/ Hex Artifact Content
Login

Artifact 61655dad911a967a69fb49df57268fd15ce8f1af3fe0a1bd90c128ef2cacfb7a:


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 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
3b30: 34 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  4.  sqlite3_free
3b40: 28 70 2d 3e 61 69 52 6f 77 45 73 74 29 3b 0a 23  (p->aiRowEst);.#
3b50: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44  endif.  sqlite3D
3b60: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
3b70: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69  ./*.** For the i
3b80: 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49 64 78  ndex called zIdx
3b90: 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20 66 6f  Name which is fo
3ba0: 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  und in the datab
3bb0: 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69  ase iDb,.** unli
3bc0: 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20 66 72  ke that index fr
3bd0: 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74 68 65  om its Table the
3be0: 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64  n remove the ind
3bf0: 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69  ex from.** the i
3c00: 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 20  ndex hash table 
3c10: 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d  and free all mem
3c20: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 61  ory structures a
3c30: 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
3c40: 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a  h the index..*/.
3c50: 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69  void sqlite3Unli
3c60: 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78  nkAndDeleteIndex
3c70: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
3c80: 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61  t iDb, const cha
3c90: 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20  r *zIdxName){.  
3ca0: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
3cb0: 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20   Hash *pHash;.. 
3cc0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
3cd0: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
3ce0: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
3cf0: 20 70 48 61 73 68 20 3d 20 26 64 62 2d 3e 61 44   pHash = &db->aD
3d00: 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[iDb].pSchema->
3d10: 69 64 78 48 61 73 68 3b 0a 20 20 70 49 6e 64 65  idxHash;.  pInde
3d20: 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  x = sqlite3HashI
3d30: 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49 64  nsert(pHash, zId
3d40: 78 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28  xName, 0);.  if(
3d50: 20 41 4c 57 41 59 53 28 70 49 6e 64 65 78 29 20   ALWAYS(pIndex) 
3d60: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  ){.    if( pInde
3d70: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
3d80: 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  x==pIndex ){.   
3d90: 20 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c     pIndex->pTabl
3da0: 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64  e->pIndex = pInd
3db0: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ex->pNext;.    }
3dc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
3dd0: 78 20 2a 70 3b 0a 20 20 20 20 20 20 2f 2a 20 4a  x *p;.      /* J
3de0: 75 73 74 69 66 69 63 61 74 69 6f 6e 20 6f 66 20  ustification of 
3df0: 41 4c 57 41 59 53 28 29 3b 20 20 54 68 65 20 69  ALWAYS();  The i
3e00: 6e 64 65 78 20 6d 75 73 74 20 62 65 20 6f 6e 20  ndex must be on 
3e10: 74 68 65 20 6c 69 73 74 20 6f 66 0a 20 20 20 20  the list of.    
3e20: 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 2a 2f    ** indices. */
3e30: 0a 20 20 20 20 20 20 70 20 3d 20 70 49 6e 64 65  .      p = pInde
3e40: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
3e50: 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  x;.      while( 
3e60: 41 4c 57 41 59 53 28 70 29 20 26 26 20 70 2d 3e  ALWAYS(p) && p->
3e70: 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 20 29 7b  pNext!=pIndex ){
3e80: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 20 7d   p = p->pNext; }
3e90: 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
3ea0: 53 28 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d  S(p && p->pNext=
3eb0: 3d 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20  =pIndex) ){.    
3ec0: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
3ed0: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
3ee0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
3ef0: 73 71 6c 69 74 65 33 46 72 65 65 49 6e 64 65 78  sqlite3FreeIndex
3f00: 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  (db, pIndex);.  
3f10: 7d 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73  }.  db->mDbFlags
3f20: 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d   |= DBFLAG_Schem
3f30: 61 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  aChange;.}../*.*
3f40: 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20 74  * Look through t
3f50: 68 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e 20  he list of open 
3f60: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 69  database files i
3f70: 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e 64 20  n db->aDb[] and 
3f80: 69 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65 20 62  if.** any have b
3f90: 65 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65 6d 6f  een closed, remo
3fa0: 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65  ve them from the
3fb0: 20 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f 63 61   list.  Realloca
3fc0: 74 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 61 44  te the.** db->aD
3fd0: 62 5b 5d 20 73 74 72 75 63 74 75 72 65 20 74 6f  b[] structure to
3fe0: 20 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65 2c   a smaller size,
3ff0: 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a   if possible..**
4000: 0a 2a 2a 20 45 6e 74 72 79 20 30 20 28 74 68 65  .** Entry 0 (the
4010: 20 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73 65   "main" database
4020: 29 20 61 6e 64 20 65 6e 74 72 79 20 31 20 28 74  ) and entry 1 (t
4030: 68 65 20 22 74 65 6d 70 22 20 64 61 74 61 62 61  he "temp" databa
4040: 73 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76 65 72  se).** are never
4050: 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20   candidates for 
4060: 62 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65 64 2e  being collapsed.
4070: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4080: 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65  CollapseDatabase
4090: 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64  Array(sqlite3 *d
40a0: 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  b){.  int i, j;.
40b0: 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64    for(i=j=2; i<d
40c0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
40d0: 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62    struct Db *pDb
40e0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
40f0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
4100: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
4110: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4120: 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 3b 0a 20  Db->zDbSName);. 
4130: 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61       pDb->zDbSNa
4140: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f  me = 0;.      co
4150: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
4160: 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20    if( j<i ){.   
4170: 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20     db->aDb[j] = 
4180: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
4190: 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20  }.    j++;.  }. 
41a0: 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20   db->nDb = j;.  
41b0: 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26  if( db->nDb<=2 &
41c0: 26 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61  & db->aDb!=db->a
41d0: 44 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20  DbStatic ){.    
41e0: 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74  memcpy(db->aDbSt
41f0: 61 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32  atic, db->aDb, 2
4200: 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b  *sizeof(db->aDb[
4210: 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  0]));.    sqlite
4220: 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e  3DbFree(db, db->
4230: 61 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44  aDb);.    db->aD
4240: 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69  b = db->aDbStati
4250: 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c;.  }.}../*.** 
4260: 52 65 73 65 74 20 74 68 65 20 73 63 68 65 6d 61  Reset the schema
4270: 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
4280: 65 20 61 74 20 69 6e 64 65 78 20 69 44 62 2e 20  e at index iDb. 
4290: 20 41 6c 73 6f 20 72 65 73 65 74 20 74 68 65 0a   Also reset the.
42a0: 2a 2a 20 54 45 4d 50 20 73 63 68 65 6d 61 2e 20  ** TEMP schema. 
42b0: 20 54 68 65 20 72 65 73 65 74 20 69 73 20 64 65   The reset is de
42c0: 66 65 72 72 65 64 20 69 66 20 64 62 2d 3e 6e 53  ferred if db->nS
42d0: 63 68 65 6d 61 4c 6f 63 6b 20 69 73 20 6e 6f 74  chemaLock is not
42e0: 20 7a 65 72 6f 2e 0a 2a 2a 20 44 65 66 65 72 72   zero..** Deferr
42f0: 65 64 20 72 65 73 65 74 73 20 6d 61 79 20 62 65  ed resets may be
4300: 20 72 75 6e 20 62 79 20 63 61 6c 6c 69 6e 67 20   run by calling 
4310: 77 69 74 68 20 69 44 62 3c 30 2e 0a 2a 2f 0a 76  with iDb<0..*/.v
4320: 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74  oid sqlite3Reset
4330: 4f 6e 65 53 63 68 65 6d 61 28 73 71 6c 69 74 65  OneSchema(sqlite
4340: 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b  3 *db, int iDb){
4350: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
4360: 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20  rt( iDb<db->nDb 
4370: 29 3b 0a 0a 20 20 69 66 28 20 69 44 62 3e 3d 30  );..  if( iDb>=0
4380: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
4390: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
43a0: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
43b0: 30 29 20 29 3b 0a 20 20 20 20 44 62 53 65 74 50  0) );.    DbSetP
43c0: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c  roperty(db, iDb,
43d0: 20 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64 29   DB_ResetWanted)
43e0: 3b 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70 65  ;.    DbSetPrope
43f0: 72 74 79 28 64 62 2c 20 31 2c 20 44 42 5f 52 65  rty(db, 1, DB_Re
4400: 73 65 74 57 61 6e 74 65 64 29 3b 0a 20 20 20 20  setWanted);.    
4410: 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 3d 20  db->mDbFlags &= 
4420: 7e 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 4b 6e  ~DBFLAG_SchemaKn
4430: 6f 77 6e 4f 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66  ownOk;.  }..  if
4440: 28 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63  ( db->nSchemaLoc
4450: 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  k==0 ){.    for(
4460: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
4470: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
4480: 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
4490: 2c 20 69 2c 20 44 42 5f 52 65 73 65 74 57 61 6e  , i, DB_ResetWan
44a0: 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ted) ){.        
44b0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65  sqlite3SchemaCle
44c0: 61 72 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53  ar(db->aDb[i].pS
44d0: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 7d 0a  chema);.      }.
44e0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
44f0: 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68  ** Erase all sch
4500: 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ema information 
4510: 66 72 6f 6d 20 61 6c 6c 20 61 74 74 61 63 68 65  from all attache
4520: 64 20 64 61 74 61 62 61 73 65 73 20 28 69 6e 63  d databases (inc
4530: 6c 75 64 69 6e 67 0a 2a 2a 20 22 6d 61 69 6e 22  luding.** "main"
4540: 20 61 6e 64 20 22 74 65 6d 70 22 29 20 66 6f 72   and "temp") for
4550: 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
4560: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
4570: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
4580: 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43  setAllSchemasOfC
4590: 6f 6e 6e 65 63 74 69 6f 6e 28 73 71 6c 69 74 65  onnection(sqlite
45a0: 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b  3 *db){.  int i;
45b0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
45c0: 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66  nterAll(db);.  f
45d0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
45e0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20  b; i++){.    Db 
45f0: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
4600: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  i];.    if( pDb-
4610: 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
4620: 20 20 69 66 28 20 64 62 2d 3e 6e 53 63 68 65 6d    if( db->nSchem
4630: 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  aLock==0 ){.    
4640: 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d      sqlite3Schem
4650: 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68  aClear(pDb->pSch
4660: 65 6d 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ema);.      }els
4670: 65 7b 0a 20 20 20 20 20 20 20 20 44 62 53 65 74  e{.        DbSet
4680: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c 20  Property(db, i, 
4690: 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64 29 3b  DB_ResetWanted);
46a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
46b0: 20 7d 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67   }.  db->mDbFlag
46c0: 73 20 26 3d 20 7e 28 44 42 46 4c 41 47 5f 53 63  s &= ~(DBFLAG_Sc
46d0: 68 65 6d 61 43 68 61 6e 67 65 7c 44 42 46 4c 41  hemaChange|DBFLA
46e0: 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 29  G_SchemaKnownOk)
46f0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55  ;.  sqlite3VtabU
4700: 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20  nlockList(db);. 
4710: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
4720: 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 69 66 28  veAll(db);.  if(
4730: 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b   db->nSchemaLock
4740: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
4750: 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61  e3CollapseDataba
4760: 73 65 41 72 72 61 79 28 64 62 29 3b 0a 20 20 7d  seArray(db);.  }
4770: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
4780: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
4790: 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f   when a commit o
47a0: 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ccurs..*/.void s
47b0: 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65  qlite3CommitInte
47c0: 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69  rnalChanges(sqli
47d0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e  te3 *db){.  db->
47e0: 6d 44 62 46 6c 61 67 73 20 26 3d 20 7e 44 42 46  mDbFlags &= ~DBF
47f0: 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65  LAG_SchemaChange
4800: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
4810: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
4820: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ed for the colum
4830: 6e 20 6e 61 6d 65 73 20 6f 66 20 61 20 74 61 62  n names of a tab
4840: 6c 65 20 6f 72 20 76 69 65 77 20 28 74 68 65 0a  le or view (the.
4850: 2a 2a 20 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20  ** Table.aCol[] 
4860: 61 72 72 61 79 29 2e 0a 2a 2f 0a 76 6f 69 64 20  array)..*/.void 
4870: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c  sqlite3DeleteCol
4880: 75 6d 6e 4e 61 6d 65 73 28 73 71 6c 69 74 65 33  umnNames(sqlite3
4890: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61   *db, Table *pTa
48a0: 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ble){.  int i;. 
48b0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
48c0: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 21   assert( pTable!
48d0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43 6f  =0 );.  if( (pCo
48e0: 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  l = pTable->aCol
48f0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  )!=0 ){.    for(
4900: 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e  i=0; i<pTable->n
4910: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
4920: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4930: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  DbFree(db, pCol-
4940: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  >zName);.      s
4950: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4960: 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74  (db, pCol->pDflt
4970: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4980: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  DbFree(db, pCol-
4990: 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20  >zColl);.    }. 
49a0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
49b0: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43 6f  (db, pTable->aCo
49c0: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
49d0: 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f   Remove the memo
49e0: 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ry data structur
49f0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
4a00: 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  th the given.** 
4a10: 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67  Table.  No chang
4a20: 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64  es are made to d
4a30: 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74  isk by this rout
4a40: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ine..**.** This 
4a50: 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c  routine just del
4a60: 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73 74  etes the data st
4a70: 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65  ructure.  It doe
4a80: 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20  s not unlink.** 
4a90: 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20 73  the table data s
4aa0: 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68  tructure from th
4ab0: 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42  e hash table.  B
4ac0: 75 74 20 69 74 20 64 6f 65 73 20 64 65 73 74 72  ut it does destr
4ad0: 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72  oy.** memory str
4ae0: 75 63 74 75 72 65 73 20 6f 66 20 74 68 65 20 69  uctures of the i
4af0: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
4b00: 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74  gn keys associat
4b10: 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20  ed with .** the 
4b20: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
4b30: 20 64 62 20 70 61 72 61 6d 65 74 65 72 20 69 73   db parameter is
4b40: 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 74 20 69   optional.  It i
4b50: 73 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20  s needed if the 
4b60: 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 0a 2a 2a  Table object .**
4b70: 20 63 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61 73   contains lookas
4b80: 69 64 65 20 6d 65 6d 6f 72 79 2e 20 20 28 54 61  ide memory.  (Ta
4b90: 62 6c 65 20 6f 62 6a 65 63 74 73 20 69 6e 20 74  ble objects in t
4ba0: 68 65 20 73 63 68 65 6d 61 20 64 6f 20 6e 6f 74  he schema do not
4bb0: 20 75 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64   use.** lookasid
4bc0: 65 20 6d 65 6d 6f 72 79 2c 20 62 75 74 20 73 6f  e memory, but so
4bd0: 6d 65 20 65 70 68 65 6d 65 72 61 6c 20 54 61 62  me ephemeral Tab
4be0: 6c 65 20 6f 62 6a 65 63 74 73 20 64 6f 2e 29 20  le objects do.) 
4bf0: 20 4f 72 20 74 68 65 0a 2a 2a 20 64 62 20 70 61   Or the.** db pa
4c00: 72 61 6d 65 74 65 72 20 63 61 6e 20 62 65 20 75  rameter can be u
4c10: 73 65 64 20 77 69 74 68 20 64 62 2d 3e 70 6e 42  sed with db->pnB
4c20: 79 74 65 73 46 72 65 65 64 20 74 6f 20 6d 65 61  ytesFreed to mea
4c30: 73 75 72 65 20 74 68 65 20 6d 65 6d 6f 72 79 0a  sure the memory.
4c40: 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 54  ** used by the T
4c50: 61 62 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  able object..*/.
4c60: 73 74 61 74 69 63 20 76 6f 69 64 20 53 51 4c 49  static void SQLI
4c70: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 64 65 6c 65  TE_NOINLINE dele
4c80: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
4c90: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  *db, Table *pTab
4ca0: 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  le){.  Index *pI
4cb0: 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 0a 23  ndex, *pNext;..#
4cc0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
4cd0: 55 47 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74  UG.  /* Record t
4ce0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
4cf0: 73 74 61 6e 64 69 6e 67 20 6c 6f 6f 6b 61 73 69  standing lookasi
4d00: 64 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 69  de allocations i
4d10: 6e 20 73 63 68 65 6d 61 20 54 61 62 6c 65 73 0a  n schema Tables.
4d20: 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 64 6f    ** prior to do
4d30: 69 6e 67 20 61 6e 79 20 66 72 65 65 28 29 20 6f  ing any free() o
4d40: 70 65 72 61 74 69 6f 6e 73 2e 20 20 53 69 6e 63  perations.  Sinc
4d50: 65 20 73 63 68 65 6d 61 20 54 61 62 6c 65 73 20  e schema Tables 
4d60: 64 6f 20 6e 6f 74 20 75 73 65 0a 20 20 2a 2a 20  do not use.  ** 
4d70: 6c 6f 6f 6b 61 73 69 64 65 2c 20 74 68 69 73 20  lookaside, this 
4d80: 6e 75 6d 62 65 72 20 73 68 6f 75 6c 64 20 6e 6f  number should no
4d90: 74 20 63 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 69  t change. */.  i
4da0: 6e 74 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20  nt nLookaside = 
4db0: 30 3b 0a 20 20 69 66 28 20 64 62 20 26 26 20 28  0;.  if( db && (
4dc0: 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61 67 73  pTable->tabFlags
4dd0: 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
4de0: 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4c 6f 6f 6b  ==0 ){.    nLook
4df0: 61 73 69 64 65 20 3d 20 73 71 6c 69 74 65 33 4c  aside = sqlite3L
4e00: 6f 6f 6b 61 73 69 64 65 55 73 65 64 28 64 62 2c  ookasideUsed(db,
4e10: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
4e20: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c  .  /* Delete all
4e30: 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   indices associa
4e40: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61  ted with this ta
4e50: 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49  ble. */.  for(pI
4e60: 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70  ndex = pTable->p
4e70: 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70  Index; pIndex; p
4e80: 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20  Index=pNext){.  
4e90: 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78    pNext = pIndex
4ea0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73  ->pNext;.    ass
4eb0: 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53 63  ert( pIndex->pSc
4ec0: 68 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70 53  hema==pTable->pS
4ed0: 63 68 65 6d 61 0a 20 20 20 20 20 20 20 20 20 7c  chema.         |
4ee0: 7c 20 28 49 73 56 69 72 74 75 61 6c 28 70 54 61  | (IsVirtual(pTa
4ef0: 62 6c 65 29 20 26 26 20 70 49 6e 64 65 78 2d 3e  ble) && pIndex->
4f00: 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  idxType!=SQLITE_
4f10: 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 29 20  IDXTYPE_APPDEF) 
4f20: 29 3b 0a 20 20 20 20 69 66 28 20 28 64 62 3d 3d  );.    if( (db==
4f30: 30 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73  0 || db->pnBytes
4f40: 46 72 65 65 64 3d 3d 30 29 20 26 26 20 21 49 73  Freed==0) && !Is
4f50: 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20  Virtual(pTable) 
4f60: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
4f70: 4e 61 6d 65 20 3d 20 70 49 6e 64 65 78 2d 3e 7a  Name = pIndex->z
4f80: 4e 61 6d 65 3b 20 0a 20 20 20 20 20 20 54 45 53  Name; .      TES
4f90: 54 4f 4e 4c 59 20 28 20 49 6e 64 65 78 20 2a 70  TONLY ( Index *p
4fa0: 4f 6c 64 20 3d 20 29 20 73 71 6c 69 74 65 33 48  Old = ) sqlite3H
4fb0: 61 73 68 49 6e 73 65 72 74 28 0a 20 20 20 20 20  ashInsert(.     
4fc0: 20 20 20 20 26 70 49 6e 64 65 78 2d 3e 70 53 63      &pIndex->pSc
4fd0: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a  hema->idxHash, z
4fe0: 4e 61 6d 65 2c 20 30 0a 20 20 20 20 20 20 29 3b  Name, 0.      );
4ff0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64  .      assert( d
5000: 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53  b==0 || sqlite3S
5010: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
5020: 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53  b, 0, pIndex->pS
5030: 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 20 20  chema) );.      
5040: 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 49  assert( pOld==pI
5050: 6e 64 65 78 20 7c 7c 20 70 4f 6c 64 3d 3d 30 20  ndex || pOld==0 
5060: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
5070: 69 74 65 33 46 72 65 65 49 6e 64 65 78 28 64 62  ite3FreeIndex(db
5080: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a  , pIndex);.  }..
5090: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20    /* Delete any 
50a0: 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 74 74  foreign keys att
50b0: 61 63 68 65 64 20 74 6f 20 74 68 69 73 20 74 61  ached to this ta
50c0: 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ble. */.  sqlite
50d0: 33 46 6b 44 65 6c 65 74 65 28 64 62 2c 20 70 54  3FkDelete(db, pT
50e0: 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c  able);..  /* Del
50f0: 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73 74  ete the Table st
5100: 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a  ructure itself..
5110: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 65    */.  sqlite3De
5120: 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  leteColumnNames(
5130: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 73  db, pTable);.  s
5140: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5150: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b   pTable->zName);
5160: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
5170: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f  (db, pTable->zCo
5180: 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33  lAff);.  sqlite3
5190: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
51a0: 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
51b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
51c0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
51d0: 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a  Table->pCheck);.
51e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
51f0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
5200: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c  .  sqlite3VtabCl
5210: 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  ear(db, pTable);
5220: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
5230: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62  3DbFree(db, pTab
5240: 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66  le);..  /* Verif
5250: 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61 73  y that no lookas
5260: 69 64 65 20 6d 65 6d 6f 72 79 20 77 61 73 20 75  ide memory was u
5270: 73 65 64 20 62 79 20 73 63 68 65 6d 61 20 74 61  sed by schema ta
5280: 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  bles */.  assert
5290: 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30 20  ( nLookaside==0 
52a0: 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 73  || nLookaside==s
52b0: 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55  qlite3LookasideU
52c0: 73 65 64 28 64 62 2c 30 29 20 29 3b 0a 7d 0a 76  sed(db,0) );.}.v
52d0: 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74  oid sqlite3Delet
52e0: 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a  eTable(sqlite3 *
52f0: 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  db, Table *pTabl
5300: 65 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  e){.  /* Do not 
5310: 64 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c 65  delete the table
5320: 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65 72   until the refer
5330: 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68  ence count reach
5340: 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66  es zero. */.  if
5350: 28 20 21 70 54 61 62 6c 65 20 29 20 72 65 74 75  ( !pTable ) retu
5360: 72 6e 3b 0a 20 20 69 66 28 20 28 28 21 64 62 20  rn;.  if( ((!db 
5370: 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  || db->pnBytesFr
5380: 65 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d 70 54  eed==0) && (--pT
5390: 61 62 6c 65 2d 3e 6e 54 61 62 52 65 66 29 3e 30  able->nTabRef)>0
53a0: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 65  ) ) return;.  de
53b0: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54  leteTable(db, pT
53c0: 61 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  able);.}.../*.**
53d0: 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65   Unlink the give
53e0: 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  n table from the
53f0: 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64   hash tables and
5400: 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a   the delete the.
5410: 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  ** table structu
5420: 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20  re with all its 
5430: 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65  indices and fore
5440: 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69  ign keys..*/.voi
5450: 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41  d sqlite3UnlinkA
5460: 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71  ndDeleteTable(sq
5470: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
5480: 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Db, const char *
5490: 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62  zTabName){.  Tab
54a0: 6c 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62  le *p;.  Db *pDb
54b0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  ;..  assert( db!
54c0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
54d0: 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
54e0: 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
54f0: 74 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20  t( zTabName );. 
5500: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5510: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
5520: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
5530: 20 74 65 73 74 63 61 73 65 28 20 7a 54 61 62 4e   testcase( zTabN
5540: 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a  ame[0]==0 );  /*
5550: 20 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62   Zero-length tab
5560: 6c 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c  le names are all
5570: 6f 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20  owed */.  pDb = 
5580: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20  &db->aDb[iDb];. 
5590: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
55a0: 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63  Insert(&pDb->pSc
55b0: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a  hema->tblHash, z
55c0: 54 61 62 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73  TabName, 0);.  s
55d0: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
55e0: 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d 3e  e(db, p);.  db->
55f0: 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c  mDbFlags |= DBFL
5600: 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b  AG_SchemaChange;
5610: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
5620: 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20  a token, return 
5630: 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f  a string that co
5640: 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65  nsists of the te
5650: 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f  xt of that.** to
5660: 6b 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68  ken.  Space to h
5670: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
5680: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62   string.** is ob
5690: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
56a0: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  teMalloc() and m
56b0: 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
56c0: 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  the calling.** f
56d0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  unction..**.** A
56e0: 6e 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72  ny quotation mar
56f0: 6b 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c  ks (ex:  "name",
5700: 20 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c   'name', [name],
5710: 20 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61 74   or `name`) that
5720: 0a 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68 65  .** surround the
5730: 20 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f 6b   body of the tok
5740: 65 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a  en are removed..
5750: 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65  **.** Tokens are
5760: 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e   often just poin
5770: 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72  ters into the or
5780: 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20  iginal SQL text 
5790: 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f  and so.** are no
57a0: 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65  t \000 terminate
57b0: 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65  d and are not pe
57c0: 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72  rsistent.  The r
57d0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a  eturned string.*
57e0: 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e  * is \000 termin
57f0: 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72 73  ated and is pers
5800: 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20  istent..*/.char 
5810: 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d  *sqlite3NameFrom
5820: 54 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64  Token(sqlite3 *d
5830: 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  b, Token *pName)
5840: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
5850: 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a  .  if( pName ){.
5860: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
5870: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
5880: 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a   (char*)pName->z
5890: 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20  , pName->n);.   
58a0: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
58b0: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  zName);.  }else{
58c0: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a  .    zName = 0;.
58d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61    }.  return zNa
58e0: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  me;.}../*.** Ope
58f0: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
5900: 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64  ter table stored
5910: 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d   in database num
5920: 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77  ber iDb for.** w
5930: 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c  riting. The tabl
5940: 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e  e is opened usin
5950: 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76  g cursor 0..*/.v
5960: 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d  oid sqlite3OpenM
5970: 61 73 74 65 72 54 61 62 6c 65 28 50 61 72 73 65  asterTable(Parse
5980: 20 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20   *p, int iDb){. 
5990: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
59a0: 65 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20  e3GetVdbe(p);.  
59b0: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
59c0: 28 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f  (p, iDb, MASTER_
59d0: 52 4f 4f 54 2c 20 31 2c 20 4d 41 53 54 45 52 5f  ROOT, 1, MASTER_
59e0: 4e 41 4d 45 29 3b 0a 20 20 73 71 6c 69 74 65 33  NAME);.  sqlite3
59f0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
5a00: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30   OP_OpenWrite, 0
5a10: 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 69  , MASTER_ROOT, i
5a20: 44 62 2c 20 35 29 3b 0a 20 20 69 66 28 20 70 2d  Db, 5);.  if( p-
5a30: 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20  >nTab==0 ){.    
5a40: 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 7d  p->nTab = 1;.  }
5a50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
5a60: 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73  ter zName points
5a70: 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e   to a nul-termin
5a80: 61 74 65 64 20 62 75 66 66 65 72 20 63 6f 6e 74  ated buffer cont
5a90: 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 0a  aining the name.
5aa0: 2a 2a 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  ** of a database
5ab0: 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22   ("main", "temp"
5ac0: 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   or the name of 
5ad0: 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e  an attached db).
5ae0: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
5af0: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 69 6e  n returns the in
5b00: 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  dex of the named
5b10: 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d   database in db-
5b20: 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d 31  >aDb[], or.** -1
5b30: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62   if the named db
5b40: 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
5b50: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5b60: 46 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69 74  FindDbName(sqlit
5b70: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
5b80: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
5b90: 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  t i = -1;       
5ba0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75    /* Database nu
5bb0: 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a 4e  mber */.  if( zN
5bc0: 61 6d 65 20 29 7b 0a 20 20 20 20 44 62 20 2a 70  ame ){.    Db *p
5bd0: 44 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 64  Db;.    for(i=(d
5be0: 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26  b->nDb-1), pDb=&
5bf0: 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30  db->aDb[i]; i>=0
5c00: 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20  ; i--, pDb--){. 
5c10: 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69       if( 0==sqli
5c20: 74 65 33 5f 73 74 72 69 63 6d 70 28 70 44 62 2d  te3_stricmp(pDb-
5c30: 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a 4e 61 6d 65  >zDbSName, zName
5c40: 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ) ) break;.     
5c50: 20 2f 2a 20 22 6d 61 69 6e 22 20 69 73 20 61 6c   /* "main" is al
5c60: 77 61 79 73 20 61 6e 20 61 63 63 65 70 74 61 62  ways an acceptab
5c70: 6c 65 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65  le alias for the
5c80: 20 70 72 69 6d 61 72 79 20 64 61 74 61 62 61 73   primary databas
5c90: 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20  e.      ** even 
5ca0: 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 72  if it has been r
5cb0: 65 6e 61 6d 65 64 20 75 73 69 6e 67 20 53 51 4c  enamed using SQL
5cc0: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4d 41 49  ITE_DBCONFIG_MAI
5cd0: 4e 44 42 4e 41 4d 45 2e 20 2a 2f 0a 20 20 20 20  NDBNAME. */.    
5ce0: 20 20 69 66 28 20 69 3d 3d 30 20 26 26 20 30 3d    if( i==0 && 0=
5cf0: 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70  =sqlite3_stricmp
5d00: 28 22 6d 61 69 6e 22 2c 20 7a 4e 61 6d 65 29 20  ("main", zName) 
5d10: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
5d20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
5d30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65  ../*.** The toke
5d40: 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e  n *pName contain
5d50: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
5d60: 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72  database (either
5d70: 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74   "main" or.** "t
5d80: 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65  emp" or the name
5d90: 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20   of an attached 
5da0: 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  db). This routin
5db0: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
5dc0: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61   index of the na
5dd0: 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20  med database in 
5de0: 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31  db->aDb[], or -1
5df0: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62   if the named db
5e00: 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78   .** does not ex
5e10: 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ist..*/.int sqli
5e20: 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74 65  te3FindDb(sqlite
5e30: 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e  3 *db, Token *pN
5e40: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  ame){.  int i;  
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5e70: 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  Database number 
5e80: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
5e90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
5eb0: 65 20 77 65 20 61 72 65 20 73 65 61 72 63 68 69  e we are searchi
5ec0: 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d  ng for */.  zNam
5ed0: 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
5ee0: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61  romToken(db, pNa
5ef0: 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74  me);.  i = sqlit
5f00: 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c  e3FindDbName(db,
5f10: 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74   zName);.  sqlit
5f20: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
5f30: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b  me);.  return i;
5f40: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65  .}../* The table
5f50: 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69 67   or view or trig
5f60: 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73  ger name is pass
5f70: 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ed to this routi
5f80: 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a  ne via tokens.**
5f90: 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d   pName1 and pNam
5fa0: 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65  e2. If the table
5fb0: 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20   name was fully 
5fc0: 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65  qualified, for e
5fd0: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52  xample:.**.** CR
5fe0: 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79  EATE TABLE xxx.y
5ff0: 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a  yy (...);.** .**
6000: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
6010: 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64  set to "xxx" and
6020: 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f   pName2 "yyy". O
6030: 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
6040: 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   if.** the table
6050: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c   name is not ful
6060: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e  ly qualified, i.
6070: 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45  e.:.**.** CREATE
6080: 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b   TABLE yyy(...);
6090: 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d  .**.** Then pNam
60a0: 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79  e1 is set to "yy
60b0: 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73  y" and pName2 is
60c0: 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   ""..**.** This 
60d0: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
60e0: 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74   *ppUnqual point
60f0: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
6100: 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31  he token (pName1
6110: 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74   or.** pName2) t
6120: 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75  hat stores the u
6130: 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65  nqualified table
6140: 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65   name.  The inde
6150: 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  x of the.** data
6160: 62 61 73 65 20 22 78 78 78 22 20 69 73 20 72 65  base "xxx" is re
6170: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
6180: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
6190: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
61a0: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
61b0: 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
61c0: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
61d0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
61e0: 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e1,      /* The 
61f0: 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d  "xxx" in the nam
6200: 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22  e "xxx.yyy" or "
6210: 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  xxx" */.  Token 
6220: 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a  *pName2,      /*
6230: 20 54 68 65 20 22 79 79 79 22 20 69 6e 20 74 68   The "yyy" in th
6240: 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22  e name "xxx.yyy"
6250: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55   */.  Token **pU
6260: 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69  nqual     /* Wri
6270: 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69  te the unqualifi
6280: 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68  ed object name h
6290: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
62a0: 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
62b0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
62c0: 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ase holding the 
62d0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
62e0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
62f0: 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  ->db;..  assert(
6300: 20 70 4e 61 6d 65 32 21 3d 30 20 29 3b 0a 20 20   pName2!=0 );.  
6310: 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20  if( pName2->n>0 
6320: 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 69  ){.    if( db->i
6330: 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a 20 20 20  nit.busy ) {.   
6340: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
6350: 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72 72  sg(pParse, "corr
6360: 75 70 74 20 64 61 74 61 62 61 73 65 22 29 3b 0a  upt database");.
6370: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
6380: 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 55 6e 71  .    }.    *pUnq
6390: 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20  ual = pName2;.  
63a0: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46    iDb = sqlite3F
63b0: 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31  indDb(db, pName1
63c0: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
63d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
63e0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
63f0: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62  , "unknown datab
6400: 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31 29  ase %T", pName1)
6410: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  ;.      return -
6420: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
6430: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
6440: 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c  ->init.iDb==0 ||
6450: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c   db->init.busy |
6460: 7c 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  | IN_RENAME_OBJE
6470: 43 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  CT.             
6480: 7c 7c 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73  || (db->mDbFlags
6490: 20 26 20 44 42 46 4c 41 47 5f 56 61 63 75 75 6d   & DBFLAG_Vacuum
64a0: 29 21 3d 30 29 3b 0a 20 20 20 20 69 44 62 20 3d  )!=0);.    iDb =
64b0: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20   db->init.iDb;. 
64c0: 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e     *pUnqual = pN
64d0: 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ame1;.  }.  retu
64e0: 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn iDb;.}../*.**
64f0: 20 54 72 75 65 20 69 66 20 50 52 41 47 4d 41 20   True if PRAGMA 
6500: 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20  writable_schema 
6510: 69 73 20 4f 4e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  is ON.*/.int sql
6520: 69 74 65 33 57 72 69 74 61 62 6c 65 53 63 68 65  ite3WritableSche
6530: 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ma(sqlite3 *db){
6540: 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 64 62  .  testcase( (db
6550: 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49 54 45 5f  ->flags&(SQLITE_
6560: 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51 4c 49  WriteSchema|SQLI
6570: 54 45 5f 44 65 66 65 6e 73 69 76 65 29 29 3d 3d  TE_Defensive))==
6580: 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
6590: 20 28 64 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c   (db->flags&(SQL
65a0: 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c  ITE_WriteSchema|
65b0: 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65  SQLITE_Defensive
65c0: 29 29 3d 3d 0a 20 20 20 20 20 20 20 20 20 20 20  ))==.           
65d0: 20 20 20 20 53 51 4c 49 54 45 5f 57 72 69 74 65      SQLITE_Write
65e0: 53 63 68 65 6d 61 20 29 3b 0a 20 20 74 65 73 74  Schema );.  test
65f0: 63 61 73 65 28 20 28 64 62 2d 3e 66 6c 61 67 73  case( (db->flags
6600: 26 28 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63  &(SQLITE_WriteSc
6610: 68 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66 65  hema|SQLITE_Defe
6620: 6e 73 69 76 65 29 29 3d 3d 0a 20 20 20 20 20 20  nsive))==.      
6630: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
6640: 44 65 66 65 6e 73 69 76 65 20 29 3b 0a 20 20 74  Defensive );.  t
6650: 65 73 74 63 61 73 65 28 20 28 64 62 2d 3e 66 6c  estcase( (db->fl
6660: 61 67 73 26 28 53 51 4c 49 54 45 5f 57 72 69 74  ags&(SQLITE_Writ
6670: 65 53 63 68 65 6d 61 7c 53 51 4c 49 54 45 5f 44  eSchema|SQLITE_D
6680: 65 66 65 6e 73 69 76 65 29 29 3d 3d 0a 20 20 20  efensive))==.   
6690: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c              (SQL
66a0: 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c  ITE_WriteSchema|
66b0: 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65  SQLITE_Defensive
66c0: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 64  ) );.  return (d
66d0: 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49 54 45  b->flags&(SQLITE
66e0: 5f 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51 4c  _WriteSchema|SQL
66f0: 49 54 45 5f 44 65 66 65 6e 73 69 76 65 29 29 3d  ITE_Defensive))=
6700: 3d 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68  =SQLITE_WriteSch
6710: 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ema;.}../*.** Th
6720: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
6730: 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74  ed to check if t
6740: 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20  he UTF-8 string 
6750: 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c  zName is a legal
6760: 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20  .** unqualified 
6770: 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73  name for a new s
6780: 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61  chema object (ta
6790: 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77  ble, index, view
67a0: 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e   or.** trigger).
67b0: 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c   All names are l
67c0: 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73  egal except thos
67d0: 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  e that begin wit
67e0: 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20  h the string.** 
67f0: 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70  "sqlite_" (in up
6800: 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69  per, lower or mi
6810: 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20  xed case). This 
6820: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  portion of the n
6830: 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72  amespace.** is r
6840: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
6850: 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74  rnal use..*/.int
6860: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a   sqlite3CheckObj
6870: 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70  ectName(Parse *p
6880: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
6890: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28  r *zName){.  if(
68a0: 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e   !pParse->db->in
68b0: 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73  it.busy && pPars
68c0: 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20  e->nested==0 .  
68d0: 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
68e0: 65 33 57 72 69 74 61 62 6c 65 53 63 68 65 6d 61  e3WritableSchema
68f0: 28 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 0a  (pParse->db)==0.
6900: 20 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d            && 0==
6910: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
6920: 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22  zName, "sqlite_"
6930: 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  , 7) ){.    sqli
6940: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
6950: 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65  se, "object name
6960: 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e   reserved for in
6970: 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c  ternal use: %s",
6980: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74   zName);.    ret
6990: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
69a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
69b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
69c0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 52  ** Return the PR
69d0: 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20  IMARY KEY index 
69e0: 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49 6e  of a table.*/.In
69f0: 64 65 78 20 2a 73 71 6c 69 74 65 33 50 72 69 6d  dex *sqlite3Prim
6a00: 61 72 79 4b 65 79 49 6e 64 65 78 28 54 61 62 6c  aryKeyIndex(Tabl
6a10: 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65  e *pTab){.  Inde
6a20: 78 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 54  x *p;.  for(p=pT
6a30: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26  ab->pIndex; p &&
6a40: 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e   !IsPrimaryKeyIn
6a50: 64 65 78 28 70 29 3b 20 70 3d 70 2d 3e 70 4e 65  dex(p); p=p->pNe
6a60: 78 74 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 70  xt){}.  return p
6a70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
6a80: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  n the column of 
6a90: 69 6e 64 65 78 20 70 49 64 78 20 74 68 61 74 20  index pIdx that 
6aa0: 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74  corresponds to t
6ab0: 61 62 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69  able.** column i
6ac0: 43 6f 6c 2e 20 20 52 65 74 75 72 6e 20 2d 31 20  Col.  Return -1 
6ad0: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f  if not found..*/
6ae0: 0a 69 31 36 20 73 71 6c 69 74 65 33 43 6f 6c 75  .i16 sqlite3Colu
6af0: 6d 6e 4f 66 49 6e 64 65 78 28 49 6e 64 65 78 20  mnOfIndex(Index 
6b00: 2a 70 49 64 78 2c 20 69 31 36 20 69 43 6f 6c 29  *pIdx, i16 iCol)
6b10: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
6b20: 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43  (i=0; i<pIdx->nC
6b30: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
6b40: 20 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78 2d   if( iCol==pIdx-
6b50: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20 72  >aiColumn[i] ) r
6b60: 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
6b70: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
6b80: 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75  ** Begin constru
6b90: 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c  cting a new tabl
6ba0: 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
6bb0: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69   in memory.  Thi
6bc0: 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73  s is.** the firs
6bd0: 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74  t of several act
6be0: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ion routines tha
6bf0: 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20  t get called in 
6c00: 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61  response.** to a
6c10: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
6c20: 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72  atement.  In par
6c30: 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f  ticular, this ro
6c40: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a  utine is called.
6c50: 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67 20  ** after seeing 
6c60: 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20  tokens "CREATE" 
6c70: 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20  and "TABLE" and 
6c80: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  the table name. 
6c90: 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c  The isTemp.** fl
6ca0: 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  ag is true if th
6cb0: 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62  e table should b
6cc0: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
6cd0: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
6ce0: 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65  se.** file inste
6cf0: 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69  ad of in the mai
6d00: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
6d10: 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
6d20: 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77  ly the case.** w
6d30: 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f  hen the "TEMP" o
6d40: 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65  r "TEMPORARY" ke
6d50: 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20  yword occurs in 
6d60: 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54  between.** CREAT
6d70: 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a  E and TABLE..**.
6d80: 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65  ** The new table
6d90: 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69   record is initi
6da0: 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69  alized and put i
6db0: 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  n pParse->pNewTa
6dc0: 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20  ble..** As more 
6dd0: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41  of the CREATE TA
6de0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73  BLE statement is
6df0: 20 70 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f   parsed, additio
6e00: 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f  nal action.** ro
6e10: 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63  utines will be c
6e20: 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72  alled to add mor
6e30: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
6e40: 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a   this record..**
6e50: 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   At the end of t
6e60: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
6e70: 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73  statement, the s
6e80: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29  qlite3EndTable()
6e90: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63   routine.** is c
6ea0: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74  alled to complet
6eb0: 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69  e the constructi
6ec0: 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  on of the new ta
6ed0: 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76  ble record..*/.v
6ee0: 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61 72 74  oid sqlite3Start
6ef0: 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a  Table(.  Parse *
6f00: 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72  pParse,   /* Par
6f10: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
6f20: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
6f30: 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20    /* First part 
6f40: 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  of the name of t
6f50: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
6f60: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
6f70: 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64  me2,   /* Second
6f80: 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d   part of the nam
6f90: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  e of the table o
6fa0: 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  r view */.  int 
6fb0: 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20  isTemp,      /* 
6fc0: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
6fd0: 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a  a TEMP table */.
6fe0: 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20    int isView,   
6ff0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
7000: 69 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a  is is a VIEW */.
7010: 20 20 69 6e 74 20 69 73 56 69 72 74 75 61 6c 2c    int isVirtual,
7020: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
7030: 69 73 20 69 73 20 61 20 56 49 52 54 55 41 4c 20  is is a VIRTUAL 
7040: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  table */.  int n
7050: 6f 45 72 72 20 20 20 20 20 20 20 20 2f 2a 20 44  oErr        /* D
7060: 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 61 62  o nothing if tab
7070: 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
7080: 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  s */.){.  Table 
7090: 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20  *pTable;.  char 
70a0: 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54  *zName = 0; /* T
70b0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e  he name of the n
70c0: 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  ew table */.  sq
70d0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
70e0: 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a  se->db;.  Vdbe *
70f0: 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  v;.  int iDb;   
7100: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
7110: 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61  e number to crea
7120: 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20  te the table in 
7130: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
7140: 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69  e;    /* Unquali
7150: 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65  fied name of the
7160: 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65   table to create
7170: 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 69   */..  if( db->i
7180: 6e 69 74 2e 62 75 73 79 20 26 26 20 64 62 2d 3e  nit.busy && db->
7190: 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3d 3d 31 20  init.newTnum==1 
71a0: 29 7b 0a 20 20 20 20 2f 2a 20 53 70 65 63 69 61  ){.    /* Specia
71b0: 6c 20 63 61 73 65 3a 20 20 50 61 72 73 69 6e 67  l case:  Parsing
71c0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
71d0: 65 72 20 6f 72 20 73 71 6c 69 74 65 5f 74 65 6d  er or sqlite_tem
71e0: 70 5f 6d 61 73 74 65 72 20 73 63 68 65 6d 61 20  p_master schema 
71f0: 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d  */.    iDb = db-
7200: 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 7a  >init.iDb;.    z
7210: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
7220: 53 74 72 44 75 70 28 64 62 2c 20 53 43 48 45 4d  StrDup(db, SCHEM
7230: 41 5f 54 41 42 4c 45 28 69 44 62 29 29 3b 0a 20  A_TABLE(iDb));. 
7240: 20 20 20 70 4e 61 6d 65 20 3d 20 70 4e 61 6d 65     pName = pName
7250: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
7260: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
7270: 73 65 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20  se */.    iDb = 
7280: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
7290: 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
72a0: 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
72b0: 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  e);.    if( iDb<
72c0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
72d0: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
72e0: 20 26 26 20 69 73 54 65 6d 70 20 26 26 20 70 4e   && isTemp && pN
72f0: 61 6d 65 32 2d 3e 6e 3e 30 20 26 26 20 69 44 62  ame2->n>0 && iDb
7300: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=1 ){.      /* 
7310: 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 74 65  If creating a te
7320: 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61  mp table, the na
7330: 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75  me may not be qu
7340: 61 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73 73 20  alified. Unless 
7350: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61  .      ** the da
7360: 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 22  tabase name is "
7370: 74 65 6d 70 22 20 61 6e 79 77 61 79 2e 20 20 2a  temp" anyway.  *
7380: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  /.      sqlite3E
7390: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
73a0: 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65  "temporary table
73b0: 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e   name must be un
73c0: 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20  qualified");.   
73d0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
73e0: 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54  .    if( !OMIT_T
73f0: 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20  EMPDB && isTemp 
7400: 29 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 7a  ) iDb = 1;.    z
7410: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
7420: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
7430: 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
7440: 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
7450: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7460: 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28  3RenameTokenMap(
7470: 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 7a  pParse, (void*)z
7480: 4e 61 6d 65 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  Name, pName);.  
7490: 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73 65    }.  }.  pParse
74a0: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a  ->sNameToken = *
74b0: 70 4e 61 6d 65 3b 0a 20 20 69 66 28 20 7a 4e 61  pName;.  if( zNa
74c0: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
74d0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
74e0: 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
74f0: 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
7500: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f  zName) ){.    go
7510: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7520: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rror;.  }.  if( 
7530: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20  db->init.iDb==1 
7540: 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69  ) isTemp = 1;.#i
7550: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7560: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
7570: 20 20 61 73 73 65 72 74 28 20 69 73 54 65 6d 70    assert( isTemp
7580: 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 3d 3d 31  ==0 || isTemp==1
7590: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
75a0: 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69 65  View==0 || isVie
75b0: 77 3d 3d 31 20 29 3b 0a 20 20 7b 0a 20 20 20 20  w==1 );.  {.    
75c0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
75d0: 61 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  aCode[] = {.    
75e0: 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45     SQLITE_CREATE
75f0: 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 53  _TABLE,.       S
7600: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
7610: 50 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20  P_TABLE,.       
7620: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49  SQLITE_CREATE_VI
7630: 45 57 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54  EW,.       SQLIT
7640: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49  E_CREATE_TEMP_VI
7650: 45 57 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 68  EW.    };.    ch
7660: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
7670: 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b  b[iDb].zDbSName;
7680: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
7690: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
76a0: 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
76b0: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73   SCHEMA_TABLE(is
76c0: 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29  Temp), 0, zDb) )
76d0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  {.      goto beg
76e0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
76f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69      }.    if( !i
7700: 73 56 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69  sVirtual && sqli
7710: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
7720: 72 73 65 2c 20 28 69 6e 74 29 61 43 6f 64 65 5b  rse, (int)aCode[
7730: 69 73 54 65 6d 70 2b 32 2a 69 73 56 69 65 77 5d  isTemp+2*isView]
7740: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7760: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20           zName, 
7770: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
7780: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
7790: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
77a0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
77b0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65  Make sure the ne
77c0: 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65  w table name doe
77d0: 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69  s not collide wi
77e0: 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  th an existing. 
77f0: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
7800: 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  le name in the s
7810: 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ame database.  I
7820: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ssue an error me
7830: 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74  ssage if.  ** it
7840: 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70   does. The excep
7850: 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73  tion is if the s
7860: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70  tatement being p
7870: 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65 64  arsed was passed
7880: 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69  .  ** to an sqli
7890: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
78a0: 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74  () call. In that
78b0: 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63   case only the c
78c0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a  olumn names.  **
78d0: 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20   and types will 
78e0: 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72  be used, so ther
78f0: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
7900: 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61  test for namespa
7910: 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f  ce.  ** collisio
7920: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
7930: 49 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52 53 45  IN_SPECIAL_PARSE
7940: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44   ){.    char *zD
7950: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
7960: 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69  .zDbSName;.    i
7970: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
7980: 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
7990: 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20  pParse) ){.     
79a0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
79b0: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
79c0: 20 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69     pTable = sqli
79d0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
79e0: 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20   zName, zDb);.  
79f0: 20 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a    if( pTable ){.
7a00: 20 20 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72        if( !noErr
7a10: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7a20: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
7a30: 73 65 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c  se, "table %T al
7a40: 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 70  ready exists", p
7a50: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Name);.      }el
7a60: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
7a70: 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  rt( !db->init.bu
7a80: 73 79 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  sy || CORRUPT_DB
7a90: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
7aa0: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
7ab0: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
7ac0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7ad0: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
7ae0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
7af0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
7b00: 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
7b10: 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20  , zDb)!=0 ){.   
7b20: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
7b30: 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72  sg(pParse, "ther
7b40: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20  e is already an 
7b50: 69 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c  index named %s",
7b60: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67   zName);.      g
7b70: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
7b80: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  error;.    }.  }
7b90: 0a 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c  ..  pTable = sql
7ba0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
7bb0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
7bc0: 65 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  e));.  if( pTabl
7bd0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  e==0 ){.    asse
7be0: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
7bf0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 50 61 72  iled );.    pPar
7c00: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
7c10: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
7c20: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
7c30: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
7c40: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  able_error;.  }.
7c50: 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20    pTable->zName 
7c60: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c  = zName;.  pTabl
7c70: 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  e->iPKey = -1;. 
7c80: 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
7c90: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
7ca0: 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c  pSchema;.  pTabl
7cb0: 65 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a  e->nTabRef = 1;.
7cc0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
7cd0: 46 41 55 4c 54 5f 52 4f 57 45 53 54 0a 20 20 70  FAULT_ROWEST.  p
7ce0: 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73  Table->nRowLogEs
7cf0: 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  t = sqlite3LogEs
7d00: 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  t(SQLITE_DEFAULT
7d10: 5f 52 4f 57 45 53 54 29 3b 0a 23 65 6c 73 65 0a  _ROWEST);.#else.
7d20: 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f    pTable->nRowLo
7d30: 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
7d40: 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
7d50: 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
7d60: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
7d70: 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  rt( pParse->pNew
7d80: 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 70 50  Table==0 );.  pP
7d90: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
7da0: 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20  = pTable;..  /* 
7db0: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d  If this is the m
7dc0: 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75  agic sqlite_sequ
7dd0: 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64 20  ence table used 
7de0: 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  by autoincrement
7df0: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f  ,.  ** then reco
7e00: 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rd a pointer to 
7e10: 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68  this table in th
7e20: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
7e30: 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73  structure.  ** s
7e40: 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20 63 61  o that INSERT ca
7e50: 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65  n find the table
7e60: 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69   easily..  */.#i
7e70: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7e80: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
7e90: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e    if( !pParse->n
7ea0: 65 73 74 65 64 20 26 26 20 73 74 72 63 6d 70 28  ested && strcmp(
7eb0: 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73  zName, "sqlite_s
7ec0: 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a  equence")==0 ){.
7ed0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
7ee0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
7ef0: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
7f00: 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53  ;.    pTable->pS
7f10: 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d  chema->pSeqTab =
7f20: 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e   pTable;.  }.#en
7f30: 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  dif..  /* Begin 
7f40: 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63  generating the c
7f50: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ode that will in
7f60: 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72  sert the table r
7f70: 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20  ecord into.  ** 
7f80: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
7f90: 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69  R table.  Note i
7fa0: 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61  n particular tha
7fb0: 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65  t we must go ahe
7fc0: 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f  ad.  ** and allo
7fd0: 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20  cate the record 
7fe0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
7ff0: 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20  able entry now. 
8000: 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a   Before any.  **
8010: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
8020: 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20  UNIQUE keywords 
8030: 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f  are parsed.  Tho
8040: 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c  se keywords will
8050: 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69   cause.  ** indi
8060: 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65  ces to be create
8070: 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  d and the table 
8080: 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65  record must come
8090: 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a   before the .  *
80a0: 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63  * indices.  Henc
80b0: 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  e, the record nu
80c0: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
80d0: 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63  le must be alloc
80e0: 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20  ated.  ** now.. 
80f0: 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   */.  if( !db->i
8100: 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d  nit.busy && (v =
8110: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
8120: 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20  pParse))!=0 ){. 
8130: 20 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20     int addr1;.  
8140: 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74    int fileFormat
8150: 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20  ;.    int reg1, 
8160: 72 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20  reg2, reg3;.    
8170: 2f 2a 20 6e 75 6c 6c 52 6f 77 5b 5d 20 69 73 20  /* nullRow[] is 
8180: 61 6e 20 4f 50 5f 52 65 63 6f 72 64 20 65 6e 63  an OP_Record enc
8190: 6f 64 69 6e 67 20 6f 66 20 61 20 72 6f 77 20 63  oding of a row c
81a0: 6f 6e 74 61 69 6e 69 6e 67 20 35 20 4e 55 4c 4c  ontaining 5 NULL
81b0: 73 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20  s */.    static 
81c0: 63 6f 6e 73 74 20 63 68 61 72 20 6e 75 6c 6c 52  const char nullR
81d0: 6f 77 5b 5d 20 3d 20 7b 20 36 2c 20 30 2c 20 30  ow[] = { 6, 0, 0
81e0: 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20  , 0, 0, 0 };.   
81f0: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
8200: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
8210: 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69  se, 1, iDb);..#i
8220: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8230: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
8240: 20 20 20 69 66 28 20 69 73 56 69 72 74 75 61 6c     if( isVirtual
8250: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8260: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
8270: 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d  P_VBegin);.    }
8280: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
8290: 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d  If the file form
82a0: 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20  at and encoding 
82b0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
82c0: 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65  have not been se
82d0: 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74  t, .    ** set t
82e0: 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a  hem now..    */.
82f0: 20 20 20 20 72 65 67 31 20 3d 20 70 50 61 72 73      reg1 = pPars
8300: 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b  e->regRowid = ++
8310: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
8320: 20 20 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d    reg2 = pParse-
8330: 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61  >regRoot = ++pPa
8340: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
8350: 65 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  eg3 = ++pParse->
8360: 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
8370: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8380: 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44  P_ReadCookie, iD
8390: 62 2c 20 72 65 67 33 2c 20 42 54 52 45 45 5f 46  b, reg3, BTREE_F
83a0: 49 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20  ILE_FORMAT);.   
83b0: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
83c0: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
83d0: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
83e0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
83f0: 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b 20 56 64  OP_If, reg3); Vd
8400: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
8410: 20 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20     fileFormat = 
8420: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
8430: 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d  ITE_LegacyFileFm
8440: 74 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20  t)!=0 ?.        
8450: 20 20 20 20 20 20 20 20 20 20 31 20 3a 20 53 51            1 : SQ
8460: 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f  LITE_MAX_FILE_FO
8470: 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74 65  RMAT;.    sqlite
8480: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8490: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
84a0: 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52  , BTREE_FILE_FOR
84b0: 4d 41 54 2c 20 66 69 6c 65 46 6f 72 6d 61 74 29  MAT, fileFormat)
84c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
84d0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
84e0: 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54  tCookie, iDb, BT
84f0: 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49 4e  REE_TEXT_ENCODIN
8500: 47 2c 20 45 4e 43 28 64 62 29 29 3b 0a 20 20 20  G, ENC(db));.   
8510: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
8520: 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
8530: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73  .    /* This jus
8540: 74 20 63 72 65 61 74 65 73 20 61 20 70 6c 61 63  t creates a plac
8550: 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20  e-holder record 
8560: 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  in the sqlite_ma
8570: 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20  ster table..    
8580: 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63 72  ** The record cr
8590: 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63  eated does not c
85a0: 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20  ontain anything 
85b0: 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65  yet.  It will be
85c0: 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a   replaced.    **
85d0: 20 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74   by the real ent
85e0: 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72  ry in code gener
85f0: 61 74 65 64 20 61 74 20 73 71 6c 69 74 65 33 45  ated at sqlite3E
8600: 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a  ndTable()..    *
8610: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77  *.    ** The row
8620: 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65  id for the new e
8630: 6e 74 72 79 20 69 73 20 6c 65 66 74 20 69 6e 20  ntry is left in 
8640: 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d  register pParse-
8650: 3e 72 65 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a  >regRowid..    *
8660: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
8670: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
8680: 77 20 74 61 62 6c 65 20 69 73 20 6c 65 66 74 20  w table is left 
8690: 69 6e 20 72 65 67 20 70 50 61 72 73 65 2d 3e 72  in reg pParse->r
86a0: 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54  egRoot..    ** T
86b0: 68 65 20 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f  he rowid and roo
86c0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 76 61  t page number va
86d0: 6c 75 65 73 20 61 72 65 20 6e 65 65 64 65 64 20  lues are needed 
86e0: 62 79 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  by the code that
86f0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45  .    ** sqlite3E
8700: 6e 64 54 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e  ndTable will gen
8710: 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69  erate..    */.#i
8720: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
8730: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
8740: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
8750: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
8760: 45 29 0a 20 20 20 20 69 66 28 20 69 73 56 69 65  E).    if( isVie
8770: 77 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20 29  w || isVirtual )
8780: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
8790: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
87a0: 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 32  Integer, 0, reg2
87b0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
87c0: 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  dif.    {.      
87d0: 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61  pParse->addrCrTa
87e0: 62 20 3d 0a 20 20 20 20 20 20 20 20 20 73 71 6c  b =.         sql
87f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8800: 2c 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65  , OP_CreateBtree
8810: 2c 20 69 44 62 2c 20 72 65 67 32 2c 20 42 54 52  , iDb, reg2, BTR
8820: 45 45 5f 49 4e 54 4b 45 59 29 3b 0a 20 20 20 20  EE_INTKEY);.    
8830: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65  }.    sqlite3Ope
8840: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50 61  nMasterTable(pPa
8850: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  rse, iDb);.    s
8860: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
8870: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
8880: 20 30 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73   0, reg1);.    s
8890: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
88a0: 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 36 2c 20  (v, OP_Blob, 6, 
88b0: 72 65 67 33 2c 20 30 2c 20 6e 75 6c 6c 52 6f 77  reg3, 0, nullRow
88c0: 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P4_STATIC);.  
88d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
88e0: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
88f0: 2c 20 30 2c 20 72 65 67 33 2c 20 72 65 67 31 29  , 0, reg3, reg1)
8900: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8910: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
8920: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
8930: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8940: 70 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b  p0(v, OP_Close);
8950: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61  .  }..  /* Norma
8960: 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65  l (non-error) re
8970: 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72  turn. */.  retur
8980: 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  n;..  /* If an e
8990: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20  rror occurs, we 
89a0: 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67  jump here */.beg
89b0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a  in_table_error:.
89c0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
89d0: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  db, zName);.  re
89e0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 74 20  turn;.}../* Set 
89f0: 70 72 6f 70 65 72 74 69 65 73 20 6f 66 20 61 20  properties of a 
8a00: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 62 61 73  table column bas
8a10: 65 64 20 6f 6e 20 74 68 65 20 28 6d 61 67 69 63  ed on the (magic
8a20: 61 6c 29 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74  al).** name of t
8a30: 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 23 69  he column..*/.#i
8a40: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8a50: 48 49 44 44 45 4e 5f 43 4f 4c 55 4d 4e 53 0a 76  HIDDEN_COLUMNS.v
8a60: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  oid sqlite3Colum
8a70: 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e  nPropertiesFromN
8a80: 61 6d 65 28 54 61 62 6c 65 20 2a 70 54 61 62 2c  ame(Table *pTab,
8a90: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b 0a   Column *pCol){.
8aa0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
8ab0: 72 6e 69 63 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61  rnicmp(pCol->zNa
8ac0: 6d 65 2c 20 22 5f 5f 68 69 64 64 65 6e 5f 5f 22  me, "__hidden__"
8ad0: 2c 20 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 10)==0 ){.    
8ae0: 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c  pCol->colFlags |
8af0: 3d 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e  = COLFLAG_HIDDEN
8b00: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54  ;.  }else if( pT
8b10: 61 62 20 26 26 20 70 43 6f 6c 21 3d 70 54 61 62  ab && pCol!=pTab
8b20: 2d 3e 61 43 6f 6c 20 26 26 20 28 70 43 6f 6c 5b  ->aCol && (pCol[
8b30: 2d 31 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43  -1].colFlags & C
8b40: 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e 29 20 29  OLFLAG_HIDDEN) )
8b50: 7b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46  {.    pTab->tabF
8b60: 6c 61 67 73 20 7c 3d 20 54 46 5f 4f 4f 4f 48 69  lags |= TF_OOOHi
8b70: 64 64 65 6e 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  dden;.  }.}.#end
8b80: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  if.../*.** Add a
8b90: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74   new column to t
8ba0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
8bb0: 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
8bc0: 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cted..**.** The 
8bd0: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
8be0: 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66  s routine once f
8bf0: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64  or each column d
8c00: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e  eclaration.** in
8c10: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
8c20: 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69  statement.  sqli
8c30: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29 20  te3StartTable() 
8c40: 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66  gets called.** f
8c50: 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e  irst to get thin
8c60: 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20  gs going.  Then 
8c70: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
8c80: 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a  called for each.
8c90: 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f  ** column..*/.vo
8ca0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
8cb0: 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  umn(Parse *pPars
8cc0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  e, Token *pName,
8cd0: 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a   Token *pType){.
8ce0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
8cf0: 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  t i;.  char *z;.
8d00: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20    char *zType;. 
8d10: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
8d20: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
8d30: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
8d40: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
8d50: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
8d60: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  turn;.  if( p->n
8d70: 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69 74  Col+1>db->aLimit
8d80: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
8d90: 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c  LUMN] ){.    sql
8da0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8db0: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63  rse, "too many c
8dc0: 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70  olumns on %s", p
8dd0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
8de0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  turn;.  }.  z = 
8df0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
8e00: 61 77 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 6e 20  aw(db, pName->n 
8e10: 2b 20 70 54 79 70 65 2d 3e 6e 20 2b 20 32 29 3b  + pType->n + 2);
8e20: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
8e30: 74 75 72 6e 3b 0a 20 20 69 66 28 20 49 4e 5f 52  turn;.  if( IN_R
8e40: 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 20 73  ENAME_OBJECT ) s
8e50: 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65  qlite3RenameToke
8e60: 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f  nMap(pParse, (vo
8e70: 69 64 2a 29 7a 2c 20 70 4e 61 6d 65 29 3b 0a 20  id*)z, pName);. 
8e80: 20 6d 65 6d 63 70 79 28 7a 2c 20 70 4e 61 6d 65   memcpy(z, pName
8e90: 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a  ->z, pName->n);.
8ea0: 20 20 7a 5b 70 4e 61 6d 65 2d 3e 6e 5d 20 3d 20    z[pName->n] = 
8eb0: 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75  0;.  sqlite3Dequ
8ec0: 6f 74 65 28 7a 29 3b 0a 20 20 66 6f 72 28 69 3d  ote(z);.  for(i=
8ed0: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
8ee0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
8ef0: 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 2c 20 70  te3_stricmp(z, p
8f00: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
8f10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
8f20: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8f30: 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20  rse, "duplicate 
8f40: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22  column name: %s"
8f50: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , z);.      sqli
8f60: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
8f70: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
8f80: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
8f90: 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d  (p->nCol & 0x7)=
8fa0: 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e  =0 ){.    Column
8fb0: 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77   *aNew;.    aNew
8fc0: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
8fd0: 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28  loc(db,p->aCol,(
8fe0: 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f  p->nCol+8)*sizeo
8ff0: 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a  f(p->aCol[0]));.
9000: 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
9010: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9020: 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
9030: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
9040: 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d   }.    p->aCol =
9050: 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f   aNew;.  }.  pCo
9060: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  l = &p->aCol[p->
9070: 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  nCol];.  memset(
9080: 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCol, 0, sizeof(
9090: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  p->aCol[0]));.  
90a0: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b  pCol->zName = z;
90b0: 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  .  sqlite3Column
90c0: 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61  PropertiesFromNa
90d0: 6d 65 28 70 2c 20 70 43 6f 6c 29 3b 0a 20 0a 20  me(p, pCol);. . 
90e0: 20 69 66 28 20 70 54 79 70 65 2d 3e 6e 3d 3d 30   if( pType->n==0
90f0: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
9100: 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20 73  ere is no type s
9110: 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e  pecified, column
9120: 73 20 68 61 76 65 20 74 68 65 20 64 65 66 61 75  s have the defau
9130: 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20  lt affinity.    
9140: 2a 2a 20 27 42 4c 4f 42 27 20 77 69 74 68 20 61  ** 'BLOB' with a
9150: 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20 6f 66   default size of
9160: 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20   4 bytes. */.   
9170: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
9180: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  = SQLITE_AFF_BLO
9190: 42 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a 45  B;.    pCol->szE
91a0: 73 74 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53  st = 1;.#ifdef S
91b0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52  QLITE_ENABLE_SOR
91c0: 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20  TER_REFERENCES. 
91d0: 20 20 20 69 66 28 20 34 3e 3d 73 71 6c 69 74 65     if( 4>=sqlite
91e0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
91f0: 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20 20 20  SorterRef ){.   
9200: 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67     pCol->colFlag
9210: 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 53 4f 52  s |= COLFLAG_SOR
9220: 54 45 52 52 45 46 3b 0a 20 20 20 20 7d 0a 23 65  TERREF;.    }.#e
9230: 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
9240: 20 20 7a 54 79 70 65 20 3d 20 7a 20 2b 20 73 71    zType = z + sq
9250: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
9260: 20 2b 20 31 3b 0a 20 20 20 20 6d 65 6d 63 70 79   + 1;.    memcpy
9270: 28 7a 54 79 70 65 2c 20 70 54 79 70 65 2d 3e 7a  (zType, pType->z
9280: 2c 20 70 54 79 70 65 2d 3e 6e 29 3b 0a 20 20 20  , pType->n);.   
9290: 20 7a 54 79 70 65 5b 70 54 79 70 65 2d 3e 6e 5d   zType[pType->n]
92a0: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
92b0: 33 44 65 71 75 6f 74 65 28 7a 54 79 70 65 29 3b  3Dequote(zType);
92c0: 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  .    pCol->affin
92d0: 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66 66  ity = sqlite3Aff
92e0: 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65 2c  inityType(zType,
92f0: 20 70 43 6f 6c 29 3b 0a 20 20 20 20 70 43 6f 6c   pCol);.    pCol
9300: 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f  ->colFlags |= CO
9310: 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a 20  LFLAG_HASTYPE;. 
9320: 20 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a   }.  p->nCol++;.
9330: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72    pParse->constr
9340: 61 69 6e 74 4e 61 6d 65 2e 6e 20 3d 20 30 3b 0a  aintName.n = 0;.
9350: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
9360: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
9370: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
9380: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
9390: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
93a0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
93b0: 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f  tatement.  A "NO
93c0: 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69  T NULL" constrai
93d0: 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73  nt has.** been s
93e0: 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e  een on a column.
93f0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
9400: 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20  ets the notNull 
9410: 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  flag on.** the c
9420: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
9430: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
9440: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
9450: 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61  te3AddNotNull(Pa
9460: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
9470: 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62   onError){.  Tab
9480: 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20  le *p;.  Column 
9490: 2a 70 43 6f 6c 3b 0a 20 20 70 20 3d 20 70 50 61  *pCol;.  p = pPa
94a0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
94b0: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45    if( p==0 || NE
94c0: 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29  VER(p->nCol<1) )
94d0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20   return;.  pCol 
94e0: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43  = &p->aCol[p->nC
94f0: 6f 6c 2d 31 5d 3b 0a 20 20 70 43 6f 6c 2d 3e 6e  ol-1];.  pCol->n
9500: 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45  otNull = (u8)onE
9510: 72 72 6f 72 3b 0a 20 20 70 2d 3e 74 61 62 46 6c  rror;.  p->tabFl
9520: 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 4e 6f 74  ags |= TF_HasNot
9530: 4e 75 6c 6c 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  Null;..  /* Set 
9540: 74 68 65 20 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20  the uniqNotNull 
9550: 66 6c 61 67 20 6f 6e 20 61 6e 79 20 55 4e 49 51  flag on any UNIQ
9560: 55 45 20 6f 72 20 50 4b 20 69 6e 64 65 78 65 73  UE or PK indexes
9570: 20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65 64   already created
9580: 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 63 6f  .  ** on this co
9590: 6c 75 6d 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20  lumn.  */.  if( 
95a0: 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26  pCol->colFlags &
95b0: 20 43 4f 4c 46 4c 41 47 5f 55 4e 49 51 55 45 20   COLFLAG_UNIQUE 
95c0: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
95d0: 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  dx;.    for(pIdx
95e0: 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  =p->pIndex; pIdx
95f0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
9600: 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
9610: 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  t( pIdx->nKeyCol
9620: 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e 45  ==1 && pIdx->onE
9630: 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b  rror!=OE_None );
9640: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
9650: 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 70 2d  >aiColumn[0]==p-
9660: 3e 6e 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20  >nCol-1 ){.     
9670: 20 20 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74     pIdx->uniqNot
9680: 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20  Null = 1;.      
9690: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
96a0: 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f  *.** Scan the co
96b0: 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a  lumn type name z
96c0: 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79  Type (length nTy
96d0: 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74  pe) and return t
96e0: 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  he.** associated
96f0: 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a   affinity type..
9700: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
9710: 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69  ne does a case-i
9720: 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63  ndependent searc
9730: 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74  h of zType for t
9740: 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67  he .** substring
9750: 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s in the followi
9760: 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65  ng table. If one
9770: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e   of the substrin
9780: 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20  gs is.** found, 
9790: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
97a0: 67 20 61 66 66 69 6e 69 74 79 20 69 73 20 72 65  g affinity is re
97b0: 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65  turned. If zType
97c0: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72   contains.** mor
97d0: 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68  e than one of th
97e0: 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e  e substrings, en
97f0: 74 72 69 65 73 20 74 6f 77 61 72 64 20 74 68 65  tries toward the
9800: 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20   top of .** the 
9810: 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72  table take prior
9820: 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ity. For example
9830: 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20 27 42  , if zType is 'B
9840: 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c  LOBINT', .** SQL
9850: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
9860: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
9870: 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20 20  ** Substring    
9880: 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d   | Affinity.** -
9890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
98a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
98b0: 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20 20  ** 'INT'        
98c0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   | SQLITE_AFF_IN
98d0: 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20  TEGER.** 'CHAR' 
98e0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
98f0: 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f  AFF_TEXT.** 'CLO
9900: 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  B'        | SQLI
9910: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
9920: 54 45 58 54 27 20 20 20 20 20 20 20 20 7c 20 53  TEXT'        | S
9930: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a  QLITE_AFF_TEXT.*
9940: 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20  * 'BLOB'        
9950: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  | SQLITE_AFF_BLO
9960: 42 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20 20  B.** 'REAL'     
9970: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
9980: 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20  REAL.** 'FLOA'  
9990: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
99a0: 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42  FF_REAL.** 'DOUB
99b0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
99c0: 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a  E_AFF_REAL.**.**
99d0: 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   If none of the 
99e0: 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68  substrings in th
99f0: 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72  e above table ar
9a00: 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49  e found,.** SQLI
9a10: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69  TE_AFF_NUMERIC i
9a20: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63  s returned..*/.c
9a30: 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e  har sqlite3Affin
9a40: 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63 68  ityType(const ch
9a50: 61 72 20 2a 7a 49 6e 2c 20 43 6f 6c 75 6d 6e 20  ar *zIn, Column 
9a60: 2a 70 43 6f 6c 29 7b 0a 20 20 75 33 32 20 68 20  *pCol){.  u32 h 
9a70: 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66 20  = 0;.  char aff 
9a80: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  = SQLITE_AFF_NUM
9a90: 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 63 68  ERIC;.  const ch
9aa0: 61 72 20 2a 7a 43 68 61 72 20 3d 20 30 3b 0a 0a  ar *zChar = 0;..
9ab0: 20 20 61 73 73 65 72 74 28 20 7a 49 6e 21 3d 30    assert( zIn!=0
9ac0: 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e   );.  while( zIn
9ad0: 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20 28  [0] ){.    h = (
9ae0: 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55  h<<8) + sqlite3U
9af0: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49  pperToLower[(*zI
9b00: 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a 49  n)&0xff];.    zI
9b10: 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d  n++;.    if( h==
9b20: 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c  (('c'<<24)+('h'<
9b30: 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72  <16)+('a'<<8)+'r
9b40: 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  ') ){           
9b50: 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20    /* CHAR */.   
9b60: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
9b70: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 20 20  AFF_TEXT;.      
9b80: 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 20 20 20  zChar = zIn;.   
9b90: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
9ba0: 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'c'<<24)+('l'<<1
9bb0: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29  6)+('o'<<8)+'b')
9bc0: 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f   ){       /* CLO
9bd0: 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  B */.      aff =
9be0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
9bf0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9c00: 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27  h==(('t'<<24)+('
9c10: 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29  e'<<16)+('x'<<8)
9c20: 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f  +'t') ){       /
9c30: 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20  * TEXT */.      
9c40: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
9c50: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _TEXT;.    }else
9c60: 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32   if( h==(('b'<<2
9c70: 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f  4)+('l'<<16)+('o
9c80: 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20  '<<8)+'b')      
9c90: 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20      /* BLOB */. 
9ca0: 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d         && (aff==
9cb0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
9cc0: 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  IC || aff==SQLIT
9cd0: 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20  E_AFF_REAL) ){. 
9ce0: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
9cf0: 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20  E_AFF_BLOB;.    
9d00: 20 20 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27 28    if( zIn[0]=='(
9d10: 27 20 29 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b  ' ) zChar = zIn;
9d20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9d30: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
9d40: 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  INT.    }else if
9d50: 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b  ( h==(('r'<<24)+
9d60: 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c  ('e'<<16)+('a'<<
9d70: 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20 20 20  8)+'l')         
9d80: 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20   /* REAL */.    
9d90: 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49      && aff==SQLI
9da0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
9db0: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
9dc0: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20  LITE_AFF_REAL;. 
9dd0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
9de0: 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c  (('f'<<24)+('l'<
9df0: 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61  <16)+('o'<<8)+'a
9e00: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ')          /* F
9e10: 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  LOA */.        &
9e20: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
9e30: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
9e40: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
9e50: 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65  AFF_REAL;.    }e
9e60: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 64 27  lse if( h==(('d'
9e70: 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b  <<24)+('o'<<16)+
9e80: 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20 20 20  ('u'<<8)+'b')   
9e90: 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a         /* DOUB *
9ea0: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66  /.        && aff
9eb0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
9ec0: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66  ERIC ){.      af
9ed0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  f = SQLITE_AFF_R
9ee0: 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  EAL;.#endif.    
9ef0: 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30 78 30  }else if( (h&0x0
9f00: 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69 27 3c  0FFFFFF)==(('i'<
9f10: 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74  <16)+('n'<<8)+'t
9f20: 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20  ') ){    /* INT 
9f30: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
9f40: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
9f50: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
9f60: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
9f70: 49 66 20 70 43 6f 6c 20 69 73 20 6e 6f 74 20 4e  If pCol is not N
9f80: 55 4c 4c 2c 20 73 74 6f 72 65 20 61 6e 20 65 73  ULL, store an es
9f90: 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 66 69  timate of the fi
9fa0: 65 6c 64 20 73 69 7a 65 2e 20 20 54 68 65 0a 20  eld size.  The. 
9fb0: 20 2a 2a 20 65 73 74 69 6d 61 74 65 20 69 73 20   ** estimate is 
9fc0: 73 63 61 6c 65 64 20 73 6f 20 74 68 61 74 20 74  scaled so that t
9fd0: 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 69 6e  he size of an in
9fe0: 74 65 67 65 72 20 69 73 20 31 2e 20 20 2a 2f 0a  teger is 1.  */.
9ff0: 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20    if( pCol ){.  
a000: 20 20 69 6e 74 20 76 20 3d 20 30 3b 20 20 20 2f    int v = 0;   /
a010: 2a 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20 69  * default size i
a020: 73 20 61 70 70 72 6f 78 20 34 20 62 79 74 65 73  s approx 4 bytes
a030: 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66 66 3c   */.    if( aff<
a040: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
a050: 49 43 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  IC ){.      if( 
a060: 7a 43 68 61 72 20 29 7b 0a 20 20 20 20 20 20 20  zChar ){.       
a070: 20 77 68 69 6c 65 28 20 7a 43 68 61 72 5b 30 5d   while( zChar[0]
a080: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
a090: 28 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74  ( sqlite3Isdigit
a0a0: 28 7a 43 68 61 72 5b 30 5d 29 20 29 7b 0a 20 20  (zChar[0]) ){.  
a0b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f            /* BLO
a0c0: 42 28 6b 29 2c 20 56 41 52 43 48 41 52 28 6b 29  B(k), VARCHAR(k)
a0d0: 2c 20 43 48 41 52 28 6b 29 20 2d 3e 20 72 3d 28  , CHAR(k) -> r=(
a0e0: 6b 2f 34 2b 31 29 20 2a 2f 0a 20 20 20 20 20 20  k/4+1) */.      
a0f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 74        sqlite3Get
a100: 49 6e 74 33 32 28 7a 43 68 61 72 2c 20 26 76 29  Int32(zChar, &v)
a110: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
a120: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
a130: 0a 20 20 20 20 20 20 20 20 20 20 7a 43 68 61 72  .          zChar
a140: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
a150: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a160: 20 20 20 76 20 3d 20 31 36 3b 20 20 20 2f 2a 20     v = 16;   /* 
a170: 42 4c 4f 42 2c 20 54 45 58 54 2c 20 43 4c 4f 42  BLOB, TEXT, CLOB
a180: 20 2d 3e 20 72 3d 35 20 20 28 61 70 70 72 6f 78   -> r=5  (approx
a190: 20 32 30 20 62 79 74 65 73 29 2a 2f 0a 20 20 20   20 bytes)*/.   
a1a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65     }.    }.#ifde
a1b0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
a1c0: 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45  SORTER_REFERENCE
a1d0: 53 0a 20 20 20 20 69 66 28 20 76 3e 3d 73 71 6c  S.    if( v>=sql
a1e0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
a1f0: 2e 73 7a 53 6f 72 74 65 72 52 65 66 20 29 7b 0a  .szSorterRef ){.
a200: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46        pCol->colF
a210: 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
a220: 53 4f 52 54 45 52 52 45 46 3b 0a 20 20 20 20 7d  SORTERREF;.    }
a230: 0a 23 65 6e 64 69 66 0a 20 20 20 20 76 20 3d 20  .#endif.    v = 
a240: 76 2f 34 20 2b 20 31 3b 0a 20 20 20 20 69 66 28  v/4 + 1;.    if(
a250: 20 76 3e 32 35 35 20 29 20 76 20 3d 20 32 35 35   v>255 ) v = 255
a260: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a 45 73  ;.    pCol->szEs
a270: 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65 74  t = v;.  }.  ret
a280: 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aff;.}../*.*
a290: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
a2a0: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
a2b0: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f  value for the mo
a2c0: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
a2d0: 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74  d column.** of t
a2e0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
a2f0: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
a300: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66  ction..**.** Def
a310: 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65  ault value expre
a320: 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63  ssions must be c
a330: 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20  onstant.  Raise 
a340: 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20  an exception if 
a350: 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74  this.** is not t
a360: 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  he case..**.** T
a370: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
a380: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
a390: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
a3a0: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
a3b0: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
a3c0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
a3d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
a3e0: 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 0a  ddDefaultValue(.
a3f0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
a400: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
a410: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
a420: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
a430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a440: 68 65 20 70 61 72 73 65 64 20 65 78 70 72 65 73  he parsed expres
a450: 73 69 6f 6e 20 6f 66 20 74 68 65 20 64 65 66 61  sion of the defa
a460: 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 63  ult value */.  c
a470: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61 72  onst char *zStar
a480: 74 2c 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74  t,      /* Start
a490: 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74 20   of the default 
a4a0: 76 61 6c 75 65 20 74 65 78 74 20 2a 2f 0a 20 20  value text */.  
a4b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64  const char *zEnd
a4c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
a4d0: 74 20 63 68 61 72 61 63 74 65 72 20 70 61 73 74  t character past
a4e0: 20 65 6e 64 20 6f 66 20 64 65 66 61 75 74 20 76   end of defaut v
a4f0: 61 6c 75 65 20 74 65 78 74 20 2a 2f 0a 29 7b 0a  alue text */.){.
a500: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f    Table *p;.  Co
a510: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71  lumn *pCol;.  sq
a520: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
a530: 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 70 50  se->db;.  p = pP
a540: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
a550: 0a 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20  .  if( p!=0 ){. 
a560: 20 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61     pCol = &(p->a
a570: 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b  Col[p->nCol-1]);
a580: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
a590: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
a5a0: 72 46 75 6e 63 74 69 6f 6e 28 70 45 78 70 72 2c  rFunction(pExpr,
a5b0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20   db->init.busy) 
a5c0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
a5d0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
a5e0: 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20   "default value 
a5f0: 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69  of column [%s] i
a600: 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c  s not constant",
a610: 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d  .          pCol-
a620: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c  >zName);.    }el
a630: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 63  se{.      /* A c
a640: 6f 70 79 20 6f 66 20 70 45 78 70 72 20 69 73 20  opy of pExpr is 
a650: 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  used instead of 
a660: 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73  the original, as
a670: 20 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a   pExpr contains.
a680: 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20        ** tokens 
a690: 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f  that point to vo
a6a0: 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 0a 20  latile memory.. 
a6b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78       */.      Ex
a6c0: 70 72 20 78 3b 0a 20 20 20 20 20 20 73 71 6c 69  pr x;.      sqli
a6d0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
a6e0: 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a  , pCol->pDflt);.
a6f0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 78 2c        memset(&x,
a700: 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a   0, sizeof(x));.
a710: 20 20 20 20 20 20 78 2e 6f 70 20 3d 20 54 4b 5f        x.op = TK_
a720: 53 50 41 4e 3b 0a 20 20 20 20 20 20 78 2e 75 2e  SPAN;.      x.u.
a730: 7a 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33  zToken = sqlite3
a740: 44 62 53 70 61 6e 44 75 70 28 64 62 2c 20 7a 53  DbSpanDup(db, zS
a750: 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20 20  tart, zEnd);.   
a760: 20 20 20 78 2e 70 4c 65 66 74 20 3d 20 70 45 78     x.pLeft = pEx
a770: 70 72 3b 0a 20 20 20 20 20 20 78 2e 66 6c 61 67  pr;.      x.flag
a780: 73 20 3d 20 45 50 5f 53 6b 69 70 3b 0a 20 20 20  s = EP_Skip;.   
a790: 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d     pCol->pDflt =
a7a0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
a7b0: 64 62 2c 20 26 78 2c 20 45 58 50 52 44 55 50 5f  db, &x, EXPRDUP_
a7c0: 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20 20 73  REDUCE);.      s
a7d0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
a7e0: 20 78 2e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20   x.u.zToken);.  
a7f0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 49 4e    }.  }.  if( IN
a800: 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29  _RENAME_OBJECT )
a810: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e  {.    sqlite3Ren
a820: 61 6d 65 45 78 70 72 55 6e 6d 61 70 28 70 50 61  ameExprUnmap(pPa
a830: 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d  rse, pExpr);.  }
a840: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
a850: 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
a860: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 61 63 6b 77 61  .}../*.** Backwa
a870: 72 64 73 20 43 6f 6d 70 61 74 69 62 69 6c 69 74  rds Compatibilit
a880: 79 20 48 61 63 6b 3a 0a 2a 2a 20 0a 2a 2a 20 48  y Hack:.** .** H
a890: 69 73 74 6f 72 69 63 61 6c 20 76 65 72 73 69 6f  istorical versio
a8a0: 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61 63 63  ns of SQLite acc
a8b0: 65 70 74 65 64 20 73 74 72 69 6e 67 73 20 61 73  epted strings as
a8c0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e   column names in
a8d0: 0a 2a 2a 20 69 6e 64 65 78 65 73 20 61 6e 64 20  .** indexes and 
a8e0: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
a8f0: 74 72 61 69 6e 74 73 20 61 6e 64 20 69 6e 20 55  traints and in U
a900: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
a910: 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  s.  Example:.**.
a920: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41  **     CREATE TA
a930: 42 4c 45 20 78 79 7a 28 61 2c 62 2c 63 2c 64 2c  BLE xyz(a,b,c,d,
a940: 65 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 27 61  e,PRIMARY KEY('a
a950: 27 29 2c 55 4e 49 51 55 45 28 27 62 27 2c 27 63  '),UNIQUE('b','c
a960: 27 20 43 4f 4c 4c 41 54 45 20 74 72 69 6d 29 0a  ' COLLATE trim).
a970: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 49 4e  **     CREATE IN
a980: 44 45 58 20 61 62 63 20 4f 4e 20 78 79 7a 28 27  DEX abc ON xyz('
a990: 63 27 2c 27 64 27 20 44 45 53 43 2c 27 65 27 20  c','d' DESC,'e' 
a9a0: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 44  COLLATE nocase D
a9b0: 45 53 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ESC);.**.** This
a9c0: 20 69 73 20 67 6f 6f 66 79 2e 20 20 42 75 74 20   is goofy.  But 
a9d0: 74 6f 20 70 72 65 73 65 72 76 65 20 62 61 63 6b  to preserve back
a9e0: 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
a9f0: 69 74 79 20 77 65 20 63 6f 6e 74 69 6e 75 65 20  ity we continue 
aa00: 74 6f 0a 2a 2a 20 61 63 63 65 70 74 20 69 74 2e  to.** accept it.
aa10: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64    This routine d
aa20: 6f 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  oes the necessar
aa30: 79 20 63 6f 6e 76 65 72 73 69 6f 6e 2e 20 20 49  y conversion.  I
aa40: 74 20 63 6f 6e 76 65 72 74 73 0a 2a 2a 20 74 68  t converts.** th
aa50: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 67 69 76  e expression giv
aa60: 65 6e 20 69 6e 20 69 74 73 20 61 72 67 75 6d 65  en in its argume
aa70: 6e 74 20 66 72 6f 6d 20 61 20 54 4b 5f 53 54 52  nt from a TK_STR
aa80: 49 4e 47 20 69 6e 74 6f 20 61 20 54 4b 5f 49 44  ING into a TK_ID
aa90: 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 70 72 65  .** if the expre
aaa0: 73 73 69 6f 6e 20 69 73 20 6a 75 73 74 20 61 20  ssion is just a 
aab0: 54 4b 5f 53 54 52 49 4e 47 20 77 69 74 68 20 61  TK_STRING with a
aac0: 6e 20 6f 70 74 69 6f 6e 61 6c 20 43 4f 4c 4c 41  n optional COLLA
aad0: 54 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 49 66  TE clause..** If
aae0: 20 74 68 65 20 65 70 78 72 65 73 73 69 6f 6e 20   the epxression 
aaf0: 69 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65  is anything othe
ab00: 72 20 74 68 61 6e 20 54 4b 5f 53 54 52 49 4e 47  r than TK_STRING
ab10: 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  , the expression
ab20: 20 69 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64   is.** unchanged
ab30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ab40: 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f   sqlite3StringTo
ab50: 49 64 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  Id(Expr *p){.  i
ab60: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52  f( p->op==TK_STR
ab70: 49 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e 6f 70  ING ){.    p->op
ab80: 20 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 65 6c 73   = TK_ID;.  }els
ab90: 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  e if( p->op==TK_
aba0: 43 4f 4c 4c 41 54 45 20 26 26 20 70 2d 3e 70 4c  COLLATE && p->pL
abb0: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49  eft->op==TK_STRI
abc0: 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 65  NG ){.    p->pLe
abd0: 66 74 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a  ft->op = TK_ID;.
abe0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73    }.}../*.** Des
abf0: 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41  ignate the PRIMA
ac00: 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74  RY KEY for the t
ac10: 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20  able.  pList is 
ac20: 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  a list of names 
ac30: 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  .** of columns t
ac40: 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69  hat form the pri
ac50: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c  mary key.  If pL
ac60: 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ist is NULL, the
ac70: 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  n the.** most re
ac80: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
ac90: 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
aca0: 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20   is the primary 
acb0: 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62  key..**.** A tab
acc0: 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d  le can have at m
acd0: 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  ost one primary 
ace0: 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62  key.  If the tab
acf0: 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a  le already has.*
ad00: 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  * a primary key 
ad10: 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65  (and this is the
ad20: 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20   second primary 
ad30: 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65  key) then create
ad40: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a   an.** error..**
ad50: 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41  .** If the PRIMA
ad60: 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73  RY KEY is on a s
ad70: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f  ingle column who
ad80: 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49  se datatype is I
ad90: 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20  NTEGER,.** then 
ada0: 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75  we will try to u
adb0: 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61  se that column a
adc0: 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65  s the rowid.  Se
add0: 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65  t the Table.iPKe
ade0: 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68  y.** field of th
adf0: 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
ae00: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
ae10: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
ae20: 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49  e.** INTEGER PRI
ae30: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e  MARY KEY column.
ae40: 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73    Table.iPKey is
ae50: 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68   set to -1 if th
ae60: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54  ere is.** no INT
ae70: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
ae80: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b  ..**.** If the k
ae90: 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54  ey is not an INT
aea0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
aeb0: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
aec0: 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20  unique.** index 
aed0: 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f  for the key.  No
aee0: 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65   index is create
aef0: 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52  d for INTEGER PR
af00: 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76  IMARY KEYs..*/.v
af10: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72  oid sqlite3AddPr
af20: 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73  imaryKey(.  Pars
af30: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
af40: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
af50: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
af60: 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  pList,  /* List 
af70: 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74  of field names t
af80: 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
af90: 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
afa0: 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
afb0: 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e  o with a uniquen
afc0: 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  ess conflict */.
afd0: 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20    int autoInc,  
afe0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
aff0: 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  he AUTOINCREMENT
b000: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
b010: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ent */.  int sor
b020: 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51  tOrder     /* SQ
b030: 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53  LITE_SO_ASC or S
b040: 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f  QLITE_SO_DESC */
b050: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
b060: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
b070: 54 61 62 6c 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20  Table;.  Column 
b080: 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  *pCol = 0;.  int
b090: 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20   iCol = -1, i;. 
b0a0: 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 69 66   int nTerm;.  if
b0b0: 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f  ( pTab==0 ) goto
b0c0: 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69   primary_key_exi
b0d0: 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74  t;.  if( pTab->t
b0e0: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73  abFlags & TF_Has
b0f0: 50 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20  PrimaryKey ){.  
b100: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
b110: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
b120: 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68   "table \"%s\" h
b130: 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  as more than one
b140: 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70   primary key", p
b150: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
b160: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
b170: 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54  y_exit;.  }.  pT
b180: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
b190: 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79  TF_HasPrimaryKey
b1a0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
b1b0: 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70   ){.    iCol = p
b1c0: 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20  Tab->nCol - 1;. 
b1d0: 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d     pCol = &pTab-
b1e0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20  >aCol[iCol];.   
b1f0: 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
b200: 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b  |= COLFLAG_PRIMK
b210: 45 59 3b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20  EY;.    nTerm = 
b220: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
b230: 6e 54 65 72 6d 20 3d 20 70 4c 69 73 74 2d 3e 6e  nTerm = pList->n
b240: 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Expr;.    for(i=
b250: 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29  0; i<nTerm; i++)
b260: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43  {.      Expr *pC
b270: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
b280: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c  prSkipCollate(pL
b290: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
b2a0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
b2b0: 70 43 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20  pCExpr!=0 );.   
b2c0: 20 20 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67     sqlite3String
b2d0: 54 6f 49 64 28 70 43 45 78 70 72 29 3b 0a 20 20  ToId(pCExpr);.  
b2e0: 20 20 20 20 69 66 28 20 70 43 45 78 70 72 2d 3e      if( pCExpr->
b2f0: 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20  op==TK_ID ){.   
b300: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
b310: 2a 7a 43 4e 61 6d 65 20 3d 20 70 43 45 78 70 72  *zCName = pCExpr
b320: 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
b330: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
b340: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
b350: 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
b360: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
b370: 74 72 49 43 6d 70 28 7a 43 4e 61 6d 65 2c 20 70  trICmp(zCName, p
b380: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
b390: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
b3a0: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
b3b0: 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  &pTab->aCol[iCol
b3c0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ];.            p
b3d0: 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d  Col->colFlags |=
b3e0: 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59   COLFLAG_PRIMKEY
b3f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
b400: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
b410: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b420: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
b430: 66 28 20 6e 54 65 72 6d 3d 3d 31 0a 20 20 20 26  f( nTerm==1.   &
b440: 26 20 70 43 6f 6c 0a 20 20 20 26 26 20 73 71 6c  & pCol.   && sql
b450: 69 74 65 33 53 74 72 49 43 6d 70 28 73 71 6c 69  ite3StrICmp(sqli
b460: 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70 43  te3ColumnType(pC
b470: 6f 6c 2c 22 22 29 2c 20 22 49 4e 54 45 47 45 52  ol,""), "INTEGER
b480: 22 29 3d 3d 30 0a 20 20 20 26 26 20 73 6f 72 74  ")==0.   && sort
b490: 4f 72 64 65 72 21 3d 53 51 4c 49 54 45 5f 53 4f  Order!=SQLITE_SO
b4a0: 5f 44 45 53 43 0a 20 20 29 7b 0a 20 20 20 20 69  _DESC.  ){.    i
b4b0: 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
b4c0: 45 43 54 20 26 26 20 70 4c 69 73 74 20 29 7b 0a  ECT && pList ){.
b4d0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 45 78        Expr *pCEx
b4e0: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
b4f0: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73  SkipCollate(pLis
b500: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
b510: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e        sqlite3Ren
b520: 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50  ameTokenRemap(pP
b530: 61 72 73 65 2c 20 26 70 54 61 62 2d 3e 69 50 4b  arse, &pTab->iPK
b540: 65 79 2c 20 70 43 45 78 70 72 29 3b 0a 20 20 20  ey, pCExpr);.   
b550: 20 7d 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b   }.    pTab->iPK
b560: 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70  ey = iCol;.    p
b570: 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28  Tab->keyConf = (
b580: 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20  u8)onError;.    
b590: 61 73 73 65 72 74 28 20 61 75 74 6f 49 6e 63 3d  assert( autoInc=
b5a0: 3d 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31  =0 || autoInc==1
b5b0: 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61   );.    pTab->ta
b5c0: 62 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e  bFlags |= autoIn
b5d0: 63 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  c*TF_Autoincreme
b5e0: 6e 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  nt;.    if( pLis
b5f0: 74 20 29 20 70 50 61 72 73 65 2d 3e 69 50 6b 53  t ) pParse->iPkS
b600: 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74  ortOrder = pList
b610: 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
b620: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75  ;.  }else if( au
b630: 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66  toInc ){.#ifndef
b640: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
b650: 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73  OINCREMENT.    s
b660: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
b670: 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52  Parse, "AUTOINCR
b680: 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c  EMENT is only al
b690: 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20  lowed on an ".  
b6a0: 20 20 20 20 20 22 49 4e 54 45 47 45 52 20 50 52       "INTEGER PR
b6b0: 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e  IMARY KEY");.#en
b6c0: 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
b6d0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
b6e0: 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30  dex(pParse, 0, 0
b6f0: 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72  , 0, pList, onEr
b700: 72 6f 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  ror, 0,.        
b710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b720: 20 20 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c     0, sortOrder,
b730: 20 30 2c 20 53 51 4c 49 54 45 5f 49 44 58 54 59   0, SQLITE_IDXTY
b740: 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 29 3b 0a  PE_PRIMARYKEY);.
b750: 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20      pList = 0;. 
b760: 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f   }..primary_key_
b770: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45  exit:.  sqlite3E
b780: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
b790: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29  arse->db, pList)
b7a0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
b7b0: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 43  *.** Add a new C
b7c0: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
b7d0: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
b7e0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
b7f0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
b800: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 68 65  id sqlite3AddChe
b810: 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  ckConstraint(.  
b820: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
b830: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
b840: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
b850: 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20 54  pCheckExpr  /* T
b860: 68 65 20 63 68 65 63 6b 20 65 78 70 72 65 73 73  he check express
b870: 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  ion */.){.#ifnde
b880: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
b890: 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  ECK.  Table *pTa
b8a0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
b8b0: 54 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33  Table;.  sqlite3
b8c0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
b8d0: 62 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26 26  b;.  if( pTab &&
b8e0: 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41   !IN_DECLARE_VTA
b8f0: 42 0a 20 20 20 26 26 20 21 73 71 6c 69 74 65 33  B.   && !sqlite3
b900: 42 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79 28  BtreeIsReadonly(
b910: 64 62 2d 3e 61 44 62 5b 64 62 2d 3e 69 6e 69 74  db->aDb[db->init
b920: 2e 69 44 62 5d 2e 70 42 74 29 0a 20 20 29 7b 0a  .iDb].pBt).  ){.
b930: 20 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63 6b      pTab->pCheck
b940: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
b950: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
b960: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 70   pTab->pCheck, p
b970: 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 20 20  CheckExpr);.    
b980: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73  if( pParse->cons
b990: 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a  traintName.n ){.
b9a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
b9b0: 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
b9c0: 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65 63  rse, pTab->pChec
b9d0: 6b 2c 20 26 70 50 61 72 73 65 2d 3e 63 6f 6e 73  k, &pParse->cons
b9e0: 74 72 61 69 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a  traintName, 1);.
b9f0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65      }.  }else.#e
ba00: 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ndif.  {.    sql
ba10: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
ba20: 50 61 72 73 65 2d 3e 64 62 2c 20 70 43 68 65 63  Parse->db, pChec
ba30: 6b 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  kExpr);.  }.}../
ba40: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c  *.** Set the col
ba50: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
ba60: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
ba70: 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c  ntly parsed tabl
ba80: 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74  e column.** to t
ba90: 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e  he CollSeq given
baa0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
bab0: 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28  3AddCollateType(
bac0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
bad0: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
bae0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
baf0: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c   i;.  char *zCol
bb00: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
bb10: 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61 6d 65  /* Dequoted name
bb20: 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65   of collation se
bb30: 71 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69  quence */.  sqli
bb40: 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
bb50: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
bb60: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
bb70: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
bb80: 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50 61  ol-1;.  db = pPa
bb90: 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c  rse->db;.  zColl
bba0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
bbb0: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b  omToken(db, pTok
bbc0: 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c  en);.  if( !zCol
bbd0: 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69  l ) return;..  i
bbe0: 66 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  f( sqlite3Locate
bbf0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
bc00: 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 49 6e  zColl) ){.    In
bc10: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 73  dex *pIdx;.    s
bc20: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
bc30: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c   p->aCol[i].zCol
bc40: 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b  l);.    p->aCol[
bc50: 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c  i].zColl = zColl
bc60: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  ;.  .    /* If t
bc70: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63  he column is dec
bc80: 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e  lared as "<name>
bc90: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c   PRIMARY KEY COL
bca0: 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20  LATE <type>",.  
bcb0: 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64    ** then an ind
bcc0: 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ex may have been
bcd0: 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73   created on this
bce0: 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74   column before t
bcf0: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74  he.    ** collat
bd00: 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64  ion type was add
bd10: 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73  ed. Correct this
bd20: 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61   if it is the ca
bd30: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  se..    */.    f
bd40: 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65  or(pIdx=p->pInde
bd50: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
bd60: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
bd70: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
bd80: 6e 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20  nKeyCol==1 );.  
bd90: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
bda0: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a  Column[0]==i ){.
bdb0: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
bdc0: 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f  Coll[0] = p->aCo
bdd0: 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  l[i].zColl;.    
bde0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
bdf0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  e{.    sqlite3Db
be00: 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
be10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
be20: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
be30: 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  rns the collatio
be40: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64  n sequence for d
be50: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74  atabase native t
be60: 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20  ext.** encoding 
be70: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
be80: 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20  e string zName, 
be90: 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a  length nName..**
bea0: 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65  .** If the reque
beb0: 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  sted collation s
bec0: 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61  equence is not a
bed0: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74  vailable, or not
bee0: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e   available.** in
bef0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
bf00: 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74  tive encoding, t
bf10: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
bf20: 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20  tory is invoked 
bf30: 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74  to.** request it
bf40: 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  . If the collati
bf50: 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20  on factory does 
bf60: 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20  not supply such 
bf70: 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61  a sequence,.** a
bf80: 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  nd the sequence 
bf90: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  is available in 
bfa0: 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63  another text enc
bfb0: 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74  oding, then that
bfc0: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
bfd0: 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
bfe0: 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66  f no versions of
bff0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
c000: 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e  ollations sequen
c010: 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ce are available
c020: 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20  , or.** another 
c030: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
c040: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
c050: 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nd an error mess
c060: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
c070: 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a  .** pParse..**.*
c080: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
c090: 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
c0a0: 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f  nd sqlite3FindCo
c0b0: 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20 72  llSeq().  This r
c0c0: 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65  outine.** invoke
c0d0: 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
c0e0: 66 61 63 74 6f 72 79 20 69 66 20 74 68 65 20 6e  factory if the n
c0f0: 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63  amed collation c
c100: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a  annot be found.*
c110: 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 20  * and generates 
c120: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
c130: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
c140: 3a 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  : sqlite3FindCol
c150: 6c 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33 47  lSeq(), sqlite3G
c160: 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43  etCollSeq().*/.C
c170: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c  ollSeq *sqlite3L
c180: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72  ocateCollSeq(Par
c190: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
c1a0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
c1b0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
c1c0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38  pParse->db;.  u8
c1d0: 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a   enc = ENC(db);.
c1e0: 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20    u8 initbusy = 
c1f0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20  db->init.busy;. 
c200: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
c210: 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
c220: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
c230: 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69  b, enc, zName, i
c240: 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20  nitbusy);.  if( 
c250: 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70  !initbusy && (!p
c260: 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e  Coll || !pColl->
c270: 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43 6f  xCmp) ){.    pCo
c280: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43  ll = sqlite3GetC
c290: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 65  ollSeq(pParse, e
c2a0: 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65  nc, pColl, zName
c2b0: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
c2c0: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   pColl;.}.../*.*
c2d0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
c2e0: 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d  that will increm
c2f0: 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63  ent the schema c
c300: 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ookie..**.** The
c310: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69   schema cookie i
c320: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
c330: 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68  ine when the sch
c340: 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64  ema for the.** d
c350: 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e  atabase changes.
c360: 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68    After each sch
c370: 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20  ema change, the 
c380: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20  cookie value.** 
c390: 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61  changes.  When a
c3a0: 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72   process first r
c3b0: 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20  eads the schema 
c3c0: 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a  it records the.*
c3d0: 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65  * cookie.  There
c3e0: 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20  after, whenever 
c3f0: 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73  it goes to acces
c400: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a  s the database,.
c410: 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65  ** it checks the
c420: 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20   cookie to make 
c430: 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20  sure the schema 
c440: 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a  has not changed.
c450: 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20  ** since it was 
c460: 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  last read..**.**
c470: 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f   This plan is no
c480: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c  t completely bul
c490: 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69  let-proof.  It i
c4a0: 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a  s possible for.*
c4b0: 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20  * the schema to 
c4c0: 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20  change multiple 
c4d0: 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68  times and for th
c4e0: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a  e cookie to be.*
c4f0: 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72  * set back to pr
c500: 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20  ior value.  But 
c510: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61  schema changes a
c520: 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a  re infrequent.**
c530: 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69   and the probabi
c540: 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20  lity of hitting 
c550: 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20  the same cookie 
c560: 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a  value is only.**
c570: 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33   1 chance in 2^3
c580: 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66  2.  So we're saf
c590: 65 20 65 6e 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20  e enough..**.** 
c5a0: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
c5b0: 46 3a 20 52 2d 33 34 32 33 30 2d 35 36 30 34 39  F: R-34230-56049
c5c0: 20 53 51 4c 69 74 65 20 61 75 74 6f 6d 61 74 69   SQLite automati
c5d0: 63 61 6c 6c 79 20 69 6e 63 72 65 6d 65 6e 74 73  cally increments
c5e0: 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 2d 76  .** the schema-v
c5f0: 65 72 73 69 6f 6e 20 77 68 65 6e 65 76 65 72 20  ersion whenever 
c600: 74 68 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67  the schema chang
c610: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
c620: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
c630: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
c640: 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74  nt iDb){.  sqlit
c650: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
c660: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  >db;.  Vdbe *v =
c670: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
c680: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c690: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
c6a0: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
c6b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c6c0: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  Op3(v, OP_SetCoo
c6d0: 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f  kie, iDb, BTREE_
c6e0: 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20  SCHEMA_VERSION, 
c6f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c700: 20 20 20 20 28 69 6e 74 29 28 31 2b 28 75 6e 73      (int)(1+(uns
c710: 69 67 6e 65 64 29 64 62 2d 3e 61 44 62 5b 69 44  igned)db->aDb[iD
c720: 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  b].pSchema->sche
c730: 6d 61 5f 63 6f 6f 6b 69 65 29 29 3b 0a 7d 0a 0a  ma_cookie));.}..
c740: 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68  /*.** Measure th
c750: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
c760: 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f  acters needed to
c770: 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   output the give
c780: 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e  n.** identifier.
c790: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74    The number ret
c7a0: 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61  urned includes a
c7b0: 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a  ny quotes used.*
c7c0: 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69  * but does not i
c7d0: 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20  nclude the null 
c7e0: 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a  terminator..**.*
c7f0: 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 20 69  * The estimate i
c800: 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20  s conservative. 
c810: 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72   It might be lar
c820: 67 65 72 20 74 68 61 74 20 77 68 61 74 20 69 73  ger that what is
c830: 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65  .** really neede
c840: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
c850: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e   identLength(con
c860: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
c870: 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b  nt n;.  for(n=0;
c880: 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a   *z; n++, z++){.
c890: 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20      if( *z=='"' 
c8a0: 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20  ){ n++; }.  }.  
c8b0: 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a  return n + 2;.}.
c8c0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ./*.** The first
c8d0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
c8e0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75  pointer to an ou
c8f0: 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 65  tput buffer. The
c900: 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61   second .** para
c910: 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
c920: 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  er to an integer
c930: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
c940: 68 65 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20  he offset at.** 
c950: 77 68 69 63 68 20 74 6f 20 77 72 69 74 65 20 69  which to write i
c960: 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62  nto the output b
c970: 75 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63  uffer. This func
c980: 74 69 6f 6e 20 63 6f 70 69 65 73 20 74 68 65 0a  tion copies the.
c990: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  ** nul-terminate
c9a0: 64 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64  d string pointed
c9b0: 20 74 6f 20 62 79 20 74 68 65 20 74 68 69 72 64   to by the third
c9c0: 20 70 61 72 61 6d 65 74 65 72 2c 20 7a 53 69 67   parameter, zSig
c9d0: 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20  nedIdent,.** to 
c9e0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 66  the specified of
c9f0: 66 73 65 74 20 69 6e 20 74 68 65 20 62 75 66 66  fset in the buff
ca00: 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 20 2a  er and updates *
ca10: 70 49 64 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a  pIdx to refer.**
ca20: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
ca30: 74 65 20 61 66 74 65 72 20 74 68 65 20 6c 61 73  te after the las
ca40: 74 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 62  t byte written b
ca50: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
ca60: 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 73  .** .** If the s
ca70: 74 72 69 6e 67 20 7a 53 69 67 6e 65 64 49 64 65  tring zSignedIde
ca80: 6e 74 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69  nt consists enti
ca90: 72 65 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75  rely of alpha-nu
caa0: 6d 65 72 69 63 0a 2a 2a 20 63 68 61 72 61 63 74  meric.** charact
cab0: 65 72 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65  ers, does not be
cac0: 67 69 6e 20 77 69 74 68 20 61 20 64 69 67 69 74  gin with a digit
cad0: 20 61 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20 53   and is not an S
cae0: 51 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74  QL keyword,.** t
caf0: 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64  hen it is copied
cb00: 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62   to the output b
cb10: 75 66 66 65 72 20 65 78 61 63 74 6c 79 20 61 73  uffer exactly as
cb20: 20 69 74 20 69 73 2e 20 4f 74 68 65 72 77 69 73   it is. Otherwis
cb30: 65 2c 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f 74  e,.** it is quot
cb40: 65 64 20 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d  ed using double-
cb50: 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  quotes..*/.stati
cb60: 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28  c void identPut(
cb70: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49  char *z, int *pI
cb80: 64 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65  dx, char *zSigne
cb90: 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67  dIdent){.  unsig
cba0: 6e 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74  ned char *zIdent
cbb0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
cbc0: 72 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b  r*)zSignedIdent;
cbd0: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65  .  int i, j, nee
cbe0: 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70  dQuote;.  i = *p
cbf0: 49 64 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b  Idx;..  for(j=0;
cc00: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
cc10: 7b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  {.    if( !sqlit
cc20: 65 33 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74  e3Isalnum(zIdent
cc30: 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a  [j]) && zIdent[j
cc40: 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a  ]!='_' ) break;.
cc50: 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20    }.  needQuote 
cc60: 3d 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74  = sqlite3Isdigit
cc70: 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20  (zIdent[0]).    
cc80: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
cc90: 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49  e3KeywordCode(zI
cca0: 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a  dent, j)!=TK_ID.
ccb0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 7a              || z
ccc0: 49 64 65 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20 20  Ident[j]!=0.    
ccd0: 20 20 20 20 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b          || j==0;
cce0: 0a 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  ..  if( needQuot
ccf0: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  e ) z[i++] = '"'
cd00: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
cd10: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
cd20: 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e    z[i++] = zIden
cd30: 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49  t[j];.    if( zI
cd40: 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a  dent[j]=='"' ) z
cd50: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d  [i++] = '"';.  }
cd60: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
cd70: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
cd80: 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a  .  z[i] = 0;.  *
cd90: 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a  pIdx = i;.}../*.
cda0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52  ** Generate a CR
cdb0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
cdc0: 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65  ment appropriate
cdd0: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a   for the given.*
cde0: 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79  * table.  Memory
cdf0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78   to hold the tex
ce00: 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  t of the stateme
ce10: 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a  nt is obtained.*
ce20: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  * from sqliteMal
ce30: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
ce40: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
ce50: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
ce60: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
ce70: 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74  *createTableStmt
ce80: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
ce90: 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ble *p){.  int i
cea0: 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a  , k, n;.  char *
ceb0: 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a  zStmt;.  char *z
cec0: 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45  Sep, *zSep2, *zE
ced0: 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  nd;.  Column *pC
cee0: 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66  ol;.  n = 0;.  f
cef0: 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f  or(pCol = p->aCo
cf00: 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  l, i=0; i<p->nCo
cf10: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
cf20: 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c  .    n += identL
cf30: 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  ength(pCol->zNam
cf40: 65 29 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20  e) + 5;.  }.  n 
cf50: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
cf60: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
cf70: 6e 3c 35 30 20 29 7b 20 0a 20 20 20 20 7a 53 65  n<50 ){ .    zSe
cf80: 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70  p = "";.    zSep
cf90: 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e  2 = ",";.    zEn
cfa0: 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65  d = ")";.  }else
cfb0: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e  {.    zSep = "\n
cfc0: 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d    ";.    zSep2 =
cfd0: 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45   ",\n  ";.    zE
cfe0: 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a  nd = "\n)";.  }.
cff0: 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d    n += 35 + 6*p-
d000: 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d  >nCol;.  zStmt =
d010: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
d020: 52 61 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28  Raw(0, n);.  if(
d030: 20 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20   zStmt==0 ){.   
d040: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
d050: 28 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  (db);.    return
d060: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
d070: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53  3_snprintf(n, zS
d080: 74 6d 74 2c 20 22 43 52 45 41 54 45 20 54 41 42  tmt, "CREATE TAB
d090: 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c  LE ");.  k = sql
d0a0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74  ite3Strlen30(zSt
d0b0: 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28  mt);.  identPut(
d0c0: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e  zStmt, &k, p->zN
d0d0: 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b  ame);.  zStmt[k+
d0e0: 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28  +] = '(';.  for(
d0f0: 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d  pCol=p->aCol, i=
d100: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
d110: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
d120: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
d130: 72 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65  r * const azType
d140: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f  [] = {.        /
d150: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  * SQLITE_AFF_BLO
d160: 42 20 20 20 20 2a 2f 20 22 22 2c 0a 20 20 20 20  B    */ "",.    
d170: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
d180: 46 5f 54 45 58 54 20 20 20 20 2a 2f 20 22 20 54  F_TEXT    */ " T
d190: 45 58 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a  EXT",.        /*
d1a0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
d1b0: 52 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20  RIC */ " NUM",. 
d1c0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
d1d0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20  _AFF_INTEGER */ 
d1e0: 22 20 49 4e 54 22 2c 0a 20 20 20 20 20 20 20 20  " INT",.        
d1f0: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  /* SQLITE_AFF_RE
d200: 41 4c 20 20 20 20 2a 2f 20 22 20 52 45 41 4c 22  AL    */ " REAL"
d210: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
d220: 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  len;.    const c
d230: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20  har *zType;..   
d240: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
d250: 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d  f(n-k, &zStmt[k]
d260: 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b  , zSep);.    k +
d270: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
d280: 30 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20  0(&zStmt[k]);.  
d290: 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a    zSep = zSep2;.
d2a0: 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74      identPut(zSt
d2b0: 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e  mt, &k, pCol->zN
d2c0: 61 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ame);.    assert
d2d0: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
d2e0: 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  -SQLITE_AFF_BLOB
d2f0: 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73   >= 0 );.    ass
d300: 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ert( pCol->affin
d310: 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ity-SQLITE_AFF_B
d320: 4c 4f 42 20 3c 20 41 72 72 61 79 53 69 7a 65 28  LOB < ArraySize(
d330: 61 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20 74  azType) );.    t
d340: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
d350: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
d360: 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20  AFF_BLOB );.    
d370: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e  testcase( pCol->
d380: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
d390: 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20  _AFF_TEXT );.   
d3a0: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
d3b0: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
d3c0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b  E_AFF_NUMERIC );
d3d0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
d3e0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
d3f0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
d400: 52 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  R );.    testcas
d410: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
d420: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  y==SQLITE_AFF_RE
d430: 41 4c 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a  AL );.    .    z
d440: 54 79 70 65 20 3d 20 61 7a 54 79 70 65 5b 70 43  Type = azType[pC
d450: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20 53  ol->affinity - S
d460: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 3b  QLITE_AFF_BLOB];
d470: 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74  .    len = sqlit
d480: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65  e3Strlen30(zType
d490: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
d4a0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
d4b0: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 0a  QLITE_AFF_BLOB .
d4c0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
d4d0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73  Col->affinity==s
d4e0: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
d4f0: 70 65 28 7a 54 79 70 65 2c 20 30 29 20 29 3b 0a  pe(zType, 0) );.
d500: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 53 74 6d      memcpy(&zStm
d510: 74 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c 65 6e  t[k], zType, len
d520: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b  );.    k += len;
d530: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 3d  .    assert( k<=
d540: 6e 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n );.  }.  sqlit
d550: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c  e3_snprintf(n-k,
d560: 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22   &zStmt[k], "%s"
d570: 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72  , zEnd);.  retur
d580: 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zStmt;.}../*.*
d590: 2a 20 52 65 73 69 7a 65 20 61 6e 20 49 6e 64 65  * Resize an Inde
d5a0: 78 20 6f 62 6a 65 63 74 20 74 6f 20 68 6f 6c 64  x object to hold
d5b0: 20 4e 20 63 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c   N columns total
d5c0: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
d5d0: 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
d5e0: 73 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d  s and SQLITE_NOM
d5f0: 45 4d 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72  EM on an OOM err
d600: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
d610: 74 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a  t resizeIndexObj
d620: 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ect(sqlite3 *db,
d630: 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e   Index *pIdx, in
d640: 74 20 4e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45  t N){.  char *zE
d650: 78 74 72 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74  xtra;.  int nByt
d660: 65 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6e  e;.  if( pIdx->n
d670: 43 6f 6c 75 6d 6e 3e 3d 4e 20 29 20 72 65 74 75  Column>=N ) retu
d680: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
d690: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 73  assert( pIdx->is
d6a0: 52 65 73 69 7a 65 64 3d 3d 30 20 29 3b 0a 20 20  Resized==0 );.  
d6b0: 6e 42 79 74 65 20 3d 20 28 73 69 7a 65 6f 66 28  nByte = (sizeof(
d6c0: 63 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28  char*) + sizeof(
d6d0: 69 31 36 29 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a  i16) + 1)*N;.  z
d6e0: 45 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33 44  Extra = sqlite3D
d6f0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
d700: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 7a 45  nByte);.  if( zE
d710: 78 74 72 61 3d 3d 30 20 29 20 72 65 74 75 72 6e  xtra==0 ) return
d720: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
d730: 50 54 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78  PT;.  memcpy(zEx
d740: 74 72 61 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  tra, pIdx->azCol
d750: 6c 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  l, sizeof(char*)
d760: 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b  *pIdx->nColumn);
d770: 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20  .  pIdx->azColl 
d780: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29  = (const char**)
d790: 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61  zExtra;.  zExtra
d7a0: 20 2b 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 2a   += sizeof(char*
d7b0: 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45  )*N;.  memcpy(zE
d7c0: 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 69 43 6f  xtra, pIdx->aiCo
d7d0: 6c 75 6d 6e 2c 20 73 69 7a 65 6f 66 28 69 31 36  lumn, sizeof(i16
d7e0: 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  )*pIdx->nColumn)
d7f0: 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  ;.  pIdx->aiColu
d800: 6d 6e 20 3d 20 28 69 31 36 2a 29 7a 45 78 74 72  mn = (i16*)zExtr
d810: 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73  a;.  zExtra += s
d820: 69 7a 65 6f 66 28 69 31 36 29 2a 4e 3b 0a 20 20  izeof(i16)*N;.  
d830: 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70  memcpy(zExtra, p
d840: 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  Idx->aSortOrder,
d850: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b   pIdx->nColumn);
d860: 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  .  pIdx->aSortOr
d870: 64 65 72 20 3d 20 28 75 38 2a 29 7a 45 78 74 72  der = (u8*)zExtr
d880: 61 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  a;.  pIdx->nColu
d890: 6d 6e 20 3d 20 4e 3b 0a 20 20 70 49 64 78 2d 3e  mn = N;.  pIdx->
d8a0: 69 73 52 65 73 69 7a 65 64 20 3d 20 31 3b 0a 20  isResized = 1;. 
d8b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d8c0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69  K;.}../*.** Esti
d8d0: 6d 61 74 65 20 74 68 65 20 74 6f 74 61 6c 20 72  mate the total r
d8e0: 6f 77 20 77 69 64 74 68 20 66 6f 72 20 61 20 74  ow width for a t
d8f0: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
d900: 76 6f 69 64 20 65 73 74 69 6d 61 74 65 54 61 62  void estimateTab
d910: 6c 65 57 69 64 74 68 28 54 61 62 6c 65 20 2a 70  leWidth(Table *p
d920: 54 61 62 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Tab){.  unsigned
d930: 20 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 63   wTable = 0;.  c
d940: 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 70 54 61  onst Column *pTa
d950: 62 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  bCol;.  int i;. 
d960: 20 66 6f 72 28 69 3d 70 54 61 62 2d 3e 6e 43 6f   for(i=pTab->nCo
d970: 6c 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d  l, pTabCol=pTab-
d980: 3e 61 43 6f 6c 3b 20 69 3e 30 3b 20 69 2d 2d 2c  >aCol; i>0; i--,
d990: 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20   pTabCol++){.   
d9a0: 20 77 54 61 62 6c 65 20 2b 3d 20 70 54 61 62 43   wTable += pTabC
d9b0: 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20  ol->szEst;.  }. 
d9c0: 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79   if( pTab->iPKey
d9d0: 3c 30 20 29 20 77 54 61 62 6c 65 2b 2b 3b 0a 20  <0 ) wTable++;. 
d9e0: 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20   pTab->szTabRow 
d9f0: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
da00: 77 54 61 62 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a  wTable*4);.}../*
da10: 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
da20: 20 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66   average size of
da30: 20 61 20 72 6f 77 20 66 6f 72 20 61 6e 20 69 6e   a row for an in
da40: 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
da50: 6f 69 64 20 65 73 74 69 6d 61 74 65 49 6e 64 65  oid estimateInde
da60: 78 57 69 64 74 68 28 49 6e 64 65 78 20 2a 70 49  xWidth(Index *pI
da70: 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  dx){.  unsigned 
da80: 77 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 69 6e  wIndex = 0;.  in
da90: 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c  t i;.  const Col
daa0: 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 49 64 78  umn *aCol = pIdx
dab0: 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a  ->pTable->aCol;.
dac0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
dad0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
dae0: 7b 0a 20 20 20 20 69 31 36 20 78 20 3d 20 70 49  {.    i16 x = pI
daf0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  dx->aiColumn[i];
db00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 78 3c 70  .    assert( x<p
db10: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43 6f  Idx->pTable->nCo
db20: 6c 20 29 3b 0a 20 20 20 20 77 49 6e 64 65 78 20  l );.    wIndex 
db30: 2b 3d 20 78 3c 30 20 3f 20 31 20 3a 20 61 43 6f  += x<0 ? 1 : aCo
db40: 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  l[pIdx->aiColumn
db50: 5b 69 5d 5d 2e 73 7a 45 73 74 3b 0a 20 20 7d 0a  [i]].szEst;.  }.
db60: 20 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77    pIdx->szIdxRow
db70: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
db80: 28 77 49 6e 64 65 78 2a 34 29 3b 0a 7d 0a 0a 2f  (wIndex*4);.}../
db90: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
dba0: 20 76 61 6c 75 65 20 78 20 69 73 20 66 6f 75 6e   value x is foun
dbb0: 64 20 61 6e 79 20 6f 66 20 74 68 65 20 66 69 72  d any of the fir
dbc0: 73 74 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20  st nCol entries 
dbd0: 6f 66 20 61 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74  of aiCol[].*/.st
dbe0: 61 74 69 63 20 69 6e 74 20 68 61 73 43 6f 6c 75  atic int hasColu
dbf0: 6d 6e 28 63 6f 6e 73 74 20 69 31 36 20 2a 61 69  mn(const i16 *ai
dc00: 43 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20 69  Col, int nCol, i
dc10: 6e 74 20 78 29 7b 0a 20 20 77 68 69 6c 65 28 20  nt x){.  while( 
dc20: 6e 43 6f 6c 2d 2d 20 3e 20 30 20 29 20 69 66 28  nCol-- > 0 ) if(
dc30: 20 78 3d 3d 2a 28 61 69 43 6f 6c 2b 2b 29 20 29   x==*(aiCol++) )
dc40: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
dc50: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 63  urn 0;.}../* Rec
dc60: 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 4e 6f  ompute the colNo
dc70: 74 49 64 78 65 64 20 66 69 65 6c 64 20 6f 66 20  tIdxed field of 
dc80: 74 68 65 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  the Index..**.**
dc90: 20 63 6f 6c 4e 6f 74 49 64 78 65 64 20 69 73 20   colNotIdxed is 
dca0: 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20 68  a bitmask that h
dcb0: 61 73 20 61 20 30 20 62 69 74 20 72 65 70 72 65  as a 0 bit repre
dcc0: 73 65 6e 74 69 6e 67 20 65 61 63 68 20 69 6e 64  senting each ind
dcd0: 65 78 65 64 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20  exed.** columns 
dce0: 74 68 61 74 20 61 72 65 20 77 69 74 68 69 6e 20  that are within 
dcf0: 74 68 65 20 66 69 72 73 74 20 36 33 20 63 6f 6c  the first 63 col
dd00: 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c  umns of the tabl
dd10: 65 2e 20 20 54 68 65 0a 2a 2a 20 68 69 67 68 2d  e.  The.** high-
dd20: 6f 72 64 65 72 20 62 69 74 20 6f 66 20 63 6f 6c  order bit of col
dd30: 4e 6f 74 49 64 78 65 64 20 69 73 20 61 6c 77 61  NotIdxed is alwa
dd40: 79 73 20 31 2e 20 20 41 6c 6c 20 75 6e 69 6e 64  ys 1.  All unind
dd50: 65 78 65 64 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  exed columns.** 
dd60: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 76  of the table hav
dd70: 65 20 61 20 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e a 1..**.** The
dd80: 20 63 6f 6c 4e 6f 74 49 64 78 65 64 20 6d 61 73   colNotIdxed mas
dd90: 6b 20 69 73 20 41 4e 44 2d 65 64 20 77 69 74 68  k is AND-ed with
dda0: 20 74 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d   the SrcList.a[]
ddb0: 2e 63 6f 6c 55 73 65 64 20 6d 61 73 6b 0a 2a 2a  .colUsed mask.**
ddc0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
ddd0: 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 63 6f   the index is co
dde0: 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2f  vering index..*/
ddf0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 63  .static void rec
de00: 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74  omputeColumnsNot
de10: 49 6e 64 65 78 65 64 28 49 6e 64 65 78 20 2a 70  Indexed(Index *p
de20: 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20  Idx){.  Bitmask 
de30: 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a  m = 0;.  int j;.
de40: 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43    for(j=pIdx->nC
de50: 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a  olumn-1; j>=0; j
de60: 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d  --){.    int x =
de70: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
de80: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 30  j];.    if( x>=0
de90: 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
dea0: 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a  se( x==BMS-1 );.
deb0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
dec0: 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20  x==BMS-2 );.    
ded0: 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 20    if( x<BMS-1 ) 
dee0: 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b  m |= MASKBIT(x);
def0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 64  .    }.  }.  pId
df00: 78 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65 64 20 3d  x->colNotIdxed =
df10: 20 7e 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 28   ~m;.  assert( (
df20: 70 49 64 78 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65  pIdx->colNotIdxe
df30: 64 3e 3e 36 33 29 3d 3d 31 20 29 3b 0a 7d 0a 0a  d>>63)==1 );.}..
df40: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
df50: 6e 65 20 72 75 6e 73 20 61 74 20 74 68 65 20 65  ne runs at the e
df60: 6e 64 20 6f 66 20 70 61 72 73 69 6e 67 20 61 20  nd of parsing a 
df70: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
df80: 74 65 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20 68  tement that.** h
df90: 61 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  as a WITHOUT ROW
dfa0: 49 44 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20  ID clause.  The 
dfb0: 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74  job of this rout
dfc0: 69 6e 65 20 69 73 20 74 6f 20 63 6f 6e 76 65 72  ine is to conver
dfd0: 74 20 62 6f 74 68 0a 2a 2a 20 69 6e 74 65 72 6e  t both.** intern
dfe0: 61 6c 20 73 63 68 65 6d 61 20 64 61 74 61 20 73  al schema data s
dff0: 74 72 75 63 74 75 72 65 73 20 61 6e 64 20 74 68  tructures and th
e000: 65 20 67 65 6e 65 72 61 74 65 64 20 56 44 42 45  e generated VDBE
e010: 20 63 6f 64 65 20 73 6f 20 74 68 61 74 20 74 68   code so that th
e020: 65 79 0a 2a 2a 20 61 72 65 20 61 70 70 72 6f 70  ey.** are approp
e030: 72 69 61 74 65 20 66 6f 72 20 61 20 57 49 54 48  riate for a WITH
e040: 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 20  OUT ROWID table 
e050: 69 6e 73 74 65 61 64 20 6f 66 20 61 20 72 6f 77  instead of a row
e060: 69 64 20 74 61 62 6c 65 2e 0a 2a 2a 20 43 68 61  id table..** Cha
e070: 6e 67 65 73 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a  nges include:.**
e080: 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 53 65 74  .**     (1)  Set
e090: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   all columns of 
e0a0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
e0b0: 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 74 6f  schema object to
e0c0: 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a   be NOT NULL..**
e0d0: 20 20 20 20 20 28 32 29 20 20 43 6f 6e 76 65 72       (2)  Conver
e0e0: 74 20 50 33 20 70 61 72 61 6d 65 74 65 72 20 6f  t P3 parameter o
e0f0: 66 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65 42  f the OP_CreateB
e100: 74 72 65 65 20 66 72 6f 6d 20 42 54 52 45 45 5f  tree from BTREE_
e110: 49 4e 54 4b 45 59 20 0a 2a 2a 20 20 20 20 20 20  INTKEY .**      
e120: 20 20 20 20 69 6e 74 6f 20 42 54 52 45 45 5f 42      into BTREE_B
e130: 4c 4f 42 4b 45 59 2e 0a 2a 2a 20 20 20 20 20 28  LOBKEY..**     (
e140: 33 29 20 20 42 79 70 61 73 73 20 74 68 65 20 63  3)  Bypass the c
e150: 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  reation of the s
e160: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
e170: 6c 65 20 65 6e 74 72 79 0a 2a 2a 20 20 20 20 20  le entry.**     
e180: 20 20 20 20 20 66 6f 72 20 74 68 65 20 50 52 49       for the PRI
e190: 4d 41 52 59 20 4b 45 59 20 61 73 20 74 68 65 20  MARY KEY as the 
e1a0: 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65  primary key inde
e1b0: 78 20 69 73 20 6e 6f 77 0a 2a 2a 20 20 20 20 20  x is now.**     
e1c0: 20 20 20 20 20 69 64 65 6e 74 69 66 69 65 64 20       identified 
e1d0: 62 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  by the sqlite_ma
e1e0: 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74 72 79  ster table entry
e1f0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 74   of the table it
e200: 73 65 6c 66 2e 0a 2a 2a 20 20 20 20 20 28 34 29  self..**     (4)
e210: 20 20 53 65 74 20 74 68 65 20 49 6e 64 65 78 2e    Set the Index.
e220: 74 6e 75 6d 20 6f 66 20 74 68 65 20 50 52 49 4d  tnum of the PRIM
e230: 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f 62  ARY KEY Index ob
e240: 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20  ject in the.**  
e250: 20 20 20 20 20 20 20 20 73 63 68 65 6d 61 20 74          schema t
e260: 6f 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66  o the rootpage f
e270: 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74 61 62  rom the main tab
e280: 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 35 29 20 20  le..**     (5)  
e290: 41 64 64 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f  Add all table co
e2a0: 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 50 52 49  lumns to the PRI
e2b0: 4d 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f  MARY KEY Index o
e2c0: 62 6a 65 63 74 0a 2a 2a 20 20 20 20 20 20 20 20  bject.**        
e2d0: 20 20 73 6f 20 74 68 61 74 20 74 68 65 20 50 52    so that the PR
e2e0: 49 4d 41 52 59 20 4b 45 59 20 69 73 20 61 20 63  IMARY KEY is a c
e2f0: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20  overing index.  
e300: 54 68 65 20 73 75 72 70 6c 75 73 0a 2a 2a 20 20  The surplus.**  
e310: 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20          columns 
e320: 61 72 65 20 70 61 72 74 20 6f 66 20 4b 65 79 49  are part of KeyI
e330: 6e 66 6f 2e 6e 41 6c 6c 46 69 65 6c 64 20 61 6e  nfo.nAllField an
e340: 64 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 66  d are not used f
e350: 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73  or.**          s
e360: 6f 72 74 69 6e 67 20 6f 72 20 6c 6f 6f 6b 75 70  orting or lookup
e370: 20 6f 72 20 75 6e 69 71 75 65 6e 65 73 73 20 63   or uniqueness c
e380: 68 65 63 6b 73 2e 0a 2a 2a 20 20 20 20 20 28 36  hecks..**     (6
e390: 29 20 20 52 65 70 6c 61 63 65 20 74 68 65 20 72  )  Replace the r
e3a0: 6f 77 69 64 20 74 61 69 6c 20 6f 6e 20 61 6c 6c  owid tail on all
e3b0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67   automatically g
e3c0: 65 6e 65 72 61 74 65 64 20 55 4e 49 51 55 45 0a  enerated UNIQUE.
e3d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e 64 69  **          indi
e3e0: 63 65 73 20 77 69 74 68 20 74 68 65 20 50 52 49  ces with the PRI
e3f0: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73  MARY KEY columns
e400: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 76 69 72 74  ..**.** For virt
e410: 75 61 6c 20 74 61 62 6c 65 73 2c 20 6f 6e 6c 79  ual tables, only
e420: 20 28 31 29 20 69 73 20 70 65 72 66 6f 72 6d 65   (1) is performe
e430: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
e440: 64 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f  d convertToWitho
e450: 75 74 52 6f 77 69 64 54 61 62 6c 65 28 50 61 72  utRowidTable(Par
e460: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
e470: 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65  e *pTab){.  Inde
e480: 78 20 2a 70 49 64 78 3b 0a 20 20 49 6e 64 65 78  x *pIdx;.  Index
e490: 20 2a 70 50 6b 3b 0a 20 20 69 6e 74 20 6e 50 6b   *pPk;.  int nPk
e4a0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
e4b0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
e4c0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
e4d0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
e4e0: 64 62 65 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  dbe;..  /* Mark 
e4f0: 65 76 65 72 79 20 50 52 49 4d 41 52 59 20 4b 45  every PRIMARY KE
e500: 59 20 63 6f 6c 75 6d 6e 20 61 73 20 4e 4f 54 20  Y column as NOT 
e510: 4e 55 4c 4c 20 28 65 78 63 65 70 74 20 66 6f 72  NULL (except for
e520: 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73   imposter tables
e530: 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ).  */.  if( !db
e540: 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54  ->init.imposterT
e550: 61 62 6c 65 20 29 7b 0a 20 20 20 20 66 6f 72 28  able ){.    for(
e560: 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  i=0; i<pTab->nCo
e570: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
e580: 66 28 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  f( (pTab->aCol[i
e590: 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c  ].colFlags & COL
e5a0: 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21 3d 30  FLAG_PRIMKEY)!=0
e5b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62   ){.        pTab
e5c0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c  ->aCol[i].notNul
e5d0: 6c 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  l = OE_Abort;.  
e5e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
e5f0: 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68  .  /* Convert th
e600: 65 20 50 33 20 6f 70 65 72 61 6e 64 20 6f 66 20  e P3 operand of 
e610: 74 68 65 20 4f 50 5f 43 72 65 61 74 65 42 74 72  the OP_CreateBtr
e620: 65 65 20 6f 70 63 6f 64 65 20 66 72 6f 6d 20 42  ee opcode from B
e630: 54 52 45 45 5f 49 4e 54 4b 45 59 0a 20 20 2a 2a  TREE_INTKEY.  **
e640: 20 69 6e 74 6f 20 42 54 52 45 45 5f 42 4c 4f 42   into BTREE_BLOB
e650: 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  KEY..  */.  if( 
e660: 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61  pParse->addrCrTa
e670: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
e680: 20 76 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   v );.    sqlite
e690: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
e6a0: 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54   pParse->addrCrT
e6b0: 61 62 2c 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45  ab, BTREE_BLOBKE
e6c0: 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  Y);.  }..  /* Lo
e6d0: 63 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59  cate the PRIMARY
e6e0: 20 4b 45 59 20 69 6e 64 65 78 2e 20 20 4f 72 2c   KEY index.  Or,
e6f0: 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 77   if this table w
e700: 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20  as originally.  
e710: 2a 2a 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ** an INTEGER PR
e720: 49 4d 41 52 59 20 4b 45 59 20 74 61 62 6c 65 2c  IMARY KEY table,
e730: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 50 52   create a new PR
e740: 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e  IMARY KEY index.
e750: 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61   .  */.  if( pTa
e760: 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20  b->iPKey>=0 ){. 
e770: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
e780: 73 74 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 69 70  st;.    Token ip
e790: 6b 54 6f 6b 65 6e 3b 0a 20 20 20 20 73 71 6c 69  kToken;.    sqli
e7a0: 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 69 70  te3TokenInit(&ip
e7b0: 6b 54 6f 6b 65 6e 2c 20 70 54 61 62 2d 3e 61 43  kToken, pTab->aC
e7c0: 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e  ol[pTab->iPKey].
e7d0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73  zName);.    pLis
e7e0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
e7f0: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
e800: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
e810: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
e820: 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f  xprAlloc(db, TK_
e830: 49 44 2c 20 26 69 70 6b 54 6f 6b 65 6e 2c 20 30  ID, &ipkToken, 0
e840: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  ));.    if( pLis
e850: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
e860: 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73     pList->a[0].s
e870: 6f 72 74 4f 72 64 65 72 20 3d 20 70 50 61 72 73  ortOrder = pPars
e880: 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72 3b  e->iPkSortOrder;
e890: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
e8a0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d  rse->pNewTable==
e8b0: 70 54 61 62 20 29 3b 0a 20 20 20 20 73 71 6c 69  pTab );.    sqli
e8c0: 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70  te3CreateIndex(p
e8d0: 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20  Parse, 0, 0, 0, 
e8e0: 70 4c 69 73 74 2c 20 70 54 61 62 2d 3e 6b 65 79  pList, pTab->key
e8f0: 43 6f 6e 66 2c 20 30 2c 20 30 2c 20 30 2c 20 30  Conf, 0, 0, 0, 0
e900: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e910: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
e920: 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b  IDXTYPE_PRIMARYK
e930: 45 59 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  EY);.    if( db-
e940: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
e950: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
e960: 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 50 6b 20  return;.    pPk 
e970: 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
e980: 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
e990: 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
e9a0: 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = -1;.  }else{. 
e9b0: 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33     pPk = sqlite3
e9c0: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
e9d0: 70 54 61 62 29 3b 0a 20 20 20 20 61 73 73 65 72  pTab);.    asser
e9e0: 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a 0a 20 20  t( pPk!=0 );..  
e9f0: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 6d 6f    /*.    ** Remo
ea00: 76 65 20 61 6c 6c 20 72 65 64 75 6e 64 61 6e 74  ve all redundant
ea10: 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68   columns from th
ea20: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20  e PRIMARY KEY.  
ea30: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 68 61  For example, cha
ea40: 6e 67 65 0a 20 20 20 20 2a 2a 20 22 50 52 49 4d  nge.    ** "PRIM
ea50: 41 52 59 20 4b 45 59 28 61 2c 62 2c 61 2c 62 2c  ARY KEY(a,b,a,b,
ea60: 63 2c 62 2c 63 2c 64 29 22 20 69 6e 74 6f 20 6a  c,b,c,d)" into j
ea70: 75 73 74 20 22 50 52 49 4d 41 52 59 20 4b 45 59  ust "PRIMARY KEY
ea80: 28 61 2c 62 2c 63 2c 64 29 22 2e 20 20 4c 61 74  (a,b,c,d)".  Lat
ea90: 65 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 61  er.    ** code a
eaa0: 73 73 75 6d 65 73 20 74 68 65 20 50 52 49 4d 41  ssumes the PRIMA
eab0: 52 59 20 4b 45 59 20 63 6f 6e 74 61 69 6e 73 20  RY KEY contains 
eac0: 6e 6f 20 72 65 70 65 61 74 65 64 20 63 6f 6c 75  no repeated colu
ead0: 6d 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mns..    */.    
eae0: 66 6f 72 28 69 3d 6a 3d 31 3b 20 69 3c 70 50 6b  for(i=j=1; i<pPk
eaf0: 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b  ->nKeyCol; i++){
eb00: 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 43 6f  .      if( hasCo
eb10: 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75  lumn(pPk->aiColu
eb20: 6d 6e 2c 20 6a 2c 20 70 50 6b 2d 3e 61 69 43 6f  mn, j, pPk->aiCo
eb30: 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20  lumn[i]) ){.    
eb40: 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e      pPk->nColumn
eb50: 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  --;.      }else{
eb60: 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69  .        pPk->ai
eb70: 43 6f 6c 75 6d 6e 5b 6a 2b 2b 5d 20 3d 20 70 50  Column[j++] = pP
eb80: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  k->aiColumn[i];.
eb90: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
eba0: 20 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3d    pPk->nKeyCol =
ebb0: 20 6a 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   j;.  }.  assert
ebc0: 28 20 70 50 6b 21 3d 30 20 29 3b 0a 20 20 70 50  ( pPk!=0 );.  pP
ebd0: 6b 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20  k->isCovering = 
ebe0: 31 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  1;.  if( !db->in
ebf0: 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c 65  it.imposterTable
ec00: 20 29 20 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e   ) pPk->uniqNotN
ec10: 75 6c 6c 20 3d 20 31 3b 0a 20 20 6e 50 6b 20 3d  ull = 1;.  nPk =
ec20: 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 0a   pPk->nKeyCol;..
ec30: 20 20 2f 2a 20 42 79 70 61 73 73 20 74 68 65 20    /* Bypass the 
ec40: 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  creation of the 
ec50: 50 52 49 4d 41 52 59 20 4b 45 59 20 62 74 72 65  PRIMARY KEY btre
ec60: 65 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65  e and the sqlite
ec70: 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62  _master.  ** tab
ec80: 6c 65 20 65 6e 74 72 79 2e 20 54 68 69 73 20 69  le entry. This i
ec90: 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20  s only required 
eca0: 69 66 20 63 75 72 72 65 6e 74 6c 79 20 67 65 6e  if currently gen
ecb0: 65 72 61 74 69 6e 67 20 56 44 42 45 0a 20 20 2a  erating VDBE.  *
ecc0: 2a 20 63 6f 64 65 20 66 6f 72 20 61 20 43 52 45  * code for a CRE
ecd0: 41 54 45 20 54 41 42 4c 45 20 28 6e 6f 74 20 77  ATE TABLE (not w
ece0: 68 65 6e 20 70 61 72 73 69 6e 67 20 6f 6e 65 20  hen parsing one 
ecf0: 61 73 20 70 61 72 74 20 6f 66 20 72 65 61 64 69  as part of readi
ed00: 6e 67 0a 20 20 2a 2a 20 61 20 64 61 74 61 62 61  ng.  ** a databa
ed10: 73 65 20 73 63 68 65 6d 61 29 2e 20 20 2a 2f 0a  se schema).  */.
ed20: 20 20 69 66 28 20 76 20 26 26 20 70 50 6b 2d 3e    if( v && pPk->
ed30: 74 6e 75 6d 3e 30 20 29 7b 0a 20 20 20 20 61 73  tnum>0 ){.    as
ed40: 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62  sert( db->init.b
ed50: 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  usy==0 );.    sq
ed60: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f  lite3VdbeChangeO
ed70: 70 63 6f 64 65 28 76 2c 20 70 50 6b 2d 3e 74 6e  pcode(v, pPk->tn
ed80: 75 6d 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20  um, OP_Goto);.  
ed90: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74  }..  /* The root
eda0: 20 70 61 67 65 20 6f 66 20 74 68 65 20 50 52 49   page of the PRI
edb0: 4d 41 52 59 20 4b 45 59 20 69 73 20 74 68 65 20  MARY KEY is the 
edc0: 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 20  table root page 
edd0: 2a 2f 0a 20 20 70 50 6b 2d 3e 74 6e 75 6d 20 3d  */.  pPk->tnum =
ede0: 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 0a 20 20   pTab->tnum;..  
edf0: 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 69 6e  /* Update the in
ee00: 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
ee10: 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 55 4e  tation of all UN
ee20: 49 51 55 45 20 69 6e 64 69 63 65 73 20 62 79 20  IQUE indices by 
ee30: 63 6f 6e 76 65 72 74 69 6e 67 0a 20 20 2a 2a 20  converting.  ** 
ee40: 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 20  the final rowid 
ee50: 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20 6f 6e 65 20  column into one 
ee60: 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20  or more columns 
ee70: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
ee80: 45 59 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  EY..  */.  for(p
ee90: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
eea0: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
eeb0: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  x->pNext){.    i
eec0: 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28 20 49 73  nt n;.    if( Is
eed0: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
eee0: 70 49 64 78 29 20 29 20 63 6f 6e 74 69 6e 75 65  pIdx) ) continue
eef0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b  ;.    for(i=n=0;
ef00: 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20   i<nPk; i++){.  
ef10: 20 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75      if( !hasColu
ef20: 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  mn(pIdx->aiColum
ef30: 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  n, pIdx->nKeyCol
ef40: 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  , pPk->aiColumn[
ef50: 69 5d 29 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d  i]) ) n++;.    }
ef60: 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b  .    if( n==0 ){
ef70: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69  .      /* This i
ef80: 6e 64 65 78 20 69 73 20 61 20 73 75 70 65 72 73  ndex is a supers
ef90: 65 74 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72  et of the primar
efa0: 79 20 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20 70  y key */.      p
efb0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70  Idx->nColumn = p
efc0: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20  Idx->nKeyCol;.  
efd0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
efe0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 73 69    }.    if( resi
eff0: 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62  zeIndexObject(db
f000: 2c 20 70 49 64 78 2c 20 70 49 64 78 2d 3e 6e 4b  , pIdx, pIdx->nK
f010: 65 79 43 6f 6c 2b 6e 29 20 29 20 72 65 74 75 72  eyCol+n) ) retur
f020: 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  n;.    for(i=0, 
f030: 6a 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  j=pIdx->nKeyCol;
f040: 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20   i<nPk; i++){.  
f050: 20 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75      if( !hasColu
f060: 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  mn(pIdx->aiColum
f070: 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  n, pIdx->nKeyCol
f080: 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  , pPk->aiColumn[
f090: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  i]) ){.        p
f0a0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
f0b0: 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   = pPk->aiColumn
f0c0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 64  [i];.        pId
f0d0: 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 70  x->azColl[j] = p
f0e0: 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20  Pk->azColl[i];. 
f0f0: 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
f100: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
f110: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
f120: 75 6d 6e 3e 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  umn>=pIdx->nKeyC
f130: 6f 6c 2b 6e 20 29 3b 0a 20 20 20 20 61 73 73 65  ol+n );.    asse
f140: 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
f150: 6e 3e 3d 6a 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  n>=j );.  }..  /
f160: 2a 20 41 64 64 20 61 6c 6c 20 74 61 62 6c 65 20  * Add all table 
f170: 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 50  columns to the P
f180: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
f190: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 6b 3c  .  */.  if( nPk<
f1a0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
f1b0: 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64 65    if( resizeInde
f1c0: 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 50 6b 2c  xObject(db, pPk,
f1d0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 20 72   pTab->nCol) ) r
f1e0: 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69  eturn;.    for(i
f1f0: 3d 30 2c 20 6a 3d 6e 50 6b 3b 20 69 3c 70 54 61  =0, j=nPk; i<pTa
f200: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
f210: 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c       if( !hasCol
f220: 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  umn(pPk->aiColum
f230: 6e 2c 20 6a 2c 20 69 29 20 29 7b 0a 20 20 20 20  n, j, i) ){.    
f240: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 50      assert( j<pP
f250: 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  k->nColumn );.  
f260: 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c        pPk->aiCol
f270: 75 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a 20 20 20 20  umn[j] = i;.    
f280: 20 20 20 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b      pPk->azColl[
f290: 6a 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42  j] = sqlite3StrB
f2a0: 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 20 20 6a  INARY;.        j
f2b0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
f2c0: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
f2d0: 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b  k->nColumn==j );
f2e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
f2f0: 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a 20 20  b->nCol==j );.  
f300: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b 2d 3e  }else{.    pPk->
f310: 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61 62 2d 3e  nColumn = pTab->
f320: 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65 63 6f  nCol;.  }.  reco
f330: 6d 70 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74 49  mputeColumnsNotI
f340: 6e 64 65 78 65 64 28 70 50 6b 29 3b 0a 7d 0a 0a  ndexed(pPk);.}..
f350: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f360: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
f370: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
f380: 75 65 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 61  ue if zName is a
f390: 20 73 68 61 64 6f 77 20 74 61 62 6c 65 20 6e 61   shadow table na
f3a0: 6d 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  me in the curren
f3b0: 74 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  t database.** co
f3c0: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
f3d0: 7a 4e 61 6d 65 20 69 73 20 74 65 6d 70 6f 72 61  zName is tempora
f3e0: 72 69 6c 79 20 6d 6f 64 69 66 69 65 64 20 77 68  rily modified wh
f3f0: 69 6c 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ile this routine
f400: 20 69 73 20 72 75 6e 6e 69 6e 67 2c 20 62 75 74   is running, but
f410: 20 69 73 0a 2a 2a 20 72 65 73 74 6f 72 65 64 20   is.** restored 
f420: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
f430: 76 61 6c 75 65 20 70 72 69 6f 72 20 74 6f 20 74  value prior to t
f440: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
f450: 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
f460: 20 69 6e 74 20 69 73 53 68 61 64 6f 77 54 61 62   int isShadowTab
f470: 6c 65 4e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a  leName(sqlite3 *
f480: 64 62 2c 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  db, char *zName)
f490: 7b 0a 20 20 63 68 61 72 20 2a 7a 54 61 69 6c 3b  {.  char *zTail;
f4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4b0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
f4c0: 74 68 65 20 6c 61 73 74 20 22 5f 22 20 69 6e 20  the last "_" in 
f4d0: 7a 4e 61 6d 65 20 2a 2f 0a 20 20 54 61 62 6c 65  zName */.  Table
f4e0: 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
f4f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
f500: 65 20 74 68 61 74 20 7a 4e 61 6d 65 20 69 73 20  e that zName is 
f510: 61 20 73 68 61 64 6f 77 20 6f 66 20 2a 2f 0a 20  a shadow of */. 
f520: 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 3b 20 20   Module *pMod;  
f530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f540: 2a 20 4d 6f 64 75 6c 65 20 66 6f 72 20 74 68 65  * Module for the
f550: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
f560: 2f 0a 0a 20 20 7a 54 61 69 6c 20 3d 20 73 74 72  /..  zTail = str
f570: 72 63 68 72 28 7a 4e 61 6d 65 2c 20 27 5f 27 29  rchr(zName, '_')
f580: 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c 3d 3d 30  ;.  if( zTail==0
f590: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 2a   ) return 0;.  *
f5a0: 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 70 54 61  zTail = 0;.  pTa
f5b0: 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  b = sqlite3FindT
f5c0: 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
f5d0: 30 29 3b 0a 20 20 2a 7a 54 61 69 6c 20 3d 20 27  0);.  *zTail = '
f5e0: 5f 27 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  _';.  if( pTab==
f5f0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
f600: 69 66 28 20 21 49 73 56 69 72 74 75 61 6c 28 70  if( !IsVirtual(p
f610: 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Tab) ) return 0;
f620: 0a 20 20 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c  .  pMod = (Modul
f630: 65 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46 69  e*)sqlite3HashFi
f640: 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c  nd(&db->aModule,
f650: 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41   pTab->azModuleA
f660: 72 67 5b 30 5d 29 3b 0a 20 20 69 66 28 20 70 4d  rg[0]);.  if( pM
f670: 6f 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  od==0 ) return 0
f680: 3b 0a 20 20 69 66 28 20 70 4d 6f 64 2d 3e 70 4d  ;.  if( pMod->pM
f690: 6f 64 75 6c 65 2d 3e 69 56 65 72 73 69 6f 6e 3c  odule->iVersion<
f6a0: 33 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  3 ) return 0;.  
f6b0: 69 66 28 20 70 4d 6f 64 2d 3e 70 4d 6f 64 75 6c  if( pMod->pModul
f6c0: 65 2d 3e 78 53 68 61 64 6f 77 4e 61 6d 65 3d 3d  e->xShadowName==
f6d0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
f6e0: 72 65 74 75 72 6e 20 70 4d 6f 64 2d 3e 70 4d 6f  return pMod->pMo
f6f0: 64 75 6c 65 2d 3e 78 53 68 61 64 6f 77 4e 61 6d  dule->xShadowNam
f700: 65 28 7a 54 61 69 6c 2b 31 29 3b 0a 7d 0a 23 65  e(zTail+1);.}.#e
f710: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 69 73 53  lse.# define isS
f720: 68 61 64 6f 77 54 61 62 6c 65 4e 61 6d 65 28 78  hadowTableName(x
f730: 2c 79 29 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20  ,y) 0.#endif /* 
f740: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f750: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
f760: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  */../*.** This r
f770: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
f780: 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66   to report the f
f790: 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74 65  inal ")" that te
f7a0: 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52  rminates.** a CR
f7b0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
f7c0: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
f7d0: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
f7e0: 74 68 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f  that other actio
f7f0: 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20  n routines have 
f800: 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a  been building.**
f810: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
f820: 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74   internal hash t
f830: 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20  ables, assuming 
f840: 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a  no errors have.*
f850: 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a  * occurred..**.*
f860: 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74  * An entry for t
f870: 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65  he table is made
f880: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74   in the master t
f890: 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e  able on disk, un
f8a0: 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73 20  less.** this is 
f8b0: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
f8c0: 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75  e or db->init.bu
f8d0: 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d  sy==1.  When db-
f8e0: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a  >init.busy==1.**
f8f0: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
f900: 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c   reading the sql
f910: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
f920: 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74   because we just
f930: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f  .** connected to
f940: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72   the database or
f950: 20 62 65 63 61 75 73 65 20 74 68 65 20 73 71 6c   because the sql
f960: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
f970: 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79   has.** recently
f980: 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74 68 65   changed, so the
f990: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20   entry for this 
f9a0: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78  table already ex
f9b0: 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73  ists in.** the s
f9c0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
f9d0: 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77  le.  We do not w
f9e0: 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69 74  ant to create it
f9f0: 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66   again..**.** If
fa00: 20 74 68 65 20 70 53 65 6c 65 63 74 20 61 72 67   the pSelect arg
fa10: 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  ument is not NUL
fa20: 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  L, it means that
fa30: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
fa40: 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63   was called to c
fa50: 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 67 65  reate a table ge
fa60: 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a  nerated from a .
fa70: 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  ** "CREATE TABLE
fa80: 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e   ... AS SELECT .
fa90: 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  .." statement.  
faa0: 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  The column names
fab0: 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74   of.** the new t
fac0: 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20  able will match 
fad0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
fae0: 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f  f the SELECT..*/
faf0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64  .void sqlite3End
fb00: 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a  Table(.  Parse *
fb10: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
fb20: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
fb30: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43  t */.  Token *pC
fb40: 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ons,           /
fb50: 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20  * The ',' token 
fb60: 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 63  after the last c
fb70: 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20  olumn defn. */. 
fb80: 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20   Token *pEnd,   
fb90: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
fba0: 27 29 27 20 62 65 66 6f 72 65 20 6f 70 74 69 6f  ')' before optio
fbb0: 6e 73 20 69 6e 20 74 68 65 20 43 52 45 41 54 45  ns in the CREATE
fbc0: 20 54 41 42 4c 45 20 2a 2f 0a 20 20 75 38 20 74   TABLE */.  u8 t
fbd0: 61 62 4f 70 74 73 2c 20 20 20 20 20 20 20 20 20  abOpts,         
fbe0: 20 20 20 20 2f 2a 20 45 78 74 72 61 20 74 61 62      /* Extra tab
fbf0: 6c 65 20 6f 70 74 69 6f 6e 73 2e 20 55 73 75 61  le options. Usua
fc00: 6c 6c 79 20 30 2e 20 2a 2f 0a 20 20 53 65 6c 65  lly 0. */.  Sele
fc10: 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20  ct *pSelect     
fc20: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66 72      /* Select fr
fc30: 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e 2e  om a "CREATE ...
fc40: 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29   AS SELECT" */.)
fc50: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 20 20 20  {.  Table *p;   
fc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fc70: 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a   The new table *
fc80: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
fc90: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a  = pParse->db; /*
fca0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
fcb0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
fcc0: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
fcd0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
fce0: 61 73 65 20 69 6e 20 77 68 69 63 68 20 74 68 65  ase in which the
fcf0: 20 74 61 62 6c 65 20 6c 69 76 65 73 20 2a 2f 0a   table lives */.
fd00: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
fd10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
fd20: 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78 20  n implied index 
fd30: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  of the table */.
fd40: 0a 20 20 69 66 28 20 70 45 6e 64 3d 3d 30 20 26  .  if( pEnd==0 &
fd50: 26 20 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  & pSelect==0 ){.
fd60: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
fd70: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
fd80: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
fd90: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
fda0: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
fdb0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
fdc0: 69 66 28 20 70 53 65 6c 65 63 74 3d 3d 30 20 26  if( pSelect==0 &
fdd0: 26 20 69 73 53 68 61 64 6f 77 54 61 62 6c 65 4e  & isShadowTableN
fde0: 61 6d 65 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65  ame(db, p->zName
fdf0: 29 20 29 7b 0a 20 20 20 20 70 2d 3e 74 61 62 46  ) ){.    p->tabF
fe00: 6c 61 67 73 20 7c 3d 20 54 46 5f 53 68 61 64 6f  lags |= TF_Shado
fe10: 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  w;.  }..  /* If 
fe20: 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  the db->init.bus
fe30: 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20  y is 1 it means 
fe40: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
fe50: 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20  he SQL off the. 
fe60: 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74   ** "sqlite_mast
fe70: 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74  er" or "sqlite_t
fe80: 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c  emp_master" tabl
fe90: 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20  e on the disk.. 
fea0: 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72   ** So do not wr
feb0: 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ite to the disk 
fec0: 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20  again.  Extract 
fed0: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
fee0: 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68  mber.  ** for th
fef0: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
ff00: 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
ff10: 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70  m field.  (The p
ff20: 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
ff30: 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
ff40: 20 70 75 74 20 74 68 65 72 65 20 62 79 20 74 68   put there by th
ff50: 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72  e sqliteOpenCb r
ff60: 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2a 0a 20 20  outine.).  **.  
ff70: 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f 74 20 70  ** If the root p
ff80: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 31 2c  age number is 1,
ff90: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 69 73   that means this
ffa0: 20 69 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   is the sqlite_m
ffb0: 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65  aster.  ** table
ffc0: 20 69 74 73 65 6c 66 2e 20 20 53 6f 20 6d 61 72   itself.  So mar
ffd0: 6b 20 69 74 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a  k it read-only..
ffe0: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
fff0: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
10000 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
10010 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
10020 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 22 29  rMsg(pParse, "")
10030 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
10040 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 6e 75      }.    p->tnu
10050 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  m = db->init.new
10060 54 6e 75 6d 3b 0a 20 20 20 20 69 66 28 20 70 2d  Tnum;.    if( p-
10070 3e 74 6e 75 6d 3d 3d 31 20 29 20 70 2d 3e 74 61  >tnum==1 ) p->ta
10080 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 52 65 61  bFlags |= TF_Rea
10090 64 6f 6e 6c 79 3b 0a 20 20 7d 0a 0a 20 20 61 73  donly;.  }..  as
100a0 73 65 72 74 28 20 28 70 2d 3e 74 61 62 46 6c 61  sert( (p->tabFla
100b0 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61  gs & TF_HasPrima
100c0 72 79 4b 65 79 29 3d 3d 30 0a 20 20 20 20 20 20  ryKey)==0.      
100d0 20 7c 7c 20 70 2d 3e 69 50 4b 65 79 3e 3d 30 20   || p->iPKey>=0 
100e0 7c 7c 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72  || sqlite3Primar
100f0 79 4b 65 79 49 6e 64 65 78 28 70 29 21 3d 30 20  yKeyIndex(p)!=0 
10100 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d  );.  assert( (p-
10110 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48  >tabFlags & TF_H
10120 61 73 50 72 69 6d 61 72 79 4b 65 79 29 21 3d 30  asPrimaryKey)!=0
10130 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 2d 3e 69  .       || (p->i
10140 50 4b 65 79 3c 30 20 26 26 20 73 71 6c 69 74 65  PKey<0 && sqlite
10150 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
10160 28 70 29 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  (p)==0) );..  /*
10170 20 53 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73   Special process
10180 69 6e 67 20 66 6f 72 20 57 49 54 48 4f 55 54 20  ing for WITHOUT 
10190 52 4f 57 49 44 20 54 61 62 6c 65 73 20 2a 2f 0a  ROWID Tables */.
101a0 20 20 69 66 28 20 74 61 62 4f 70 74 73 20 26 20    if( tabOpts & 
101b0 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20  TF_WithoutRowid 
101c0 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74  ){.    if( (p->t
101d0 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74  abFlags & TF_Aut
101e0 6f 69 6e 63 72 65 6d 65 6e 74 29 20 29 7b 0a 20  oincrement) ){. 
101f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
10200 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
10210 20 20 20 20 20 20 20 22 41 55 54 4f 49 4e 43 52         "AUTOINCR
10220 45 4d 45 4e 54 20 6e 6f 74 20 61 6c 6c 6f 77 65  EMENT not allowe
10230 64 20 6f 6e 20 57 49 54 48 4f 55 54 20 52 4f 57  d on WITHOUT ROW
10240 49 44 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20  ID tables");.   
10250 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
10260 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62  .    if( (p->tab
10270 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50 72  Flags & TF_HasPr
10280 69 6d 61 72 79 4b 65 79 29 3d 3d 30 20 29 7b 0a  imaryKey)==0 ){.
10290 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
102a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 50  orMsg(pParse, "P
102b0 52 49 4d 41 52 59 20 4b 45 59 20 6d 69 73 73 69  RIMARY KEY missi
102c0 6e 67 20 6f 6e 20 74 61 62 6c 65 20 25 73 22 2c  ng on table %s",
102d0 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20   p->zName);.    
102e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
102f0 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 57  tabFlags |= TF_W
10300 69 74 68 6f 75 74 52 6f 77 69 64 20 7c 20 54 46  ithoutRowid | TF
10310 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b  _NoVisibleRowid;
10320 0a 20 20 20 20 20 20 63 6f 6e 76 65 72 74 54 6f  .      convertTo
10330 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c  WithoutRowidTabl
10340 65 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  e(pParse, p);.  
10350 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 44 62 20 3d    }.  }..  iDb =
10360 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
10370 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63  Index(db, p->pSc
10380 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20  hema);..#ifndef 
10390 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
103a0 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e  K.  /* Resolve n
103b0 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48 45 43  ames in all CHEC
103c0 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 70  K constraint exp
103d0 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ressions..  */. 
103e0 20 69 66 28 20 70 2d 3e 70 43 68 65 63 6b 20 29   if( p->pCheck )
103f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
10400 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63  olveSelfReferenc
10410 65 28 70 50 61 72 73 65 2c 20 70 2c 20 4e 43 5f  e(pParse, p, NC_
10420 49 73 43 68 65 63 6b 2c 20 30 2c 20 70 2d 3e 70  IsCheck, 0, p->p
10430 43 68 65 63 6b 29 3b 0a 20 20 7d 0a 23 65 6e 64  Check);.  }.#end
10440 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
10450 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
10460 29 20 2a 2f 0a 0a 20 20 2f 2a 20 45 73 74 69 6d  ) */..  /* Estim
10470 61 74 65 20 74 68 65 20 61 76 65 72 61 67 65 20  ate the average 
10480 72 6f 77 20 73 69 7a 65 20 66 6f 72 20 74 68 65  row size for the
10490 20 74 61 62 6c 65 20 61 6e 64 20 66 6f 72 20 61   table and for a
104a0 6c 6c 20 69 6d 70 6c 69 65 64 20 69 6e 64 69 63  ll implied indic
104b0 65 73 20 2a 2f 0a 20 20 65 73 74 69 6d 61 74 65  es */.  estimate
104c0 54 61 62 6c 65 57 69 64 74 68 28 70 29 3b 0a 20  TableWidth(p);. 
104d0 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e   for(pIdx=p->pIn
104e0 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
104f0 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
10500 20 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57    estimateIndexW
10510 69 64 74 68 28 70 49 64 78 29 3b 0a 20 20 7d 0a  idth(pIdx);.  }.
10520 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69  .  /* If not ini
10530 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20  tializing, then 
10540 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20  create a record 
10550 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
10560 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51  e.  ** in the SQ
10570 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
10580 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
10590 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e..  **.  ** If 
105a0 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52  this is a TEMPOR
105b0 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65  ARY table, write
105c0 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20   the entry into 
105d0 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20  the auxiliary.  
105e0 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  ** file instead 
105f0 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  of into the main
10600 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
10610 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
10620 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
10630 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65   int n;.    Vdbe
10640 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   *v;.    char *z
10650 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65  Type;    /* "vie
10660 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f  w" or "table" */
10670 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65  .    char *zType
10680 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f  2;   /* "VIEW" o
10690 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20  r "TABLE" */.   
106a0 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20   char *zStmt;   
106b0 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20   /* Text of the 
106c0 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20  CREATE TABLE or 
106d0 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74  CREATE VIEW stat
106e0 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20  ement */..    v 
106f0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
10700 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
10710 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
10720 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c  return;..    sql
10730 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
10740 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a  , OP_Close, 0);.
10750 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20  .    /* .    ** 
10760 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65  Initialize zType
10770 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69 65   for the new vie
10780 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20 20  w or table..    
10790 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53  */.    if( p->pS
107a0 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
107b0 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74    /* A regular t
107c0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54  able */.      zT
107d0 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20  ype = "table";. 
107e0 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54       zType2 = "T
107f0 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53  ABLE";.#ifndef S
10800 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
10810 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10820 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20   /* A view */.  
10830 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65      zType = "vie
10840 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32  w";.      zType2
10850 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69   = "VIEW";.#endi
10860 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
10870 49 66 20 74 68 69 73 20 69 73 20 61 20 43 52 45  If this is a CRE
10880 41 54 45 20 54 41 42 4c 45 20 78 78 20 41 53 20  ATE TABLE xx AS 
10890 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63  SELECT ..., exec
108a0 75 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20  ute the SELECT. 
108b0 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
108c0 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
108d0 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72  new table. The r
108e0 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20  oot-page number 
108f0 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  for the.    ** n
10900 65 77 20 74 61 62 6c 65 20 69 73 20 69 6e 20 72  ew table is in r
10910 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e  egister pParse->
10920 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a  regRoot..    **.
10930 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20      ** Once the 
10940 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20  SELECT has been 
10950 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65 33  coded by sqlite3
10960 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20  Select(), it is 
10970 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74  in a.    ** suit
10980 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75  able state to qu
10990 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ery for the colu
109a0 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70  mn names and typ
109b0 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20  es to be used.  
109c0 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20    ** by the new 
109d0 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  table..    **.  
109e0 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63 61    ** A shared-ca
109f0 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69  che write-lock i
10a00 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74  s not required t
10a10 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6e  o write to the n
10a20 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a  ew table,.    **
10a30 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63   as a schema-loc
10a40 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  k must have alre
10a50 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  ady been obtaine
10a60 64 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e 20  d to create it. 
10a70 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20 73  Since.    ** a s
10a80 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75  chema-lock exclu
10a90 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64 61  des all other da
10aa0 74 61 62 61 73 65 20 75 73 65 72 73 2c 20 74 68  tabase users, th
10ab0 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75  e write-lock wou
10ac0 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 64  ld.    ** be red
10ad0 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20  undant..    */. 
10ae0 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
10af0 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65  {.      SelectDe
10b00 73 74 20 64 65 73 74 3b 20 20 20 20 2f 2a 20 57  st dest;    /* W
10b10 68 65 72 65 20 74 68 65 20 53 45 4c 45 43 54 20  here the SELECT 
10b20 73 68 6f 75 6c 64 20 73 74 6f 72 65 20 72 65 73  should store res
10b30 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ults */.      in
10b40 74 20 72 65 67 59 69 65 6c 64 3b 20 20 20 20 20  t regYield;     
10b50 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
10b60 6c 64 69 6e 67 20 63 6f 2d 72 6f 75 74 69 6e 65  lding co-routine
10b70 20 65 6e 74 72 79 2d 70 6f 69 6e 74 20 2a 2f 0a   entry-point */.
10b80 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f        int addrTo
10b90 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70  p;        /* Top
10ba0 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75 74 69   of the co-routi
10bb0 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ne */.      int 
10bc0 72 65 67 52 65 63 3b 20 20 20 20 20 20 20 20 20  regRec;         
10bd0 2f 2a 20 41 20 72 65 63 6f 72 64 20 74 6f 20 62  /* A record to b
10be0 65 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 68  e insert into th
10bf0 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20  e new table */. 
10c00 20 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69       int regRowi
10c10 64 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  d;       /* Rowi
10c20 64 20 6f 66 20 74 68 65 20 6e 65 78 74 20 72 6f  d of the next ro
10c30 77 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20  w to insert */. 
10c40 20 20 20 20 20 69 6e 74 20 61 64 64 72 49 6e 73       int addrIns
10c50 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 6f 70 20  Loop;    /* Top 
10c60 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
10c70 69 6e 73 65 72 74 69 6e 67 20 72 6f 77 73 20 2a  inserting rows *
10c80 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
10c90 53 65 6c 54 61 62 3b 20 20 20 20 20 2f 2a 20 41  SelTab;     /* A
10ca0 20 74 61 62 6c 65 20 74 68 61 74 20 64 65 73 63   table that desc
10cb0 72 69 62 65 73 20 74 68 65 20 53 45 4c 45 43 54  ribes the SELECT
10cc0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 20   results */..   
10cd0 20 20 20 72 65 67 59 69 65 6c 64 20 3d 20 2b 2b     regYield = ++
10ce0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
10cf0 20 20 20 20 72 65 67 52 65 63 20 3d 20 2b 2b 70      regRec = ++p
10d00 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
10d10 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b     regRowid = ++
10d20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
10d30 20 20 20 20 61 73 73 65 72 74 28 70 50 61 72 73      assert(pPars
10d40 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20 20 20  e->nTab==1);.   
10d50 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f     sqlite3MayAbo
10d60 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  rt(pParse);.    
10d70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10d80 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  Op3(v, OP_OpenWr
10d90 69 74 65 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e  ite, 1, pParse->
10da0 72 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20  regRoot, iDb);. 
10db0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10dc0 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
10dd0 41 47 5f 50 32 49 53 52 45 47 29 3b 0a 20 20 20  AG_P2ISREG);.   
10de0 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20     pParse->nTab 
10df0 3d 20 32 3b 0a 20 20 20 20 20 20 61 64 64 72 54  = 2;.      addrT
10e00 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
10e10 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
10e20 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
10e30 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
10e40 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c  P_InitCoroutine,
10e50 20 72 65 67 59 69 65 6c 64 2c 20 30 2c 20 61 64   regYield, 0, ad
10e60 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 69 66  drTop);.      if
10e70 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
10e80 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 70   return;.      p
10e90 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
10ea0 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
10eb0 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
10ec0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  t);.      if( pS
10ed0 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72  elTab==0 ) retur
10ee0 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  n;.      assert(
10ef0 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20   p->aCol==0 );. 
10f00 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70       p->nCol = p
10f10 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
10f20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53      p->aCol = pS
10f30 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20  elTab->aCol;.   
10f40 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
10f50 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c   = 0;.      pSel
10f60 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
10f70 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65       sqlite3Dele
10f80 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c  teTable(db, pSel
10f90 54 61 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Tab);.      sqli
10fa0 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
10fb0 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72  t(&dest, SRT_Cor
10fc0 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64  outine, regYield
10fd0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10fe0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
10ff0 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 3b 0a  Select, &dest);.
11000 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
11010 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
11020 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11030 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76  beEndCoroutine(v
11040 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20  , regYield);.   
11050 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
11060 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f  mpHere(v, addrTo
11070 70 20 2d 20 31 29 3b 0a 20 20 20 20 20 20 61 64  p - 1);.      ad
11080 64 72 49 6e 73 4c 6f 6f 70 20 3d 20 73 71 6c 69  drInsLoop = sqli
11090 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
110a0 20 4f 50 5f 59 69 65 6c 64 2c 20 64 65 73 74 2e   OP_Yield, dest.
110b0 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
110c0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
110d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
110e0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
110f0 61 6b 65 52 65 63 6f 72 64 2c 20 64 65 73 74 2e  akeRecord, dest.
11100 69 53 64 73 74 2c 20 64 65 73 74 2e 6e 53 64 73  iSdst, dest.nSds
11110 74 2c 20 72 65 67 52 65 63 29 3b 0a 20 20 20 20  t, regRec);.    
11120 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 41 66    sqlite3TableAf
11130 66 69 6e 69 74 79 28 76 2c 20 70 2c 20 30 29 3b  finity(v, p, 0);
11140 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11150 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
11160 65 77 52 6f 77 69 64 2c 20 31 2c 20 72 65 67 52  ewRowid, 1, regR
11170 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  owid);.      sql
11180 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
11190 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 31 2c 20  , OP_Insert, 1, 
111a0 72 65 67 52 65 63 2c 20 72 65 67 52 6f 77 69 64  regRec, regRowid
111b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
111c0 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
111d0 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  InsLoop);.      
111e0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
111f0 65 72 65 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f  ere(v, addrInsLo
11200 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  op);.      sqlit
11210 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
11220 4f 50 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a 20 20  OP_Close, 1);.  
11230 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70    }..    /* Comp
11240 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ute the complete
11250 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
11260 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ATE statement */
11270 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
11280 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   ){.      zStmt 
11290 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d  = createTableStm
112a0 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65  t(db, p);.    }e
112b0 6c 73 65 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e  lse{.      Token
112c0 20 2a 70 45 6e 64 32 20 3d 20 74 61 62 4f 70 74   *pEnd2 = tabOpt
112d0 73 20 3f 20 26 70 50 61 72 73 65 2d 3e 73 4c 61  s ? &pParse->sLa
112e0 73 74 54 6f 6b 65 6e 20 3a 20 70 45 6e 64 3b 0a  stToken : pEnd;.
112f0 20 20 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 28        n = (int)(
11300 70 45 6e 64 32 2d 3e 7a 20 2d 20 70 50 61 72 73  pEnd2->z - pPars
11310 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29  e->sNameToken.z)
11320 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 6e 64  ;.      if( pEnd
11330 32 2d 3e 7a 5b 30 5d 21 3d 27 3b 27 20 29 20 6e  2->z[0]!=';' ) n
11340 20 2b 3d 20 70 45 6e 64 32 2d 3e 6e 3b 0a 20 20   += pEnd2->n;.  
11350 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69      zStmt = sqli
11360 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a  te3MPrintf(db, .
11370 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
11380 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70  E %s %.*s", zTyp
11390 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73  e2, n, pParse->s
113a0 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20  NameToken.z.    
113b0 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
113c0 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68  /* A slot for th
113d0 65 20 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72  e record has alr
113e0 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
113f0 74 65 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20  ted in the .    
11400 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ** SQLITE_MASTER
11410 20 74 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74   table.  We just
11420 20 6e 65 65 64 20 74 6f 20 75 70 64 61 74 65 20   need to update 
11430 74 68 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61  that slot with a
11440 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  ll.    ** the in
11450 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20  formation we've 
11460 63 6f 6c 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a  collected..    *
11470 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  /.    sqlite3Nes
11480 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
11490 0a 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25  .      "UPDATE %
114a0 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20 20  Q.%s ".         
114b0 22 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20  "SET type='%s', 
114c0 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d  name=%Q, tbl_nam
114d0 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23  e=%Q, rootpage=#
114e0 25 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20  %d, sql=%Q ".   
114f0 20 20 20 20 22 57 48 45 52 45 20 72 6f 77 69 64      "WHERE rowid
11500 3d 23 25 64 22 2c 0a 20 20 20 20 20 20 64 62 2d  =#%d",.      db-
11510 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
11520 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c  me, MASTER_NAME,
11530 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20  .      zType,.  
11540 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20      p->zName,.  
11550 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20      p->zName,.  
11560 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52      pParse->regR
11570 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74  oot,.      zStmt
11580 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ,.      pParse->
11590 72 65 67 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a  regRowid.    );.
115a0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
115b0 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20  e(db, zStmt);.  
115c0 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
115d0 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
115e0 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  b);..#ifndef SQL
115f0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
11600 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68  REMENT.    /* Ch
11610 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65  eck to see if we
11620 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
11630 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  an sqlite_sequen
11640 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 20  ce table for.   
11650 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72 61 63   ** keeping trac
11660 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d 65  k of autoincreme
11670 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a  nt keys..    */.
11680 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46      if( (p->tabF
11690 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e  lags & TF_Autoin
116a0 63 72 65 6d 65 6e 74 29 21 3d 30 20 29 7b 0a 20  crement)!=0 ){. 
116b0 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26       Db *pDb = &
116c0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
116d0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
116e0 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
116f0 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
11700 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
11710 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61  >pSchema->pSeqTa
11720 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
11730 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
11740 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
11750 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42       "CREATE TAB
11760 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71  LE %Q.sqlite_seq
11770 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29 22  uence(name,seq)"
11780 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  ,.          pDb-
11790 3e 7a 44 62 53 4e 61 6d 65 0a 20 20 20 20 20 20  >zDbSName.      
117a0 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
117b0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
117c0 2a 20 52 65 70 61 72 73 65 20 65 76 65 72 79 74  * Reparse everyt
117d0 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f  hing to update o
117e0 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61  ur internal data
117f0 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20   structures */. 
11800 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11810 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76  dParseSchemaOp(v
11820 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20  , iDb,.         
11830 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66    sqlite3MPrintf
11840 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d 27  (db, "tbl_name='
11850 25 71 27 20 41 4e 44 20 74 79 70 65 21 3d 27 74  %q' AND type!='t
11860 72 69 67 67 65 72 27 22 2c 20 70 2d 3e 7a 4e 61  rigger'", p->zNa
11870 6d 65 29 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  me));.  }...  /*
11880 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20 74   Add the table t
11890 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o the in-memory 
118a0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
118b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
118c0 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
118d0 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
118e0 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20  Table *pOld;.   
118f0 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
11900 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20   = p->pSchema;. 
11910 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
11920 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
11930 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
11940 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69  .    pOld = sqli
11950 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
11960 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c  Schema->tblHash,
11970 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70 29 3b 0a 20   p->zName, p);. 
11980 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20     if( pOld ){. 
11990 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
119a0 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c  pOld );  /* Mall
119b0 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  oc must have fai
119c0 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49  led inside HashI
119d0 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20  nsert() */.     
119e0 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
119f0 28 64 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75  (db);.      retu
11a00 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  rn;.    }.    pP
11a10 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
11a20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6d 44 62  = 0;.    db->mDb
11a30 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f  Flags |= DBFLAG_
11a40 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 0a 23  SchemaChange;..#
11a50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11a60 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20  IT_ALTERTABLE.  
11a70 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65 63    if( !p->pSelec
11a80 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  t ){.      const
11a90 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28   char *zName = (
11aa0 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 50 61  const char *)pPa
11ab0 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
11ac0 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 61  z;.      int nNa
11ad0 6d 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  me;.      assert
11ae0 28 20 21 70 53 65 6c 65 63 74 20 26 26 20 70 43  ( !pSelect && pC
11af0 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a 20  ons && pEnd );. 
11b00 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e       if( pCons->
11b10 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  z==0 ){.        
11b20 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20  pCons = pEnd;.  
11b30 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d      }.      nNam
11b40 65 20 3d 20 28 69 6e 74 29 28 28 63 6f 6e 73 74  e = (int)((const
11b50 20 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a   char *)pCons->z
11b60 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20   - zName);.     
11b70 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74   p->addColOffset
11b80 20 3d 20 31 33 20 2b 20 73 71 6c 69 74 65 33 55   = 13 + sqlite3U
11b90 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d 65  tf8CharLen(zName
11ba0 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  , nName);.    }.
11bb0 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69  #endif.  }.}..#i
11bc0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11bd0 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65  T_VIEW./*.** The
11be0 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
11bf0 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72  is routine in or
11c00 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 20  der to create a 
11c10 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64  new VIEW.*/.void
11c20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 56 69   sqlite3CreateVi
11c30 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
11c40 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rse,     /* The 
11c50 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
11c60 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67  */.  Token *pBeg
11c70 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43  in,     /* The C
11c80 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74  REATE token that
11c90 20 62 65 67 69 6e 73 20 74 68 65 20 73 74 61 74   begins the stat
11ca0 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ement */.  Token
11cb0 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a   *pName1,     /*
11cc0 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20   The token that 
11cd0 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f  holds the name o
11ce0 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  f the view */.  
11cf0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
11d00 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20     /* The token 
11d10 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e  that holds the n
11d20 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20  ame of the view 
11d30 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
11d40 43 4e 61 6d 65 73 2c 20 2f 2a 20 4f 70 74 69 6f  CNames, /* Optio
11d50 6e 61 6c 20 6c 69 73 74 20 6f 66 20 76 69 65 77  nal list of view
11d60 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
11d70 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
11d80 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43  ct,   /* A SELEC
11d90 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
11da0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
11db0 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69   new view */.  i
11dc0 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20  nt isTemp,      
11dd0 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20    /* TRUE for a 
11de0 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a  TEMPORARY view *
11df0 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20  /.  int noErr   
11e00 20 20 20 20 20 20 20 2f 2a 20 53 75 70 70 72 65         /* Suppre
11e10 73 73 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ss error message
11e20 73 20 69 66 20 56 49 45 57 20 61 6c 72 65 61 64  s if VIEW alread
11e30 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20  y exists */.){. 
11e40 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
11e50 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   n;.  const char
11e60 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e   *z;.  Token sEn
11e70 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  d;.  DbFixer sFi
11e80 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  x;.  Token *pNam
11e90 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 44 62  e = 0;.  int iDb
11ea0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
11eb0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
11ec0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61   if( pParse->nVa
11ed0 72 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  r>0 ){.    sqlit
11ee0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
11ef0 65 2c 20 22 70 61 72 61 6d 65 74 65 72 73 20 61  e, "parameters a
11f00 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69  re not allowed i
11f10 6e 20 76 69 65 77 73 22 29 3b 0a 20 20 20 20 67  n views");.    g
11f20 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f  oto create_view_
11f30 66 61 69 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  fail;.  }.  sqli
11f40 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50  te3StartTable(pP
11f50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
11f60 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c  ame2, isTemp, 1,
11f70 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20   0, noErr);.  p 
11f80 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
11f90 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
11fa0 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
11fb0 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69  ) goto create_vi
11fc0 65 77 5f 66 61 69 6c 3b 0a 20 20 73 71 6c 69 74  ew_fail;.  sqlit
11fd0 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
11fe0 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
11ff0 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
12000 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
12010 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
12020 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73  p->pSchema);.  s
12030 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
12040 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62  Fix, pParse, iDb
12050 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29  , "view", pName)
12060 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  ;.  if( sqlite3F
12070 69 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20  ixSelect(&sFix, 
12080 70 53 65 6c 65 63 74 29 20 29 20 67 6f 74 6f 20  pSelect) ) goto 
12090 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c  create_view_fail
120a0 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63  ;..  /* Make a c
120b0 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72  opy of the entir
120c0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
120d0 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  nt that defines 
120e0 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54  the view..  ** T
120f0 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61  his will force a
12100 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65  ll the Expr.toke
12110 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65  n.z values to be
12120 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a   dynamically.  *
12130 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68  * allocated rath
12140 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f  er than point to
12150 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e   the input strin
12160 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20  g - which means 
12170 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77  that.  ** they w
12180 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74 65  ill persist afte
12190 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 71  r the current sq
121a0 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c  lite3_exec() cal
121b0 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a  l returns..  */.
121c0 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
121d0 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 70 2d  OBJECT ){.    p-
121e0 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65  >pSelect = pSele
121f0 63 74 3b 0a 20 20 20 20 70 53 65 6c 65 63 74 20  ct;.    pSelect 
12200 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
12210 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73    p->pSelect = s
12220 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
12230 64 62 2c 20 70 53 65 6c 65 63 74 2c 20 45 58 50  db, pSelect, EXP
12240 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
12250 7d 0a 20 20 70 2d 3e 70 43 68 65 63 6b 20 3d 20  }.  p->pCheck = 
12260 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
12270 75 70 28 64 62 2c 20 70 43 4e 61 6d 65 73 2c 20  up(db, pCNames, 
12280 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b  EXPRDUP_REDUCE);
12290 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
122a0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 63  cFailed ) goto c
122b0 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b  reate_view_fail;
122c0 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
122d0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45  e end of the CRE
122e0 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65  ATE VIEW stateme
122f0 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70  nt.  Make sEnd p
12300 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65  oint to.  ** the
12310 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e   end..  */.  sEn
12320 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73  d = pParse->sLas
12330 74 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74  tToken;.  assert
12340 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 7c  ( sEnd.z[0]!=0 |
12350 7c 20 73 45 6e 64 2e 6e 3d 3d 30 20 29 3b 0a 20  | sEnd.n==0 );. 
12360 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d   if( sEnd.z[0]!=
12370 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e  ';' ){.    sEnd.
12380 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d  z += sEnd.n;.  }
12390 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20  .  sEnd.n = 0;. 
123a0 20 6e 20 3d 20 28 69 6e 74 29 28 73 45 6e 64 2e   n = (int)(sEnd.
123b0 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a  z - pBegin->z);.
123c0 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b    assert( n>0 );
123d0 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a  .  z = pBegin->z
123e0 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74  ;.  while( sqlit
123f0 65 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d  e3Isspace(z[n-1]
12400 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45  ) ){ n--; }.  sE
12410 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a  nd.z = &z[n-1];.
12420 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20    sEnd.n = 1;.. 
12430 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45   /* Use sqlite3E
12440 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64  ndTable() to add
12450 20 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65   the view to the
12460 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
12470 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
12480 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  3EndTable(pParse
12490 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 2c 20 30  , 0, &sEnd, 0, 0
124a0 29 3b 0a 0a 63 72 65 61 74 65 5f 76 69 65 77 5f  );..create_view_
124b0 66 61 69 6c 3a 0a 20 20 73 71 6c 69 74 65 33 53  fail:.  sqlite3S
124c0 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
124d0 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20  pSelect);.  if( 
124e0 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
124f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
12500 65 6e 61 6d 65 45 78 70 72 6c 69 73 74 55 6e 6d  enameExprlistUnm
12510 61 70 28 70 50 61 72 73 65 2c 20 70 43 4e 61 6d  ap(pParse, pCNam
12520 65 73 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  es);.  }.  sqlit
12530 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
12540 28 64 62 2c 20 70 43 4e 61 6d 65 73 29 3b 0a 20  (db, pCNames);. 
12550 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69   return;.}.#endi
12560 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
12570 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21 64  _VIEW */..#if !d
12580 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
12590 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
125a0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
125b0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 2f  _VIRTUALTABLE)./
125c0 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73  *.** The Table s
125d0 74 72 75 63 74 75 72 65 20 70 54 61 62 6c 65 20  tructure pTable 
125e0 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45 57  is really a VIEW
125f0 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e  .  Fill in the n
12600 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63  ames of.** the c
12610 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69  olumns of the vi
12620 65 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c 65  ew in the pTable
12630 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 74   structure.  Ret
12640 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a  urn the number.*
12650 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  * of errors.  If
12660 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65   an error is see
12670 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  n leave an error
12680 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
12690 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a  se->zErrMsg..*/.
126a0 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77 47  int sqlite3ViewG
126b0 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61  etColumnNames(Pa
126c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
126d0 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54  le *pTable){.  T
126e0 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20  able *pSelTab;  
126f0 20 2f 2a 20 41 20 66 61 6b 65 20 74 61 62 6c 65   /* A fake table
12700 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20 67   from which we g
12710 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  et the result se
12720 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
12730 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79  Sel;     /* Copy
12740 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 74   of the SELECT t
12750 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
12760 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  he view */.  int
12770 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20 2f   nErr = 0;     /
12780 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  * Number of erro
12790 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a  rs encountered *
127a0 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
127b0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
127c0 72 69 6c 79 20 68 6f 6c 64 73 20 74 68 65 20 6e  rily holds the n
127d0 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73  umber of cursors
127e0 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20 73   assigned */.  s
127f0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
12800 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74  rse->db;  /* Dat
12810 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
12820 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f   for malloc erro
12830 72 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  rs */.#ifndef SQ
12840 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
12850 4c 54 41 42 4c 45 0a 20 20 69 6e 74 20 72 63 3b  LTABLE.  int rc;
12860 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
12870 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
12880 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 73 71 6c 69  ORIZATION.  sqli
12890 74 65 33 5f 78 61 75 74 68 20 78 41 75 74 68 3b  te3_xauth xAuth;
128a0 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20         /* Saved 
128b0 78 41 75 74 68 20 70 6f 69 6e 74 65 72 20 2a 2f  xAuth pointer */
128c0 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
128d0 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69  t( pTable );..#i
128e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
128f0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
12900 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b   db->nSchemaLock
12910 2b 2b 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ++;.  rc = sqlit
12920 65 33 56 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63  e3VtabCallConnec
12930 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65  t(pParse, pTable
12940 29 3b 0a 20 20 64 62 2d 3e 6e 53 63 68 65 6d 61  );.  db->nSchema
12950 4c 6f 63 6b 2d 2d 3b 0a 20 20 69 66 28 20 72 63  Lock--;.  if( rc
12960 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
12970 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56 69  ;.  }.  if( IsVi
12980 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29 20  rtual(pTable) ) 
12990 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
129a0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
129b0 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20  _OMIT_VIEW.  /* 
129c0 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20  A positive nCol 
129d0 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e  means the column
129e0 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73  s names for this
129f0 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61   view are.  ** a
12a00 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20  lready known..  
12a10 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
12a20 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e  >nCol>0 ) return
12a30 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61   0;..  /* A nega
12a40 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73  tive nCol is a s
12a50 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65  pecial marker me
12a60 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72  aning that we ar
12a70 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a  e currently.  **
12a80 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75   trying to compu
12a90 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  te the column na
12aa0 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65  mes.  If we ente
12ab0 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  r this routine w
12ac0 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74  ith.  ** a negat
12ad0 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61  ive nCol, it mea
12ae0 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76  ns two or more v
12af0 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70  iews form a loop
12b00 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a  , like this:.  *
12b10 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  *.  **     CREAT
12b20 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45  E VIEW one AS SE
12b30 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b  LECT * FROM two;
12b40 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
12b50 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c   VIEW two AS SEL
12b60 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a  ECT * FROM one;.
12b70 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c    **.  ** Actual
12b80 6c 79 2c 20 74 68 65 20 65 72 72 6f 72 20 61 62  ly, the error ab
12b90 6f 76 65 20 69 73 20 6e 6f 77 20 63 61 75 67 68  ove is now caugh
12ba0 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68  t prior to reach
12bb0 69 6e 67 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a  ing this point..
12bc0 20 20 2a 2a 20 42 75 74 20 74 68 65 20 66 6f 6c    ** But the fol
12bd0 6c 6f 77 69 6e 67 20 74 65 73 74 20 69 73 20 73  lowing test is s
12be0 74 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74 20 61  till important a
12bf0 73 20 69 74 20 64 6f 65 73 20 63 6f 6d 65 20 75  s it does come u
12c00 70 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66 6f  p.  ** in the fo
12c10 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20  llowing:.  ** . 
12c20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54   **     CREATE T
12c30 41 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28 61 29  ABLE main.ex1(a)
12c40 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  ;.  **     CREAT
12c50 45 20 54 45 4d 50 20 56 49 45 57 20 65 78 31 20  E TEMP VIEW ex1 
12c60 41 53 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  AS SELECT a FROM
12c70 20 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20 20 53   ex1;.  **     S
12c80 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 6d  ELECT * FROM tem
12c90 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20 69 66  p.ex1;.  */.  if
12ca0 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30  ( pTable->nCol<0
12cb0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
12cc0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
12cd0 22 76 69 65 77 20 25 73 20 69 73 20 63 69 72 63  "view %s is circ
12ce0 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c  ularly defined",
12cf0 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b   pTable->zName);
12d00 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
12d10 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 61   }.  assert( pTa
12d20 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a  ble->nCol>=0 );.
12d30 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20  .  /* If we get 
12d40 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
12d50 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f  ns we need to co
12d60 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c 65 20  mpute the table 
12d70 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65  names..  ** Note
12d80 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74   that the call t
12d90 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  o sqlite3ResultS
12da0 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c  etOfSelect() wil
12db0 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a  l expand any.  *
12dc0 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69  * "*" elements i
12dd0 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 73 65  n the results se
12de0 74 20 6f 66 20 74 68 65 20 76 69 65 77 20 61 6e  t of the view an
12df0 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63 75  d will assign cu
12e00 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68  rsors.  ** to th
12e10 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  e elements of th
12e20 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
12e30 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77 61  But we do not wa
12e40 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67 65 73  nt these changes
12e50 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d  .  ** to be perm
12e60 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20 63  anent.  So the c
12e70 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64 6f  omputation is do
12e80 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20  ne on a copy of 
12e90 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20  the SELECT.  ** 
12ea0 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64  statement that d
12eb0 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e  efines the view.
12ec0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
12ed0 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20  pTable->pSelect 
12ee0 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c 69  );.  pSel = sqli
12ef0 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
12f00 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
12f10 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  , 0);.  if( pSel
12f20 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
12f30 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42  TE_OMIT_ALTERTAB
12f40 4c 45 0a 20 20 20 20 75 38 20 65 50 61 72 73 65  LE.    u8 eParse
12f50 4d 6f 64 65 20 3d 20 70 50 61 72 73 65 2d 3e 65  Mode = pParse->e
12f60 50 61 72 73 65 4d 6f 64 65 3b 0a 20 20 20 20 70  ParseMode;.    p
12f70 50 61 72 73 65 2d 3e 65 50 61 72 73 65 4d 6f 64  Parse->eParseMod
12f80 65 20 3d 20 50 41 52 53 45 5f 4d 4f 44 45 5f 4e  e = PARSE_MODE_N
12f90 4f 52 4d 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20  ORMAL;.#endif.  
12fa0 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54    n = pParse->nT
12fb0 61 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  ab;.    sqlite3S
12fc0 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
12fd0 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ors(pParse, pSel
12fe0 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 70 54 61  ->pSrc);.    pTa
12ff0 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a  ble->nCol = -1;.
13000 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
13010 65 2e 62 44 69 73 61 62 6c 65 2b 2b 3b 0a 23 69  e.bDisable++;.#i
13020 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13030 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
13040 20 20 20 20 78 41 75 74 68 20 3d 20 64 62 2d 3e      xAuth = db->
13050 78 41 75 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78  xAuth;.    db->x
13060 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 70 53  Auth = 0;.    pS
13070 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
13080 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
13090 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a  (pParse, pSel);.
130a0 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20      db->xAuth = 
130b0 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20  xAuth;.#else.   
130c0 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74   pSelTab = sqlit
130d0 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
130e0 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
130f0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50  );.#endif.    pP
13100 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a  arse->nTab = n;.
13110 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e      if( pTable->
13120 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20 20  pCheck ){.      
13130 2f 2a 20 43 52 45 41 54 45 20 56 49 45 57 20 6e  /* CREATE VIEW n
13140 61 6d 65 28 61 72 67 6c 69 73 74 29 20 41 53 20  ame(arglist) AS 
13150 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  ....      ** The
13160 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f   names of the co
13170 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
13180 6c 65 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f  le are taken fro
13190 6d 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 6c 69  m.      ** argli
131a0 73 74 20 77 68 69 63 68 20 69 73 20 73 74 6f 72  st which is stor
131b0 65 64 20 69 6e 20 70 54 61 62 6c 65 2d 3e 70 43  ed in pTable->pC
131c0 68 65 63 6b 2e 20 20 54 68 65 20 70 43 68 65 63  heck.  The pChec
131d0 6b 20 66 69 65 6c 64 0a 20 20 20 20 20 20 2a 2a  k field.      **
131e0 20 6e 6f 72 6d 61 6c 6c 79 20 68 6f 6c 64 73 20   normally holds 
131f0 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
13200 73 20 6f 6e 20 61 6e 20 6f 72 64 69 6e 61 72 79  s on an ordinary
13210 20 74 61 62 6c 65 2c 20 62 75 74 20 66 6f 72 0a   table, but for.
13220 20 20 20 20 20 20 2a 2a 20 61 20 56 49 45 57 20        ** a VIEW 
13230 69 74 20 68 6f 6c 64 73 20 74 68 65 20 6c 69 73  it holds the lis
13240 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  t of column name
13250 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
13260 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73    sqlite3Columns
13270 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
13280 72 73 65 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68  rse, pTable->pCh
13290 65 63 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20  eck, .          
132a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132b0 20 20 20 20 20 20 20 26 70 54 61 62 6c 65 2d 3e         &pTable->
132c0 6e 43 6f 6c 2c 20 26 70 54 61 62 6c 65 2d 3e 61  nCol, &pTable->a
132d0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Col);.      if( 
132e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
132f0 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70  ==0 .       && p
13300 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 0a 20  Parse->nErr==0. 
13310 20 20 20 20 20 20 26 26 20 70 54 61 62 6c 65 2d        && pTable-
13320 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 2d 3e 70 45 4c  >nCol==pSel->pEL
13330 69 73 74 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20  ist->nExpr.     
13340 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
13350 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75  te3SelectAddColu
13360 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69  mnTypeAndCollati
13370 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c  on(pParse, pTabl
13380 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20  e, pSel);.      
13390 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
133a0 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20  pSelTab ){.     
133b0 20 2f 2a 20 43 52 45 41 54 45 20 56 49 45 57 20   /* CREATE VIEW 
133c0 6e 61 6d 65 20 41 53 2e 2e 2e 20 20 77 69 74 68  name AS...  with
133d0 6f 75 74 20 61 6e 20 61 72 67 75 6d 65 6e 74 20  out an argument 
133e0 6c 69 73 74 2e 20 20 43 6f 6e 73 74 72 75 63 74  list.  Construct
133f0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  .      ** the co
13400 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20  lumn names from 
13410 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
13420 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
13430 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 20 20  s the view..    
13440 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
13450 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d  t( pTable->aCol=
13460 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  =0 );.      pTab
13470 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54  le->nCol = pSelT
13480 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->nCol;.      
13490 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70  pTable->aCol = p
134a0 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  SelTab->aCol;.  
134b0 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f      pSelTab->nCo
134c0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65  l = 0;.      pSe
134d0 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  lTab->aCol = 0;.
134e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
134f0 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
13500 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 54 61 62  Held(db, 0, pTab
13510 6c 65 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a  le->pSchema) );.
13520 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13530 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
13540 30 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b  0;.      nErr++;
13550 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
13560 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
13570 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20  , pSelTab);.    
13580 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
13590 65 74 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20  ete(db, pSel);. 
135a0 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
135b0 2e 62 44 69 73 61 62 6c 65 2d 2d 3b 0a 23 69 66  .bDisable--;.#if
135c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
135d0 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20  _ALTERTABLE.    
135e0 70 50 61 72 73 65 2d 3e 65 50 61 72 73 65 4d 6f  pParse->eParseMo
135f0 64 65 20 3d 20 65 50 61 72 73 65 4d 6f 64 65 3b  de = eParseMode;
13600 0a 23 65 6e 64 69 66 0a 20 20 7d 20 65 6c 73 65  .#endif.  } else
13610 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20   {.    nErr++;. 
13620 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63   }.  pTable->pSc
13630 68 65 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67  hema->schemaFlag
13640 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73 65 74 56  s |= DB_UnresetV
13650 69 65 77 73 3b 0a 20 20 69 66 28 20 64 62 2d 3e  iews;.  if( db->
13660 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
13670 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
13680 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c  eColumnNames(db,
13690 20 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 54   pTable);.    pT
136a0 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  able->aCol = 0;.
136b0 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
136c0 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
136d0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
136e0 56 49 45 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e  VIEW */.  return
136f0 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69   nErr;  .}.#endi
13700 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
13710 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
13720 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
13730 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
13740 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65  ABLE) */..#ifnde
13750 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
13760 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  EW./*.** Clear t
13770 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
13780 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20  from every VIEW 
13790 69 6e 20 64 61 74 61 62 61 73 65 20 69 64 78 2e  in database idx.
137a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
137b0 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
137c0 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ll(sqlite3 *db, 
137d0 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68  int idx){.  Hash
137e0 45 6c 65 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72  Elem *i;.  asser
137f0 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
13800 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 64  MutexHeld(db, id
13810 78 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20 21  x, 0) );.  if( !
13820 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
13830 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65  , idx, DB_Unrese
13840 74 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e  tViews) ) return
13850 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  ;.  for(i=sqlite
13860 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
13870 44 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d  Db[idx].pSchema-
13880 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73  >tblHash); i;i=s
13890 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
138a0 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
138b0 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
138c0 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20  ata(i);.    if( 
138d0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
138e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
138f0 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  leteColumnNames(
13900 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  db, pTab);.     
13910 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b   pTab->aCol = 0;
13920 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f  .      pTab->nCo
13930 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  l = 0;.    }.  }
13940 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72  .  DbClearProper
13950 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55  ty(db, idx, DB_U
13960 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a  nresetViews);.}.
13970 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
13980 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
13990 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a  l(A,B).#endif /*
139a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
139b0 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  W */../*.** This
139c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
139d0 6c 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20  led by the VDBE 
139e0 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e  to adjust the in
139f0 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a  ternal schema.**
13a00 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 20   used by SQLite 
13a10 77 68 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c  when the btree l
13a20 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62  ayer moves a tab
13a30 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68  le root page. Th
13a40 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f  e.** root-page o
13a50 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  f a table or ind
13a60 65 78 20 69 6e 20 64 61 74 61 62 61 73 65 20 69  ex in database i
13a70 44 62 20 68 61 73 20 63 68 61 6e 67 65 64 20 66  Db has changed f
13a80 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20  rom iFrom.** to 
13a90 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65  iTo..**.** Ticke
13aa0 74 20 23 31 37 32 38 3a 20 20 54 68 65 20 73 79  t #1728:  The sy
13ab0 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68 74  mbol table might
13ac0 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69   still contain i
13ad0 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e  nformation.** on
13ae0 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69   tables and/or i
13af0 6e 64 69 63 65 73 20 74 68 61 74 20 61 72 65 20  ndices that are 
13b00 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62  the process of b
13b10 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
13b20 20 49 66 20 79 6f 75 20 61 72 65 20 75 6e 6c 75   If you are unlu
13b30 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73  cky, one of thos
13b40 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65  e deleted indice
13b50 73 20 6f 72 20 74 61 62 6c 65 73 20 6d 69 67 68  s or tables migh
13b60 74 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61  t.** have the sa
13b70 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62  me rootpage numb
13b80 65 72 20 61 73 20 74 68 65 20 72 65 61 6c 20 74  er as the real t
13b90 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68  able or index th
13ba0 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d  at is.** being m
13bb0 6f 76 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e  oved.  So we can
13bc0 6e 6f 74 20 73 74 6f 70 20 73 65 61 72 63 68 69  not stop searchi
13bd0 6e 67 20 61 66 74 65 72 20 74 68 65 20 66 69 72  ng after the fir
13be0 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63  st match .** bec
13bf0 61 75 73 65 20 74 68 65 20 66 69 72 73 74 20 6d  ause the first m
13c00 61 74 63 68 20 6d 69 67 68 74 20 62 65 20 66 6f  atch might be fo
13c10 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 65 6c  r one of the del
13c20 65 74 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20  eted indices.** 
13c30 6f 72 20 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f  or tables and no
13c40 74 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  t the table/inde
13c50 78 20 74 68 61 74 20 69 73 20 61 63 74 75 61 6c  x that is actual
13c60 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a  ly being moved..
13c70 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e 74 69  ** We must conti
13c80 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69  nue looping unti
13c90 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64  l all tables and
13ca0 20 69 6e 64 69 63 65 73 20 77 69 74 68 0a 2a 2a   indices with.**
13cb0 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d   rootpage==iFrom
13cc0 20 68 61 76 65 20 62 65 65 6e 20 63 6f 6e 76 65   have been conve
13cd0 72 74 65 64 20 74 6f 20 68 61 76 65 20 61 20 72  rted to have a r
13ce0 6f 6f 74 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a  ootpage of iTo.*
13cf0 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65  * in order to be
13d00 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 77 65   certain that we
13d10 20 67 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f   got the right o
13d20 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ne..*/.#ifndef S
13d30 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
13d40 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74  ACUUM.void sqlit
13d50 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28  e3RootPageMoved(
13d60 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
13d70 20 69 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c   iDb, int iFrom,
13d80 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73   int iTo){.  Has
13d90 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20  hElem *pElem;.  
13da0 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 20 20 44  Hash *pHash;.  D
13db0 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72  b *pDb;..  asser
13dc0 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
13dd0 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
13de0 62 2c 20 30 29 20 29 3b 0a 20 20 70 44 62 20 3d  b, 0) );.  pDb =
13df0 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
13e00 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e    pHash = &pDb->
13e10 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
13e20 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  ;.  for(pElem=sq
13e30 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48  liteHashFirst(pH
13e40 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
13e50 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
13e60 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54  t(pElem)){.    T
13e70 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
13e80 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
13e90 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  m);.    if( pTab
13ea0 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b  ->tnum==iFrom ){
13eb0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75  .      pTab->tnu
13ec0 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20  m = iTo;.    }. 
13ed0 20 7d 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44   }.  pHash = &pD
13ee0 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  b->pSchema->idxH
13ef0 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d  ash;.  for(pElem
13f00 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
13f10 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20  (pHash); pElem; 
13f20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
13f30 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20  Next(pElem)){.  
13f40 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
13f50 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
13f60 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Elem);.    if( p
13f70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d  Idx->tnum==iFrom
13f80 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   ){.      pIdx->
13f90 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20  tnum = iTo;.    
13fa0 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
13fb0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65  /*.** Write code
13fc0 20 74 6f 20 65 72 61 73 65 20 74 68 65 20 74 61   to erase the ta
13fd0 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
13fe0 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64  ge iTable from d
13ff0 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20  atabase iDb..** 
14000 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20  Also write code 
14010 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71  to modify the sq
14020 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
14030 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73  e and internal s
14040 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f  chema.** if a ro
14050 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68  ot-page of anoth
14060 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
14070 64 20 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c  d by the btree-l
14080 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65  ayer whilst.** e
14090 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74  rasing iTable (t
140a0 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77  his can happen w
140b0 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ith an auto-vacu
140c0 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f  um database)..*/
140d0 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65   .static void de
140e0 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61  stroyRootPage(Pa
140f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
14100 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62   iTable, int iDb
14110 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
14120 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
14130 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 31 20  arse);.  int r1 
14140 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
14150 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69  Reg(pParse);.  i
14160 66 28 20 69 54 61 62 6c 65 3c 32 20 29 20 73 71  f( iTable<2 ) sq
14170 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
14180 61 72 73 65 2c 20 22 63 6f 72 72 75 70 74 20 73  arse, "corrupt s
14190 63 68 65 6d 61 22 29 3b 0a 20 20 73 71 6c 69 74  chema");.  sqlit
141a0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
141b0 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 62  OP_Destroy, iTab
141c0 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a 20 20  le, r1, iDb);.  
141d0 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
141e0 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66  pParse);.#ifndef
141f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
14200 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f  OVACUUM.  /* OP_
14210 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20 61  Destroy stores a
14220 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31 2e  n in integer r1.
14230 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65 72   If this integer
14240 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72  .  ** is non-zer
14250 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  o, then it is th
14260 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
14270 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f  er of a table mo
14280 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61  ved to.  ** loca
14290 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65  tion iTable. The
142a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
142b0 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71 6c  modifies the sql
142c0 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
142d0 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74   to.  ** reflect
142e0 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   this..  **.  **
142f0 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74   The "#NNN" in t
14300 68 65 20 53 51 4c 20 69 73 20 61 20 73 70 65 63  he SQL is a spec
14310 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ial constant tha
14320 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72  t means whatever
14330 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69   value.  ** is i
14340 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20  n register NNN. 
14350 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72 75 6c   See grammar rul
14360 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
14370 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49 53 54  th the TK_REGIST
14380 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f  ER.  ** token fo
14390 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
143a0 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  ormation..  */. 
143b0 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
143c0 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
143d0 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20    "UPDATE %Q.%s 
143e0 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20  SET rootpage=%d 
143f0 57 48 45 52 45 20 23 25 64 20 41 4e 44 20 72 6f  WHERE #%d AND ro
14400 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20 20 20  otpage=#%d",.   
14410 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44    pParse->db->aD
14420 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c  b[iDb].zDbSName,
14430 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 69 54   MASTER_NAME, iT
14440 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23  able, r1, r1);.#
14450 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 52  endif.  sqlite3R
14460 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
14470 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a  arse, r1);.}../*
14480 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20 63  .** Write VDBE c
14490 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 61 62  ode to erase tab
144a0 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20  le pTab and all 
144b0 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63  associated indic
144c0 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43  es on disk..** C
144d0 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20 74 68  ode to update th
144e0 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
144f0 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72  tables and inter
14500 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e  nal schema defin
14510 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73  itions.** in cas
14520 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65  e a root-page be
14530 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68  longing to anoth
14540 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
14550 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 6c  d by the btree l
14560 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20  ayer.** is also 
14570 61 64 64 65 64 20 28 74 68 69 73 20 63 61 6e 20  added (this can 
14580 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61  happen with an a
14590 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
145a0 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ase)..*/.static 
145b0 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c  void destroyTabl
145c0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
145d0 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20   Table *pTab){. 
145e0 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
145f0 61 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f 2d  ase may be auto-
14600 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 28  vacuum capable (
14610 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  if SQLITE_OMIT_A
14620 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69  UTOVACUUM.  ** i
14630 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c 20  s not defined), 
14640 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 72  then it is impor
14650 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f  tant to call OP_
14660 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20  Destroy on the. 
14670 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e   ** table and in
14680 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 69  dex root-pages i
14690 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69 6e  n order, startin
146a0 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65 72  g with the numer
146b0 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72  ically .  ** lar
146c0 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e  gest root-page n
146d0 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61 72  umber. This guar
146e0 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e 65  antees that none
146f0 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   of the root-pag
14700 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 65  es.  ** to be de
14710 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f 63  stroyed is reloc
14720 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ated by an earli
14730 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69  er OP_Destroy. i
14740 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  .e. if the.  ** 
14750 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 63  following were c
14760 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  oded:.  **.  ** 
14770 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a 20  OP_Destroy 4 0. 
14780 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f   ** ....  ** OP_
14790 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a  Destroy 5 0.  **
147a0 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70  .  ** and root p
147b0 61 67 65 20 35 20 68 61 70 70 65 6e 65 64 20 74  age 5 happened t
147c0 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65 73 74  o be the largest
147d0 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
147e0 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  r in the.  ** da
147f0 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f  tabase, then roo
14800 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20 62  t page 5 would b
14810 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 20  e moved to page 
14820 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 22  4 by the .  ** "
14830 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22 20  OP_Destroy 4 0" 
14840 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62 73  opcode. The subs
14850 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 72  equent "OP_Destr
14860 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68 69  oy 5 0" would hi
14870 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69  t.  ** a free-li
14880 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  st page..  */.  
14890 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62 2d  int iTab = pTab-
148a0 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65  >tnum;.  int iDe
148b0 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20  stroyed = 0;..  
148c0 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
148d0 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
148e0 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d 20   int iLargest = 
148f0 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65 73  0;..    if( iDes
14900 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61  troyed==0 || iTa
14910 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b 0a  b<iDestroyed ){.
14920 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d        iLargest =
14930 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20   iTab;.    }.   
14940 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
14950 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
14960 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
14970 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20  .      int iIdx 
14980 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20  = pIdx->tnum;.  
14990 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
149a0 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
149b0 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
149c0 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79 65    if( (iDestroye
149d0 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44  d==0 || (iIdx<iD
149e0 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69 49  estroyed)) && iI
149f0 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20  dx>iLargest ){. 
14a00 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20         iLargest 
14a10 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a  = iIdx;.      }.
14a20 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c      }.    if( iL
14a30 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20  argest==0 ){.   
14a40 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
14a50 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
14a60 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
14a70 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
14a80 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
14a90 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 61 73 73  hema);.      ass
14aa0 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
14ab0 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e  Db<pParse->db->n
14ac0 44 62 20 29 3b 0a 20 20 20 20 20 20 64 65 73 74  Db );.      dest
14ad0 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
14ae0 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 69 44  se, iLargest, iD
14af0 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73 74 72  b);.      iDestr
14b00 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74 3b  oyed = iLargest;
14b10 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
14b20 0a 2a 2a 20 52 65 6d 6f 76 65 20 65 6e 74 72 69  .** Remove entri
14b30 65 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69  es from the sqli
14b40 74 65 5f 73 74 61 74 4e 20 74 61 62 6c 65 73 20  te_statN tables 
14b50 28 66 6f 72 20 4e 20 69 6e 20 28 31 2c 32 2c 33  (for N in (1,2,3
14b60 29 29 0a 2a 2a 20 61 66 74 65 72 20 61 20 44 52  )).** after a DR
14b70 4f 50 20 49 4e 44 45 58 20 6f 72 20 44 52 4f 50  OP INDEX or DROP
14b80 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a   TABLE command..
14b90 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
14ba0 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54  qlite3ClearStatT
14bb0 61 62 6c 65 73 28 0a 20 20 50 61 72 73 65 20 2a  ables(.  Parse *
14bc0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
14bd0 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
14be0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
14bf0 69 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  iDb,            
14c00 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
14c10 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63  se number */.  c
14c20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
14c30 2c 20 20 20 20 20 2f 2a 20 22 69 64 78 22 20 6f  ,     /* "idx" o
14c40 72 20 22 74 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e  r "tbl" */.  con
14c50 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
14c60 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 69      /* Name of i
14c70 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 2a 2f  ndex or table */
14c80 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  .){.  int i;.  c
14c90 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
14ca0 6d 65 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  me = pParse->db-
14cb0 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
14cc0 6d 65 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  me;.  for(i=1; i
14cd0 3c 3d 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  <=4; i++){.    c
14ce0 68 61 72 20 7a 54 61 62 5b 32 34 5d 3b 0a 20 20  har zTab[24];.  
14cf0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
14d00 74 66 28 73 69 7a 65 6f 66 28 7a 54 61 62 29 2c  tf(sizeof(zTab),
14d10 7a 54 61 62 2c 22 73 71 6c 69 74 65 5f 73 74 61  zTab,"sqlite_sta
14d20 74 25 64 22 2c 69 29 3b 0a 20 20 20 20 69 66 28  t%d",i);.    if(
14d30 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
14d40 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 54  e(pParse->db, zT
14d50 61 62 2c 20 7a 44 62 4e 61 6d 65 29 20 29 7b 0a  ab, zDbName) ){.
14d60 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
14d70 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
14d80 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  .        "DELETE
14d90 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
14da0 45 20 25 73 3d 25 51 22 2c 0a 20 20 20 20 20 20  E %s=%Q",.      
14db0 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54 61 62 2c    zDbName, zTab,
14dc0 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65 0a 20 20   zType, zName.  
14dd0 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
14de0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
14df0 74 65 20 63 6f 64 65 20 74 6f 20 64 72 6f 70 20  te code to drop 
14e00 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  a table..*/.void
14e10 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f 70   sqlite3CodeDrop
14e20 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
14e30 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
14e40 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 69  , int iDb, int i
14e50 73 56 69 65 77 29 7b 0a 20 20 56 64 62 65 20 2a  sView){.  Vdbe *
14e60 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
14e70 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
14e80 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
14e90 65 72 3b 0a 20 20 44 62 20 2a 70 44 62 20 3d 20  er;.  Db *pDb = 
14ea0 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a  &db->aDb[iDb];..
14eb0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
14ec0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
14ed0 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
14ee0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
14ef0 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
14f00 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23  rse, 1, iDb);..#
14f10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14f20 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
14f30 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
14f40 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  pTab) ){.    sql
14f50 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
14f60 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20  , OP_VBegin);.  
14f70 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  }.#endif..  /* D
14f80 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73  rop all triggers
14f90 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
14fa0 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
14fb0 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20   dropped. Code. 
14fc0 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64   ** is generated
14fd0 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72 69   to remove entri
14fe0 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d  es from sqlite_m
14ff0 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20 2a  aster and/or.  *
15000 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61  * sqlite_temp_ma
15010 73 74 65 72 20 69 66 20 72 65 71 75 69 72 65 64  ster if required
15020 2e 0a 20 20 2a 2f 0a 20 20 70 54 72 69 67 67 65  ..  */.  pTrigge
15030 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67  r = sqlite3Trigg
15040 65 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  erList(pParse, p
15050 54 61 62 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  Tab);.  while( p
15060 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 61  Trigger ){.    a
15070 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72 2d  ssert( pTrigger-
15080 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
15090 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20  pSchema || .    
150a0 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e 70 53      pTrigger->pS
150b0 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31  chema==db->aDb[1
150c0 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ].pSchema );.   
150d0 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67   sqlite3DropTrig
150e0 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 70  gerPtr(pParse, p
150f0 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20 70 54  Trigger);.    pT
15100 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65  rigger = pTrigge
15110 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 23  r->pNext;.  }..#
15120 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15130 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
15140 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79  .  /* Remove any
15150 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20   entries of the 
15160 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
15170 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64  table associated
15180 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 74   with.  ** the t
15190 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
151a0 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  ed. This is done
151b0 20 62 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c   before the tabl
151c0 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20 2a  e is dropped.  *
151d0 2a 20 61 74 20 74 68 65 20 62 74 72 65 65 20 6c  * at the btree l
151e0 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74 68  evel, in case th
151f0 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  e sqlite_sequenc
15200 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74 6f  e table needs to
15210 0a 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20  .  ** move as a 
15220 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 64 72  result of the dr
15230 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e 20 69  op (can happen i
15240 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
15250 64 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  de)..  */.  if( 
15260 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
15270 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e   TF_Autoincremen
15280 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
15290 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
152a0 73 65 2c 0a 20 20 20 20 20 20 22 44 45 4c 45 54  se,.      "DELET
152b0 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65  E FROM %Q.sqlite
152c0 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52 45 20  _sequence WHERE 
152d0 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20  name=%Q",.      
152e0 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 70  pDb->zDbSName, p
152f0 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29  Tab->zName.    )
15300 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
15310 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49  /* Drop all SQLI
15320 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
15330 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65  and index entrie
15340 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
15350 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20  the.  ** table. 
15360 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65  The program name
15370 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74   loops through t
15380 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
15390 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 2a 2a  and deletes.  **
153a0 20 65 76 65 72 79 20 72 6f 77 20 74 68 61 74 20   every row that 
153b0 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
153c0 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61  e of the same na
153d0 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65  me as the one be
153e0 69 6e 67 0a 20 20 2a 2a 20 64 72 6f 70 70 65 64  ing.  ** dropped
153f0 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20 68  . Triggers are h
15400 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c  andled separatel
15410 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69 67  y because a trig
15420 67 65 72 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20  ger can be.  ** 
15430 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 74  created in the t
15440 65 6d 70 20 64 61 74 61 62 61 73 65 20 74 68 61  emp database tha
15450 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  t refers to a ta
15460 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20  ble in another. 
15470 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20   ** database..  
15480 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74  */.  sqlite3Nest
15490 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  edParse(pParse, 
154a0 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46  .      "DELETE F
154b0 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20  ROM %Q.%s WHERE 
154c0 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20  tbl_name=%Q and 
154d0 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27 22  type!='trigger'"
154e0 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62  ,.      pDb->zDb
154f0 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41  SName, MASTER_NA
15500 4d 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  ME, pTab->zName)
15510 3b 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20  ;.  if( !isView 
15520 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  && !IsVirtual(pT
15530 61 62 29 20 29 7b 0a 20 20 20 20 64 65 73 74 72  ab) ){.    destr
15540 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  oyTable(pParse, 
15550 70 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pTab);.  }..  /*
15560 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   Remove the tabl
15570 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c  e entry from SQL
15580 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20 73  ite's internal s
15590 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79  chema and modify
155a0 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61  .  ** the schema
155b0 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a 2f 0a 20 20   cookie..  */.  
155c0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
155d0 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ab) ){.    sqlit
155e0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
155f0 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69 44 62  OP_VDestroy, iDb
15600 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  , 0, 0, pTab->zN
15610 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ame, 0);.    sql
15620 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
15630 72 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rse);.  }.  sqli
15640 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
15650 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69   OP_DropTable, i
15660 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e  Db, 0, 0, pTab->
15670 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c  zName, 0);.  sql
15680 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
15690 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
156a0 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
156b0 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 7d 0a  All(db, iDb);.}.
156c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
156d0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
156e0 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20   do the work of 
156f0 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61  a DROP TABLE sta
15700 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65  tement..** pName
15710 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
15720 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
15730 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64  dropped..*/.void
15740 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c   sqlite3DropTabl
15750 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
15760 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c   SrcList *pName,
15770 20 69 6e 74 20 69 73 56 69 65 77 2c 20 69 6e 74   int isView, int
15780 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62 6c 65   noErr){.  Table
15790 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20 2a   *pTab;.  Vdbe *
157a0 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
157b0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
157c0 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28   int iDb;..  if(
157d0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
157e0 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d ){.    goto ex
157f0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
15800 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
15810 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a  rse->nErr==0 );.
15820 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
15830 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66  >nSrc==1 );.  if
15840 28 20 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  ( sqlite3ReadSch
15850 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f  ema(pParse) ) go
15860 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
15870 6c 65 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20  le;.  if( noErr 
15880 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72  ) db->suppressEr
15890 72 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 69  r++;.  assert( i
158a0 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69  sView==0 || isVi
158b0 65 77 3d 3d 4c 4f 43 41 54 45 5f 56 49 45 57 20  ew==LOCATE_VIEW 
158c0 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  );.  pTab = sqli
158d0 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74  te3LocateTableIt
158e0 65 6d 28 70 50 61 72 73 65 2c 20 69 73 56 69 65  em(pParse, isVie
158f0 77 2c 20 26 70 4e 61 6d 65 2d 3e 61 5b 30 5d 29  w, &pName->a[0])
15900 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20  ;.  if( noErr ) 
15910 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72 2d  db->suppressErr-
15920 2d 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  -;..  if( pTab==
15930 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f 45  0 ){.    if( noE
15940 72 72 20 29 20 73 71 6c 69 74 65 33 43 6f 64 65  rr ) sqlite3Code
15950 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d  VerifyNamedSchem
15960 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d  a(pParse, pName-
15970 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
15980 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
15990 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
159a0 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
159b0 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
159c0 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
159d0 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
159e0 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
159f0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61   );..  /* If pTa
15a00 62 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74  b is a virtual t
15a10 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69 65 77 47  able, call ViewG
15a20 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20  etColumnNames() 
15a30 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a 2a 20 69  to ensure.  ** i
15a40 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  t is initialized
15a50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  ..  */.  if( IsV
15a60 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26 20  irtual(pTab) && 
15a70 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
15a80 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
15a90 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 67  , pTab) ){.    g
15aa0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
15ab0 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  ble;.  }.#ifndef
15ac0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
15ad0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
15ae0 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20     int code;.   
15af0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
15b00 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
15b10 28 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74  (iDb);.    const
15b20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
15b30 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
15b40 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  me;.    const ch
15b50 61 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b 0a 20  ar *zArg2 = 0;. 
15b60 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
15b70 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
15b80 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
15b90 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20  Tab, 0, zDb)){. 
15ba0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
15bb0 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
15bc0 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20  .    if( isView 
15bd0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  ){.      if( !OM
15be0 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
15bf0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
15c00 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
15c10 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20  P_TEMP_VIEW;.   
15c20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15c30 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
15c40 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  DROP_VIEW;.     
15c50 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
15c60 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
15c70 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  BLE.    }else if
15c80 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
15c90 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 20  ) ){.      code 
15ca0 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54  = SQLITE_DROP_VT
15cb0 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41 72 67  ABLE;.      zArg
15cc0 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54  2 = sqlite3GetVT
15cd0 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 2d 3e  able(db, pTab)->
15ce0 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e  pMod->zName;.#en
15cf0 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
15d00 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
15d10 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
15d20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
15d30 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
15d40 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  MP_TABLE;.      
15d50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
15d60 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
15d70 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
15d80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
15d90 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
15da0 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54  pParse, code, pT
15db0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67 32  ab->zName, zArg2
15dc0 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
15dd0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
15de0 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  able;.    }.    
15df0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
15e00 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
15e10 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62  ITE_DELETE, pTab
15e20 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  ->zName, 0, zDb)
15e30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
15e40 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
15e50 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
15e60 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
15e70 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rNICmp(pTab->zNa
15e80 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
15e90 29 3d 3d 30 20 0a 20 20 20 20 26 26 20 73 71 6c  )==0 .    && sql
15ea0 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61  ite3StrNICmp(pTa
15eb0 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  b->zName, "sqlit
15ec0 65 5f 73 74 61 74 22 2c 20 31 31 29 21 3d 30 20  e_stat", 11)!=0 
15ed0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
15ee0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
15ef0 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
15f00 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70 54   be dropped", pT
15f10 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
15f20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
15f30 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  able;.  }..#ifnd
15f40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
15f50 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20  IEW.  /* Ensure 
15f60 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20 6e 6f  DROP TABLE is no
15f70 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69 65 77  t used on a view
15f80 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45 57 20  , and DROP VIEW 
15f90 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a  is not used.  **
15fa0 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a   on a table..  *
15fb0 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 26  /.  if( isView &
15fc0 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  & pTab->pSelect=
15fd0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
15fe0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15ff0 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c  , "use DROP TABL
16000 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c  E to delete tabl
16010 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  e %s", pTab->zNa
16020 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
16030 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
16040 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65 77   }.  if( !isView
16050 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
16060 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
16070 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
16080 20 22 75 73 65 20 44 52 4f 50 20 56 49 45 57 20   "use DROP VIEW 
16090 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20 25  to delete view %
160a0 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s", pTab->zName)
160b0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
160c0 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
160d0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
160e0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
160f0 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 66  move the table f
16100 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
16110 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73  able.  ** on dis
16120 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  k..  */.  v = sq
16130 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
16140 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
16150 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
16160 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
16170 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
16180 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77  .    if( !isView
16190 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
161a0 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73  3ClearStatTables
161b0 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74  (pParse, iDb, "t
161c0 62 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  bl", pTab->zName
161d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
161e0 46 6b 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72  FkDropTable(pPar
161f0 73 65 2c 20 70 4e 61 6d 65 2c 20 70 54 61 62 29  se, pName, pTab)
16200 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
16210 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65  te3CodeDropTable
16220 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69  (pParse, pTab, i
16230 44 62 2c 20 69 73 56 69 65 77 29 3b 0a 20 20 7d  Db, isView);.  }
16240 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  ..exit_drop_tabl
16250 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  e:.  sqlite3SrcL
16260 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e  istDelete(db, pN
16270 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ame);.}../*.** T
16280 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
16290 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
162a0 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65  a new foreign ke
162b0 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a  y on the table.*
162c0 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  * currently unde
162d0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
162e0 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d   pFromCol determ
162f0 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d  ines which colum
16300 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72  ns.** in the cur
16310 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74  rent table point
16320 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20   to the foreign 
16330 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f  key.  If pFromCo
16340 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e  l==0 then.** con
16350 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20  nect the key to 
16360 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
16370 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69  inserted.  pTo i
16380 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a  s the name of.**
16390 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65 72   the table refer
163a0 72 65 64 20 74 6f 20 28 61 2e 6b 2e 61 20 74 68  red to (a.k.a th
163b0 65 20 22 70 61 72 65 6e 74 22 20 74 61 62 6c 65  e "parent" table
163c0 29 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20  ).  pToCol is a 
163d0 6c 69 73 74 0a 2a 2a 20 6f 66 20 74 61 62 6c 65  list.** of table
163e0 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20  s in the parent 
163f0 70 54 6f 20 74 61 62 6c 65 2e 20 20 66 6c 61 67  pTo table.  flag
16400 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a  s contains all.*
16410 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * information ab
16420 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74  out the conflict
16430 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
16440 72 69 74 68 6d 73 20 73 70 65 63 69 66 69 65 64  rithms specified
16450 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44 45  .** in the ON DE
16460 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45 20  LETE, ON UPDATE 
16470 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c  and ON INSERT cl
16480 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  auses..**.** An 
16490 46 4b 65 79 20 73 74 72 75 63 74 75 72 65 20 69  FKey structure i
164a0 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 64  s created and ad
164b0 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ded to the table
164c0 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e   currently.** un
164d0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
164e0 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e   in the pParse->
164f0 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64 2e  pNewTable field.
16500 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69  .**.** The forei
16510 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f  gn key is set fo
16520 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63  r IMMEDIATE proc
16530 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65  essing.  A subse
16540 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f  quent call.** to
16550 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72   sqlite3DeferFor
16560 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20  eignKey() might 
16570 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44  change this to D
16580 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64  EFERRED..*/.void
16590 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f   sqlite3CreateFo
165a0 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73  reignKey(.  Pars
165b0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
165c0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
165d0 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
165e0 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a  t *pFromCol,  /*
165f0 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73   Columns in this
16600 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e   table that poin
16610 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65  t to other table
16620 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f   */.  Token *pTo
16630 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ,          /* Na
16640 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20  me of the other 
16650 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  table */.  ExprL
16660 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20  ist *pToCol,    
16670 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  /* Columns in th
16680 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  e other table */
16690 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
166a0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c          /* Confl
166b0 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
166c0 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b  lgorithms. */.){
166d0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
166e0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66   pParse->db;.#if
166f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16700 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46  _FOREIGN_KEY.  F
16710 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a  Key *pFKey = 0;.
16720 20 20 46 4b 65 79 20 2a 70 4e 65 78 74 54 6f 3b    FKey *pNextTo;
16730 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70 50  .  Table *p = pP
16740 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
16750 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
16760 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f  int i;.  int nCo
16770 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20  l;.  char *z;.. 
16780 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20   assert( pTo!=0 
16790 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  );.  if( p==0 ||
167a0 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42   IN_DECLARE_VTAB
167b0 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
167c0 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d    if( pFromCol==
167d0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f  0 ){.    int iCo
167e0 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  l = p->nCol-1;. 
167f0 20 20 20 69 66 28 20 4e 45 56 45 52 28 69 43 6f     if( NEVER(iCo
16800 6c 3c 30 29 20 29 20 67 6f 74 6f 20 66 6b 5f 65  l<0) ) goto fk_e
16810 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43  nd;.    if( pToC
16820 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45  ol && pToCol->nE
16830 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr!=1 ){.      
16840 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
16850 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e  pParse, "foreign
16860 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20   key on %s".    
16870 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65       " should re
16880 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65  ference only one
16890 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
168a0 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70   %T",.         p
168b0 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
168c0 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20  me, pTo);.      
168d0 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
168e0 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b   }.    nCol = 1;
168f0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f  .  }else if( pTo
16900 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e  Col && pToCol->n
16910 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e  Expr!=pFromCol->
16920 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c  nExpr ){.    sql
16930 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
16940 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75  rse,.        "nu
16950 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
16960 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
16970 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
16980 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20  e number of ".  
16990 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69        "columns i
169a0 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  n the referenced
169b0 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f   table");.    go
169c0 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c  to fk_end;.  }el
169d0 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70  se{.    nCol = p
169e0 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a  FromCol->nExpr;.
169f0 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69    }.  nByte = si
16a00 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 28  zeof(*pFKey) + (
16a10 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 70  nCol-1)*sizeof(p
16a20 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b  FKey->aCol[0]) +
16a30 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69   pTo->n + 1;.  i
16a40 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20  f( pToCol ){.   
16a50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43   for(i=0; i<pToC
16a60 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ol->nExpr; i++){
16a70 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  .      nByte += 
16a80 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
16a90 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
16aa0 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20  me) + 1;.    }. 
16ab0 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c   }.  pFKey = sql
16ac0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
16ad0 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20  (db, nByte );.  
16ae0 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a  if( pFKey==0 ){.
16af0 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
16b00 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46  .  }.  pFKey->pF
16b10 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79  rom = p;.  pFKey
16b20 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d  ->pNextFrom = p-
16b30 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63  >pFKey;.  z = (c
16b40 68 61 72 2a 29 26 70 46 4b 65 79 2d 3e 61 43 6f  har*)&pFKey->aCo
16b50 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79  l[nCol];.  pFKey
16b60 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 69 66 28  ->zTo = z;.  if(
16b70 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
16b80 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T ){.    sqlite3
16b90 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70  RenameTokenMap(p
16ba0 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 7a 2c  Parse, (void*)z,
16bb0 20 70 54 6f 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d   pTo);.  }.  mem
16bc0 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70  cpy(z, pTo->z, p
16bd0 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d  To->n);.  z[pTo-
16be0 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  >n] = 0;.  sqlit
16bf0 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20  e3Dequote(z);.  
16c00 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20  z += pTo->n+1;. 
16c10 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e   pFKey->nCol = n
16c20 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  Col;.  if( pFrom
16c30 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  Col==0 ){.    pF
16c40 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72  Key->aCol[0].iFr
16c50 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  om = p->nCol-1;.
16c60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
16c70 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
16c80 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  +){.      int j;
16c90 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
16ca0 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  j<p->nCol; j++){
16cb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
16cc0 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61  ite3StrICmp(p->a
16cd0 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46  Col[j].zName, pF
16ce0 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
16cf0 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
16d00 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
16d10 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20  i].iFrom = j;.  
16d20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16d30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16d40 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d  .      if( j>=p-
16d50 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  >nCol ){.       
16d60 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
16d70 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
16d80 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c      "unknown col
16d90 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f  umn \"%s\" in fo
16da0 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
16db0 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  tion", .        
16dc0 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d    pFromCol->a[i]
16dd0 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
16de0 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
16df0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
16e00 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
16e10 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
16e20 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65  te3RenameTokenRe
16e30 6d 61 70 28 70 50 61 72 73 65 2c 20 26 70 46 4b  map(pParse, &pFK
16e40 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2c 20 70 46 72  ey->aCol[i], pFr
16e50 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  omCol->a[i].zNam
16e60 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
16e70 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43  }.  }.  if( pToC
16e80 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
16e90 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
16ea0 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
16eb0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
16ec0 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
16ed0 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  e);.      pFKey-
16ee0 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20  >aCol[i].zCol = 
16ef0 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 49 4e 5f  z;.      if( IN_
16f00 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
16f10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16f20 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70  RenameTokenRemap
16f30 28 70 50 61 72 73 65 2c 20 7a 2c 20 70 54 6f 43  (pParse, z, pToC
16f40 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ol->a[i].zName);
16f50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
16f60 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d  emcpy(z, pToCol-
16f70 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b  >a[i].zName, n);
16f80 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b  .      z[n] = 0;
16f90 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b  .      z += n+1;
16fa0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
16fb0 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
16fc0 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63   0;.  pFKey->aAc
16fd0 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29 28 66  tion[0] = (u8)(f
16fe0 6c 61 67 73 20 26 20 30 78 66 66 29 3b 20 20 20  lags & 0xff);   
16ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 44           /* ON D
17000 45 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a  ELETE action */.
17010 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e    pFKey->aAction
17020 5b 31 5d 20 3d 20 28 75 38 29 28 28 66 6c 61 67  [1] = (u8)((flag
17030 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66 29  s >> 8 ) & 0xff)
17040 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54  ;    /* ON UPDAT
17050 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61  E action */..  a
17060 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
17070 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
17080 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  , 0, p->pSchema)
17090 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20 3d 20   );.  pNextTo = 
170a0 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65 33 48  (FKey *)sqlite3H
170b0 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 53  ashInsert(&p->pS
170c0 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68 2c  chema->fkeyHash,
170d0 20 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a   .      pFKey->z
170e0 54 6f 2c 20 28 76 6f 69 64 20 2a 29 70 46 4b 65  To, (void *)pFKe
170f0 79 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  y.  );.  if( pNe
17100 78 74 54 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a 20  xtTo==pFKey ){. 
17110 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
17120 6c 74 28 64 62 29 3b 0a 20 20 20 20 67 6f 74 6f  lt(db);.    goto
17130 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69   fk_end;.  }.  i
17140 66 28 20 70 4e 65 78 74 54 6f 20 29 7b 0a 20 20  f( pNextTo ){.  
17150 20 20 61 73 73 65 72 74 28 20 70 4e 65 78 74 54    assert( pNextT
17160 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30 20 29 3b  o->pPrevTo==0 );
17170 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78  .    pFKey->pNex
17180 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f 3b 0a 20  tTo = pNextTo;. 
17190 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65     pNextTo->pPre
171a0 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a 20 20 7d  vTo = pFKey;.  }
171b0 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
171c0 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74  foreign key to t
171d0 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65 20  he table as the 
171e0 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a  last step..  */.
171f0 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b    p->pFKey = pFK
17200 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b  ey;.  pFKey = 0;
17210 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69  ..fk_end:.  sqli
17220 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 46  te3DbFree(db, pF
17230 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  Key);.#endif /* 
17240 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
17250 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
17260 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78  ) */.  sqlite3Ex
17270 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
17280 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71   pFromCol);.  sq
17290 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
172a0 65 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29 3b  ete(db, pToCol);
172b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
172c0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
172d0 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c   when an INITIAL
172e0 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20  LY IMMEDIATE or 
172f0 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
17300 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20  ED.** clause is 
17310 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20  seen as part of 
17320 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  a foreign key de
17330 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69  finition.  The i
17340 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72  sDeferred.** par
17350 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72 20  ameter is 1 for 
17360 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
17370 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49  ED and 0 for INI
17380 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
17390 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f  ..** The behavio
173a0 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  r of the most re
173b0 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66  cently created f
173c0 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64  oreign key is ad
173d0 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64  justed.** accord
173e0 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ingly..*/.void s
173f0 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69  qlite3DeferForei
17400 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61  gnKey(Parse *pPa
17410 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72  rse, int isDefer
17420 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  red){.#ifndef SQ
17430 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
17440 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70  N_KEY.  Table *p
17450 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b  Tab;.  FKey *pFK
17460 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20  ey;.  if( (pTab 
17470 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
17480 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65  ble)==0 || (pFKe
17490 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29  y = pTab->pFKey)
174a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
174b0 61 73 73 65 72 74 28 20 69 73 44 65 66 65 72 72  assert( isDeferr
174c0 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65 72  ed==0 || isDefer
174d0 72 65 64 3d 3d 31 20 29 3b 20 2f 2a 20 45 56 3a  red==1 ); /* EV:
174e0 20 52 2d 33 30 33 32 33 2d 32 31 39 31 37 20 2a   R-30323-21917 *
174f0 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  /.  pFKey->isDef
17500 65 72 72 65 64 20 3d 20 28 75 38 29 69 73 44 65  erred = (u8)isDe
17510 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d  ferred;.#endif.}
17520 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
17530 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
17540 65 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c  erase and refill
17550 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54   index *pIdx.  T
17560 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  his is.** used t
17570 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  o initialize a n
17580 65 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ewly created ind
17590 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75  ex or to recompu
175a0 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  te the.** conten
175b0 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e  t of an index in
175c0 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52   response to a R
175d0 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a  EINDEX command..
175e0 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74  **.** if memRoot
175f0 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61  Page is not nega
17600 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  tive, it means t
17610 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73  hat the index is
17620 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65   newly.** create
17630 64 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72  d.  The register
17640 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6d 65   specified by me
17650 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69  mRootPage contai
17660 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  ns the.** root p
17670 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
17680 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d  e index.  If mem
17690 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61  RootPage is nega
176a0 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  tive, then.** th
176b0 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  e index already 
176c0 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20  exists and must 
176d0 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72  be cleared befor
176e0 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64  e being refilled
176f0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74   and.** the root
17700 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
17710 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b  the index is tak
17720 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e  en from pIndex->
17730 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tnum..*/.static 
17740 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66 69  void sqlite3Refi
17750 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  llIndex(Parse *p
17760 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
17770 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f  ndex, int memRoo
17780 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20  tPage){.  Table 
17790 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e  *pTab = pIndex->
177a0 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20  pTable;  /* The 
177b0 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e  table that is in
177c0 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  dexed */.  int i
177d0 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
177e0 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72  ab++;     /* Btr
177f0 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
17800 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  or pTab */.  int
17810 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e   iIdx = pParse->
17820 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42  nTab++;     /* B
17830 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64  tree cursor used
17840 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20   for pIndex */. 
17850 20 69 6e 74 20 69 53 6f 72 74 65 72 3b 20 20 20   int iSorter;   
17860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17870 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 65 64  /* Cursor opened
17880 20 62 79 20 4f 70 65 6e 53 6f 72 74 65 72 20 28   by OpenSorter (
17890 69 66 20 69 6e 20 75 73 65 29 20 2a 2f 0a 20 20  if in use) */.  
178a0 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20  int addr1;      
178b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
178c0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70  * Address of top
178d0 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e   of loop */.  in
178e0 74 20 61 64 64 72 32 3b 20 20 20 20 20 20 20 20  t addr2;        
178f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17900 41 64 64 72 65 73 73 20 74 6f 20 6a 75 6d 70 20  Address to jump 
17910 74 6f 20 66 6f 72 20 6e 65 78 74 20 69 74 65 72  to for next iter
17920 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 74  ation */.  int t
17930 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  num;            
17940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
17950 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20  t page of index 
17960 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 74 49 64  */.  int iPartId
17970 78 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20  xLabel;         
17980 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74      /* Jump to t
17990 68 69 73 20 6c 61 62 65 6c 20 74 6f 20 73 6b 69  his label to ski
179a0 70 20 61 20 72 6f 77 20 2a 2f 0a 20 20 56 64 62  p a row */.  Vdb
179b0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
179c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
179d0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
179e0 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d  o this virtual m
179f0 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49  achine */.  KeyI
17a00 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20 20  nfo *pKey;      
17a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65             /* Ke
17a20 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78 20  yInfo for index 
17a30 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  */.  int regReco
17a40 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rd;             
17a50 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
17a60 68 6f 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c 65  holding assemble
17a70 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a  d index record *
17a80 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
17a90 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
17aa0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
17ab0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
17ac0 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  .  int iDb = sql
17ad0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
17ae0 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53  x(db, pIndex->pS
17af0 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66  chema);..#ifndef
17b00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
17b10 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  HORIZATION.  if(
17b20 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
17b30 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
17b40 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78  _REINDEX, pIndex
17b50 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20  ->zName, 0,.    
17b60 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
17b70 44 62 53 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20  DbSName ) ){.   
17b80 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
17b90 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72  dif..  /* Requir
17ba0 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f  e a write-lock o
17bb0 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 70  n the table to p
17bc0 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70 65 72  erform this oper
17bd0 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ation */.  sqlit
17be0 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
17bf0 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
17c00 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e  num, 1, pTab->zN
17c10 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  ame);..  v = sql
17c20 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
17c30 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
17c40 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
17c50 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29  memRootPage>=0 )
17c60 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d 65 6d  {.    tnum = mem
17c70 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65 6c 73  RootPage;.  }els
17c80 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49  e{.    tnum = pI
17c90 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 7d 0a  ndex->tnum;.  }.
17ca0 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
17cb0 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70  KeyInfoOfIndex(p
17cc0 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a  Parse, pIndex);.
17cd0 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 21 3d    assert( pKey!=
17ce0 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
17cf0 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
17d00 3e 6e 45 72 72 20 29 3b 0a 0a 20 20 2f 2a 20 4f  >nErr );..  /* O
17d10 70 65 6e 20 74 68 65 20 73 6f 72 74 65 72 20 63  pen the sorter c
17d20 75 72 73 6f 72 20 69 66 20 77 65 20 61 72 65 20  ursor if we are 
17d30 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20  to use one. */. 
17d40 20 69 53 6f 72 74 65 72 20 3d 20 70 50 61 72 73   iSorter = pPars
17d50 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c  e->nTab++;.  sql
17d60 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
17d70 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c  , OP_SorterOpen,
17d80 20 69 53 6f 72 74 65 72 2c 20 30 2c 20 70 49 6e   iSorter, 0, pIn
17d90 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 28 63  dex->nKeyCol, (c
17da0 68 61 72 2a 29 0a 20 20 20 20 20 20 20 20 20 20  har*).          
17db0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17dc0 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79  3KeyInfoRef(pKey
17dd0 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  ), P4_KEYINFO);.
17de0 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 74  .  /* Open the t
17df0 61 62 6c 65 2e 20 4c 6f 6f 70 20 74 68 72 6f 75  able. Loop throu
17e00 67 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74  gh all rows of t
17e10 68 65 20 74 61 62 6c 65 2c 20 69 6e 73 65 72 74  he table, insert
17e20 69 6e 67 20 69 6e 64 65 78 0a 20 20 2a 2a 20 72  ing index.  ** r
17e30 65 63 6f 72 64 73 20 69 6e 74 6f 20 74 68 65 20  ecords into the 
17e40 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 73 71 6c  sorter. */.  sql
17e50 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
17e60 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c  arse, iTab, iDb,
17e70 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
17e80 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73  ad);.  addr1 = s
17e90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17ea0 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
17eb0 54 61 62 2c 20 30 29 3b 20 56 64 62 65 43 6f 76  Tab, 0); VdbeCov
17ec0 65 72 61 67 65 28 76 29 3b 0a 20 20 72 65 67 52  erage(v);.  regR
17ed0 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
17ee0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
17ef0 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 75 6c 74  );.  sqlite3Mult
17f00 69 57 72 69 74 65 28 70 50 61 72 73 65 29 3b 0a  iWrite(pParse);.
17f10 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61  .  sqlite3Genera
17f20 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73  teIndexKey(pPars
17f30 65 2c 70 49 6e 64 65 78 2c 69 54 61 62 2c 72 65  e,pIndex,iTab,re
17f40 67 52 65 63 6f 72 64 2c 30 2c 26 69 50 61 72 74  gRecord,0,&iPart
17f50 49 64 78 4c 61 62 65 6c 2c 30 2c 30 29 3b 0a 20  IdxLabel,0,0);. 
17f60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17f70 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49  p2(v, OP_SorterI
17f80 6e 73 65 72 74 2c 20 69 53 6f 72 74 65 72 2c 20  nsert, iSorter, 
17f90 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
17fa0 6c 69 74 65 33 52 65 73 6f 6c 76 65 50 61 72 74  lite3ResolvePart
17fb0 49 64 78 4c 61 62 65 6c 28 70 50 61 72 73 65 2c  IdxLabel(pParse,
17fc0 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c 29 3b   iPartIdxLabel);
17fd0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
17fe0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
17ff0 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31 29 3b   iTab, addr1+1);
18000 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
18010 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
18020 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
18030 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74  );.  if( memRoot
18040 50 61 67 65 3c 30 20 29 20 73 71 6c 69 74 65 33  Page<0 ) sqlite3
18050 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18060 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44  _Clear, tnum, iD
18070 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  b);.  sqlite3Vdb
18080 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
18090 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74  enWrite, iIdx, t
180a0 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20 20 20  num, iDb, .     
180b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
180c0 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f  char *)pKey, P4_
180d0 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69  KEYINFO);.  sqli
180e0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
180f0 76 2c 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53  v, OPFLAG_BULKCS
18100 52 7c 28 28 6d 65 6d 52 6f 6f 74 50 61 67 65 3e  R|((memRootPage>
18110 3d 30 29 3f 4f 50 46 4c 41 47 5f 50 32 49 53 52  =0)?OPFLAG_P2ISR
18120 45 47 3a 30 29 29 3b 0a 0a 20 20 61 64 64 72 31  EG:0));..  addr1
18130 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
18140 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
18150 72 53 6f 72 74 2c 20 69 53 6f 72 74 65 72 2c 20  rSort, iSorter, 
18160 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  0); VdbeCoverage
18170 28 76 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69  (v);.  if( IsUni
18180 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29  queIndex(pIndex)
18190 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 32 20 3d   ){.    int j2 =
181a0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
181b0 28 76 2c 20 31 29 3b 0a 20 20 20 20 61 64 64 72  (v, 1);.    addr
181c0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
181d0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
181e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 56 65     sqlite3VdbeVe
181f0 72 69 66 79 41 62 6f 72 74 61 62 6c 65 28 76 2c  rifyAbortable(v,
18200 20 4f 45 5f 41 62 6f 72 74 29 3b 0a 20 20 20 20   OE_Abort);.    
18210 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18220 34 49 6e 74 28 76 2c 20 4f 50 5f 53 6f 72 74 65  4Int(v, OP_Sorte
18230 72 43 6f 6d 70 61 72 65 2c 20 69 53 6f 72 74 65  rCompare, iSorte
18240 72 2c 20 6a 32 2c 20 72 65 67 52 65 63 6f 72 64  r, j2, regRecord
18250 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18260 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65             pInde
18270 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62  x->nKeyCol); Vdb
18280 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
18290 20 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65 43    sqlite3UniqueC
182a0 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65  onstraint(pParse
182b0 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 70 49 6e 64  , OE_Abort, pInd
182c0 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ex);.    sqlite3
182d0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
182e0 6a 32 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  j2);.  }else{.  
182f0 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65    addr2 = sqlite
18300 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
18310 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (v);.  }.  sqlit
18320 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
18330 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69  OP_SorterData, i
18340 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63 6f 72  Sorter, regRecor
18350 64 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69  d, iIdx);.  sqli
18360 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
18370 20 4f 50 5f 53 65 65 6b 45 6e 64 2c 20 69 49 64   OP_SeekEnd, iId
18380 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  x);.  sqlite3Vdb
18390 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
183a0 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 72  xInsert, iIdx, r
183b0 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
183c0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
183d0 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
183e0 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c  EKRESULT);.  sql
183f0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
18400 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
18410 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
18420 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18430 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 53 6f  _SorterNext, iSo
18440 72 74 65 72 2c 20 61 64 64 72 32 29 3b 20 56 64  rter, addr2); Vd
18450 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
18460 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
18470 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
18480 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
18490 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
184a0 2c 20 69 54 61 62 29 3b 0a 20 20 73 71 6c 69 74  , iTab);.  sqlit
184b0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
184c0 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 29 3b  OP_Close, iIdx);
184d0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
184e0 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
184f0 2c 20 69 53 6f 72 74 65 72 29 3b 0a 7d 0a 0a 2f  , iSorter);.}../
18500 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 68 65  *.** Allocate he
18510 61 70 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64  ap space to hold
18520 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63 74   an Index object
18530 20 77 69 74 68 20 6e 43 6f 6c 20 63 6f 6c 75 6d   with nCol colum
18540 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65 61  ns..**.** Increa
18550 73 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  se the allocatio
18560 6e 20 73 69 7a 65 20 74 6f 20 70 72 6f 76 69 64  n size to provid
18570 65 20 61 6e 20 65 78 74 72 61 20 6e 45 78 74 72  e an extra nExtr
18580 61 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 38 2d  a bytes.** of 8-
18590 62 79 74 65 20 61 6c 69 67 6e 65 64 20 73 70 61  byte aligned spa
185a0 63 65 20 61 66 74 65 72 20 74 68 65 20 49 6e 64  ce after the Ind
185b0 65 78 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65  ex object and re
185c0 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65  turn a.** pointe
185d0 72 20 74 6f 20 74 68 69 73 20 65 78 74 72 61 20  r to this extra 
185e0 73 70 61 63 65 20 69 6e 20 2a 70 70 45 78 74 72  space in *ppExtr
185f0 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c  a..*/.Index *sql
18600 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65  ite3AllocateInde
18610 78 4f 62 6a 65 63 74 28 0a 20 20 73 71 6c 69 74  xObject(.  sqlit
18620 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
18630 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
18640 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 31 36 20  ection */.  i16 
18650 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  nCol,           
18660 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
18670 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
18680 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  he index */.  in
18690 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
186a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
186b0 62 79 74 65 73 20 6f 66 20 65 78 74 72 61 20 73  bytes of extra s
186c0 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 20 2a 2f  pace to alloc */
186d0 0a 20 20 63 68 61 72 20 2a 2a 70 70 45 78 74 72  .  char **ppExtr
186e0 61 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  a       /* Point
186f0 65 72 20 74 6f 20 74 68 65 20 22 65 78 74 72 61  er to the "extra
18700 22 20 73 70 61 63 65 20 2a 2f 0a 29 7b 0a 20 20  " space */.){.  
18710 49 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20  Index *p;       
18720 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
18730 64 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a  d index object *
18740 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
18750 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
18760 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 49  s of space for I
18770 6e 64 65 78 20 6f 62 6a 65 63 74 20 2b 20 61 72  ndex object + ar
18780 72 61 79 73 20 2a 2f 0a 0a 20 20 6e 42 79 74 65  rays */..  nByte
18790 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   = ROUND8(sizeof
187a0 28 49 6e 64 65 78 29 29 20 2b 20 20 20 20 20 20  (Index)) +      
187b0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
187c0 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20   structure  */. 
187d0 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38 28           ROUND8(
187e0 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43  sizeof(char*)*nC
187f0 6f 6c 29 20 2b 20 20 20 20 20 20 20 20 20 2f 2a  ol) +         /*
18800 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20   Index.azColl   
18810 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52    */.          R
18820 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4c 6f 67  OUND8(sizeof(Log
18830 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20  Est)*(nCol+1) + 
18840 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52      /* Index.aiR
18850 6f 77 4c 6f 67 45 73 74 20 20 20 2a 2f 0a 20 20  owLogEst   */.  
18860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
18870 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 20  izeof(i16)*nCol 
18880 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  +            /* 
18890 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20  Index.aiColumn  
188a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
188b0 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38 29 2a       sizeof(u8)*
188c0 6e 43 6f 6c 29 3b 20 20 20 20 20 20 20 20 20 20  nCol);          
188d0 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72     /* Index.aSor
188e0 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 20 3d 20  tOrder */.  p = 
188f0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
18900 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 2b 20  ero(db, nByte + 
18910 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 70  nExtra);.  if( p
18920 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 45   ){.    char *pE
18930 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29 70  xtra = ((char*)p
18940 29 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  )+ROUND8(sizeof(
18950 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 70 2d 3e  Index));.    p->
18960 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74 20  azColl = (const 
18970 63 68 61 72 2a 2a 29 70 45 78 74 72 61 3b 20 70  char**)pExtra; p
18980 45 78 74 72 61 20 2b 3d 20 52 4f 55 4e 44 38 28  Extra += ROUND8(
18990 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43  sizeof(char*)*nC
189a0 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 69 52 6f  ol);.    p->aiRo
189b0 77 4c 6f 67 45 73 74 20 3d 20 28 4c 6f 67 45 73  wLogEst = (LogEs
189c0 74 2a 29 70 45 78 74 72 61 3b 20 70 45 78 74 72  t*)pExtra; pExtr
189d0 61 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45  a += sizeof(LogE
189e0 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 3b 0a 20 20  st)*(nCol+1);.  
189f0 20 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20    p->aiColumn = 
18a00 28 69 31 36 2a 29 70 45 78 74 72 61 3b 20 20 20  (i16*)pExtra;   
18a10 20 20 20 20 70 45 78 74 72 61 20 2b 3d 20 73 69      pExtra += si
18a20 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 3b 0a  zeof(i16)*nCol;.
18a30 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65      p->aSortOrde
18a40 72 20 3d 20 28 75 38 2a 29 70 45 78 74 72 61 3b  r = (u8*)pExtra;
18a50 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20  .    p->nColumn 
18a60 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 6e  = nCol;.    p->n
18a70 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2d 20  KeyCol = nCol - 
18a80 31 3b 0a 20 20 20 20 2a 70 70 45 78 74 72 61 20  1;.    *ppExtra 
18a90 3d 20 28 28 63 68 61 72 2a 29 70 29 20 2b 20 6e  = ((char*)p) + n
18aa0 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Byte;.  }.  retu
18ab0 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn p;.}../*.** C
18ac0 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65  reate a new inde
18ad0 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62  x for an SQL tab
18ae0 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d  le.  pName1.pNam
18af0 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  e2 is the name o
18b00 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20  f the index .** 
18b10 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20  and pTblList is 
18b20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
18b30 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
18b40 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f   be indexed.  Bo
18b50 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e  th will .** be N
18b60 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72  ULL for a primar
18b70 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65  y key or an inde
18b80 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65  x that is create
18b90 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a  d to satisfy a.*
18ba0 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  * UNIQUE constra
18bb0 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20  int.  If pTable 
18bc0 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e  and pIndex are N
18bd0 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d  ULL, use pParse-
18be0 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73  >pNewTable.** as
18bf0 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
18c00 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73   indexed.  pPars
18c10 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20  e->pNewTable is 
18c20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a  a table that is.
18c30 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  ** currently bei
18c40 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ng constructed b
18c50 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  y a CREATE TABLE
18c60 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
18c70 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73  * pList is a lis
18c80 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
18c90 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69  be indexed.  pLi
18ca0 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  st will be NULL 
18cb0 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20  if this.** is a 
18cc0 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75  primary key or u
18cd0 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74  nique-constraint
18ce0 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
18cf0 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ent column added
18d00 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65  .** to the table
18d10 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
18d20 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
18d30 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18d40 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50  CreateIndex(.  P
18d50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
18d60 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61    /* All informa
18d70 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20  tion about this 
18d80 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  parse */.  Token
18d90 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a   *pName1,     /*
18da0 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 69   First part of i
18db0 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62  ndex name. May b
18dc0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  e NULL */.  Toke
18dd0 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
18de0 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  * Second part of
18df0 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79   index name. May
18e00 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72   be NULL */.  Sr
18e10 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c  cList *pTblName,
18e20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64   /* Table to ind
18e30 65 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e  ex. Use pParse->
18e40 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a  pNewTable if 0 *
18e50 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
18e60 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74  ist,   /* A list
18e70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
18e80 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  e indexed */.  i
18e90 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
18ea0 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f    /* OE_Abort, O
18eb0 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70  E_Ignore, OE_Rep
18ec0 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65  lace, or OE_None
18ed0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74   */.  Token *pSt
18ee0 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  art,     /* The 
18ef0 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
18f00 74 20 62 65 67 69 6e 73 20 74 68 69 73 20 73 74  t begins this st
18f10 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70  atement */.  Exp
18f20 72 20 2a 70 50 49 57 68 65 72 65 2c 20 20 20 20  r *pPIWhere,    
18f30 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
18f40 66 6f 72 20 70 61 72 74 69 61 6c 20 69 6e 64 69  for partial indi
18f50 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ces */.  int sor
18f60 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53  tOrder,     /* S
18f70 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69  ort order of pri
18f80 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c  mary key when pL
18f90 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69  ist==NULL */.  i
18fa0 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 2c 20 20  nt ifNotExist,  
18fb0 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20    /* Omit error 
18fc0 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  if index already
18fd0 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 75 38 20   exists */.  u8 
18fe0 69 64 78 54 79 70 65 20 20 20 20 20 20 20 20 20  idxType         
18ff0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 79 70  /* The index typ
19000 65 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  e */.){.  Table 
19010 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f  *pTab = 0;     /
19020 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  * Table to be in
19030 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  dexed */.  Index
19040 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20   *pIndex = 0;   
19050 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
19060 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20  be created */.  
19070 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
19080 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
19090 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  the index */.  i
190a0 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
190b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
190c0 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a   characters in z
190d0 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  Name */.  int i,
190e0 20 6a 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46   j;.  DbFixer sF
190f0 69 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ix;        /* Fo
19100 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61  r assigning data
19110 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54  base names to pT
19120 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  able */.  int so
19130 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f  rtOrderMask;   /
19140 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53  * 1 to honor DES
19150 43 20 69 6e 20 69 6e 64 65 78 2e 20 20 30 20 74  C in index.  0 t
19160 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73  o ignore. */.  s
19170 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
19180 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70  rse->db;.  Db *p
19190 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
191a0 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69 63 20  /* The specific 
191b0 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
191c0 20 74 68 65 20 69 6e 64 65 78 65 64 20 64 61 74   the indexed dat
191d0 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  abase */.  int i
191e0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
191f0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
19200 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73  database that is
19210 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a   being written *
19220 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
19230 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75   = 0;    /* Unqu
19240 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20  alified name of 
19250 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65  the index to cre
19260 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ate */.  struct 
19270 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
19280 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72  ListItem; /* For
19290 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c   looping over pL
192a0 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ist */.  int nEx
192b0 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tra = 0;        
192c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
192d0 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
192e0 20 7a 45 78 74 72 61 5b 5d 20 2a 2f 0a 20 20 69   zExtra[] */.  i
192f0 6e 74 20 6e 45 78 74 72 61 43 6f 6c 3b 20 20 20  nt nExtraCol;   
19300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19310 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
19320 72 61 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65  ra columns neede
19330 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78  d */.  char *zEx
19340 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tra = 0;        
19350 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
19360 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68 65   space after the
19370 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f   Index object */
19380 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20  .  Index *pPk = 
19390 30 3b 20 20 20 20 20 20 2f 2a 20 50 52 49 4d 41  0;      /* PRIMA
193a0 52 59 20 4b 45 59 20 69 6e 64 65 78 20 66 6f 72  RY KEY index for
193b0 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
193c0 61 62 6c 65 73 20 2a 2f 0a 0a 20 20 69 66 28 20  ables */..  if( 
193d0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
193e0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
193f0 3e 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  >0 ){.    goto e
19400 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
19410 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 4e 5f 44  ;.  }.  if( IN_D
19420 45 43 4c 41 52 45 5f 56 54 41 42 20 26 26 20 69  ECLARE_VTAB && i
19430 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49  dxType!=SQLITE_I
19440 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45  DXTYPE_PRIMARYKE
19450 59 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  Y ){.    goto ex
19460 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
19470 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54  .  }.  if( SQLIT
19480 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
19490 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
194a0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
194b0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
194c0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
194d0 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  nd the table tha
194e0 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
194f0 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c  ed.  Return earl
19500 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  y if not found..
19510 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e    */.  if( pTblN
19520 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f  ame!=0 ){..    /
19530 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61  * Use the two-pa
19540 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f  rt index name to
19550 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64   determine the d
19560 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20  atabase .    ** 
19570 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68  to search for th
19580 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74  e table. 'Fix' t
19590 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  he table name to
195a0 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20   this db.    ** 
195b0 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75  before looking u
195c0 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  p the table..   
195d0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
195e0 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32  pName1 && pName2
195f0 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71   );.    iDb = sq
19600 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
19610 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
19620 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
19630 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
19640 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
19650 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73  te_index;.    as
19660 73 65 72 74 28 20 70 4e 61 6d 65 20 26 26 20 70  sert( pName && p
19670 4e 61 6d 65 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e  Name->z );..#ifn
19680 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19690 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49 66  TEMPDB.    /* If
196a0 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20   the index name 
196b0 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c  was unqualified,
196c0 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 61   check if the ta
196d0 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20  ble.    ** is a 
196e0 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73  temp table. If s
196f0 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  o, set the datab
19700 61 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74  ase to 1. Do not
19710 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   do this.    ** 
19720 69 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67 20  if initialising 
19730 61 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  a database schem
19740 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  a..    */.    if
19750 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
19760 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   ){.      pTab =
19770 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c   sqlite3SrcListL
19780 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54  ookup(pParse, pT
19790 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  blName);.      i
197a0 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20  f( pName2->n==0 
197b0 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d  && pTab && pTab-
197c0 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44  >pSchema==db->aD
197d0 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a  b[1].pSchema ){.
197e0 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b          iDb = 1;
197f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
19800 65 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c 69 74  endif..    sqlit
19810 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
19820 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69   pParse, iDb, "i
19830 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  ndex", pName);. 
19840 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
19850 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20  xSrcList(&sFix, 
19860 70 54 62 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20  pTblName) ){.   
19870 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68     /* Because th
19880 65 20 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75  e parser constru
19890 63 74 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f  cts pTblName fro
198a0 6d 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74  m a single ident
198b0 69 66 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20  ifier,.      ** 
198c0 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
198d0 74 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c  t can never fail
198e0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
198f0 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t(0);.    }.    
19900 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
19910 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50  cateTableItem(pP
19920 61 72 73 65 2c 20 30 2c 20 26 70 54 62 6c 4e 61  arse, 0, &pTblNa
19930 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 20 20 61  me->a[0]);.    a
19940 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
19950 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20 70 54  cFailed==0 || pT
19960 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab==0 );.    if(
19970 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20   pTab==0 ) goto 
19980 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
19990 78 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d  x;.    if( iDb==
199a0 31 20 26 26 20 64 62 2d 3e 61 44 62 5b 69 44 62  1 && db->aDb[iDb
199b0 5d 2e 70 53 63 68 65 6d 61 21 3d 70 54 61 62 2d  ].pSchema!=pTab-
199c0 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
199d0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
199e0 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
199f0 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 72        "cannot cr
19a00 65 61 74 65 20 61 20 54 45 4d 50 20 69 6e 64 65  eate a TEMP inde
19a10 78 20 6f 6e 20 6e 6f 6e 2d 54 45 4d 50 20 74 61  x on non-TEMP ta
19a20 62 6c 65 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20  ble \"%s\"",.   
19a30 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
19a40 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
19a50 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
19a60 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
19a70 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
19a80 29 20 29 20 70 50 6b 20 3d 20 73 71 6c 69 74 65  ) ) pPk = sqlite
19a90 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
19aa0 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pTab);.  }else{
19ab0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
19ac0 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  me==0 );.    ass
19ad0 65 72 74 28 20 70 53 74 61 72 74 3d 3d 30 20 29  ert( pStart==0 )
19ae0 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50 61  ;.    pTab = pPa
19af0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
19b00 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20      if( !pTab ) 
19b10 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
19b20 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62 20  _index;.    iDb 
19b30 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
19b40 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
19b50 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20  >pSchema);.  }. 
19b60 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
19b70 69 44 62 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28  iDb];..  assert(
19b80 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73   pTab!=0 );.  as
19b90 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
19ba0 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  rr==0 );.  if( s
19bb0 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
19bc0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c  Tab->zName, "sql
19bd0 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20  ite_", 7)==0 .  
19be0 20 20 20 20 20 26 26 20 64 62 2d 3e 69 6e 69 74       && db->init
19bf0 2e 62 75 73 79 3d 3d 30 0a 20 20 20 20 20 20 20  .busy==0.       
19c00 26 26 20 70 54 62 6c 4e 61 6d 65 21 3d 30 0a 23  && pTblName!=0.#
19c10 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  if SQLITE_USER_A
19c20 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20  UTHENTICATION.  
19c30 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 55       && sqlite3U
19c40 73 65 72 41 75 74 68 54 61 62 6c 65 28 70 54 61  serAuthTable(pTa
19c50 62 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 0a 23 65 6e  b->zName)==0.#en
19c60 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
19c70 45 5f 41 4c 4c 4f 57 5f 53 51 4c 49 54 45 5f 4d  E_ALLOW_SQLITE_M
19c80 41 53 54 45 52 5f 49 4e 44 45 58 0a 20 20 20 20  ASTER_INDEX.    
19c90 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72     && sqlite3Str
19ca0 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d  ICmp(&pTab->zNam
19cb0 65 5b 37 5d 2c 22 6d 61 73 74 65 72 22 29 21 3d  e[7],"master")!=
19cc0 30 0a 23 65 6e 64 69 66 0a 20 29 7b 0a 20 20 20  0.#endif. ){.   
19cd0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
19ce0 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
19cf0 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  %s may not be in
19d00 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  dexed", pTab->zN
19d10 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
19d20 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
19d30 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
19d40 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
19d50 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
19d60 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
19d70 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
19d80 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74  , "views may not
19d90 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20   be indexed");. 
19da0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
19db0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
19dc0 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
19dd0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
19de0 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56  LTABLE.  if( IsV
19df0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
19e00 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
19e10 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 72  Msg(pParse, "vir
19e20 74 75 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20  tual tables may 
19e30 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29  not be indexed")
19e40 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
19e50 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
19e60 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20  }.#endif..  /*. 
19e70 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d   ** Find the nam
19e80 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  e of the index. 
19e90 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
19ea0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
19eb0 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64  another.  ** ind
19ec0 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68  ex or table with
19ed0 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
19ee0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65   .  **.  ** Exce
19ef0 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72  ption:  If we ar
19f00 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61  e reading the na
19f10 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74  mes of permanent
19f20 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68   indices from th
19f30 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61  e.  ** sqlite_ma
19f40 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61  ster table (beca
19f50 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  use some other p
19f60 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74  rocess changed t
19f70 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20  he schema) and. 
19f80 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69   ** one of the i
19f90 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69  ndex names colli
19fa0 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d  des with the nam
19fb0 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79  e of a temporary
19fc0 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69   table or.  ** i
19fd0 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69  ndex, then we wi
19fe0 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70  ll continue to p
19ff0 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65  rocess this inde
1a000 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  x..  **.  ** If 
1a010 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e  pName==0 it mean
1a020 73 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20  s that we are.  
1a030 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  ** dealing with 
1a040 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
1a050 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
1a060 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  nt.  We have to 
1a070 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20  invent our.  ** 
1a080 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  own name..  */. 
1a090 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20   if( pName ){.  
1a0a0 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
1a0b0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
1a0c0 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  b, pName);.    i
1a0d0 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f  f( zName==0 ) go
1a0e0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1a0f0 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
1a100 28 20 70 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b  ( pName->z!=0 );
1a110 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
1a120 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
1a130 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
1a140 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
1a150 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1a160 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
1a170 0a 20 20 20 20 69 66 28 20 21 49 4e 5f 52 45 4e  .    if( !IN_REN
1a180 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20  AME_OBJECT ){.  
1a190 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
1a1a0 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20  t.busy ){.      
1a1b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
1a1c0 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
1a1d0 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  , 0)!=0 ){.     
1a1e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1a1f0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68  rMsg(pParse, "th
1a200 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
1a210 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22   table named %s"
1a220 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
1a230 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1a240 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1a250 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1a260 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
1a270 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
1a280 6d 65 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d  me, pDb->zDbSNam
1a290 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)!=0 ){.       
1a2a0 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74   if( !ifNotExist
1a2b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
1a2c0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1a2d0 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20  arse, "index %s 
1a2e0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
1a2f0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
1a300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a310 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69    assert( !db->i
1a320 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20  nit.busy );.    
1a330 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
1a340 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
1a350 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
1a360 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f      }.        go
1a370 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1a380 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
1a390 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1a3a0 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65   int n;.    Inde
1a3b0 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f  x *pLoop;.    fo
1a3c0 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49  r(pLoop=pTab->pI
1a3d0 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70  ndex, n=1; pLoop
1a3e0 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
1a3f0 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20  Next, n++){}.   
1a400 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
1a410 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c  MPrintf(db, "sql
1a420 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25 73  ite_autoindex_%s
1a430 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  _%d", pTab->zNam
1a440 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a  e, n);.    if( z
1a450 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
1a460 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1a470 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 0a  e_index;.    }..
1a480 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63      /* Automatic
1a490 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 67 65 6e   index names gen
1a4a0 65 72 61 74 65 64 20 66 72 6f 6d 20 77 69 74 68  erated from with
1a4b0 69 6e 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61  in sqlite3_decla
1a4c0 72 65 5f 76 74 61 62 28 29 0a 20 20 20 20 2a 2a  re_vtab().    **
1a4d0 20 6d 75 73 74 20 68 61 76 65 20 6e 61 6d 65 73   must have names
1a4e0 20 74 68 61 74 20 61 72 65 20 64 69 73 74 69 6e   that are distin
1a4f0 63 74 20 66 72 6f 6d 20 6e 6f 72 6d 61 6c 20 61  ct from normal a
1a500 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6e  utomatic index n
1a510 61 6d 65 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65  ames..    ** The
1a520 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65   following state
1a530 6d 65 6e 74 20 63 6f 6e 76 65 72 74 73 20 22 73  ment converts "s
1a540 71 6c 69 74 65 33 5f 61 75 74 6f 69 6e 64 65 78  qlite3_autoindex
1a550 2e 2e 2e 22 20 69 6e 74 6f 0a 20 20 20 20 2a 2a  ..." into.    **
1a560 20 22 73 71 6c 69 74 65 33 5f 62 75 74 6f 69 6e   "sqlite3_butoin
1a570 64 65 78 2e 2e 2e 22 20 69 6e 20 6f 72 64 65 72  dex..." in order
1a580 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d   to make the nam
1a590 65 73 20 64 69 73 74 69 6e 63 74 2e 0a 20 20 20  es distinct..   
1a5a0 20 2a 2a 20 54 68 65 20 22 76 74 61 62 5f 65 72   ** The "vtab_er
1a5b0 72 2e 74 65 73 74 22 20 74 65 73 74 20 64 65 6d  r.test" test dem
1a5c0 6f 6e 73 74 72 61 74 65 73 20 74 68 65 20 6e 65  onstrates the ne
1a5d0 65 64 20 6f 66 20 74 68 69 73 20 73 74 61 74 65  ed of this state
1a5e0 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ment. */.    if(
1a5f0 20 49 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52 53   IN_SPECIAL_PARS
1a600 45 20 29 20 7a 4e 61 6d 65 5b 37 5d 2b 2b 3b 0a  E ) zName[7]++;.
1a610 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
1a620 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  for authorizatio
1a630 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69  n to create an i
1a640 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  ndex..  */.#ifnd
1a650 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1a660 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69  UTHORIZATION.  i
1a670 66 28 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  f( !IN_RENAME_OB
1a680 4a 45 43 54 20 29 7b 0a 20 20 20 20 63 6f 6e 73  JECT ){.    cons
1a690 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44  t char *zDb = pD
1a6a0 62 2d 3e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20  b->zDbSName;.   
1a6b0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1a6c0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1a6d0 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48  LITE_INSERT, SCH
1a6e0 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20  EMA_TABLE(iDb), 
1a6f0 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
1a700 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1a710 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
1a720 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52     i = SQLITE_CR
1a730 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20  EATE_INDEX;.    
1a740 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
1a750 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d   && iDb==1 ) i =
1a760 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
1a770 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  EMP_INDEX;.    i
1a780 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1a790 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a  eck(pParse, i, z
1a7a0 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
1a7b0 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  e, zDb) ){.     
1a7c0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1a7d0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
1a7e0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1a7f0 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20  If pList==0, it 
1a800 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69  means this routi
1a810 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  ne was called to
1a820 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a   make a primary.
1a830 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20    ** key out of 
1a840 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
1a850 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62  added to the tab
1a860 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
1a870 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63  ction..  ** So c
1a880 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73  reate a fake lis
1a890 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68  t to simulate th
1a8a0 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  is..  */.  if( p
1a8b0 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 54  List==0 ){.    T
1a8c0 6f 6b 65 6e 20 70 72 65 76 43 6f 6c 3b 0a 20 20  oken prevCol;.  
1a8d0 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d    Column *pCol =
1a8e0 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61   &pTab->aCol[pTa
1a8f0 62 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 20 20  b->nCol-1];.    
1a900 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c  pCol->colFlags |
1a910 3d 20 43 4f 4c 46 4c 41 47 5f 55 4e 49 51 55 45  = COLFLAG_UNIQUE
1a920 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b  ;.    sqlite3Tok
1a930 65 6e 49 6e 69 74 28 26 70 72 65 76 43 6f 6c 2c  enInit(&prevCol,
1a940 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
1a950 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
1a960 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
1a970 28 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20  (pParse, 0,.    
1a980 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1a990 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
1a9a0 4b 5f 49 44 2c 20 26 70 72 65 76 43 6f 6c 2c 20  K_ID, &prevCol, 
1a9b0 30 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  0));.    if( pLi
1a9c0 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  st==0 ) goto exi
1a9d0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1a9e0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
1a9f0 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20  t->nExpr==1 );. 
1aa00 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
1aa10 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28 70  stSetSortOrder(p
1aa20 4c 69 73 74 2c 20 73 6f 72 74 4f 72 64 65 72 29  List, sortOrder)
1aa30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
1aa40 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68  qlite3ExprListCh
1aa50 65 63 6b 4c 65 6e 67 74 68 28 70 50 61 72 73 65  eckLength(pParse
1aa60 2c 20 70 4c 69 73 74 2c 20 22 69 6e 64 65 78 22  , pList, "index"
1aa70 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  );.    if( pPars
1aa80 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65  e->nErr ) goto e
1aa90 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1aaa0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75  ;.  }..  /* Figu
1aab0 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
1aac0 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
1aad0 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 73  re required to s
1aae0 74 6f 72 65 20 65 78 70 6c 69 63 69 74 6c 79 0a  tore explicitly.
1aaf0 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20 63    ** specified c
1ab00 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1ab10 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20  e names..  */.  
1ab20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
1ab30 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
1ab40 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
1ab50 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
1ab60 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
1ab70 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
1ab80 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
1ab90 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20  K_COLLATE ){.   
1aba0 20 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20     nExtra += (1 
1abb0 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  + sqlite3Strlen3
1abc0 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  0(pExpr->u.zToke
1abd0 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n));.    }.  }..
1abe0 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63    /* .  ** Alloc
1abf0 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 74  ate the index st
1ac00 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20  ructure. .  */. 
1ac10 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
1ac20 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
1ac30 0a 20 20 6e 45 78 74 72 61 43 6f 6c 20 3d 20 70  .  nExtraCol = p
1ac40 50 6b 20 3f 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  Pk ? pPk->nKeyCo
1ac50 6c 20 3a 20 31 3b 0a 20 20 61 73 73 65 72 74 28  l : 1;.  assert(
1ac60 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20   pList->nExpr + 
1ac70 6e 45 78 74 72 61 43 6f 6c 20 3c 3d 20 33 32 37  nExtraCol <= 327
1ac80 36 37 20 2f 2a 20 46 69 74 73 20 69 6e 20 69 31  67 /* Fits in i1
1ac90 36 20 2a 2f 20 29 3b 0a 20 20 70 49 6e 64 65 78  6 */ );.  pIndex
1aca0 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61   = sqlite3Alloca
1acb0 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62  teIndexObject(db
1acc0 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b  , pList->nExpr +
1acd0 20 6e 45 78 74 72 61 43 6f 6c 2c 0a 20 20 20 20   nExtraCol,.    
1ace0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad00 20 20 6e 4e 61 6d 65 20 2b 20 6e 45 78 74 72 61    nName + nExtra
1ad10 20 2b 20 31 2c 20 26 7a 45 78 74 72 61 29 3b 0a   + 1, &zExtra);.
1ad20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1ad30 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
1ad40 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1ad50 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ndex;.  }.  asse
1ad60 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
1ad70 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d  LIGNMENT(pIndex-
1ad80 3e 61 69 52 6f 77 4c 6f 67 45 73 74 29 20 29 3b  >aiRowLogEst) );
1ad90 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
1ada0 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
1adb0 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20  pIndex->azColl) 
1adc0 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  );.  pIndex->zNa
1add0 6d 65 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 7a  me = zExtra;.  z
1ade0 45 78 74 72 61 20 2b 3d 20 6e 4e 61 6d 65 20 2b  Extra += nName +
1adf0 20 31 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e   1;.  memcpy(pIn
1ae00 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  dex->zName, zNam
1ae10 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70  e, nName+1);.  p
1ae20 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20  Index->pTable = 
1ae30 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  pTab;.  pIndex->
1ae40 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e  onError = (u8)on
1ae50 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d  Error;.  pIndex-
1ae60 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f  >uniqNotNull = o
1ae70 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b  nError!=OE_None;
1ae80 0a 20 20 70 49 6e 64 65 78 2d 3e 69 64 78 54 79  .  pIndex->idxTy
1ae90 70 65 20 3d 20 69 64 78 54 79 70 65 3b 0a 20 20  pe = idxType;.  
1aea0 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 20  pIndex->pSchema 
1aeb0 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
1aec0 53 63 68 65 6d 61 3b 0a 20 20 70 49 6e 64 65 78  Schema;.  pIndex
1aed0 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 70 4c 69 73  ->nKeyCol = pLis
1aee0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20  t->nExpr;.  if( 
1aef0 70 50 49 57 68 65 72 65 20 29 7b 0a 20 20 20 20  pPIWhere ){.    
1af00 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65  sqlite3ResolveSe
1af10 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61 72  lfReference(pPar
1af20 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f 50 61 72  se, pTab, NC_Par
1af30 74 49 64 78 2c 20 70 50 49 57 68 65 72 65 2c 20  tIdx, pPIWhere, 
1af40 30 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  0);.    pIndex->
1af50 70 50 61 72 74 49 64 78 57 68 65 72 65 20 3d 20  pPartIdxWhere = 
1af60 70 50 49 57 68 65 72 65 3b 0a 20 20 20 20 70 50  pPIWhere;.    pP
1af70 49 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a  IWhere = 0;.  }.
1af80 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1af90 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
1afa0 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
1afb0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
1afc0 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c 64 20  ee if we should 
1afd0 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71 75 65  honor DESC reque
1afe0 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c  sts on index col
1aff0 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  umns.  */.  if( 
1b000 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69  pDb->pSchema->fi
1b010 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a  le_format>=4 ){.
1b020 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73      sortOrderMas
1b030 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e  k = -1;   /* Hon
1b040 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c  or DESC */.  }el
1b050 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65  se{.    sortOrde
1b060 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a  rMask = 0;    /*
1b070 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a   Ignore DESC */.
1b080 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a    }..  /* Analyz
1b090 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78  e the list of ex
1b0a0 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 66  pressions that f
1b0b0 6f 72 6d 20 74 68 65 20 74 65 72 6d 73 20 6f 66  orm the terms of
1b0c0 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 0a 20   the index and. 
1b0d0 20 2a 2a 20 72 65 70 6f 72 74 20 61 6e 79 20 65   ** report any e
1b0e0 72 72 6f 72 73 2e 20 20 49 6e 20 74 68 65 20 63  rrors.  In the c
1b0f0 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
1b100 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1b110 69 73 20 65 78 61 63 74 6c 79 0a 20 20 2a 2a 20  is exactly.  ** 
1b120 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20  a table column, 
1b130 73 74 6f 72 65 20 74 68 61 74 20 63 6f 6c 75 6d  store that colum
1b140 6e 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e  n in aiColumn[].
1b150 20 20 46 6f 72 20 67 65 6e 65 72 61 6c 20 65 78    For general ex
1b160 70 72 65 73 73 69 6f 6e 73 2c 0a 20 20 2a 2a 20  pressions,.  ** 
1b170 70 6f 70 75 6c 61 74 65 20 70 49 6e 64 65 78 2d  populate pIndex-
1b180 3e 61 43 6f 6c 45 78 70 72 20 61 6e 64 20 73 74  >aColExpr and st
1b190 6f 72 65 20 58 4e 5f 45 58 50 52 20 28 2d 32 29  ore XN_EXPR (-2)
1b1a0 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 0a   in aiColumn[]..
1b1b0 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20    **.  ** TODO: 
1b1c0 49 73 73 75 65 20 61 20 77 61 72 6e 69 6e 67 20  Issue a warning 
1b1d0 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63  if two or more c
1b1e0 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
1b1f0 64 65 78 20 61 72 65 20 69 64 65 6e 74 69 63 61  dex are identica
1b200 6c 2e 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73  l..  ** TODO: Is
1b210 73 75 65 20 61 20 77 61 72 6e 69 6e 67 20 69 66  sue a warning if
1b220 20 74 68 65 20 74 61 62 6c 65 20 70 72 69 6d 61   the table prima
1b230 72 79 20 6b 65 79 20 69 73 20 75 73 65 64 20 61  ry key is used a
1b240 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20  s part of the.  
1b250 2a 2a 20 69 6e 64 65 78 20 6b 65 79 2e 0a 20 20  ** index key..  
1b260 2a 2f 0a 20 20 70 4c 69 73 74 49 74 65 6d 20 3d  */.  pListItem =
1b270 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 69 66 28   pList->a;.  if(
1b280 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
1b290 54 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d  T ){.    pIndex-
1b2a0 3e 61 43 6f 6c 45 78 70 72 20 3d 20 70 4c 69 73  >aColExpr = pLis
1b2b0 74 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30  t;.    pList = 0
1b2c0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
1b2d0 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43   i<pIndex->nKeyC
1b2e0 6f 6c 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74  ol; i++, pListIt
1b2f0 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  em++){.    Expr 
1b300 2a 70 43 45 78 70 72 3b 20 20 20 20 20 20 20 20  *pCExpr;        
1b310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b320 20 69 2d 74 68 20 69 6e 64 65 78 20 65 78 70 72   i-th index expr
1b330 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e  ession */.    in
1b340 74 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f  t requestedSortO
1b350 72 64 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  rder;        /* 
1b360 41 53 43 20 6f 72 20 44 45 53 43 20 6f 6e 20 74  ASC or DESC on t
1b370 68 65 20 69 2d 74 68 20 65 78 70 72 65 73 73 69  he i-th expressi
1b380 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  on */.    const 
1b390 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20  char *zColl;    
1b3a0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
1b3b0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
1b3c0 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 73 71 6c 69  ame */..    sqli
1b3d0 74 65 33 53 74 72 69 6e 67 54 6f 49 64 28 70 4c  te3StringToId(pL
1b3e0 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  istItem->pExpr);
1b3f0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f  .    sqlite3Reso
1b400 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65  lveSelfReference
1b410 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e  (pParse, pTab, N
1b420 43 5f 49 64 78 45 78 70 72 2c 20 70 4c 69 73 74  C_IdxExpr, pList
1b430 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 30 29 3b  Item->pExpr, 0);
1b440 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
1b450 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69  >nErr ) goto exi
1b460 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1b470 20 20 20 20 70 43 45 78 70 72 20 3d 20 73 71 6c      pCExpr = sql
1b480 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
1b490 61 74 65 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70  ate(pListItem->p
1b4a0 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
1b4b0 43 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  CExpr->op!=TK_CO
1b4c0 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 69 66  LUMN ){.      if
1b4d0 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e  ( pTab==pParse->
1b4e0 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20  pNewTable ){.   
1b4f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1b500 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 65 78  rMsg(pParse, "ex
1b510 70 72 65 73 73 69 6f 6e 73 20 70 72 6f 68 69 62  pressions prohib
1b520 69 74 65 64 20 69 6e 20 50 52 49 4d 41 52 59 20  ited in PRIMARY 
1b530 4b 45 59 20 61 6e 64 20 22 0a 20 20 20 20 20 20  KEY and ".      
1b540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b550 20 20 20 20 20 20 20 20 20 20 22 55 4e 49 51 55            "UNIQU
1b560 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b  E constraints");
1b570 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
1b580 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1b590 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1b5a0 66 28 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45  f( pIndex->aColE
1b5b0 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  xpr==0 ){.      
1b5c0 20 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78    pIndex->aColEx
1b5d0 70 72 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  pr = pList;.    
1b5e0 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20      pList = 0;. 
1b5f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 20 3d       }.      j =
1b600 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20 20   XN_EXPR;.      
1b610 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1b620 5b 69 5d 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20  [i] = XN_EXPR;. 
1b630 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69       pIndex->uni
1b640 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  qNotNull = 0;.  
1b650 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a    }else{.      j
1b660 20 3d 20 70 43 45 78 70 72 2d 3e 69 43 6f 6c 75   = pCExpr->iColu
1b670 6d 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  mn;.      assert
1b680 28 20 6a 3c 3d 30 78 37 66 66 66 20 29 3b 0a 20  ( j<=0x7fff );. 
1b690 20 20 20 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a       if( j<0 ){.
1b6a0 20 20 20 20 20 20 20 20 6a 20 3d 20 70 54 61 62          j = pTab
1b6b0 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 7d  ->iPKey;.      }
1b6c0 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 61  else if( pTab->a
1b6d0 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d  Col[j].notNull==
1b6e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  0 ){.        pIn
1b6f0 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  dex->uniqNotNull
1b700 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1b710 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
1b720 6c 75 6d 6e 5b 69 5d 20 3d 20 28 69 31 36 29 6a  lumn[i] = (i16)j
1b730 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6c  ;.    }.    zCol
1b740 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  l = 0;.    if( p
1b750 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d  ListItem->pExpr-
1b760 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
1b770 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  ){.      int nCo
1b780 6c 6c 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20  ll;.      zColl 
1b790 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  = pListItem->pEx
1b7a0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
1b7b0 20 20 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69      nColl = sqli
1b7c0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c  te3Strlen30(zCol
1b7d0 6c 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 61 73  l) + 1;.      as
1b7e0 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e 43  sert( nExtra>=nC
1b7f0 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  oll );.      mem
1b800 63 70 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f 6c  cpy(zExtra, zCol
1b810 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  l, nColl);.     
1b820 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b   zColl = zExtra;
1b830 0a 20 20 20 20 20 20 7a 45 78 74 72 61 20 2b 3d  .      zExtra +=
1b840 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e 45   nColl;.      nE
1b850 78 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20  xtra -= nColl;. 
1b860 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 3e 3d     }else if( j>=
1b870 30 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  0 ){.      zColl
1b880 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
1b890 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  .zColl;.    }.  
1b8a0 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 7a    if( !zColl ) z
1b8b0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 74  Coll = sqlite3St
1b8c0 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 69 66 28  rBINARY;.    if(
1b8d0 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
1b8e0 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63 61 74  && !sqlite3Locat
1b8f0 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
1b900 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20   zColl) ){.     
1b910 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1b920 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
1b930 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c     pIndex->azCol
1b940 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20  l[i] = zColl;.  
1b950 20 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f    requestedSortO
1b960 72 64 65 72 20 3d 20 70 4c 69 73 74 49 74 65 6d  rder = pListItem
1b970 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20 73 6f  ->sortOrder & so
1b980 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20  rtOrderMask;.   
1b990 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72   pIndex->aSortOr
1b9a0 64 65 72 5b 69 5d 20 3d 20 28 75 38 29 72 65 71  der[i] = (u8)req
1b9b0 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b  uestedSortOrder;
1b9c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e  .  }..  /* Appen
1b9d0 64 20 74 68 65 20 74 61 62 6c 65 20 6b 65 79 20  d the table key 
1b9e0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1b9f0 65 20 69 6e 64 65 78 2e 20 20 46 6f 72 20 57 49  e index.  For WI
1ba00 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20 2a 2a  THOUT ROWID.  **
1ba10 20 74 61 62 6c 65 73 20 28 77 68 65 6e 20 70 50   tables (when pP
1ba20 6b 21 3d 30 29 20 74 68 69 73 20 77 69 6c 6c 20  k!=0) this will 
1ba30 62 65 20 74 68 65 20 64 65 63 6c 61 72 65 64 20  be the declared 
1ba40 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f  PRIMARY KEY.  Fo
1ba50 72 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 74 61  r.  ** normal ta
1ba60 62 6c 65 73 20 28 77 68 65 6e 20 70 50 6b 3d 3d  bles (when pPk==
1ba70 30 29 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20  0) this will be 
1ba80 74 68 65 20 72 6f 77 69 64 2e 0a 20 20 2a 2f 0a  the rowid..  */.
1ba90 20 20 69 66 28 20 70 50 6b 20 29 7b 0a 20 20 20    if( pPk ){.   
1baa0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d   for(j=0; j<pPk-
1bab0 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  >nKeyCol; j++){.
1bac0 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70 50        int x = pP
1bad0 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a  k->aiColumn[j];.
1bae0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 78 3e        assert( x>
1baf0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
1bb00 68 61 73 43 6f 6c 75 6d 6e 28 70 49 6e 64 65 78  hasColumn(pIndex
1bb10 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 6e 64  ->aiColumn, pInd
1bb20 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 78 29 20  ex->nKeyCol, x) 
1bb30 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ){.        pInde
1bb40 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20  x->nColumn--; . 
1bb50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1bb60 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
1bb70 6c 75 6d 6e 5b 69 5d 20 3d 20 78 3b 0a 20 20 20  lumn[i] = x;.   
1bb80 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43       pIndex->azC
1bb90 6f 6c 6c 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 7a  oll[i] = pPk->az
1bba0 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  Coll[j];.       
1bbb0 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72   pIndex->aSortOr
1bbc0 64 65 72 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 53  der[i] = pPk->aS
1bbd0 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20  ortOrder[j];.   
1bbe0 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
1bbf0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
1bc00 72 74 28 20 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e  rt( i==pIndex->n
1bc10 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 7d 65 6c 73  Column );.  }els
1bc20 65 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  e{.    pIndex->a
1bc30 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f  iColumn[i] = XN_
1bc40 52 4f 57 49 44 3b 0a 20 20 20 20 70 49 6e 64 65  ROWID;.    pInde
1bc50 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 73  x->azColl[i] = s
1bc60 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b  qlite3StrBINARY;
1bc70 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
1bc80 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64  faultRowEst(pInd
1bc90 65 78 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  ex);.  if( pPars
1bca0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20  e->pNewTable==0 
1bcb0 29 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57  ) estimateIndexW
1bcc0 69 64 74 68 28 70 49 6e 64 65 78 29 3b 0a 0a 20  idth(pIndex);.. 
1bcd0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 64 65   /* If this inde
1bce0 78 20 63 6f 6e 74 61 69 6e 73 20 65 76 65 72 79  x contains every
1bcf0 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 74 73 20 74   column of its t
1bd00 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 72 6b 0a  able, then mark.
1bd10 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 6f 76    ** it as a cov
1bd20 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20  ering index */. 
1bd30 20 61 73 73 65 72 74 28 20 48 61 73 52 6f 77 69   assert( HasRowi
1bd40 64 28 70 54 61 62 29 20 0a 20 20 20 20 20 20 7c  d(pTab) .      |
1bd50 7c 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20  | pTab->iPKey<0 
1bd60 7c 7c 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  || sqlite3Column
1bd70 4f 66 49 6e 64 65 78 28 70 49 6e 64 65 78 2c 20  OfIndex(pIndex, 
1bd80 70 54 61 62 2d 3e 69 50 4b 65 79 29 3e 3d 30 20  pTab->iPKey)>=0 
1bd90 29 3b 0a 20 20 72 65 63 6f 6d 70 75 74 65 43 6f  );.  recomputeCo
1bda0 6c 75 6d 6e 73 4e 6f 74 49 6e 64 65 78 65 64 28  lumnsNotIndexed(
1bdb0 70 49 6e 64 65 78 29 3b 0a 20 20 69 66 28 20 70  pIndex);.  if( p
1bdc0 54 62 6c 4e 61 6d 65 21 3d 30 20 26 26 20 70 49  TblName!=0 && pI
1bdd0 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70  ndex->nColumn>=p
1bde0 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
1bdf0 20 70 49 6e 64 65 78 2d 3e 69 73 43 6f 76 65 72   pIndex->isCover
1be00 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72  ing = 1;.    for
1be10 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
1be20 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
1be30 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b  if( j==pTab->iPK
1be40 65 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ey ) continue;. 
1be50 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1be60 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49  ColumnOfIndex(pI
1be70 6e 64 65 78 2c 6a 29 3e 3d 30 20 29 20 63 6f 6e  ndex,j)>=0 ) con
1be80 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 49 6e  tinue;.      pIn
1be90 64 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20  dex->isCovering 
1bea0 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
1beb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
1bec0 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d  f( pTab==pParse-
1bed0 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20  >pNewTable ){.  
1bee0 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
1bef0 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  e has been calle
1bf00 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61  d to create an a
1bf10 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61  utomatic index a
1bf20 73 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c  s a.    ** resul
1bf30 74 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b  t of a PRIMARY K
1bf40 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61  EY or UNIQUE cla
1bf50 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20  use on a column 
1bf60 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20  definition, or. 
1bf70 20 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20     ** a PRIMARY 
1bf80 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c  KEY or UNIQUE cl
1bf90 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ause following t
1bfa0 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69  he column defini
1bfb0 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e  tions..    ** i.
1bfc0 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a  e. one of:.    *
1bfd0 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20  *.    ** CREATE 
1bfe0 54 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52  TABLE t(x PRIMAR
1bff0 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a  Y KEY, y);.    *
1c000 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  * CREATE TABLE t
1c010 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c  (x, y, UNIQUE(x,
1c020 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20   y));.    **.   
1c030 20 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20   ** Either way, 
1c040 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
1c050 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  the table alread
1c060 79 20 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e  y has such an in
1c070 64 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73  dex. If.    ** s
1c080 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20  o, don't bother 
1c090 63 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e  creating this on
1c0a0 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70  e. This only app
1c0b0 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61  lies to.    ** a
1c0c0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65  utomatically cre
1c0d0 61 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73  ated indices. Us
1c0e0 65 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68  ers can do as th
1c0f0 65 79 20 77 69 73 68 20 77 69 74 68 0a 20 20 20  ey wish with.   
1c100 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64   ** explicit ind
1c110 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ices..    **.   
1c120 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55 45 20 6f   ** Two UNIQUE o
1c130 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  r PRIMARY KEY co
1c140 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f  nstraints are co
1c150 6e 73 69 64 65 72 65 64 20 65 71 75 69 76 61 6c  nsidered equival
1c160 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61 6e 64 20  ent.    ** (and 
1c170 74 68 75 73 20 73 75 70 70 72 65 73 73 69 6e 67  thus suppressing
1c180 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 6e 65 29   the second one)
1c190 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 68 61   even if they ha
1c1a0 76 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20  ve different.   
1c1b0 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72 73 2e   ** sort orders.
1c1c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
1c1d0 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66 66  f there are diff
1c1e0 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20  erent collating 
1c1f0 73 65 71 75 65 6e 63 65 73 20 6f 72 20 69 66 20  sequences or if 
1c200 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20  the columns of. 
1c210 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 73 74 72     ** the constr
1c220 61 69 6e 74 20 6f 63 63 75 72 20 69 6e 20 64 69  aint occur in di
1c230 66 66 65 72 65 6e 74 20 6f 72 64 65 72 73 2c 20  fferent orders, 
1c240 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61  then the constra
1c250 69 6e 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  ints are.    ** 
1c260 63 6f 6e 73 69 64 65 72 65 64 20 64 69 73 74 69  considered disti
1c270 6e 63 74 20 61 6e 64 20 62 6f 74 68 20 72 65 73  nct and both res
1c280 75 6c 74 20 69 6e 20 73 65 70 61 72 61 74 65 20  ult in separate 
1c290 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a  indices..    */.
1c2a0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
1c2b0 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
1c2c0 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
1c2d0 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
1c2e0 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  xt){.      int k
1c2f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1c300 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
1c310 64 78 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  dx) );.      ass
1c320 65 72 74 28 20 70 49 64 78 2d 3e 69 64 78 54 79  ert( pIdx->idxTy
1c330 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59  pe!=SQLITE_IDXTY
1c340 50 45 5f 41 50 50 44 45 46 20 29 3b 0a 20 20 20  PE_APPDEF );.   
1c350 20 20 20 61 73 73 65 72 74 28 20 49 73 55 6e 69     assert( IsUni
1c360 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29  queIndex(pIndex)
1c370 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70   );..      if( p
1c380 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49  Idx->nKeyCol!=pI
1c390 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20  ndex->nKeyCol ) 
1c3a0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1c3b0 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d  for(k=0; k<pIdx-
1c3c0 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a  >nKeyCol; k++){.
1c3d0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
1c3e0 61 72 20 2a 7a 31 3b 0a 20 20 20 20 20 20 20 20  ar *z1;.        
1c3f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a  const char *z2;.
1c400 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1c410 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b  pIdx->aiColumn[k
1c420 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ]>=0 );.        
1c430 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
1c440 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61  mn[k]!=pIndex->a
1c450 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65  iColumn[k] ) bre
1c460 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d  ak;.        z1 =
1c470 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d   pIdx->azColl[k]
1c480 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70  ;.        z2 = p
1c490 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d  Index->azColl[k]
1c4a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
1c4b0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c  lite3StrICmp(z1,
1c4c0 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20   z2) ) break;.  
1c4d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1c4e0 6b 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  k==pIdx->nKeyCol
1c4f0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1c500 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70  pIdx->onError!=p
1c510 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29  Index->onError )
1c520 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
1c530 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  his constraint c
1c540 72 65 61 74 65 73 20 74 68 65 20 73 61 6d 65 20  reates the same 
1c550 69 6e 64 65 78 20 61 73 20 61 20 70 72 65 76 69  index as a previ
1c560 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ous.          **
1c570 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63   constraint spec
1c580 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20  ified somewhere 
1c590 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41  in the CREATE TA
1c5a0 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  BLE statement.. 
1c5b0 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65           ** Howe
1c5c0 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c  ver the ON CONFL
1c5d0 49 43 54 20 63 6c 61 75 73 65 73 20 61 72 65 20  ICT clauses are 
1c5e0 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f  different. If bo
1c5f0 74 68 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  th this .       
1c600 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
1c610 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75   and the previou
1c620 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e  s equivalent con
1c630 73 74 72 61 69 6e 74 20 68 61 76 65 20 65 78 70  straint have exp
1c640 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20 20 20  licit.          
1c650 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  ** ON CONFLICT c
1c660 6c 61 75 73 65 73 20 74 68 69 73 20 69 73 20 61  lauses this is a
1c670 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69  n error. Otherwi
1c680 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20  se, use the.    
1c690 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69        ** explici
1c6a0 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 62 65  tly specified be
1c6b0 68 61 76 69 6f 72 20 66 6f 72 20 74 68 65 20 69  havior for the i
1c6c0 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20  ndex..          
1c6d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
1c6e0 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72   !(pIdx->onError
1c6f0 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20  ==OE_Default || 
1c700 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d  pIndex->onError=
1c710 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a  =OE_Default) ){.
1c720 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1c730 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1c740 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
1c750 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e       "conflictin
1c760 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  g ON CONFLICT cl
1c770 61 75 73 65 73 20 73 70 65 63 69 66 69 65 64 22  auses specified"
1c780 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
1c790 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
1c7a0 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
1c7b0 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20  E_Default ){.   
1c7c0 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f           pIdx->o
1c7d0 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d  nError = pIndex-
1c7e0 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20  >onError;.      
1c7f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1c800 20 20 20 20 20 20 20 20 69 66 28 20 69 64 78 54          if( idxT
1c810 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44 58 54  ype==SQLITE_IDXT
1c820 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 20 29  YPE_PRIMARYKEY )
1c830 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65 20 3d   pIdx->idxType =
1c840 20 69 64 78 54 79 70 65 3b 0a 20 20 20 20 20 20   idxType;.      
1c850 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
1c860 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20  OBJECT ){.      
1c870 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78      pIndex->pNex
1c880 74 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  t = pParse->pNew
1c890 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 20  Index;.         
1c8a0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e 64   pParse->pNewInd
1c8b0 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  ex = pIndex;.   
1c8c0 20 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20         pIndex = 
1c8d0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
1c8e0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
1c8f0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
1c900 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1c910 20 20 69 66 28 20 21 49 4e 5f 52 45 4e 41 4d 45    if( !IN_RENAME
1c920 5f 4f 42 4a 45 43 54 20 29 7b 0a 0a 20 20 20 20  _OBJECT ){..    
1c930 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20  /* Link the new 
1c940 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
1c950 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64  to its table and
1c960 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20   to the other.  
1c970 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    ** in-memory d
1c980 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
1c990 65 73 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  es. .    */.    
1c9a0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1c9b0 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 20 20 69  nErr==0 );.    i
1c9c0 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1c9d0 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20   ){.      Index 
1c9e0 2a 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  *p;.      assert
1c9f0 28 20 21 49 4e 5f 53 50 45 43 49 41 4c 5f 50 41  ( !IN_SPECIAL_PA
1ca00 52 53 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73  RSE );.      ass
1ca10 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
1ca20 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
1ca30 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  0, pIndex->pSche
1ca40 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ma) );.      if(
1ca50 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
1ca60 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
1ca70 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  tnum = db->init.
1ca80 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 20 20 20  newTnum;.       
1ca90 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65   if( sqlite3Inde
1caa0 78 48 61 73 44 75 70 6c 69 63 61 74 65 52 6f 6f  xHasDuplicateRoo
1cab0 74 50 61 67 65 28 70 49 6e 64 65 78 29 20 29 7b  tPage(pIndex) ){
1cac0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1cad0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1cae0 65 2c 20 22 69 6e 76 61 6c 69 64 20 72 6f 6f 74  e, "invalid root
1caf0 70 61 67 65 22 29 3b 0a 20 20 20 20 20 20 20 20  page");.        
1cb00 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
1cb10 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1cb20 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  PT;.          go
1cb30 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1cb40 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ndex;.        }.
1cb50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 20        }.      p 
1cb60 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
1cb70 65 72 74 28 26 70 49 6e 64 65 78 2d 3e 70 53 63  ert(&pIndex->pSc
1cb80 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a  hema->idxHash, .
1cb90 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78            pIndex
1cba0 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 29  ->zName, pIndex)
1cbb0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 20 29 7b  ;.      if( p ){
1cbc0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1cbd0 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f   p==pIndex );  /
1cbe0 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
1cbf0 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  ve failed */.   
1cc00 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46       sqlite3OomF
1cc10 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20  ault(db);.      
1cc20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
1cc30 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
1cc40 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6d 44 62 46  }.      db->mDbF
1cc50 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53  lags |= DBFLAG_S
1cc60 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20 20  chemaChange;.   
1cc70 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1cc80 69 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  is is the initia
1cc90 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  l CREATE INDEX s
1cca0 74 61 74 65 6d 65 6e 74 20 28 6f 72 20 43 52 45  tatement (or CRE
1ccb0 41 54 45 20 54 41 42 4c 45 20 69 66 20 74 68 65  ATE TABLE if the
1ccc0 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 69 73  .    ** index is
1ccd0 20 61 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65   an implied inde
1cce0 78 20 66 6f 72 20 61 20 55 4e 49 51 55 45 20 6f  x for a UNIQUE o
1ccf0 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  r PRIMARY KEY co
1cd00 6e 73 74 72 61 69 6e 74 29 20 74 68 65 6e 0a 20  nstraint) then. 
1cd10 20 20 20 2a 2a 20 65 6d 69 74 20 63 6f 64 65 20     ** emit code 
1cd20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  to allocate the 
1cd30 69 6e 64 65 78 20 72 6f 6f 74 70 61 67 65 20 6f  index rootpage o
1cd40 6e 20 64 69 73 6b 20 61 6e 64 20 6d 61 6b 65 20  n disk and make 
1cd50 61 6e 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 20  an entry for.   
1cd60 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 6e   ** the index in
1cd70 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
1cd80 65 72 20 74 61 62 6c 65 20 61 6e 64 20 70 6f 70  er table and pop
1cd90 75 6c 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ulate the index 
1cda0 77 69 74 68 0a 20 20 20 20 2a 2a 20 63 6f 6e 74  with.    ** cont
1cdb0 65 6e 74 2e 20 20 42 75 74 2c 20 64 6f 20 6e 6f  ent.  But, do no
1cdc0 74 20 64 6f 20 74 68 69 73 20 69 66 20 77 65 20  t do this if we 
1cdd0 61 72 65 20 73 69 6d 70 6c 79 20 72 65 61 64 69  are simply readi
1cde0 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
1cdf0 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c  ster.    ** tabl
1ce00 65 20 74 6f 20 70 61 72 73 65 20 74 68 65 20 73  e to parse the s
1ce10 63 68 65 6d 61 2c 20 6f 72 20 69 66 20 74 68 69  chema, or if thi
1ce20 73 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 50  s index is the P
1ce30 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
1ce40 0a 20 20 20 20 2a 2a 20 6f 66 20 61 20 57 49 54  .    ** of a WIT
1ce50 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
1ce60 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1ce70 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69  If pTblName==0 i
1ce80 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64  t means this ind
1ce90 65 78 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  ex is generated 
1cea0 61 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 50 52  as an implied PR
1ceb0 49 4d 41 52 59 20 4b 45 59 0a 20 20 20 20 2a 2a  IMARY KEY.    **
1cec0 20 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78   or UNIQUE index
1ced0 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42   in a CREATE TAB
1cee0 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53  LE statement.  S
1cef0 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20  ince the table. 
1cf00 20 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62     ** has just b
1cf10 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20  een created, it 
1cf20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61  contains no data
1cf30 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69   and the index i
1cf40 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20  nitialization.  
1cf50 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65    ** step can be
1cf60 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f   skipped..    */
1cf70 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 48 61  .    else if( Ha
1cf80 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20  sRowid(pTab) || 
1cf90 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20  pTblName!=0 ){. 
1cfa0 20 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20       Vdbe *v;.  
1cfb0 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b      char *zStmt;
1cfc0 0a 20 20 20 20 20 20 69 6e 74 20 69 4d 65 6d 20  .      int iMem 
1cfd0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1cfe0 3b 0a 0a 20 20 20 20 20 20 76 20 3d 20 73 71 6c  ;..      v = sql
1cff0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1d000 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 76  se);.      if( v
1d010 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
1d020 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20  create_index;.. 
1d030 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
1d040 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
1d050 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
1d060 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74  ..      /* Creat
1d070 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66  e the rootpage f
1d080 6f 72 20 74 68 65 20 69 6e 64 65 78 20 75 73 69  or the index usi
1d090 6e 67 20 43 72 65 61 74 65 49 6e 64 65 78 2e 20  ng CreateIndex. 
1d0a0 42 75 74 20 62 65 66 6f 72 65 0a 20 20 20 20 20  But before.     
1d0b0 20 2a 2a 20 64 6f 69 6e 67 20 73 6f 2c 20 63 6f   ** doing so, co
1d0c0 64 65 20 61 20 4e 6f 6f 70 20 69 6e 73 74 72 75  de a Noop instru
1d0d0 63 74 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20  ction and store 
1d0e0 69 74 73 20 61 64 64 72 65 73 73 20 69 6e 20 0a  its address in .
1d0f0 20 20 20 20 20 20 2a 2a 20 49 6e 64 65 78 2e 74        ** Index.t
1d100 6e 75 6d 2e 20 54 68 69 73 20 69 73 20 72 65 71  num. This is req
1d110 75 69 72 65 64 20 69 6e 20 63 61 73 65 20 74 68  uired in case th
1d120 69 73 20 69 6e 64 65 78 20 69 73 20 61 63 74 75  is index is actu
1d130 61 6c 6c 79 20 61 20 0a 20 20 20 20 20 20 2a 2a  ally a .      **
1d140 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64   PRIMARY KEY and
1d150 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 63   the table is ac
1d160 74 75 61 6c 6c 79 20 61 20 57 49 54 48 4f 55 54  tually a WITHOUT
1d170 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 49 6e   ROWID table. In
1d180 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20   .      ** that 
1d190 63 61 73 65 20 74 68 65 20 63 6f 6e 76 65 72 74  case the convert
1d1a0 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61  ToWithoutRowidTa
1d1b0 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 20 77 69  ble() routine wi
1d1c0 6c 6c 20 72 65 70 6c 61 63 65 0a 20 20 20 20 20  ll replace.     
1d1d0 20 2a 2a 20 74 68 65 20 4e 6f 6f 70 20 77 69 74   ** the Noop wit
1d1e0 68 20 61 20 47 6f 74 6f 20 74 6f 20 6a 75 6d 70  h a Goto to jump
1d1f0 20 6f 76 65 72 20 74 68 65 20 56 44 42 45 20 63   over the VDBE c
1d200 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 65  ode generated be
1d210 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49  low. */.      pI
1d220 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 73 71 6c  ndex->tnum = sql
1d230 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
1d240 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20  , OP_Noop);.    
1d250 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d260 4f 70 33 28 76 2c 20 4f 50 5f 43 72 65 61 74 65  Op3(v, OP_Create
1d270 42 74 72 65 65 2c 20 69 44 62 2c 20 69 4d 65 6d  Btree, iDb, iMem
1d280 2c 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 29  , BTREE_BLOBKEY)
1d290 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 61 74 68  ;..      /* Gath
1d2a0 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  er the complete 
1d2b0 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  text of the CREA
1d2c0 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
1d2d0 6e 74 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a 2a  nt into.      **
1d2e0 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61   the zStmt varia
1d2f0 62 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ble.      */.   
1d300 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b     if( pStart ){
1d310 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
1d320 20 28 69 6e 74 29 28 70 50 61 72 73 65 2d 3e 73   (int)(pParse->s
1d330 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20 70 4e  LastToken.z - pN
1d340 61 6d 65 2d 3e 7a 29 20 2b 20 70 50 61 72 73 65  ame->z) + pParse
1d350 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a  ->sLastToken.n;.
1d360 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d          if( pNam
1d370 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29  e->z[n-1]==';' )
1d380 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 20 20 2f 2a   n--;.        /*
1d390 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77   A named index w
1d3a0 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20  ith an explicit 
1d3b0 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
1d3c0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  tement */.      
1d3d0 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
1d3e0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43 52  3MPrintf(db, "CR
1d3f0 45 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a  EATE%s INDEX %.*
1d400 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
1d410 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65  onError==OE_None
1d420 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45   ? "" : " UNIQUE
1d430 22 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b  ", n, pName->z);
1d440 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1d450 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f        /* An auto
1d460 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72 65 61  matic index crea
1d470 74 65 64 20 62 79 20 61 20 50 52 49 4d 41 52 59  ted by a PRIMARY
1d480 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63   KEY or UNIQUE c
1d490 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
1d4a0 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20       /* zStmt = 
1d4b0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
1d4c0 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a  "); */.        z
1d4d0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1d4e0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20  }..      /* Add 
1d4f0 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69  an entry in sqli
1d500 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68  te_master for th
1d510 69 73 20 69 6e 64 65 78 0a 20 20 20 20 20 20 2a  is index.      *
1d520 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e  /.      sqlite3N
1d530 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
1d540 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 49  e, .          "I
1d550 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73  NSERT INTO %Q.%s
1d560 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c   VALUES('index',
1d570 25 51 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c  %Q,%Q,#%d,%Q);",
1d580 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61  .          db->a
1d590 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
1d5a0 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a 20  , MASTER_NAME,. 
1d5b0 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d           pIndex-
1d5c0 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
1d5d0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20    pTab->zName,. 
1d5e0 20 20 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20           iMem,. 
1d5f0 20 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20           zStmt. 
1d600 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
1d610 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1d620 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20  db, zStmt);..   
1d630 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69     /* Fill the i
1d640 6e 64 65 78 20 77 69 74 68 20 64 61 74 61 20 61  ndex with data a
1d650 6e 64 20 72 65 70 61 72 73 65 20 74 68 65 20 73  nd reparse the s
1d660 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f  chema. Code an O
1d670 50 5f 45 78 70 69 72 65 0a 20 20 20 20 20 20 2a  P_Expire.      *
1d680 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
1d690 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64  all pre-compiled
1d6a0 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20   statements..   
1d6b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
1d6c0 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20  pTblName ){.    
1d6d0 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
1d6e0 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
1d6f0 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20  Index, iMem);.  
1d700 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61        sqlite3Cha
1d710 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
1d720 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , iDb);.        
1d730 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61  sqlite3VdbeAddPa
1d740 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69  rseSchemaOp(v, i
1d750 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
1d760 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
1d770 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27 20 41 4e  b, "name='%q' AN
1d780 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c  D type='index'",
1d790 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29   pIndex->zName))
1d7a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1d7b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d7c0 50 5f 45 78 70 69 72 65 2c 20 30 2c 20 31 29 3b  P_Expire, 0, 1);
1d7d0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1d7e0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
1d7f0 65 72 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e 74  ere(v, pIndex->t
1d800 6e 75 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  num);.    }.  }.
1d810 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e  .  /* When addin
1d820 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68  g an index to th
1d830 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65  e list of indice
1d840 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d  s for a table, m
1d850 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c  ake.  ** sure al
1d860 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65  l indices labele
1d870 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d  d OE_Replace com
1d880 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73  e after all thos
1d890 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f  e labeled.  ** O
1d8a0 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20  E_Ignore.  This 
1d8b0 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72  is necessary for
1d8c0 20 74 68 65 20 63 6f 72 72 65 63 74 20 63 6f 6e   the correct con
1d8d0 73 74 72 61 69 6e 74 20 63 68 65 63 6b 0a 20 20  straint check.  
1d8e0 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 28 69  ** processing (i
1d8f0 6e 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74  n sqlite3Generat
1d900 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b  eConstraintCheck
1d910 73 28 29 29 20 61 73 20 70 61 72 74 20 6f 66 0a  s()) as part of.
1d920 20 20 2a 2a 20 55 50 44 41 54 45 20 61 6e 64 20    ** UPDATE and 
1d930 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74  INSERT statement
1d940 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  s.  .  */.  if( 
1d950 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c  db->init.busy ||
1d960 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a   pTblName==0 ){.
1d970 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21      if( onError!
1d980 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70  =OE_Replace || p
1d990 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20  Tab->pIndex==0. 
1d9a0 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d          || pTab-
1d9b0 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72  >pIndex->onError
1d9c0 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20  ==OE_Replace){. 
1d9d0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65       pIndex->pNe
1d9e0 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  xt = pTab->pInde
1d9f0 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70  x;.      pTab->p
1da00 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a  Index = pIndex;.
1da10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1da20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d   Index *pOther =
1da30 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
1da40 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68       while( pOth
1da50 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74  er->pNext && pOt
1da60 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72  her->pNext->onEr
1da70 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
1da80 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65  ){.        pOthe
1da90 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  r = pOther->pNex
1daa0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
1dab0 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
1dac0 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
1dad0 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e        pOther->pN
1dae0 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  ext = pIndex;.  
1daf0 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 20 3d    }.    pIndex =
1db00 20 30 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69   0;.  }.  else i
1db10 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
1db20 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ECT ){.    asser
1db30 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 49  t( pParse->pNewI
1db40 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 70  ndex==0 );.    p
1db50 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e 64 65 78  Parse->pNewIndex
1db60 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 70   = pIndex;.    p
1db70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Index = 0;.  }..
1db80 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65    /* Clean up be
1db90 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a  fore exiting */.
1dba0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1dbb0 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20  x:.  if( pIndex 
1dbc0 29 20 73 71 6c 69 74 65 33 46 72 65 65 49 6e 64  ) sqlite3FreeInd
1dbd0 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  ex(db, pIndex);.
1dbe0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1dbf0 65 74 65 28 64 62 2c 20 70 50 49 57 68 65 72 65  ete(db, pPIWhere
1dc00 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1dc10 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1dc20 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
1dc30 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
1dc40 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73  , pTblName);.  s
1dc50 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1dc60 20 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   zName);.}../*.*
1dc70 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78  * Fill the Index
1dc80 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61  .aiRowEst[] arra
1dc90 79 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 69  y with default i
1dca0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66  nformation - inf
1dcb0 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62  ormation.** to b
1dcc0 65 20 75 73 65 64 20 77 68 65 6e 20 77 65 20 68  e used when we h
1dcd0 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20  ave not run the 
1dce0 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e  ANALYZE command.
1dcf0 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b  .**.** aiRowEst[
1dd00 30 5d 20 69 73 20 73 75 70 70 6f 73 65 64 20 74  0] is supposed t
1dd10 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75  o contain the nu
1dd20 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
1dd30 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a   in the index..*
1dd40 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f  * Since we do no
1dd50 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20  t know, guess 1 
1dd60 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45  million.  aiRowE
1dd70 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69  st[1] is an esti
1dd80 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e  mate of the.** n
1dd90 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
1dda0 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
1ddb0 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63  match any partic
1ddc0 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68  ular value of th
1ddd0 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d  e.** first colum
1dde0 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  n of the index. 
1ddf0 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20   aiRowEst[2] is 
1de00 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  an estimate of t
1de10 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
1de20 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68 20  rows that match 
1de30 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 63  any particular c
1de40 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68  ombination of th
1de50 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e  e first 2 column
1de60 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65  s.** of the inde
1de70 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68  x.  And so forth
1de80 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79  .  It must alway
1de90 73 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68  s be the case th
1dea0 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  at.*.**         
1deb0 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61    aiRowEst[N]<=a
1dec0 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20  iRowEst[N-1].** 
1ded0 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45            aiRowE
1dee0 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41  st[N]>=1.**.** A
1def0 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20  part from that, 
1df00 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74  we have little t
1df10 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20  o go on besides 
1df20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a  intuition as to.
1df30 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b  ** how aiRowEst[
1df40 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74  ] should be init
1df50 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75  ialized.  The nu
1df60 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65 64 20  mbers generated 
1df70 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65  here.** are base
1df80 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c  d on typical val
1df90 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74  ues found in act
1dfa0 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a  ual indices..*/.
1dfb0 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 61  void sqlite3Defa
1dfc0 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20  ultRowEst(Index 
1dfd0 2a 70 49 64 78 29 7b 0a 20 20 2f 2a 20 20 20 20  *pIdx){.  /*    
1dfe0 20 20 20 20 20 20 20 20 20 20 20 20 31 30 2c 20              10, 
1dff0 20 39 2c 20 20 38 2c 20 20 37 2c 20 20 36 20 2a   9,  8,  7,  6 *
1e000 2f 0a 20 20 4c 6f 67 45 73 74 20 61 56 61 6c 5b  /.  LogEst aVal[
1e010 5d 20 3d 20 7b 20 33 33 2c 20 33 32 2c 20 33 30  ] = { 33, 32, 30
1e020 2c 20 32 38 2c 20 32 36 20 7d 3b 0a 20 20 4c 6f  , 28, 26 };.  Lo
1e030 67 45 73 74 20 2a 61 20 3d 20 70 49 64 78 2d 3e  gEst *a = pIdx->
1e040 61 69 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69  aiRowLogEst;.  i
1e050 6e 74 20 6e 43 6f 70 79 20 3d 20 4d 49 4e 28 41  nt nCopy = MIN(A
1e060 72 72 61 79 53 69 7a 65 28 61 56 61 6c 29 2c 20  rraySize(aVal), 
1e070 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a  pIdx->nKeyCol);.
1e080 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49    int i;..  /* I
1e090 6e 64 65 78 65 73 20 77 69 74 68 20 64 65 66 61  ndexes with defa
1e0a0 75 6c 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65  ult row estimate
1e0b0 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76  s should not hav
1e0c0 65 20 73 74 61 74 31 20 64 61 74 61 20 2a 2f 0a  e stat1 data */.
1e0d0 20 20 61 73 73 65 72 74 28 20 21 70 49 64 78 2d    assert( !pIdx-
1e0e0 3e 68 61 73 53 74 61 74 31 20 29 3b 0a 0a 20 20  >hasStat1 );..  
1e0f0 2f 2a 20 53 65 74 20 74 68 65 20 66 69 72 73 74  /* Set the first
1e100 20 65 6e 74 72 79 20 28 6e 75 6d 62 65 72 20 6f   entry (number o
1e110 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e  f rows in the in
1e120 64 65 78 29 20 74 6f 20 74 68 65 20 65 73 74 69  dex) to the esti
1e130 6d 61 74 65 64 20 0a 20 20 2a 2a 20 6e 75 6d 62  mated .  ** numb
1e140 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
1e150 65 20 74 61 62 6c 65 2c 20 6f 72 20 68 61 6c 66  e table, or half
1e160 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
1e170 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
1e180 0a 20 20 2a 2a 20 66 6f 72 20 61 20 70 61 72 74  .  ** for a part
1e190 69 61 6c 20 69 6e 64 65 78 2e 20 20 20 42 75 74  ial index.   But
1e1a0 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20   do not let the 
1e1b0 65 73 74 69 6d 61 74 65 20 64 72 6f 70 20 62 65  estimate drop be
1e1c0 6c 6f 77 20 31 30 2e 20 2a 2f 0a 20 20 61 5b 30  low 10. */.  a[0
1e1d0 5d 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  ] = pIdx->pTable
1e1e0 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20  ->nRowLogEst;.  
1e1f0 69 66 28 20 70 49 64 78 2d 3e 70 50 61 72 74 49  if( pIdx->pPartI
1e200 64 78 57 68 65 72 65 21 3d 30 20 29 20 61 5b 30  dxWhere!=0 ) a[0
1e210 5d 20 2d 3d 20 31 30 3b 20 20 61 73 73 65 72 74  ] -= 10;  assert
1e220 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 10==sqlite3Log
1e230 45 73 74 28 32 29 20 29 3b 0a 20 20 69 66 28 20  Est(2) );.  if( 
1e240 61 5b 30 5d 3c 33 33 20 29 20 61 5b 30 5d 20 3d  a[0]<33 ) a[0] =
1e250 20 33 33 3b 20 20 20 20 20 20 20 20 20 20 20 20   33;            
1e260 20 20 20 20 20 20 61 73 73 65 72 74 28 20 33 33        assert( 33
1e270 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
1e280 31 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 73 74  10) );..  /* Est
1e290 69 6d 61 74 65 20 74 68 61 74 20 61 5b 31 5d 20  imate that a[1] 
1e2a0 69 73 20 31 30 2c 20 61 5b 32 5d 20 69 73 20 39  is 10, a[2] is 9
1e2b0 2c 20 61 5b 33 5d 20 69 73 20 38 2c 20 61 5b 34  , a[3] is 8, a[4
1e2c0 5d 20 69 73 20 37 2c 20 61 5b 35 5d 20 69 73 0a  ] is 7, a[5] is.
1e2d0 20 20 2a 2a 20 36 20 61 6e 64 20 65 61 63 68 20    ** 6 and each 
1e2e0 73 75 62 73 65 71 75 65 6e 74 20 76 61 6c 75 65  subsequent value
1e2f0 20 28 69 66 20 61 6e 79 29 20 69 73 20 35 2e 20   (if any) is 5. 
1e300 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26 61 5b   */.  memcpy(&a[
1e310 31 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f 70 79 2a  1], aVal, nCopy*
1e320 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 29 3b  sizeof(LogEst));
1e330 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 70 79 2b 31  .  for(i=nCopy+1
1e340 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  ; i<=pIdx->nKeyC
1e350 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 5b  ol; i++){.    a[
1e360 69 5d 20 3d 20 32 33 3b 20 20 20 20 20 20 20 20  i] = 23;        
1e370 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1e380 72 74 28 20 32 33 3d 3d 73 71 6c 69 74 65 33 4c  rt( 23==sqlite3L
1e390 6f 67 45 73 74 28 35 29 20 29 3b 0a 20 20 7d 0a  ogEst(5) );.  }.
1e3a0 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71  .  assert( 0==sq
1e3b0 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29 20 29  lite3LogEst(1) )
1e3c0 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75 65  ;.  if( IsUnique
1e3d0 49 6e 64 65 78 28 70 49 64 78 29 20 29 20 61 5b  Index(pIdx) ) a[
1e3e0 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 5d 20 3d  pIdx->nKeyCol] =
1e3f0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
1e400 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  s routine will d
1e410 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20  rop an existing 
1e420 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68  named index.  Th
1e430 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d  is routine.** im
1e440 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f  plements the DRO
1e450 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  P INDEX statemen
1e460 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1e470 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73  e3DropIndex(Pars
1e480 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
1e490 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69  st *pName, int i
1e4a0 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64 65  fExists){.  Inde
1e4b0 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62  x *pIndex;.  Vdb
1e4c0 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *v;.  sqlite3 
1e4d0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1e4e0 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
1e4f0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1e500 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f 2a 20  nErr==0 );   /* 
1e510 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74  Never called wit
1e520 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a  h prior errors *
1e530 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  /.  if( db->mall
1e540 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
1e550 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
1e560 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ndex;.  }.  asse
1e570 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d  rt( pName->nSrc=
1e580 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  =1 );.  if( SQLI
1e590 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
1e5a0 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
1e5b0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
1e5c0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1e5d0 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  }.  pIndex = sql
1e5e0 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
1e5f0 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  , pName->a[0].zN
1e600 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ame, pName->a[0]
1e610 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69  .zDatabase);.  i
1e620 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a  f( pIndex==0 ){.
1e630 20 20 20 20 69 66 28 20 21 69 66 45 78 69 73 74      if( !ifExist
1e640 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
1e650 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1e660 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  e, "no such inde
1e670 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30  x: %S", pName, 0
1e680 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1e690 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
1e6a0 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61  erifyNamedSchema
1e6b0 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e  (pParse, pName->
1e6c0 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
1e6d0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
1e6e0 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
1e6f0 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   1;.    goto exi
1e700 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1e710 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  }.  if( pIndex->
1e720 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  idxType!=SQLITE_
1e730 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 20 29  IDXTYPE_APPDEF )
1e740 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
1e750 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69  orMsg(pParse, "i
1e760 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
1e770 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20  with UNIQUE ".  
1e780 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20      "or PRIMARY 
1e790 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  KEY constraint c
1e7a0 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  annot be dropped
1e7b0 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ", 0);.    goto 
1e7c0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1e7d0 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
1e7e0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
1e7f0 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53  x(db, pIndex->pS
1e800 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20  chema);.#ifndef 
1e810 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
1e820 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
1e830 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c    int code = SQL
1e840 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a  ITE_DROP_INDEX;.
1e850 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
1e860 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
1e870 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
1e880 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
1e890 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20  iDb].zDbSName;. 
1e8a0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1e8b0 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42  Tab = SCHEMA_TAB
1e8c0 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 69 66 28  LE(iDb);.    if(
1e8d0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1e8e0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
1e8f0 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30  _DELETE, zTab, 0
1e900 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
1e910 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
1e920 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
1e930 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
1e940 20 26 26 20 69 44 62 20 29 20 63 6f 64 65 20 3d   && iDb ) code =
1e950 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
1e960 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
1e970 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1e980 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
1e990 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70  pIndex->zName, p
1e9a0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29  Tab->zName, zDb)
1e9b0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
1e9c0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
1e9d0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1e9e0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1e9f0 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  code to remove t
1ea00 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f  he index and fro
1ea10 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  m the master tab
1ea20 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  le */.  v = sqli
1ea30 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1ea40 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
1ea50 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
1ea60 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
1ea70 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20  arse, 1, iDb);. 
1ea80 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
1ea90 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
1eaa0 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
1eab0 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 6e 61  M %Q.%s WHERE na
1eac0 6d 65 3d 25 51 20 41 4e 44 20 74 79 70 65 3d 27  me=%Q AND type='
1ead0 69 6e 64 65 78 27 22 2c 0a 20 20 20 20 20 20 20  index'",.       
1eae0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
1eaf0 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41  SName, MASTER_NA
1eb00 4d 45 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ME, pIndex->zNam
1eb10 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  e.    );.    sql
1eb20 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62  ite3ClearStatTab
1eb30 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c  les(pParse, iDb,
1eb40 20 22 69 64 78 22 2c 20 70 49 6e 64 65 78 2d 3e   "idx", pIndex->
1eb50 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
1eb60 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
1eb70 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
1eb80 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
1eb90 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  e(pParse, pIndex
1eba0 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
1ebb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ebc0 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e  Op4(v, OP_DropIn
1ebd0 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  dex, iDb, 0, 0, 
1ebe0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30  pIndex->zName, 0
1ebf0 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f  );.  }..exit_dro
1ec00 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74  p_index:.  sqlit
1ec10 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
1ec20 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  db, pName);.}../
1ec30 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69 73 20 61  *.** pArray is a
1ec40 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 61   pointer to an a
1ec50 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e  rray of objects.
1ec60 20 45 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20   Each object in 
1ec70 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 69 73 20  the.** array is 
1ec80 73 7a 45 6e 74 72 79 20 62 79 74 65 73 20 69 6e  szEntry bytes in
1ec90 20 73 69 7a 65 2e 20 54 68 69 73 20 72 6f 75 74   size. This rout
1eca0 69 6e 65 20 75 73 65 73 20 73 71 6c 69 74 65 33  ine uses sqlite3
1ecb0 44 62 52 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20 74  DbRealloc().** t
1ecc0 6f 20 65 78 74 65 6e 64 20 74 68 65 20 61 72 72  o extend the arr
1ecd0 61 79 20 73 6f 20 74 68 61 74 20 74 68 65 72 65  ay so that there
1ece0 20 69 73 20 73 70 61 63 65 20 66 6f 72 20 61 20   is space for a 
1ecf0 6e 65 77 20 6f 62 6a 65 63 74 20 61 74 20 74 68  new object at th
1ed00 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  e end..**.** Whe
1ed10 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1ed20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 45 6e  is called, *pnEn
1ed30 74 72 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  try contains the
1ed40 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
1ed50 0a 2a 2a 20 74 68 65 20 61 72 72 61 79 20 28 69  .** the array (i
1ed60 6e 20 65 6e 74 72 69 65 73 20 2d 20 73 6f 20 74  n entries - so t
1ed70 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  he allocation is
1ed80 20 28 28 2a 70 6e 45 6e 74 72 79 29 20 2a 20 73   ((*pnEntry) * s
1ed90 7a 45 6e 74 72 79 29 20 62 79 74 65 73 0a 2a 2a  zEntry) bytes.**
1eda0 20 69 6e 20 74 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a   in total)..**.*
1edb0 2a 20 49 66 20 74 68 65 20 72 65 61 6c 6c 6f 63  * If the realloc
1edc0 28 29 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  () is successful
1edd0 20 28 69 2e 65 2e 20 69 66 20 6e 6f 20 4f 4f 4d   (i.e. if no OOM
1ede0 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 63 63 75 72   condition occur
1edf0 73 29 2c 20 74 68 65 0a 2a 2a 20 73 70 61 63 65  s), the.** space
1ee00 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
1ee10 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 73  he new object is
1ee20 20 7a 65 72 6f 65 64 2c 20 2a 70 6e 45 6e 74 72   zeroed, *pnEntr
1ee30 79 20 75 70 64 61 74 65 64 20 74 6f 0a 2a 2a 20  y updated to.** 
1ee40 72 65 66 6c 65 63 74 20 74 68 65 20 6e 65 77 20  reflect the new 
1ee50 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61  size of the arra
1ee60 79 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20  y and a pointer 
1ee70 74 6f 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63  to the new alloc
1ee80 61 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 65  ation.** returne
1ee90 64 2e 20 2a 70 49 64 78 20 69 73 20 73 65 74 20  d. *pIdx is set 
1eea0 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
1eeb0 74 68 65 20 6e 65 77 20 61 72 72 61 79 20 65 6e  the new array en
1eec0 74 72 79 20 69 6e 20 74 68 69 73 20 63 61 73 65  try in this case
1eed0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
1eee0 65 2c 20 69 66 20 74 68 65 20 72 65 61 6c 6c 6f  e, if the reallo
1eef0 63 28 29 20 66 61 69 6c 73 2c 20 2a 70 49 64 78  c() fails, *pIdx
1ef00 20 69 73 20 73 65 74 20 74 6f 20 2d 31 2c 20 2a   is set to -1, *
1ef10 70 6e 45 6e 74 72 79 20 72 65 6d 61 69 6e 73 0a  pnEntry remains.
1ef20 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ** unchanged and
1ef30 20 61 20 63 6f 70 79 20 6f 66 20 70 41 72 72 61   a copy of pArra
1ef40 79 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 76  y returned..*/.v
1ef50 6f 69 64 20 2a 73 71 6c 69 74 65 33 41 72 72 61  oid *sqlite3Arra
1ef60 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c  yAllocate(.  sql
1ef70 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 2f  ite3 *db,      /
1ef80 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  * Connection to 
1ef90 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63  notify of malloc
1efa0 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76   failures */.  v
1efb0 6f 69 64 20 2a 70 41 72 72 61 79 2c 20 20 20 20  oid *pArray,    
1efc0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 62 6a   /* Array of obj
1efd0 65 63 74 73 2e 20 20 4d 69 67 68 74 20 62 65 20  ects.  Might be 
1efe0 72 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  reallocated */. 
1eff0 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20 20   int szEntry,   
1f000 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61     /* Size of ea
1f010 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  ch object in the
1f020 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
1f030 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a  *pnEntry,     /*
1f040 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63   Number of objec
1f050 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  ts currently in 
1f060 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49  use */.  int *pI
1f070 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  dx         /* Wr
1f080 69 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66  ite the index of
1f090 20 61 20 6e 65 77 20 73 6c 6f 74 20 68 65 72 65   a new slot here
1f0a0 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
1f0b0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
1f0c0 34 20 6e 20 3d 20 2a 70 49 64 78 20 3d 20 2a 70  4 n = *pIdx = *p
1f0d0 6e 45 6e 74 72 79 3b 0a 20 20 69 66 28 20 28 6e  nEntry;.  if( (n
1f0e0 20 26 20 28 6e 2d 31 29 29 3d 3d 30 20 29 7b 0a   & (n-1))==0 ){.
1f0f0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
1f100 34 20 73 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f 20  4 sz = (n==0) ? 
1f110 31 20 3a 20 32 2a 6e 3b 0a 20 20 20 20 76 6f 69  1 : 2*n;.    voi
1f120 64 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  d *pNew = sqlite
1f130 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
1f140 41 72 72 61 79 2c 20 73 7a 2a 73 7a 45 6e 74 72  Array, sz*szEntr
1f150 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  y);.    if( pNew
1f160 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 49  ==0 ){.      *pI
1f170 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72  dx = -1;.      r
1f180 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 20 20  eturn pArray;.  
1f190 20 20 7d 0a 20 20 20 20 70 41 72 72 61 79 20 3d    }.    pArray =
1f1a0 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d   pNew;.  }.  z =
1f1b0 20 28 63 68 61 72 2a 29 70 41 72 72 61 79 3b 0a   (char*)pArray;.
1f1c0 20 20 6d 65 6d 73 65 74 28 26 7a 5b 6e 20 2a 20    memset(&z[n * 
1f1d0 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45  szEntry], 0, szE
1f1e0 6e 74 72 79 29 3b 0a 20 20 2b 2b 2a 70 6e 45 6e  ntry);.  ++*pnEn
1f1f0 74 72 79 3b 0a 20 20 72 65 74 75 72 6e 20 70 41  try;.  return pA
1f200 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rray;.}../*.** A
1f210 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d  ppend a new elem
1f220 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ent to the given
1f230 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65   IdList.  Create
1f240 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66   a new IdList if
1f250 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a  .** need be..**.
1f260 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20  ** A new IdList 
1f270 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
1f280 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29  NULL if malloc()
1f290 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73   fails..*/.IdLis
1f2a0 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t *sqlite3IdList
1f2b0 41 70 70 65 6e 64 28 50 61 72 73 65 20 2a 70 50  Append(Parse *pP
1f2c0 61 72 73 65 2c 20 49 64 4c 69 73 74 20 2a 70 4c  arse, IdList *pL
1f2d0 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ist, Token *pTok
1f2e0 65 6e 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  en){.  sqlite3 *
1f2f0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1f300 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1f310 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
1f320 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44  pList = sqlite3D
1f330 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
1f340 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29  sizeof(IdList) )
1f350 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
1f360 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1f370 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20   }.  pList->a = 
1f380 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
1f390 63 61 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a  cate(.      db,.
1f3a0 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a        pList->a,.
1f3b0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69        sizeof(pLi
1f3c0 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20  st->a[0]),.     
1f3d0 20 26 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20   &pList->nId,.  
1f3e0 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 69 66      &i.  );.  if
1f3f0 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  ( i<0 ){.    sql
1f400 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
1f410 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  (db, pList);.   
1f420 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1f430 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
1f440 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
1f450 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54  FromToken(db, pT
1f460 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 49 4e 5f  oken);.  if( IN_
1f470 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 26 26  RENAME_OBJECT &&
1f480 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
1f490 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  me ){.    sqlite
1f4a0 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28  3RenameTokenMap(
1f4b0 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 70  pParse, (void*)p
1f4c0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
1f4d0 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20  , pToken);.  }. 
1f4e0 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
1f4f0 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
1f500 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  n IdList..*/.voi
1f510 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44  d sqlite3IdListD
1f520 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
1f530 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  b, IdList *pList
1f540 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
1f550 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
1f560 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
1f570 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
1f580 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
1f590 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d  bFree(db, pList-
1f5a0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
1f5b0 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
1f5c0 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b  e(db, pList->a);
1f5d0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1f5e0 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  NN(db, pList);.}
1f5f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1f600 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73  he index in pLis
1f610 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66  t of the identif
1f620 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20  ier named zId.  
1f630 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20  Return -1.** if 
1f640 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e  not found..*/.in
1f650 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  t sqlite3IdListI
1f660 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69  ndex(IdList *pLi
1f670 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
1f680 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  zName){.  int i;
1f690 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1f6a0 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66  ) return -1;.  f
1f6b0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1f6c0 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
1f6d0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1f6e0 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
1f6f0 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
1f700 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a  ) return i;.  }.
1f710 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
1f720 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 69  /*.** Maximum si
1f730 7a 65 20 6f 66 20 61 20 53 72 63 4c 69 73 74 20  ze of a SrcList 
1f740 6f 62 6a 65 63 74 2e 0a 2a 2a 20 54 68 65 20 53  object..** The S
1f750 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 69 73  rcList object is
1f760 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65   used to represe
1f770 6e 74 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  nt the FROM clau
1f780 73 65 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43  se of a.** SELEC
1f790 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6e 64  T statement, and
1f7a0 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e   the query plann
1f7b0 65 72 20 63 61 6e 6e 6f 74 20 64 65 61 6c 20 77  er cannot deal w
1f7c0 69 74 68 20 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e  ith more.** than
1f7d0 20 36 34 20 74 61 62 6c 65 73 20 69 6e 20 61 20   64 tables in a 
1f7e0 6a 6f 69 6e 2e 20 20 53 6f 20 61 6e 79 20 76 61  join.  So any va
1f7f0 6c 75 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20  lue larger than 
1f800 36 34 20 68 65 72 65 0a 2a 2a 20 69 73 20 73 75  64 here.** is su
1f810 66 66 69 63 69 65 6e 74 20 66 6f 72 20 6d 6f 73  fficient for mos
1f820 74 20 75 73 65 73 2e 20 20 53 6d 61 6c 6c 65 72  t uses.  Smaller
1f830 20 76 61 6c 75 65 73 2c 20 6c 69 6b 65 20 73 61   values, like sa
1f840 79 20 31 30 2c 20 61 72 65 0a 2a 2a 20 61 70 70  y 10, are.** app
1f850 72 6f 70 72 69 61 74 65 20 66 6f 72 20 73 6d 61  ropriate for sma
1f860 6c 6c 20 61 6e 64 20 6d 65 6d 6f 72 79 2d 6c 69  ll and memory-li
1f870 6d 69 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f  mited applicatio
1f880 6e 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ns..*/.#ifndef S
1f890 51 4c 49 54 45 5f 4d 41 58 5f 53 52 43 4c 49 53  QLITE_MAX_SRCLIS
1f8a0 54 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  T.# define SQLIT
1f8b0 45 5f 4d 41 58 5f 53 52 43 4c 49 53 54 20 32 30  E_MAX_SRCLIST 20
1f8c0 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
1f8d0 45 78 70 61 6e 64 20 74 68 65 20 73 70 61 63 65  Expand the space
1f8e0 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
1f8f0 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74  he given SrcList
1f900 20 6f 62 6a 65 63 74 20 62 79 0a 2a 2a 20 63 72   object by.** cr
1f910 65 61 74 69 6e 67 20 6e 45 78 74 72 61 20 6e 65  eating nExtra ne
1f920 77 20 73 6c 6f 74 73 20 62 65 67 69 6e 6e 69 6e  w slots beginnin
1f930 67 20 61 74 20 69 53 74 61 72 74 2e 20 20 69 53  g at iStart.  iS
1f940 74 61 72 74 20 69 73 20 7a 65 72 6f 20 62 61 73  tart is zero bas
1f950 65 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f 74 73  ed..** New slots
1f960 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a   are zeroed..**.
1f970 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1f980 73 75 70 70 6f 73 65 20 61 20 53 72 63 4c 69 73  suppose a SrcLis
1f990 74 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f 6e 74  t initially cont
1f9a0 61 69 6e 73 20 74 77 6f 20 65 6e 74 72 69 65 73  ains two entries
1f9b0 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61 70 70  : A,B..** To app
1f9c0 65 6e 64 20 33 20 6e 65 77 20 65 6e 74 72 69 65  end 3 new entrie
1f9d0 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 2c 20  s onto the end, 
1f9e0 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  do this:.**.**  
1f9f0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1fa00 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63  Enlarge(db, pSrc
1fa10 6c 69 73 74 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a  list, 3, 2);.**.
1fa20 2a 2a 20 41 66 74 65 72 20 74 68 65 20 63 61 6c  ** After the cal
1fa30 6c 20 61 62 6f 76 65 20 69 74 20 77 6f 75 6c 64  l above it would
1fa40 20 63 6f 6e 74 61 69 6e 3a 20 20 41 2c 20 42 2c   contain:  A, B,
1fa50 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a   nil, nil, nil..
1fa60 2a 2a 20 49 66 20 74 68 65 20 69 53 74 61 72 74  ** If the iStart
1fa70 20 61 72 67 75 6d 65 6e 74 20 68 61 64 20 62 65   argument had be
1fa80 65 6e 20 31 20 69 6e 73 74 65 61 64 20 6f 66 20  en 1 instead of 
1fa90 32 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  2, then the resu
1faa0 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65  lt.** would have
1fab0 20 62 65 65 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20   been:  A, nil, 
1fac0 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20 54 6f  nil, nil, B.  To
1fad0 20 70 72 65 70 65 6e 64 20 74 68 65 20 6e 65 77   prepend the new
1fae0 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65 20 69   slots,.** the i
1faf0 53 74 61 72 74 20 76 61 6c 75 65 20 77 6f 75 6c  Start value woul
1fb00 64 20 62 65 20 30 2e 20 20 54 68 65 20 72 65 73  d be 0.  The res
1fb10 75 6c 74 20 74 68 65 6e 20 77 6f 75 6c 64 0a 2a  ult then would.*
1fb20 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20  * be: nil, nil, 
1fb30 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a  nil, A, B..**.**
1fb40 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
1fb50 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 6f 72  ocation fails or
1fb60 20 74 68 65 20 53 72 63 4c 69 73 74 20 62 65 63   the SrcList bec
1fb70 6f 6d 65 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20  omes too large, 
1fb80 6c 65 61 76 65 0a 2a 2a 20 74 68 65 20 6f 72 69  leave.** the ori
1fb90 67 69 6e 61 6c 20 53 72 63 4c 69 73 74 20 75 6e  ginal SrcList un
1fba0 63 68 61 6e 67 65 64 2c 20 72 65 74 75 72 6e 20  changed, return 
1fbb0 4e 55 4c 4c 2c 20 61 6e 64 20 6c 65 61 76 65 20  NULL, and leave 
1fbc0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
1fbd0 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  .** in pParse..*
1fbe0 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
1fbf0 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65  e3SrcListEnlarge
1fc00 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1fc10 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
1fc20 67 20 63 6f 6e 74 65 78 74 20 69 6e 74 6f 20 77  g context into w
1fc30 68 69 63 68 20 65 72 72 6f 72 73 20 61 72 65 20  hich errors are 
1fc40 72 65 70 6f 72 74 65 64 20 2a 2f 0a 20 20 53 72  reported */.  Sr
1fc50 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
1fc60 20 2f 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20   /* The SrcList 
1fc70 74 6f 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a  to be enlarged *
1fc80 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
1fc90 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1fca0 20 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f   of new slots to
1fcb0 20 61 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b   add to pSrc->a[
1fcc0 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72  ] */.  int iStar
1fcd0 74 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  t         /* Ind
1fce0 65 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20  ex in pSrc->a[] 
1fcf0 6f 66 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f  of first new slo
1fd00 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
1fd10 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ..  /* Sanity ch
1fd20 65 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e  ecking on callin
1fd30 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  g parameters */.
1fd40 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74    assert( iStart
1fd50 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
1fd60 20 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20   nExtra>=1 );.  
1fd70 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20  assert( pSrc!=0 
1fd80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
1fd90 61 72 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20  art<=pSrc->nSrc 
1fda0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
1fdb0 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61  e additional spa
1fdc0 63 65 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  ce if needed */.
1fdd0 20 20 69 66 28 20 28 75 33 32 29 70 53 72 63 2d    if( (u32)pSrc-
1fde0 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72  >nSrc+nExtra>pSr
1fdf0 63 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  c->nAlloc ){.   
1fe00 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a   SrcList *pNew;.
1fe10 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
1fe20 34 20 6e 41 6c 6c 6f 63 20 3d 20 32 2a 28 73 71  4 nAlloc = 2*(sq
1fe30 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 53 72 63  lite3_int64)pSrc
1fe40 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3b 0a 20  ->nSrc+nExtra;. 
1fe50 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
1fe60 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
1fe70 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
1fe80 2b 6e 45 78 74 72 61 3e 3d 53 51 4c 49 54 45 5f  +nExtra>=SQLITE_
1fe90 4d 41 58 5f 53 52 43 4c 49 53 54 20 29 7b 0a 20  MAX_SRCLIST ){. 
1fea0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1feb0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
1fec0 6f 20 6d 61 6e 79 20 46 52 4f 4d 20 63 6c 61 75  o many FROM clau
1fed0 73 65 20 74 65 72 6d 73 2c 20 6d 61 78 3a 20 25  se terms, max: %
1fee0 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  d",.            
1fef0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1ff00 5f 4d 41 58 5f 53 52 43 4c 49 53 54 29 3b 0a 20  _MAX_SRCLIST);. 
1ff10 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1ff20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 6c     }.    if( nAl
1ff30 6c 6f 63 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 53  loc>SQLITE_MAX_S
1ff40 52 43 4c 49 53 54 20 29 20 6e 41 6c 6c 6f 63 20  RCLIST ) nAlloc 
1ff50 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 52 43  = SQLITE_MAX_SRC
1ff60 4c 49 53 54 3b 0a 20 20 20 20 70 4e 65 77 20 3d  LIST;.    pNew =
1ff70 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
1ff80 63 28 64 62 2c 20 70 53 72 63 2c 0a 20 20 20 20  c(db, pSrc,.    
1ff90 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
1ffa0 66 28 2a 70 53 72 63 29 20 2b 20 28 6e 41 6c 6c  f(*pSrc) + (nAll
1ffb0 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 53 72  oc-1)*sizeof(pSr
1ffc0 63 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20  c->a[0]) );.    
1ffd0 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
1ffe0 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
1fff0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
20000 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
20010 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 20  .    }.    pSrc 
20020 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 53 72 63  = pNew;.    pSrc
20030 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f  ->nAlloc = nAllo
20040 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76  c;.  }..  /* Mov
20050 65 20 65 78 69 73 74 69 6e 67 20 73 6c 6f 74 73  e existing slots
20060 20 74 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72   that come after
20070 20 74 68 65 20 6e 65 77 6c 79 20 69 6e 73 65 72   the newly inser
20080 74 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f  ted slots.  ** o
20090 75 74 20 6f 66 20 74 68 65 20 77 61 79 20 2a 2f  ut of the way */
200a0 0a 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e  .  for(i=pSrc->n
200b0 53 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74  Src-1; i>=iStart
200c0 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63  ; i--){.    pSrc
200d0 2d 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20  ->a[i+nExtra] = 
200e0 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a  pSrc->a[i];.  }.
200f0 20 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20    pSrc->nSrc += 
20100 6e 45 78 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65  nExtra;..  /* Ze
20110 72 6f 20 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c  ro the newly all
20120 6f 63 61 74 65 64 20 73 6c 6f 74 73 20 2a 2f 0a  ocated slots */.
20130 20 20 6d 65 6d 73 65 74 28 26 70 53 72 63 2d 3e    memset(&pSrc->
20140 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 73 69  a[iStart], 0, si
20150 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29  zeof(pSrc->a[0])
20160 2a 6e 45 78 74 72 61 29 3b 0a 20 20 66 6f 72 28  *nExtra);.  for(
20170 69 3d 69 53 74 61 72 74 3b 20 69 3c 69 53 74 61  i=iStart; i<iSta
20180 72 74 2b 6e 45 78 74 72 61 3b 20 69 2b 2b 29 7b  rt+nExtra; i++){
20190 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e  .    pSrc->a[i].
201a0 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20  iCursor = -1;.  
201b0 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 61  }..  /* Return a
201c0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
201d0 65 6e 6c 61 72 67 65 64 20 53 72 63 4c 69 73 74  enlarged SrcList
201e0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 53 72   */.  return pSr
201f0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  c;.}.../*.** App
20200 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20  end a new table 
20210 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65  name to the give
20220 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61  n SrcList.  Crea
20230 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  te a new SrcList
20240 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20   if.** need be. 
20250 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20   A new entry is 
20260 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 53  created in the S
20270 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70  rcList even if p
20280 54 61 62 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a  Table is NULL..*
20290 2a 0a 2a 2a 20 41 20 53 72 63 4c 69 73 74 20 69  *.** A SrcList i
202a0 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e  s returned, or N
202b0 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20  ULL if there is 
202c0 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 72 20  an OOM error or 
202d0 69 66 20 74 68 65 0a 2a 2a 20 53 72 63 4c 69 73  if the.** SrcLis
202e0 74 20 67 72 6f 77 73 20 74 6f 20 6c 61 72 67 65  t grows to large
202f0 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 0a  .  The returned.
20300 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74  ** SrcList might
20310 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
20320 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74  the SrcList that
20330 20 77 61 73 20 69 6e 70 75 74 20 6f 72 20 69 74   was input or it
20340 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e   might be.** a n
20350 65 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f  ew one.  If an O
20360 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  OM error does oc
20370 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 70  curs, then the p
20380 72 69 6f 72 20 76 61 6c 75 65 20 6f 66 20 70 4c  rior value of pL
20390 69 73 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 69  ist.** that is i
203a0 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75  nput to this rou
203b0 74 69 6e 65 20 69 73 20 61 75 74 6f 6d 61 74 69  tine is automati
203c0 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a  cally freed..**.
203d0 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20  ** If pDatabase 
203e0 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20  is not null, it 
203f0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74  means that the t
20400 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69  able has an opti
20410 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65  onal.** database
20420 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c   name prefix.  L
20430 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61  ike this:  "data
20440 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68  base.table".  Th
20450 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70  e pDatabase.** p
20460 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62  oints to the tab
20470 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
20480 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f  pTable points to
20490 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
204a0 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69  me..** The SrcLi
204b0 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65  st.a[].zName fie
204c0 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  ld is filled wit
204d0 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  h the table name
204e0 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20   which might.** 
204f0 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65  come from pTable
20500 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69   (if pDatabase i
20510 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20  s NULL) or from 
20520 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20  pDatabase.  .** 
20530 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74  SrcList.a[].zDat
20540 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20  abase is filled 
20550 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
20560 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62  e name from pTab
20570 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e  le,.** or with N
20580 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61  ULL if no databa
20590 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e  se is specified.
205a0 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  .**.** In other 
205b0 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c  words, if call l
205c0 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
205d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
205e0 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41  rcListAppend(D,A
205f0 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,0);.**.** The
20600 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e  n B is a table n
20610 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
20620 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73  base name is uns
20630 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61  pecified.  If ca
20640 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69  lled.** like thi
20650 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
20660 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
20670 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a  ppend(D,A,B,C);.
20680 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20  **.** Then C is 
20690 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  the table name a
206a0 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61  nd B is the data
206b0 62 61 73 65 20 6e 61 6d 65 2e 20 20 49 66 20 43  base name.  If C
206c0 20 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74   is defined.** t
206d0 68 65 6e 20 73 6f 20 69 73 20 42 2e 20 20 49 6e  hen so is B.  In
206e0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 65   other words, we
206f0 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 63 61   never have a ca
20700 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a 20  se where:.**.** 
20710 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
20720 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41  rcListAppend(D,A
20730 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74  ,0,C);.**.** Bot
20740 68 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61  h pTable and pDa
20750 74 61 62 61 73 65 20 61 72 65 20 61 73 73 75 6d  tabase are assum
20760 65 64 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e  ed to be quoted.
20770 20 20 54 68 65 79 20 61 72 65 20 64 65 71 75 6f    They are dequo
20780 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62 65  ted.** before be
20790 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68 65  ing added to the
207a0 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72 63   SrcList..*/.Src
207b0 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
207c0 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50 61  ListAppend(.  Pa
207d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
207e0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
207f0 74 65 78 74 2c 20 69 6e 20 77 68 69 63 68 20 65  text, in which e
20800 72 72 6f 72 73 20 61 72 65 20 72 65 70 6f 72 74  rrors are report
20810 65 64 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ed */.  SrcList 
20820 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 41  *pList,     /* A
20830 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20 53 72  ppend to this Sr
20840 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61  cList. NULL crea
20850 74 65 73 20 61 20 6e 65 77 20 53 72 63 4c 69 73  tes a new SrcLis
20860 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  t */.  Token *pT
20870 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 61  able,      /* Ta
20880 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f  ble to append */
20890 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62  .  Token *pDatab
208a0 61 73 65 20 20 20 20 2f 2a 20 44 61 74 61 62 61  ase    /* Databa
208b0 73 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  se of the table 
208c0 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  */.){.  struct S
208d0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
208e0 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  em;.  sqlite3 *d
208f0 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 61  b;.  assert( pDa
20900 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20 70 54 61  tabase==0 || pTa
20910 62 6c 65 21 3d 30 20 29 3b 20 20 2f 2a 20 43 61  ble!=0 );  /* Ca
20920 6e 6e 6f 74 20 68 61 76 65 20 43 20 77 69 74 68  nnot have C with
20930 6f 75 74 20 42 20 2a 2f 0a 20 20 61 73 73 65 72  out B */.  asser
20940 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a  t( pParse!=0 );.
20950 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
20960 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 64 62 20  ->db!=0 );.  db 
20970 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
20980 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
20990 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
209a0 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
209b0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a  (pParse->db, siz
209c0 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a  eof(SrcList) );.
209d0 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
209e0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
209f0 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
20a00 20 31 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   1;.    pList->n
20a10 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d  Src = 1;.    mem
20a20 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 30 5d  set(&pList->a[0]
20a30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73  , 0, sizeof(pLis
20a40 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 70  t->a[0]));.    p
20a50 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  List->a[0].iCurs
20a60 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65  or = -1;.  }else
20a70 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  {.    SrcList *p
20a80 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53 72 63  New = sqlite3Src
20a90 4c 69 73 74 45 6e 6c 61 72 67 65 28 70 50 61 72  ListEnlarge(pPar
20aa0 73 65 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c  se, pList, 1, pL
20ab0 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 20 20  ist->nSrc);.    
20ac0 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
20ad0 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
20ae0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
20af0 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ist);.      retu
20b00 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rn 0;.    }else{
20b10 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70  .      pList = p
20b20 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  New;.    }.  }. 
20b30 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
20b40 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31  >a[pList->nSrc-1
20b50 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62 61  ];.  if( pDataba
20b60 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65 2d  se && pDatabase-
20b70 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61  >z==0 ){.    pDa
20b80 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a  tabase = 0;.  }.
20b90 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
20ba0 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  ){.    pItem->zN
20bb0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
20bc0 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
20bd0 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70  Database);.    p
20be0 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  Item->zDatabase 
20bf0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
20c00 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c  mToken(db, pTabl
20c10 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
20c20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
20c30 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
20c40 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 29  oken(db, pTable)
20c50 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 44 61  ;.    pItem->zDa
20c60 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a  tabase = 0;.  }.
20c70 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
20c80 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
20c90 56 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78  VdbeCursor index
20ca0 20 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20   numbers to all 
20cb0 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c  tables in a SrcL
20cc0 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ist.*/.void sqli
20cd0 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
20ce0 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70  Cursors(Parse *p
20cf0 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
20d00 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
20d10 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
20d20 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
20d30 20 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c   assert(pList ||
20d40 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
20d50 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
20d60 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
20d70 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
20d80 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74  List->a; i<pList
20d90 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
20da0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  em++){.      if(
20db0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e   pItem->iCursor>
20dc0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
20dd0 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72    pItem->iCursor
20de0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
20df0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  +;.      if( pIt
20e00 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
20e10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
20e20 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
20e30 72 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  rs(pParse, pItem
20e40 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29  ->pSelect->pSrc)
20e50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20e60 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
20e70 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72  ete an entire Sr
20e80 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20  cList including 
20e90 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63  all its substruc
20ea0 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
20eb0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
20ec0 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
20ed0 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
20ee0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
20ef0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
20f00 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c  *pItem;.  if( pL
20f10 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
20f20 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
20f30 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
20f40 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
20f50 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
20f60 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
20f70 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
20f80 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
20f90 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
20fa0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
20fb0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
20fc0 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
20fd0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
20fe0 69 73 49 6e 64 65 78 65 64 42 79 20 29 20 73 71  isIndexedBy ) sq
20ff0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
21000 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  pItem->u1.zIndex
21010 65 64 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70  edBy);.    if( p
21020 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
21030 6e 63 20 29 20 73 71 6c 69 74 65 33 45 78 70 72  nc ) sqlite3Expr
21040 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
21050 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
21060 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  g);.    sqlite3D
21070 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
21080 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20  Item->pTab);.   
21090 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
210a0 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
210b0 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71  pSelect);.    sq
210c0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
210d0 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b  db, pItem->pOn);
210e0 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69  .    sqlite3IdLi
210f0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  stDelete(db, pIt
21100 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d  em->pUsing);.  }
21110 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
21120 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  NN(db, pList);.}
21130 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
21140 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
21150 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20  y the parser to 
21160 61 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74  add a new term t
21170 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  o the.** end of 
21180 61 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63  a growing FROM c
21190 6c 61 75 73 65 2e 20 20 54 68 65 20 22 70 22 20  lause.  The "p" 
211a0 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
211b0 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20   part of.** the 
211c0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74  FROM clause that
211d0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
211e0 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20  n constructed.  
211f0 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69  "p" is NULL.** i
21200 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
21210 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20  rst term of the 
21220 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54  FROM clause.  pT
21230 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61  able and pDataba
21240 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61  se.** are the na
21250 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
21260 61 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d  and database nam
21270 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ed in the FROM c
21280 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70  lause term..** p
21290 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c  Database is NULL
212a0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
212b0 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20   name qualifier 
212c0 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65  is missing - the
212d0 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20  .** usual case. 
212e0 20 49 66 20 74 68 65 20 74 65 72 6d 20 68 61 73   If the term has
212f0 20 61 6e 20 61 6c 69 61 73 2c 20 74 68 65 6e 20   an alias, then 
21300 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f  pAlias points to
21310 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f   the.** alias to
21320 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72  ken.  If the ter
21330 6d 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2c  m is a subquery,
21340 20 74 68 65 6e 20 70 53 75 62 71 75 65 72 79 20   then pSubquery 
21350 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54  is the.** SELECT
21360 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
21370 74 68 65 20 73 75 62 71 75 65 72 79 20 65 6e 63  the subquery enc
21380 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c  odes.  The pTabl
21390 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61  e and.** pDataba
213a0 73 65 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  se parameters ar
213b0 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75  e NULL for subqu
213c0 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20  eries.  The pOn 
213d0 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61  and pUsing.** pa
213e0 72 61 6d 65 74 65 72 73 20 61 72 65 20 74 68 65  rameters are the
213f0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
21400 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
21410 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  uses..**.** Retu
21420 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  rn a new SrcList
21430 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69   which encodes i
21440 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20  s the FROM with 
21450 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20  the new.** term 
21460 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73  added..*/.SrcLis
21470 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
21480 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28  tAppendFromTerm(
21490 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
214a0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
214b0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
214c0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20  .  SrcList *p,  
214d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
214e0 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74  e left part of t
214f0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61  he FROM clause a
21500 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20  lready seen */. 
21510 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20   Token *pTable, 
21520 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
21530 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
21540 20 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d   add to the FROM
21550 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b   clause */.  Tok
21560 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20  en *pDatabase,  
21570 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
21580 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
21590 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a  taining pTable *
215a0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61  /.  Token *pAlia
215b0 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  s,          /* T
215c0 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
215d0 64 65 20 6f 66 20 74 68 65 20 41 53 20 73 75 62  de of the AS sub
215e0 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
215f0 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72  Select *pSubquer
21600 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  y,      /* A sub
21610 71 75 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c  query used in pl
21620 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e  ace of a table n
21630 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ame */.  Expr *p
21640 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  On,             
21650 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75 73   /* The ON claus
21660 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20  e of a join */. 
21670 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 20   IdList *pUsing 
21680 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
21690 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
216a0 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73  a join */.){.  s
216b0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
216c0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c  em *pItem;.  sql
216d0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
216e0 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21 70 20  e->db;.  if( !p 
216f0 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69 6e  && (pOn || pUsin
21700 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  g) ){.    sqlite
21710 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
21720 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65  , "a JOIN clause
21730 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66   is required bef
21740 6f 72 65 20 25 73 22 2c 20 0a 20 20 20 20 20 20  ore %s", .      
21750 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22 55  (pOn ? "ON" : "U
21760 53 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20 20  SING").    );.  
21770 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72    goto append_fr
21780 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  om_error;.  }.  
21790 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  p = sqlite3SrcLi
217a0 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
217b0 20 70 2c 20 70 54 61 62 6c 65 2c 20 70 44 61 74   p, pTable, pDat
217c0 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d  abase);.  if( p=
217d0 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61  =0 ){.    goto a
217e0 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72  ppend_from_error
217f0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
21800 70 2d 3e 6e 53 72 63 3e 30 20 29 3b 0a 20 20 70  p->nSrc>0 );.  p
21810 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e  Item = &p->a[p->
21820 6e 53 72 63 2d 31 5d 3b 0a 20 20 61 73 73 65 72  nSrc-1];.  asser
21830 74 28 20 28 70 54 61 62 6c 65 3d 3d 30 29 3d 3d  t( (pTable==0)==
21840 28 70 44 61 74 61 62 61 73 65 3d 3d 30 29 20 29  (pDatabase==0) )
21850 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
21860 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 70  m->zName==0 || p
21870 44 61 74 61 62 61 73 65 21 3d 30 20 29 3b 0a 20  Database!=0 );. 
21880 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
21890 42 4a 45 43 54 20 26 26 20 70 49 74 65 6d 2d 3e  BJECT && pItem->
218a0 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 54 6f 6b  zName ){.    Tok
218b0 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20 28 41 4c  en *pToken = (AL
218c0 57 41 59 53 28 70 44 61 74 61 62 61 73 65 29 20  WAYS(pDatabase) 
218d0 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 29  && pDatabase->z)
218e0 20 3f 20 70 44 61 74 61 62 61 73 65 20 3a 20 70   ? pDatabase : p
218f0 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74  Table;.    sqlit
21900 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70  e3RenameTokenMap
21910 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
21920 7a 4e 61 6d 65 2c 20 70 54 6f 6b 65 6e 29 3b 0a  zName, pToken);.
21930 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 41    }.  assert( pA
21940 6c 69 61 73 21 3d 30 20 29 3b 0a 20 20 69 66 28  lias!=0 );.  if(
21950 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20   pAlias->n ){.  
21960 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20    pItem->zAlias 
21970 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
21980 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61  mToken(db, pAlia
21990 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d  s);.  }.  pItem-
219a0 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62 71  >pSelect = pSubq
219b0 75 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70  uery;.  pItem->p
219c0 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65  On = pOn;.  pIte
219d0 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55 73 69  m->pUsing = pUsi
219e0 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  ng;.  return p;.
219f0 0a 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72  . append_from_er
21a00 72 6f 72 3a 0a 20 20 61 73 73 65 72 74 28 20 70  ror:.  assert( p
21a10 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ==0 );.  sqlite3
21a20 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
21a30 4f 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64  On);.  sqlite3Id
21a40 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
21a50 55 73 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65  Using);.  sqlite
21a60 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
21a70 2c 20 70 53 75 62 71 75 65 72 79 29 3b 0a 20 20  , pSubquery);.  
21a80 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
21a90 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44 45 58 45  ** Add an INDEXE
21aa0 44 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45  D BY or NOT INDE
21ab0 58 45 44 20 63 6c 61 75 73 65 20 74 6f 20 74 68  XED clause to th
21ac0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
21ad0 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e  added .** elemen
21ae0 74 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65 2d  t of the source-
21af0 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  list passed as t
21b00 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
21b10 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
21b20 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65  te3SrcListIndexe
21b30 64 42 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  dBy(Parse *pPars
21b40 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 54  e, SrcList *p, T
21b50 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64 42 79  oken *pIndexedBy
21b60 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  ){.  assert( pIn
21b70 64 65 78 65 64 42 79 21 3d 30 20 29 3b 0a 20 20  dexedBy!=0 );.  
21b80 69 66 28 20 70 20 26 26 20 70 49 6e 64 65 78 65  if( p && pIndexe
21b90 64 42 79 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20  dBy->n>0 ){.    
21ba0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
21bb0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
21bc0 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 72 63 3e  assert( p->nSrc>
21bd0 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d  0 );.    pItem =
21be0 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31   &p->a[p->nSrc-1
21bf0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
21c00 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65  Item->fg.notInde
21c10 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  xed==0 );.    as
21c20 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e  sert( pItem->fg.
21c30 69 73 49 6e 64 65 78 65 64 42 79 3d 3d 30 20 29  isIndexedBy==0 )
21c40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
21c50 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  tem->fg.isTabFun
21c60 63 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  c==0 );.    if( 
21c70 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31  pIndexedBy->n==1
21c80 20 26 26 20 21 70 49 6e 64 65 78 65 64 42 79 2d   && !pIndexedBy-
21c90 3e 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  >z ){.      /* A
21ca0 20 22 4e 4f 54 20 49 4e 44 45 58 45 44 22 20 63   "NOT INDEXED" c
21cb0 6c 61 75 73 65 20 77 61 73 20 73 75 70 70 6c 69  lause was suppli
21cc0 65 64 2e 20 53 65 65 20 70 61 72 73 65 2e 79 20  ed. See parse.y 
21cd0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72  .      ** constr
21ce0 75 63 74 20 22 69 6e 64 65 78 65 64 5f 6f 70 74  uct "indexed_opt
21cf0 22 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a  " for details. *
21d00 2f 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66  /.      pItem->f
21d10 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 31  g.notIndexed = 1
21d20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21d30 20 20 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e     pItem->u1.zIn
21d40 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65  dexedBy = sqlite
21d50 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
21d60 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65  Parse->db, pInde
21d70 78 65 64 42 79 29 3b 0a 20 20 20 20 20 20 70 49  xedBy);.      pI
21d80 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65  tem->fg.isIndexe
21d90 64 42 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  dBy = 1;.    }. 
21da0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
21db0 74 68 65 20 6c 69 73 74 20 6f 66 20 66 75 6e 63  the list of func
21dc0 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74  tion arguments t
21dd0 6f 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 6e  o the SrcList en
21de0 74 72 79 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62  try for a.** tab
21df0 6c 65 2d 76 61 6c 75 65 64 2d 66 75 6e 63 74 69  le-valued-functi
21e00 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
21e10 74 65 33 53 72 63 4c 69 73 74 46 75 6e 63 41 72  te3SrcListFuncAr
21e20 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  gs(Parse *pParse
21e30 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 45 78  , SrcList *p, Ex
21e40 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
21e50 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73    if( p ){.    s
21e60 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
21e70 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e  em *pItem = &p->
21e80 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20  a[p->nSrc-1];.  
21e90 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
21ea0 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d  >fg.notIndexed==
21eb0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
21ec0 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64   pItem->fg.isInd
21ed0 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20  exedBy==0 );.   
21ee0 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
21ef0 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20  fg.isTabFunc==0 
21f00 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 31  );.    pItem->u1
21f10 2e 70 46 75 6e 63 41 72 67 20 3d 20 70 4c 69 73  .pFuncArg = pLis
21f20 74 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 66 67  t;.    pItem->fg
21f30 2e 69 73 54 61 62 46 75 6e 63 20 3d 20 31 3b 0a  .isTabFunc = 1;.
21f40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
21f50 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
21f60 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
21f70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  List);.  }.}../*
21f80 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 6e  .** When buildin
21f90 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 75  g up a FROM clau
21fa0 73 65 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  se in the parser
21fb0 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  , the join opera
21fc0 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61  tor.** is initia
21fd0 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74 6f 20  lly attached to 
21fe0 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  the left operand
21ff0 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64 65 20  .  But the code 
22000 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70  generator.** exp
22010 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ects the join op
22020 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20  erator to be on 
22030 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
22040 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
22050 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 6a  .** Shifts all j
22060 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 72  oin operators fr
22070 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
22080 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 46   for an entire F
22090 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a  ROM.** clause..*
220a0 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75  *.** Example: Su
220b0 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 69  ppose the join i
220c0 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
220d0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 20 6e  **           A n
220e0 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69  atural cross joi
220f0 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70  n B.**.** The op
22100 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74 75 72  erator is "natur
22110 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20  al cross join". 
22120 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f 70 65   The A and B ope
22130 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72 65 64  rands are stored
22140 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61  .** in p->a[0] a
22150 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70  nd p->a[1], resp
22160 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20 70  ectively.  The p
22170 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 20  arser initially 
22180 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70  stores the.** op
22190 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e 20 20  erator with A.  
221a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 69  This routine shi
221b0 66 74 73 20 74 68 61 74 20 6f 70 65 72 61 74 6f  fts that operato
221c0 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a  r over to B..*/.
221d0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
221e0 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65  istShiftJoinType
221f0 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20  (SrcList *p){.  
22200 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  if( p ){.    int
22210 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d   i;.    for(i=p-
22220 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d  >nSrc-1; i>0; i-
22230 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69  -){.      p->a[i
22240 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  ].fg.jointype = 
22250 70 2d 3e 61 5b 69 2d 31 5d 2e 66 67 2e 6a 6f 69  p->a[i-1].fg.joi
22260 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20  ntype;.    }.   
22270 20 70 2d 3e 61 5b 30 5d 2e 66 67 2e 6a 6f 69 6e   p->a[0].fg.join
22280 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  type = 0;.  }.}.
22290 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
222a0 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20 61 20  VDBE code for a 
222b0 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 2e  BEGIN statement.
222c0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
222d0 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  BeginTransaction
222e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
222f0 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71 6c  int type){.  sql
22300 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
22310 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20   *v;.  int i;.. 
22320 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21   assert( pParse!
22330 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61  =0 );.  db = pPa
22340 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
22350 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
22360 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
22370 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
22380 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
22390 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 7b  BEGIN", 0, 0) ){
223a0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
223b0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
223c0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
223d0 20 69 66 28 20 21 76 20 29 20 72 65 74 75 72 6e   if( !v ) return
223e0 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b  ;.  if( type!=TK
223f0 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20  _DEFERRED ){.   
22400 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
22410 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
22420 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22430 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63  p2(v, OP_Transac
22440 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d  tion, i, (type==
22450 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29  TK_EXCLUSIVE)+1)
22460 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
22470 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20  dbeUsesBtree(v, 
22480 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  i);.    }.  }.  
22490 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
224a0 30 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  0(v, OP_AutoComm
224b0 69 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  it);.}../*.** Ge
224c0 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
224d0 20 66 6f 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72   for a COMMIT or
224e0 20 52 4f 4c 4c 42 41 43 4b 20 73 74 61 74 65 6d   ROLLBACK statem
224f0 65 6e 74 2e 0a 2a 2a 20 43 6f 64 65 20 66 6f 72  ent..** Code for
22500 20 52 4f 4c 4c 42 41 43 4b 20 69 73 20 67 65 6e   ROLLBACK is gen
22510 65 72 61 74 65 64 20 69 66 20 65 54 79 70 65 3d  erated if eType=
22520 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 2e 20 20 4f  =TK_ROLLBACK.  O
22530 74 68 65 72 77 69 73 65 0a 2a 2a 20 63 6f 64 65  therwise.** code
22540 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66 6f   is generated fo
22550 72 20 61 20 43 4f 4d 4d 49 54 2e 0a 2a 2f 0a 76  r a COMMIT..*/.v
22560 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54 72  oid sqlite3EndTr
22570 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
22580 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65 54 79  *pParse, int eTy
22590 70 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  pe){.  Vdbe *v;.
225a0 20 20 69 6e 74 20 69 73 52 6f 6c 6c 62 61 63 6b    int isRollback
225b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
225c0 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rse!=0 );.  asse
225d0 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d  rt( pParse->db!=
225e0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  0 );.  assert( e
225f0 54 79 70 65 3d 3d 54 4b 5f 43 4f 4d 4d 49 54 20  Type==TK_COMMIT 
22600 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 45 4e 44  || eType==TK_END
22610 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f   || eType==TK_RO
22620 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 69 73 52 6f  LLBACK );.  isRo
22630 6c 6c 62 61 63 6b 20 3d 20 65 54 79 70 65 3d 3d  llback = eType==
22640 54 4b 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 69  TK_ROLLBACK;.  i
22650 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
22660 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
22670 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
22680 0a 20 20 20 20 20 20 20 69 73 52 6f 6c 6c 62 61  .       isRollba
22690 63 6b 20 3f 20 22 52 4f 4c 4c 42 41 43 4b 22 20  ck ? "ROLLBACK" 
226a0 3a 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  : "COMMIT", 0, 0
226b0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
226c0 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74  .  }.  v = sqlit
226d0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
226e0 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
226f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22700 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  Op2(v, OP_AutoCo
22710 6d 6d 69 74 2c 20 31 2c 20 69 73 52 6f 6c 6c 62  mmit, 1, isRollb
22720 61 63 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ack);.  }.}../*.
22730 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
22740 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
22750 65 20 70 61 72 73 65 72 20 77 68 65 6e 20 69 74  e parser when it
22760 20 70 61 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e   parses a comman
22770 64 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20  d to create,.** 
22780 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62  release or rollb
22790 61 63 6b 20 61 6e 20 53 51 4c 20 73 61 76 65 70  ack an SQL savep
227a0 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  oint. .*/.void s
227b0 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28  qlite3Savepoint(
227c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
227d0 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e  nt op, Token *pN
227e0 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
227f0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
22800 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
22810 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  e->db, pName);. 
22820 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
22830 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
22840 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
22850 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
22860 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
22870 41 54 49 4f 4e 0a 20 20 20 20 73 74 61 74 69 63  ATION.    static
22880 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f   const char * co
22890 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45  nst az[] = { "BE
228a0 47 49 4e 22 2c 20 22 52 45 4c 45 41 53 45 22 2c  GIN", "RELEASE",
228b0 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20   "ROLLBACK" };. 
228c0 20 20 20 61 73 73 65 72 74 28 20 21 53 41 56 45     assert( !SAVE
228d0 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26 20 53  POINT_BEGIN && S
228e0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
228f0 3d 3d 31 20 26 26 20 53 41 56 45 50 4f 49 4e 54  ==1 && SAVEPOINT
22900 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a  _ROLLBACK==2 );.
22910 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 21  #endif.    if( !
22920 76 20 7c 7c 20 73 71 6c 69 74 65 33 41 75 74 68  v || sqlite3Auth
22930 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
22940 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20  LITE_SAVEPOINT, 
22950 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30  az[op], zName, 0
22960 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
22970 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
22980 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  >db, zName);.   
22990 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
229a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
229b0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76  AddOp4(v, OP_Sav
229c0 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30  epoint, op, 0, 0
229d0 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41  , zName, P4_DYNA
229e0 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  MIC);.  }.}../*.
229f0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
22a00 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 69   TEMP database i
22a10 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c  s open and avail
22a20 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52  able for use.  R
22a30 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d  eturn.** the num
22a40 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
22a50 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20  Leave any error 
22a60 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65 20  messages in the 
22a70 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
22a80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22a90 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65  OpenTempDatabase
22aa0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
22ab0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
22ac0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
22ad0 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  f( db->aDb[1].pB
22ae0 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d  t==0 && !pParse-
22af0 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
22b00 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72 65  int rc;.    Btre
22b10 65 20 2a 70 42 74 3b 0a 20 20 20 20 73 74 61 74  e *pBt;.    stat
22b20 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61  ic const int fla
22b30 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  gs = .          
22b40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
22b50 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20  WRITE |.        
22b60 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
22b70 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20  EATE |.         
22b80 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
22b90 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20  LUSIVE |.       
22ba0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44     SQLITE_OPEN_D
22bb0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20  ELETEONCLOSE |. 
22bc0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
22bd0 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20  OPEN_TEMP_DB;.. 
22be0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
22bf0 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66  treeOpen(db->pVf
22c00 73 2c 20 30 2c 20 64 62 2c 20 26 70 42 74 2c 20  s, 0, db, &pBt, 
22c10 30 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69  0, flags);.    i
22c20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
22c30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
22c40 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
22c50 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  , "unable to ope
22c60 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61  n a temporary da
22c70 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 20  tabase ".       
22c80 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69   "file for stori
22c90 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ng temporary tab
22ca0 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61  les");.      pPa
22cb0 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  rse->rc = rc;.  
22cc0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
22cd0 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b    }.    db->aDb[
22ce0 31 5d 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  1].pBt = pBt;.  
22cf0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
22d00 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a  b[1].pSchema );.
22d10 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e      if( SQLITE_N
22d20 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72  OMEM==sqlite3Btr
22d30 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 42  eeSetPageSize(pB
22d40 74 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73  t, db->nextPages
22d50 69 7a 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a 20  ize, -1, 0) ){. 
22d60 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46       sqlite3OomF
22d70 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20  ault(db);.      
22d80 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
22d90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
22da0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20  }../*.** Record 
22db0 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68  the fact that th
22dc0 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
22dd0 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  will need to be 
22de0 76 65 72 69 66 69 65 64 0a 2a 2a 20 66 6f 72 20  verified.** for 
22df0 64 61 74 61 62 61 73 65 20 69 44 62 2e 20 20 54  database iDb.  T
22e00 68 65 20 63 6f 64 65 20 74 6f 20 61 63 74 75 61  he code to actua
22e10 6c 6c 79 20 76 65 72 69 66 79 20 74 68 65 20 73  lly verify the s
22e20 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a 20  chema cookie.** 
22e30 77 69 6c 6c 20 6f 63 63 75 72 20 61 74 20 74 68  will occur at th
22e40 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74 6f 70  e end of the top
22e50 2d 6c 65 76 65 6c 20 56 44 42 45 20 61 6e 64 20  -level VDBE and 
22e60 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65  will be generate
22e70 64 0a 2a 2a 20 6c 61 74 65 72 2c 20 62 79 20 73  d.** later, by s
22e80 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69  qlite3FinishCodi
22e90 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ng()..*/.void sq
22ea0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
22eb0 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61  chema(Parse *pPa
22ec0 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  rse, int iDb){. 
22ed0 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
22ee0 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
22ef0 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
22f00 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  ;..  assert( iDb
22f10 3e 3d 30 20 26 26 20 69 44 62 3c 70 50 61 72 73  >=0 && iDb<pPars
22f20 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  e->db->nDb );.  
22f30 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
22f40 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
22f50 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b  !=0 || iDb==1 );
22f60 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 53  .  assert( iDb<S
22f70 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
22f80 45 44 2b 32 20 29 3b 0a 20 20 61 73 73 65 72 74  ED+2 );.  assert
22f90 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
22fa0 75 74 65 78 48 65 6c 64 28 70 50 61 72 73 65 2d  utexHeld(pParse-
22fb0 3e 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  >db, iDb, 0) );.
22fc0 20 20 69 66 28 20 44 62 4d 61 73 6b 54 65 73 74    if( DbMaskTest
22fd0 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b  (pToplevel->cook
22fe0 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
22ff0 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74  ){.    DbMaskSet
23000 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b  (pToplevel->cook
23010 69 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20  ieMask, iDb);.  
23020 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
23030 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a  DB && iDb==1 ){.
23040 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
23050 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 54  nTempDatabase(pT
23060 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a  oplevel);.    }.
23070 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
23080 61 72 67 75 6d 65 6e 74 20 7a 44 62 20 69 73 20  argument zDb is 
23090 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20  NULL, then call 
230a0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
230b0 79 53 63 68 65 6d 61 28 29 20 66 6f 72 20 65 61  ySchema() for ea
230c0 63 68 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20  ch .** attached 
230d0 64 61 74 61 62 61 73 65 2e 20 4f 74 68 65 72 77  database. Otherw
230e0 69 73 65 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66  ise, invoke it f
230f0 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
23100 6e 61 6d 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a  named zDb only..
23110 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
23120 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63  odeVerifyNamedSc
23130 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72  hema(Parse *pPar
23140 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
23150 7a 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  zDb){.  sqlite3 
23160 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
23170 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
23180 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
23190 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70   i++){.    Db *p
231a0 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
231b0 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
231c0 42 74 20 26 26 20 28 21 7a 44 62 20 7c 7c 20 30  Bt && (!zDb || 0
231d0 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
231e0 28 7a 44 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e  (zDb, pDb->zDbSN
231f0 61 6d 65 29 29 20 29 7b 0a 20 20 20 20 20 20 73  ame)) ){.      s
23200 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
23210 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
23220 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
23230 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
23240 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70 72  DBE code that pr
23250 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67  epares for doing
23260 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68   an operation th
23270 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e  at.** might chan
23280 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ge the database.
23290 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
232a0 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65 77  ine starts a new
232b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
232c0 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61  we are not alrea
232d0 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74  dy within.** a t
232e0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
232f0 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 77  we are already w
23300 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
23310 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63  ion, then a chec
23320 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74  kpoint.** is set
23330 20 69 66 20 74 68 65 20 73 65 74 53 74 61 74 65   if the setState
23340 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69  ment parameter i
23350 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b  s true.  A check
23360 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  point should.** 
23370 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61  be set for opera
23380 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74  tions that might
23390 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20   fail (due to a 
233a0 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74  constraint) part
233b0 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74   of.** the way t
233c0 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68  hrough and which
233d0 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e   will need to un
233e0 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77  do some writes w
233f0 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
23400 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65  .** rollback the
23410 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69   whole transacti
23420 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69  on.  For operati
23430 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f  ons where all co
23440 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e  nstraints.** can
23450 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f   be checked befo
23460 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61  re any changes a
23470 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64  re made to the d
23480 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e  atabase, it is n
23490 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72  ever.** necessar
234a0 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74  y to undo a writ
234b0 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70  e and the checkp
234c0 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  oint should not 
234d0 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  be set..*/.void 
234e0 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
234f0 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65  eOperation(Parse
23500 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65   *pParse, int se
23510 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20  tStatement, int 
23520 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  iDb){.  Parse *p
23530 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
23540 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
23550 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
23560 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
23570 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
23580 0a 20 20 44 62 4d 61 73 6b 53 65 74 28 70 54 6f  .  DbMaskSet(pTo
23590 70 6c 65 76 65 6c 2d 3e 77 72 69 74 65 4d 61 73  plevel->writeMas
235a0 6b 2c 20 69 44 62 29 3b 0a 20 20 70 54 6f 70 6c  k, iDb);.  pTopl
235b0 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69  evel->isMultiWri
235c0 74 65 20 7c 3d 20 73 65 74 53 74 61 74 65 6d 65  te |= setStateme
235d0 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64  nt;.}../*.** Ind
235e0 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 73  icate that the s
235f0 74 61 74 65 6d 65 6e 74 20 63 75 72 72 65 6e 74  tatement current
23600 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
23610 63 74 69 6f 6e 20 6d 69 67 68 74 20 77 72 69 74  ction might writ
23620 65 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f  e.** more than o
23630 6e 65 20 65 6e 74 72 79 20 28 65 78 61 6d 70 6c  ne entry (exampl
23640 65 3a 20 64 65 6c 65 74 69 6e 67 20 6f 6e 65 20  e: deleting one 
23650 72 6f 77 20 74 68 65 6e 20 69 6e 73 65 72 74 69  row then inserti
23660 6e 67 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69  ng another,.** i
23670 6e 73 65 72 74 69 6e 67 20 6d 75 6c 74 69 70 6c  nserting multipl
23680 65 20 72 6f 77 73 20 69 6e 20 61 20 74 61 62 6c  e rows in a tabl
23690 65 2c 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20  e, or inserting 
236a0 61 20 72 6f 77 20 61 6e 64 20 69 6e 64 65 78 20  a row and index 
236b0 65 6e 74 72 69 65 73 2e 29 0a 2a 2a 20 49 66 20  entries.).** If 
236c0 61 6e 20 61 62 6f 72 74 20 6f 63 63 75 72 73 20  an abort occurs 
236d0 61 66 74 65 72 20 73 6f 6d 65 20 6f 66 20 74 68  after some of th
236e0 65 73 65 20 77 72 69 74 65 73 20 68 61 76 65 20  ese writes have 
236f0 63 6f 6d 70 6c 65 74 65 64 2c 20 74 68 65 6e 20  completed, then 
23700 69 74 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65  it will.** be ne
23710 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20  cessary to undo 
23720 74 68 65 20 63 6f 6d 70 6c 65 74 65 64 20 77 72  the completed wr
23730 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ites..*/.void sq
23740 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28  lite3MultiWrite(
23750 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
23760 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
23770 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
23780 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
23790 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  );.  pToplevel->
237a0 69 73 4d 75 6c 74 69 57 72 69 74 65 20 3d 20 31  isMultiWrite = 1
237b0 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20  ;.}../* .** The 
237c0 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 63  code generator c
237d0 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
237e0 65 20 69 66 20 69 73 20 64 69 73 63 6f 76 65 72  e if is discover
237f0 73 20 74 68 61 74 20 69 74 20 69 73 0a 2a 2a 20  s that it is.** 
23800 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 62 6f 72  possible to abor
23810 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 70 72  t a statement pr
23820 69 6f 72 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f  ior to completio
23830 6e 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20  n.  In order to 
23840 0a 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68 69 73  .** perform this
23850 20 61 62 6f 72 74 20 77 69 74 68 6f 75 74 20 63   abort without c
23860 6f 72 72 75 70 74 69 6e 67 20 74 68 65 20 64 61  orrupting the da
23870 74 61 62 61 73 65 2c 20 77 65 20 6e 65 65 64 20  tabase, we need 
23880 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20  to make.** sure 
23890 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65  that the stateme
238a0 6e 74 20 69 73 20 70 72 6f 74 65 63 74 65 64 20  nt is protected 
238b0 62 79 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  by a statement t
238c0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
238d0 2a 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77  * Technically, w
238e0 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73  e only need to s
238f0 65 74 20 74 68 65 20 6d 61 79 41 62 6f 72 74 20  et the mayAbort 
23900 66 6c 61 67 20 69 66 20 74 68 65 0a 2a 2a 20 69  flag if the.** i
23910 73 4d 75 6c 74 69 57 72 69 74 65 20 66 6c 61 67  sMultiWrite flag
23920 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
23930 73 65 74 2e 20 20 54 68 65 72 65 20 69 73 20 61  set.  There is a
23940 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79   time dependency
23950 0a 2a 2a 20 73 75 63 68 20 74 68 61 74 20 74 68  .** such that th
23960 65 20 61 62 6f 72 74 20 6d 75 73 74 20 6f 63 63  e abort must occ
23970 75 72 20 61 66 74 65 72 20 74 68 65 20 6d 75 6c  ur after the mul
23980 74 69 77 72 69 74 65 2e 20 20 54 68 69 73 20 6d  tiwrite.  This m
23990 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 61  akes.** some sta
239a0 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6c 76 69 6e  tements involvin
239b0 67 20 74 68 65 20 52 45 50 4c 41 43 45 20 63 6f  g the REPLACE co
239c0 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
239d0 6e 20 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 67  n algorithm.** g
239e0 6f 20 61 20 6c 69 74 74 6c 65 20 66 61 73 74 65  o a little faste
239f0 72 2e 20 20 42 75 74 20 74 61 6b 69 6e 67 20 61  r.  But taking a
23a00 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 69 73  dvantage of this
23a10 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79   time dependency
23a20 0a 2a 2a 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72  .** makes it mor
23a30 65 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 70  e difficult to p
23a40 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 63 6f  rove that the co
23a50 64 65 20 69 73 20 63 6f 72 72 65 63 74 20 28 69  de is correct (i
23a60 6e 20 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72  n .** particular
23a70 2c 20 69 74 20 70 72 65 76 65 6e 74 73 20 75 73  , it prevents us
23a80 20 66 72 6f 6d 20 77 72 69 74 69 6e 67 20 61 6e   from writing an
23a90 20 65 66 66 65 63 74 69 76 65 0a 2a 2a 20 69 6d   effective.** im
23aa0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
23ab0 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79  sqlite3AssertMay
23ac0 41 62 6f 72 74 28 29 29 20 61 6e 64 20 73 6f 20  Abort()) and so 
23ad0 77 65 20 68 61 76 65 20 63 68 6f 73 65 6e 0a 2a  we have chosen.*
23ae0 2a 20 74 6f 20 74 61 6b 65 20 74 68 65 20 73 61  * to take the sa
23af0 66 65 20 72 6f 75 74 65 20 61 6e 64 20 73 6b 69  fe route and ski
23b00 70 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  p the optimizati
23b10 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
23b20 74 65 33 4d 61 79 41 62 6f 72 74 28 50 61 72 73  te3MayAbort(Pars
23b30 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61  e *pParse){.  Pa
23b40 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
23b50 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
23b60 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
23b70 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41   pToplevel->mayA
23b80 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  bort = 1;.}../*.
23b90 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61  ** Code an OP_Ha
23ba0 6c 74 20 74 68 61 74 20 63 61 75 73 65 73 20 74  lt that causes t
23bb0 68 65 20 76 64 62 65 20 74 6f 20 72 65 74 75 72  he vdbe to retur
23bc0 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  n an SQLITE_CONS
23bd0 54 52 41 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e  TRAINT.** error.
23be0 20 54 68 65 20 6f 6e 45 72 72 6f 72 20 70 61 72   The onError par
23bf0 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65  ameter determine
23c00 73 20 77 68 69 63 68 20 28 69 66 20 61 6e 79 29  s which (if any)
23c10 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
23c20 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72  t.** and/or curr
23c30 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
23c40 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
23c50 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 48  */.void sqlite3H
23c60 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20  altConstraint(. 
23c70 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
23c80 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
23c90 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65  ntext */.  int e
23ca0 72 72 43 6f 64 65 2c 20 20 20 20 20 20 2f 2a 20  rrCode,      /* 
23cb0 65 78 74 65 6e 64 65 64 20 65 72 72 6f 72 20 63  extended error c
23cc0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  ode */.  int onE
23cd0 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f  rror,      /* Co
23ce0 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f  nstraint type */
23cf0 0a 20 20 63 68 61 72 20 2a 70 34 2c 20 20 20 20  .  char *p4,    
23d00 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65       /* Error me
23d10 73 73 61 67 65 20 2a 2f 0a 20 20 69 38 20 70 34  ssage */.  i8 p4
23d20 74 79 70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  type,        /* 
23d30 50 34 5f 53 54 41 54 49 43 20 6f 72 20 50 34 5f  P4_STATIC or P4_
23d40 54 52 41 4e 53 49 45 4e 54 20 2a 2f 0a 20 20 75  TRANSIENT */.  u
23d50 38 20 70 35 45 72 72 6d 73 67 20 20 20 20 20 20  8 p5Errmsg      
23d60 20 2f 2a 20 50 35 5f 45 72 72 4d 73 67 20 74 79   /* P5_ErrMsg ty
23d70 70 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  pe */.){.  Vdbe 
23d80 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
23d90 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
23da0 73 73 65 72 74 28 20 28 65 72 72 43 6f 64 65 26  ssert( (errCode&
23db0 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f  0xff)==SQLITE_CO
23dc0 4e 53 54 52 41 49 4e 54 20 29 3b 0a 20 20 69 66  NSTRAINT );.  if
23dd0 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62  ( onError==OE_Ab
23de0 6f 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ort ){.    sqlit
23df0 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  e3MayAbort(pPars
23e00 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
23e10 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
23e20 50 5f 48 61 6c 74 2c 20 65 72 72 43 6f 64 65 2c  P_Halt, errCode,
23e30 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c   onError, 0, p4,
23e40 20 70 34 74 79 70 65 29 3b 0a 20 20 73 71 6c 69   p4type);.  sqli
23e50 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
23e60 76 2c 20 70 35 45 72 72 6d 73 67 29 3b 0a 7d 0a  v, p5Errmsg);.}.
23e70 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
23e80 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 55 4e  P_Halt due to UN
23e90 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20  IQUE or PRIMARY 
23ea0 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  KEY constraint v
23eb0 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  iolation..*/.voi
23ec0 64 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65 43  d sqlite3UniqueC
23ed0 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72  onstraint(.  Par
23ee0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
23ef0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
23f00 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  t */.  int onErr
23f10 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73  or,      /* Cons
23f20 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20  traint type */. 
23f30 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
23f40 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
23f50 74 68 61 74 20 74 72 69 67 67 65 72 73 20 74 68  that triggers th
23f60 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  e constraint */.
23f70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b  ){.  char *zErr;
23f80 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 53 74 72 41  .  int j;.  StrA
23f90 63 63 75 6d 20 65 72 72 4d 73 67 3b 0a 20 20 54  ccum errMsg;.  T
23fa0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 64  able *pTab = pId
23fb0 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 73 71  x->pTable;..  sq
23fc0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69  lite3StrAccumIni
23fd0 74 28 26 65 72 72 4d 73 67 2c 20 70 50 61 72 73  t(&errMsg, pPars
23fe0 65 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 0a 20 20  e->db, 0, 0, .  
23ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24000 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
24010 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
24020 4d 49 54 5f 4c 45 4e 47 54 48 5d 29 3b 0a 20 20  MIT_LENGTH]);.  
24030 69 66 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78  if( pIdx->aColEx
24040 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  pr ){.    sqlite
24050 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 65  3_str_appendf(&e
24060 72 72 4d 73 67 2c 20 22 69 6e 64 65 78 20 27 25  rrMsg, "index '%
24070 71 27 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  q'", pIdx->zName
24080 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
24090 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d  for(j=0; j<pIdx-
240a0 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  >nKeyCol; j++){.
240b0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
240c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
240d0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
240e0 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 7a 43  ]>=0 );.      zC
240f0 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol = pTab->aCol[
24100 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
24110 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  ]].zName;.      
24120 69 66 28 20 6a 20 29 20 73 71 6c 69 74 65 33 5f  if( j ) sqlite3_
24130 73 74 72 5f 61 70 70 65 6e 64 28 26 65 72 72 4d  str_append(&errM
24140 73 67 2c 20 22 2c 20 22 2c 20 32 29 3b 0a 20 20  sg, ", ", 2);.  
24150 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
24160 61 70 70 65 6e 64 61 6c 6c 28 26 65 72 72 4d 73  appendall(&errMs
24170 67 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  g, pTab->zName);
24180 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
24190 74 72 5f 61 70 70 65 6e 64 28 26 65 72 72 4d 73  tr_append(&errMs
241a0 67 2c 20 22 2e 22 2c 20 31 29 3b 0a 20 20 20 20  g, ".", 1);.    
241b0 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
241c0 70 65 6e 64 61 6c 6c 28 26 65 72 72 4d 73 67 2c  pendall(&errMsg,
241d0 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   zCol);.    }.  
241e0 7d 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74  }.  zErr = sqlit
241f0 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68  e3StrAccumFinish
24200 28 26 65 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c  (&errMsg);.  sql
24210 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69  ite3HaltConstrai
24220 6e 74 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  nt(pParse, .    
24230 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
24240 78 28 70 49 64 78 29 20 3f 20 53 51 4c 49 54 45  x(pIdx) ? SQLITE
24250 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d  _CONSTRAINT_PRIM
24260 41 52 59 4b 45 59 20 0a 20 20 20 20 20 20 20 20  ARYKEY .        
24270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24280 20 20 20 20 3a 20 53 51 4c 49 54 45 5f 43 4f 4e      : SQLITE_CON
24290 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 2c 0a  STRAINT_UNIQUE,.
242a0 20 20 20 20 6f 6e 45 72 72 6f 72 2c 20 7a 45 72      onError, zEr
242b0 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 20 50  r, P4_DYNAMIC, P
242c0 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71  5_ConstraintUniq
242d0 75 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  ue);.}.../*.** C
242e0 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64  ode an OP_Halt d
242f0 75 65 20 74 6f 20 6e 6f 6e 2d 75 6e 69 71 75 65  ue to non-unique
24300 20 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f 69 64 20   rowid..*/.void 
24310 73 71 6c 69 74 65 33 52 6f 77 69 64 43 6f 6e 73  sqlite3RowidCons
24320 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20  traint(.  Parse 
24330 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
24340 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
24350 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
24360 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63        /* Conflic
24370 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
24380 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 54 61 62 6c  orithm */.  Tabl
24390 65 20 2a 70 54 61 62 20 20 20 20 20 20 20 2f 2a  e *pTab       /*
243a0 20 54 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   The table with 
243b0 74 68 65 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72  the non-unique r
243c0 6f 77 69 64 20 2a 2f 20 0a 29 7b 0a 20 20 63 68  owid */ .){.  ch
243d0 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 69 6e 74 20  ar *zMsg;.  int 
243e0 72 63 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  rc;.  if( pTab->
243f0 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20  iPKey>=0 ){.    
24400 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
24410 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62  rintf(pParse->db
24420 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d  , "%s.%s", pTab-
24430 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
24440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24450 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61    pTab->aCol[pTa
24460 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29  b->iPKey].zName)
24470 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
24480 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49  E_CONSTRAINT_PRI
24490 4d 41 52 59 4b 45 59 3b 0a 20 20 7d 65 6c 73 65  MARYKEY;.  }else
244a0 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c  {.    zMsg = sql
244b0 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
244c0 73 65 2d 3e 64 62 2c 20 22 25 73 2e 72 6f 77 69  se->db, "%s.rowi
244d0 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
244e0 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
244f0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57  E_CONSTRAINT_ROW
24500 49 44 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ID;.  }.  sqlite
24510 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
24520 70 50 61 72 73 65 2c 20 72 63 2c 20 6f 6e 45 72  pParse, rc, onEr
24530 72 6f 72 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59  ror, zMsg, P4_DY
24540 4e 41 4d 49 43 2c 0a 20 20 20 20 20 20 20 20 20  NAMIC,.         
24550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
24560 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71  5_ConstraintUniq
24570 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ue);.}../*.** Ch
24580 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49  eck to see if pI
24590 6e 64 65 78 20 75 73 65 73 20 74 68 65 20 63 6f  ndex uses the co
245a0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
245b0 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a   pColl.  Return.
245c0 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20 64 6f  ** true if it do
245d0 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  es and false if 
245e0 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a  it does not..*/.
245f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
24600 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
24610 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e  ic int collation
24620 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72  Match(const char
24630 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a   *zColl, Index *
24640 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 69  pIndex){.  int i
24650 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c  ;.  assert( zCol
24660 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  l!=0 );.  for(i=
24670 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f  0; i<pIndex->nCo
24680 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
24690 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
246a0 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
246b0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  ];.    assert( z
246c0 21 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 61  !=0 || pIndex->a
246d0 69 43 6f 6c 75 6d 6e 5b 69 5d 3c 30 20 29 3b 0a  iColumn[i]<0 );.
246e0 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
246f0 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 26  aiColumn[i]>=0 &
24700 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  & 0==sqlite3StrI
24710 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b  Cmp(z, zColl) ){
24720 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
24730 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
24740 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
24750 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65  ./*.** Recompute
24760 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
24770 70 54 61 62 20 74 68 61 74 20 75 73 65 20 74 68  pTab that use th
24780 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
24790 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49  ence pColl..** I
247a0 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20  f pColl==0 then 
247b0 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  recompute all in
247c0 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a  dices of pTab..*
247d0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
247e0 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74  _OMIT_REINDEX.st
247f0 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65  atic void reinde
24800 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  xTable(Parse *pP
24810 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
24820 62 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  b, char const *z
24830 43 6f 6c 6c 29 7b 0a 20 20 69 66 28 20 21 49 73  Coll){.  if( !Is
24840 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
24850 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  .    Index *pInd
24860 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
24870 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73   /* An index ass
24880 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61  ociated with pTa
24890 62 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 70 49  b */..    for(pI
248a0 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  ndex=pTab->pInde
248b0 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  x; pIndex; pInde
248c0 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29  x=pIndex->pNext)
248d0 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6c  {.      if( zCol
248e0 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f  l==0 || collatio
248f0 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49  nMatch(zColl, pI
24900 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20 20  ndex) ){.       
24910 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
24920 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
24930 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
24940 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
24950 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
24960 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
24970 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
24980 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
24990 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
249a0 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a  e, pIndex, -1);.
249b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
249c0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
249d0 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  * Recompute all 
249e0 69 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74  indices of all t
249f0 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74  ables in all dat
24a00 61 62 61 73 65 73 20 77 68 65 72 65 20 74 68 65  abases where the
24a10 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20  .** indices use 
24a20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
24a30 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49  quence pColl.  I
24a40 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20  f pColl==0 then 
24a50 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c  recompute.** all
24a60 20 69 6e 64 69 63 65 73 20 65 76 65 72 79 77 68   indices everywh
24a70 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ere..*/.#ifndef 
24a80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
24a90 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEX.static void 
24aa0 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
24ab0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
24ac0 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
24ad0 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20  l){.  Db *pDb;  
24ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24af0 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61    /* A single da
24b00 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
24b10 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
24b20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
24b30 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75  atabase index nu
24b40 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  mber */.  sqlite
24b50 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
24b60 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74  db;   /* The dat
24b70 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
24b80 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a   */.  HashElem *
24b90 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
24ba0 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
24bb0 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20   over tables in 
24bc0 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  pDb */.  Table *
24bd0 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
24be0 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
24bf0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
24c00 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
24c10 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
24c20 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b  llMutexes(db) );
24c30 20 20 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72 20    /* Needed for 
24c40 73 63 68 65 6d 61 20 61 63 63 65 73 73 20 2a 2f  schema access */
24c50 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44  .  for(iDb=0, pD
24c60 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64  b=db->aDb; iDb<d
24c70 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70  b->nDb; iDb++, p
24c80 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72  Db++){.    asser
24c90 74 28 20 70 44 62 21 3d 30 20 29 3b 0a 20 20 20  t( pDb!=0 );.   
24ca0 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73   for(k=sqliteHas
24cb0 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63  hFirst(&pDb->pSc
24cc0 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20  hema->tblHash); 
24cd0 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68   k; k=sqliteHash
24ce0 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20  Next(k)){.      
24cf0 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73  pTab = (Table*)s
24d00 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29  qliteHashData(k)
24d10 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 54  ;.      reindexT
24d20 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
24d30 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d  b, zColl);.    }
24d40 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
24d50 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
24d60 64 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44  de for the REIND
24d70 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  EX command..**.*
24d80 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
24d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24da0 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31              -- 1
24db0 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
24dc0 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20  EX  <collation> 
24dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
24de0 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   2.**        REI
24df0 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65  NDEX  ?<database
24e00 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20  >.?<tablename>  
24e10 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 3.**        R
24e20 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61  EINDEX  ?<databa
24e30 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e  se>.?<indexname>
24e40 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72    -- 4.**.** For
24e50 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69  m 1 causes all i
24e60 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74  ndices in all at
24e70 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
24e80 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a   to be rebuilt..
24e90 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c  ** Form 2 rebuil
24ea0 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69  ds all indices i
24eb0 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  n all databases 
24ec0 74 68 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d  that use the nam
24ed0 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20  ed.** collating 
24ee0 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73  function.  Forms
24ef0 20 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64   3 and 4 rebuild
24f00 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78   the named index
24f10 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63   or all.** indic
24f20 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
24f30 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  th the named tab
24f40 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  le..*/.#ifndef S
24f50 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
24f60 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  EX.void sqlite3R
24f70 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  eindex(Parse *pP
24f80 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
24f90 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  me1, Token *pNam
24fa0 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  e2){.  CollSeq *
24fb0 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
24fc0 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
24fd0 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72  sequence to be r
24fe0 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c  eindexed, or NUL
24ff0 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20  L */.  char *z; 
25000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25010 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20     /* Name of a 
25020 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a  table or index *
25030 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
25040 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  zDb;            
25050 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
25060 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62  atabase */.  Tab
25070 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
25080 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61           /* A ta
25090 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
250a0 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ase */.  Index *
250b0 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20  pIndex;         
250c0 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
250d0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
250e0 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69   pTab */.  int i
250f0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
25100 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
25110 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d  tabase index num
25120 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ber */.  sqlite3
25130 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
25140 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  b;   /* The data
25150 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
25160 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a  */.  Token *pObj
25170 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
25180 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
25190 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
251a0 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a  o be reindexed *
251b0 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  /..  /* Read the
251c0 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
251d0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
251e0 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  curs, leave an e
251f0 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
25200 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50  * and code in pP
25210 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
25220 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53  NULL. */.  if( S
25230 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
25240 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
25250 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  se) ){.    retur
25260 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e  n;.  }..  if( pN
25270 61 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ame1==0 ){.    r
25280 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
25290 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20  pParse, 0);.    
252a0 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20  return;.  }else 
252b0 69 66 28 20 4e 45 56 45 52 28 70 4e 61 6d 65 32  if( NEVER(pName2
252c0 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e  ==0) || pName2->
252d0 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  z==0 ){.    char
252e0 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73   *zColl;.    ass
252f0 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29  ert( pName1->z )
25300 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71  ;.    zColl = sq
25310 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
25320 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
25330 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20  Name1);.    if( 
25340 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b  !zColl ) return;
25350 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
25360 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
25370 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f  db, ENC(db), zCo
25380 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ll, 0);.    if( 
25390 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72  pColl ){.      r
253a0 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
253b0 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a  pParse, zColl);.
253c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
253d0 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  ree(db, zColl);.
253e0 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
253f0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
25400 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29  bFree(db, zColl)
25410 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  ;.  }.  iDb = sq
25420 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
25430 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
25440 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61   pName2, &pObjNa
25450 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30  me);.  if( iDb<0
25460 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d   ) return;.  z =
25470 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
25480 54 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61  Token(db, pObjNa
25490 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  me);.  if( z==0 
254a0 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20  ) return;.  zDb 
254b0 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
254c0 44 62 53 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20  DbSName;.  pTab 
254d0 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
254e0 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a  le(db, z, zDb);.
254f0 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
25500 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70    reindexTable(p
25510 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b  Parse, pTab, 0);
25520 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
25530 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 72  ee(db, z);.    r
25540 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e  eturn;.  }.  pIn
25550 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  dex = sqlite3Fin
25560 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44  dIndex(db, z, zD
25570 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  b);.  sqlite3DbF
25580 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 69 66  ree(db, z);.  if
25590 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ( pIndex ){.    
255a0 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
255b0 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
255c0 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 0, iDb);.    
255d0 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
255e0 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
255f0 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75  x, -1);.    retu
25600 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
25610 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
25620 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64 65  , "unable to ide
25630 6e 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63 74  ntify the object
25640 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64   to be reindexed
25650 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ");.}.#endif../*
25660 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 4b 65 79  .** Return a Key
25670 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
25680 68 61 74 20 69 73 20 61 70 70 72 6f 70 72 69 61  hat is appropria
25690 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  te for the given
256a0 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68   Index..**.** Th
256b0 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20  e caller should 
256c0 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 4b 65  invoke sqlite3Ke
256d0 79 49 6e 66 6f 55 6e 72 65 66 28 29 20 6f 6e 20  yInfoUnref() on 
256e0 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62 6a  the returned obj
256f0 65 63 74 0a 2a 2a 20 77 68 65 6e 20 69 74 20 68  ect.** when it h
25700 61 73 20 66 69 6e 69 73 68 65 64 20 75 73 69 6e  as finished usin
25710 67 20 69 74 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f  g it..*/.KeyInfo
25720 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f   *sqlite3KeyInfo
25730 4f 66 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  OfIndex(Parse *p
25740 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
25750 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dx){.  int i;.  
25760 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d  int nCol = pIdx-
25770 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20  >nColumn;.  int 
25780 6e 4b 65 79 20 3d 20 70 49 64 78 2d 3e 6e 4b 65  nKey = pIdx->nKe
25790 79 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  yCol;.  KeyInfo 
257a0 2a 70 4b 65 79 3b 0a 20 20 69 66 28 20 70 50 61  *pKey;.  if( pPa
257b0 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
257c0 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 64 78  rn 0;.  if( pIdx
257d0 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 29 7b  ->uniqNotNull ){
257e0 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69  .    pKey = sqli
257f0 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
25800 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79  pParse->db, nKey
25810 2c 20 6e 43 6f 6c 2d 6e 4b 65 79 29 3b 0a 20 20  , nCol-nKey);.  
25820 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 20  }else{.    pKey 
25830 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
25840 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
25850 2c 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 7d 0a  , nCol, 0);.  }.
25860 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
25870 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
25880 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
25890 62 6c 65 28 70 4b 65 79 29 20 29 3b 0a 20 20 20  ble(pKey) );.   
258a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
258b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f  ; i++){.      co
258c0 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20  nst char *zColl 
258d0 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  = pIdx->azColl[i
258e0 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61  ];.      pKey->a
258f0 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3d  Coll[i] = zColl=
25900 3d 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52  =sqlite3StrBINAR
25910 59 20 3f 20 30 20 3a 0a 20 20 20 20 20 20 20 20  Y ? 0 :.        
25920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25930 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
25940 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f  lSeq(pParse, zCo
25950 6c 6c 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d  ll);.      pKey-
25960 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
25970 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
25980 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  r[i];.    }.    
25990 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
259a0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
259b0 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51  ( pParse->rc==SQ
259c0 4c 49 54 45 5f 45 52 52 4f 52 5f 4d 49 53 53 49  LITE_ERROR_MISSI
259d0 4e 47 5f 43 4f 4c 4c 53 45 51 20 29 3b 0a 20 20  NG_COLLSEQ );.  
259e0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 62 4e      if( pIdx->bN
259f0 6f 51 75 65 72 79 3d 3d 30 20 29 7b 0a 20 20 20  oQuery==0 ){.   
25a00 20 20 20 20 20 2f 2a 20 44 65 61 63 74 69 76 61       /* Deactiva
25a10 74 65 20 74 68 65 20 69 6e 64 65 78 20 62 65 63  te the index bec
25a20 61 75 73 65 20 69 74 20 63 6f 6e 74 61 69 6e 73  ause it contains
25a30 20 61 6e 20 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 6c   an unknown coll
25a40 61 74 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  ating.        **
25a50 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68 65 20   sequence.  The 
25a60 6f 6e 6c 79 20 77 61 79 20 74 6f 20 72 65 61 63  only way to reac
25a70 74 69 76 65 20 74 68 65 20 69 6e 64 65 78 20 69  tive the index i
25a80 73 20 74 6f 20 72 65 6c 6f 61 64 20 74 68 65 0a  s to reload the.
25a90 20 20 20 20 20 20 20 20 2a 2a 20 73 63 68 65 6d          ** schem
25aa0 61 2e 20 20 41 64 64 69 6e 67 20 74 68 65 20 6d  a.  Adding the m
25ab0 69 73 73 69 6e 67 20 63 6f 6c 6c 61 74 69 6e 67  issing collating
25ac0 20 73 65 71 75 65 6e 63 65 20 6c 61 74 65 72 20   sequence later 
25ad0 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20 20 20  does not.       
25ae0 20 2a 2a 20 72 65 61 63 74 69 76 65 20 74 68 65   ** reactive the
25af0 20 69 6e 64 65 78 2e 20 20 54 68 65 20 61 70 70   index.  The app
25b00 6c 69 63 61 74 69 6f 6e 20 68 61 64 20 74 68 65  lication had the
25b10 20 63 68 61 6e 63 65 20 74 6f 20 72 65 67 69 73   chance to regis
25b20 74 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ter.        ** t
25b30 68 65 20 6d 69 73 73 69 6e 67 20 69 6e 64 65 78  he missing index
25b40 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61   using the colla
25b50 74 69 6f 6e 2d 6e 65 65 64 65 64 20 63 61 6c 6c  tion-needed call
25b60 62 61 63 6b 2e 20 20 46 6f 72 0a 20 20 20 20 20  back.  For.     
25b70 20 20 20 2a 2a 20 73 69 6d 70 6c 69 63 69 74 79     ** simplicity
25b80 2c 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f  , SQLite will no
25b90 74 20 67 69 76 65 20 74 68 65 20 61 70 70 6c 69  t give the appli
25ba0 63 61 74 69 6f 6e 20 61 20 73 65 63 6f 6e 64 20  cation a second 
25bb0 63 68 61 6e 63 65 2e 0a 20 20 20 20 20 20 20 20  chance..        
25bc0 2a 2f 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  */.        pIdx-
25bd0 3e 62 4e 6f 51 75 65 72 79 20 3d 20 31 3b 0a 20  >bNoQuery = 1;. 
25be0 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72         pParse->r
25bf0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
25c00 5f 52 45 54 52 59 3b 0a 20 20 20 20 20 20 7d 0a  _RETRY;.      }.
25c10 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79        sqlite3Key
25c20 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 29 3b  InfoUnref(pKey);
25c30 0a 20 20 20 20 20 20 70 4b 65 79 20 3d 20 30 3b  .      pKey = 0;
25c40 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
25c50 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a 0a 23 69 66  urn pKey;.}..#if
25c60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
25c70 5f 43 54 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  _CTE./* .** This
25c80 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
25c90 6b 65 64 20 6f 6e 63 65 20 70 65 72 20 43 54 45  ked once per CTE
25ca0 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
25cb0 68 69 6c 65 20 70 61 72 73 69 6e 67 20 61 20 0a  hile parsing a .
25cc0 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20  ** WITH clause. 
25cd0 0a 2a 2f 0a 57 69 74 68 20 2a 73 71 6c 69 74 65  .*/.With *sqlite
25ce0 33 57 69 74 68 41 64 64 28 0a 20 20 50 61 72 73  3WithAdd(.  Pars
25cf0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
25d00 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
25d10 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 69 74 68  ontext */.  With
25d20 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20 20   *pWith,        
25d30 20 20 20 20 2f 2a 20 45 78 69 73 74 69 6e 67 20      /* Existing 
25d40 57 49 54 48 20 63 6c 61 75 73 65 2c 20 6f 72 20  WITH clause, or 
25d50 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
25d60 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *pName,         
25d70 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
25d80 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 20 2a 2f   common-table */
25d90 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41 72  .  ExprList *pAr
25da0 67 6c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4f 70  glist,     /* Op
25db0 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 6e 61  tional column na
25dc0 6d 65 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20  me list for the 
25dd0 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63  table */.  Selec
25de0 74 20 2a 70 51 75 65 72 79 20 20 20 20 20 20 20  t *pQuery       
25df0 20 20 20 2f 2a 20 51 75 65 72 79 20 75 73 65 64     /* Query used
25e00 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   to initialize t
25e10 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  he table */.){. 
25e20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
25e30 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 57 69 74  Parse->db;.  Wit
25e40 68 20 2a 70 4e 65 77 3b 0a 20 20 63 68 61 72 20  h *pNew;.  char 
25e50 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 43 68  *zName;..  /* Ch
25e60 65 63 6b 20 74 68 61 74 20 74 68 65 20 43 54 45  eck that the CTE
25e70 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 20   name is unique 
25e80 77 69 74 68 69 6e 20 74 68 69 73 20 57 49 54 48  within this WITH
25e90 20 63 6c 61 75 73 65 2e 20 49 66 0a 20 20 2a 2a   clause. If.  **
25ea0 20 6e 6f 74 2c 20 73 74 6f 72 65 20 61 6e 20 65   not, store an e
25eb0 72 72 6f 72 20 69 6e 20 74 68 65 20 50 61 72 73  rror in the Pars
25ec0 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  e structure. */.
25ed0 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
25ee0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
25ef0 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65  Parse->db, pName
25f00 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 26  );.  if( zName &
25f10 26 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69  & pWith ){.    i
25f20 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
25f30 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65  0; i<pWith->nCte
25f40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
25f50 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
25f60 28 7a 4e 61 6d 65 2c 20 70 57 69 74 68 2d 3e 61  (zName, pWith->a
25f70 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
25f80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
25f90 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
25fa0 20 22 64 75 70 6c 69 63 61 74 65 20 57 49 54 48   "duplicate WITH
25fb0 20 74 61 62 6c 65 20 6e 61 6d 65 3a 20 25 73 22   table name: %s"
25fc0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
25fd0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
25fe0 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20  f( pWith ){.    
25ff0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42  sqlite3_int64 nB
26000 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 57  yte = sizeof(*pW
26010 69 74 68 29 20 2b 20 28 73 69 7a 65 6f 66 28 70  ith) + (sizeof(p
26020 57 69 74 68 2d 3e 61 5b 31 5d 29 20 2a 20 70 57  With->a[1]) * pW
26030 69 74 68 2d 3e 6e 43 74 65 29 3b 0a 20 20 20 20  ith->nCte);.    
26040 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
26050 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 57 69 74  Realloc(db, pWit
26060 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  h, nByte);.  }el
26070 73 65 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73  se{.    pNew = s
26080 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
26090 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
260a0 57 69 74 68 29 29 3b 0a 20 20 7d 0a 20 20 61 73  With));.  }.  as
260b0 73 65 72 74 28 20 28 70 4e 65 77 21 3d 30 20 26  sert( (pNew!=0 &
260c0 26 20 7a 4e 61 6d 65 21 3d 30 29 20 7c 7c 20 64  & zName!=0) || d
260d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
260e0 29 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  );..  if( db->ma
260f0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
26100 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
26110 74 44 65 6c 65 74 65 28 64 62 2c 20 70 41 72 67  tDelete(db, pArg
26120 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  list);.    sqlit
26130 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
26140 62 2c 20 70 51 75 65 72 79 29 3b 0a 20 20 20 20  b, pQuery);.    
26150 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
26160 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  , zName);.    pN
26170 65 77 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d 65  ew = pWith;.  }e
26180 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  lse{.    pNew->a
26190 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 53 65  [pNew->nCte].pSe
261a0 6c 65 63 74 20 3d 20 70 51 75 65 72 79 3b 0a 20  lect = pQuery;. 
261b0 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
261c0 3e 6e 43 74 65 5d 2e 70 43 6f 6c 73 20 3d 20 70  >nCte].pCols = p
261d0 41 72 67 6c 69 73 74 3b 0a 20 20 20 20 70 4e 65  Arglist;.    pNe
261e0 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d  w->a[pNew->nCte]
261f0 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  .zName = zName;.
26200 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
26210 2d 3e 6e 43 74 65 5d 2e 7a 43 74 65 45 72 72 20  ->nCte].zCteErr 
26220 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  = 0;.    pNew->n
26230 43 74 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65  Cte++;.  }..  re
26240 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
26250 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e  .** Free the con
26260 74 65 6e 74 73 20 6f 66 20 74 68 65 20 57 69 74  tents of the Wit
26270 68 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  h object passed 
26280 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
26290 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  gument..*/.void 
262a0 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74  sqlite3WithDelet
262b0 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
262c0 69 74 68 20 2a 70 57 69 74 68 29 7b 0a 20 20 69  ith *pWith){.  i
262d0 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20  f( pWith ){.    
262e0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
262f0 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74  =0; i<pWith->nCt
26300 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  e; i++){.      s
26310 74 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 20  truct Cte *pCte 
26320 3d 20 26 70 57 69 74 68 2d 3e 61 5b 69 5d 3b 0a  = &pWith->a[i];.
26330 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
26340 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
26350 70 43 74 65 2d 3e 70 43 6f 6c 73 29 3b 0a 20 20  pCte->pCols);.  
26360 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
26370 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65  tDelete(db, pCte
26380 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
26390 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
263a0 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29  db, pCte->zName)
263b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
263c0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57  te3DbFree(db, pW
263d0 69 74 68 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  ith);.  }.}.#end
263e0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
263f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 29 20  QLITE_OMIT_CTE) 
26400 2a 2f 0a                                         */.