SQLITE_NOTICE(283): recovered 1 frames from WAL file /fossil/sqlite.fossil-wal

SQLite: Hex Artifact Content
/ Hex Artifact Content
Login

Artifact 20c584fc7da90631f2028cd281c033cb19b3fadde3071334d9114b0419ba395f:


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 69 66 28 20 70 50 61 72 73 65 2d 3e 70     if( pParse->p
1cb0: 41 69 6e 63 21 3d 30 20 26 26 20 70 50 61 72 73  Ainc!=0 && pPars
1cc0: 65 2d 3e 6e 54 61 62 3d 3d 30 20 29 20 70 50 61  e->nTab==0 ) pPa
1cd0: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20  rse->nTab = 1;. 
1ce0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61     sqlite3VdbeMa
1cf0: 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61 72 73  keReady(v, pPars
1d00: 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  e);.    pParse->
1d10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1d20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1d30: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
1d40: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 7d 0a  TE_ERROR;.  }.}.
1d50: 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70  ./*.** Run the p
1d60: 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67  arser and code g
1d70: 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72 73 69  enerator recursi
1d80: 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  vely in order to
1d90: 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64   generate.** cod
1da0: 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74  e for the SQL st
1db0: 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e  atement given on
1dc0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1dd0: 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74  e pParse context
1de0: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
1df0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1e00: 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61 72 73  .  When the pars
1e10: 65 72 20 69 73 20 72 75 6e 20 72 65 63 75 72 73  er is run recurs
1e20: 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61  ively.** this wa
1e30: 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f  y, the final OP_
1e40: 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65  Halt is not appe
1e50: 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69  nded and other i
1e60: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a  nitialization.**
1e70: 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f   and finalizatio
1e80: 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74  n steps are omit
1e90: 74 65 64 20 62 65 63 61 75 73 65 20 74 68 6f 73  ted because thos
1ea0: 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62  e are handling b
1eb0: 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f  y the.** outermo
1ec0: 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a  st parser..**.**
1ed0: 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20   Not everything 
1ee0: 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68  is nestable.  Th
1ef0: 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20 64  is facility is d
1f00: 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69  esigned to permi
1f10: 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44  t.** INSERT, UPD
1f20: 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20  ATE, and DELETE 
1f30: 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e  operations again
1f40: 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  st SQLITE_MASTER
1f50: 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69  .  Use.** care i
1f60: 66 20 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20  f you decide to 
1f70: 74 72 79 20 74 6f 20 75 73 65 20 74 68 69 73 20  try to use this 
1f80: 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65  routine for some
1f90: 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e   other purposes.
1fa0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1fb0: 4e 65 73 74 65 64 50 61 72 73 65 28 50 61 72 73  NestedParse(Pars
1fc0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
1fd0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
1fe0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
1ff0: 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  ap;.  char *zSql
2000: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
2010: 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  g = 0;.  sqlite3
2020: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
2030: 62 3b 0a 20 20 63 68 61 72 20 73 61 76 65 42 75  b;.  char saveBu
2040: 66 5b 50 41 52 53 45 5f 54 41 49 4c 5f 53 5a 5d  f[PARSE_TAIL_SZ]
2050: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
2060: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  >nErr ) return;.
2070: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
2080: 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b 20 20  ->nested<10 );  
2090: 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c  /* Nesting shoul
20a0: 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d  d only be of lim
20b0: 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a 20 20  ited depth */.  
20c0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
20d0: 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  rmat);.  zSql = 
20e0: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
20f0: 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  db, zFormat, ap)
2100: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
2110: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b    if( zSql==0 ){
2120: 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20 20 2f  .    return;   /
2130: 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74 20  * A malloc must 
2140: 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  have failed */. 
2150: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73   }.  pParse->nes
2160: 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28  ted++;.  memcpy(
2170: 73 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f 54  saveBuf, PARSE_T
2180: 41 49 4c 28 70 50 61 72 73 65 29 2c 20 50 41 52  AIL(pParse), PAR
2190: 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 6d  SE_TAIL_SZ);.  m
21a0: 65 6d 73 65 74 28 50 41 52 53 45 5f 54 41 49 4c  emset(PARSE_TAIL
21b0: 28 70 50 61 72 73 65 29 2c 20 30 2c 20 50 41 52  (pParse), 0, PAR
21c0: 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 73  SE_TAIL_SZ);.  s
21d0: 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28  qlite3RunParser(
21e0: 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a  pParse, zSql, &z
21f0: 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 7a  ErrMsg);.  if( z
2200: 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 73 71  ErrMsg ){.    sq
2210: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2220: 61 72 73 65 2c 20 22 25 7a 22 2c 20 7a 45 72 72  arse, "%z", zErr
2230: 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Msg);.  }.  sqli
2240: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
2250: 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28 50 41  ql);.  memcpy(PA
2260: 52 53 45 5f 54 41 49 4c 28 70 50 61 72 73 65 29  RSE_TAIL(pParse)
2270: 2c 20 73 61 76 65 42 75 66 2c 20 50 41 52 53 45  , saveBuf, PARSE
2280: 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 70 50 61  _TAIL_SZ);.  pPa
2290: 72 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d  rse->nested--;.}
22a0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  ..#if SQLITE_USE
22b0: 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
22c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
22d0: 55 45 20 69 66 20 7a 54 61 62 6c 65 20 69 73 20  UE if zTable is 
22e0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
22f0: 73 79 73 74 65 6d 20 74 61 62 6c 65 20 74 68 61  system table tha
2300: 74 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20  t stores the.** 
2310: 6c 69 73 74 20 6f 66 20 75 73 65 72 73 20 61 6e  list of users an
2320: 64 20 74 68 65 69 72 20 61 63 63 65 73 73 20 63  d their access c
2330: 72 65 64 65 6e 74 69 61 6c 73 2e 0a 2a 2f 0a 69  redentials..*/.i
2340: 6e 74 20 73 71 6c 69 74 65 33 55 73 65 72 41 75  nt sqlite3UserAu
2350: 74 68 54 61 62 6c 65 28 63 6f 6e 73 74 20 63 68  thTable(const ch
2360: 61 72 20 2a 7a 54 61 62 6c 65 29 7b 0a 20 20 72  ar *zTable){.  r
2370: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 73 74  eturn sqlite3_st
2380: 72 69 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73  ricmp(zTable, "s
2390: 71 6c 69 74 65 5f 75 73 65 72 22 29 3d 3d 30 3b  qlite_user")==0;
23a0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
23b0: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
23c0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
23d0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61  that describes a
23e0: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
23f0: 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69  base.** table gi
2400: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
2410: 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28  that table and (
2420: 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20  optionally) the 
2430: 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  name of the.** d
2440: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
2450: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  ng the table.  R
2460: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
2470: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49  t found..**.** I
2480: 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30  f zDatabase is 0
2490: 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  , all databases 
24a0: 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72  are searched for
24b0: 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74   the table and t
24c0: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63  he.** first matc
24d0: 68 69 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65  hing table is re
24e0: 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65  turned.  (No che
24f0: 63 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63  cking for duplic
2500: 61 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d  ate table.** nam
2510: 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68  es is done.)  Th
2520: 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69  e search order i
2530: 73 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68  s TEMP first, th
2540: 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e  en MAIN, then an
2550: 79 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64  y.** auxiliary d
2560: 61 74 61 62 61 73 65 73 20 61 64 64 65 64 20 75  atabases added u
2570: 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20  sing the ATTACH 
2580: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53  command..**.** S
2590: 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c  ee also sqlite3L
25a0: 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f  ocateTable()..*/
25b0: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46  .Table *sqlite3F
25c0: 69 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33  indTable(sqlite3
25d0: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
25e0: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
25f0: 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b  har *zDatabase){
2600: 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b  .  Table *p = 0;
2610: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
2620: 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72 65 20  All mutexes are 
2630: 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 63 68  required for sch
2640: 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d 61 6b  ema access.  Mak
2650: 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64 20 74  e sure we hold t
2660: 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  hem. */.  assert
2670: 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 7c  ( zDatabase!=0 |
2680: 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  | sqlite3BtreeHo
2690: 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62  ldsAllMutexes(db
26a0: 29 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) );.#if SQLITE_
26b0: 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
26c0: 49 4f 4e 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68  ION.  /* Only th
26d0: 65 20 61 64 6d 69 6e 20 75 73 65 72 20 69 73 20  e admin user is 
26e0: 61 6c 6c 6f 77 65 64 20 74 6f 20 6b 6e 6f 77 20  allowed to know 
26f0: 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 5f  that the sqlite_
2700: 75 73 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20  user table.  ** 
2710: 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 66 28 20  exists */.  if( 
2720: 64 62 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65 76  db->auth.authLev
2730: 65 6c 3c 55 41 55 54 48 5f 41 64 6d 69 6e 20 26  el<UAUTH_Admin &
2740: 26 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74  & sqlite3UserAut
2750: 68 54 61 62 6c 65 28 7a 4e 61 6d 65 29 21 3d 30  hTable(zName)!=0
2760: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
2770: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77  ;.  }.#endif.  w
2780: 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 66 6f 72  hile(1){.    for
2790: 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20  (i=OMIT_TEMPDB; 
27a0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
27b0: 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 28  .      int j = (
27c0: 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20  i<2) ? i^1 : i; 
27d0: 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50    /* Search TEMP
27e0: 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a   before MAIN */.
27f0: 20 20 20 20 20 20 69 66 28 20 7a 44 61 74 61 62        if( zDatab
2800: 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
2810: 33 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61  3StrICmp(zDataba
2820: 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a  se, db->aDb[j].z
2830: 44 62 53 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  DbSName)==0 ){. 
2840: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
2850: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
2860: 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20  xHeld(db, j, 0) 
2870: 29 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 73  );.        p = s
2880: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
2890: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65  db->aDb[j].pSche
28a0: 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61  ma->tblHash, zNa
28b0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  me);.        if(
28c0: 20 70 20 29 20 72 65 74 75 72 6e 20 70 3b 0a 20   p ) return p;. 
28d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
28e0: 20 2f 2a 20 4e 6f 74 20 66 6f 75 6e 64 2e 20 20   /* Not found.  
28f0: 49 66 20 74 68 65 20 6e 61 6d 65 20 77 65 20 77  If the name we w
2900: 65 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ere looking for 
2910: 77 61 73 20 74 65 6d 70 2e 73 71 6c 69 74 65 5f  was temp.sqlite_
2920: 6d 61 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 68  master.    ** th
2930: 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20 6e 61  en change the na
2940: 6d 65 20 74 6f 20 73 71 6c 69 74 65 5f 74 65 6d  me to sqlite_tem
2950: 70 5f 6d 61 73 74 65 72 20 61 6e 64 20 74 72 79  p_master and try
2960: 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69   again. */.    i
2970: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
2980: 70 28 7a 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f  p(zName, MASTER_
2990: 4e 41 4d 45 29 21 3d 30 20 29 20 62 72 65 61 6b  NAME)!=0 ) break
29a0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
29b0: 33 5f 73 74 72 69 63 6d 70 28 7a 44 61 74 61 62  3_stricmp(zDatab
29c0: 61 73 65 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  ase, db->aDb[1].
29d0: 7a 44 62 53 4e 61 6d 65 29 21 3d 30 20 29 20 62  zDbSName)!=0 ) b
29e0: 72 65 61 6b 3b 0a 20 20 20 20 7a 4e 61 6d 65 20  reak;.    zName 
29f0: 3d 20 54 45 4d 50 5f 4d 41 53 54 45 52 5f 4e 41  = TEMP_MASTER_NA
2a00: 4d 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ME;.  }.  return
2a10: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63   0;.}../*.** Loc
2a20: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
2a30: 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  y structure that
2a40: 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72   describes a par
2a50: 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65  ticular database
2a60: 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20  .** table given 
2a70: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74  the name of that
2a80: 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69   table and (opti
2a90: 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65  onally) the name
2aa0: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
2ab0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
2ac0: 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
2ad0: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
2ae0: 75 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65  und.  Also leave
2af0: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73   an.** error mes
2b00: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e  sage in pParse->
2b10: 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54  zErrMsg..**.** T
2b20: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
2b30: 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
2b40: 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69  ne and sqlite3Fi
2b50: 6e 64 54 61 62 6c 65 28 29 20 69 73 20 74 68 61  ndTable() is tha
2b60: 74 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  t this.** routin
2b70: 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f  e leaves an erro
2b80: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
2b90: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65  rse->zErrMsg whe
2ba0: 72 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e  re.** sqlite3Fin
2bb0: 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f  dTable() does no
2bc0: 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  t..*/.Table *sql
2bd0: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
2be0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2bf0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e  ,         /* con
2c00: 74 65 78 74 20 69 6e 20 77 68 69 63 68 20 74 6f  text in which to
2c10: 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73 20 2a   report errors *
2c20: 2f 0a 20 20 75 33 32 20 66 6c 61 67 73 2c 20 20  /.  u32 flags,  
2c30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 4f             /* LO
2c40: 43 41 54 45 5f 56 49 45 57 20 6f 72 20 4c 4f 43  CATE_VIEW or LOC
2c50: 41 54 45 5f 4e 4f 45 52 52 20 2a 2f 0a 20 20 63  ATE_NOERR */.  c
2c60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
2c70: 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ,     /* Name of
2c80: 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72   the table we ar
2c90: 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f  e looking for */
2ca0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2cb0: 44 62 61 73 65 20 20 20 20 20 2f 2a 20 4e 61 6d  Dbase     /* Nam
2cc0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2cd0: 65 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  e.  Might be NUL
2ce0: 4c 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  L */.){.  Table 
2cf0: 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *p;.  sqlite3 *d
2d00: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
2d10: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64  .  /* Read the d
2d20: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
2d30: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
2d40: 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  rs, leave an err
2d50: 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20  or message.  ** 
2d60: 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72  and code in pPar
2d70: 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  se and return NU
2d80: 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 28 64 62  LL. */.  if( (db
2d90: 2d 3e 6d 44 62 46 6c 61 67 73 20 26 20 44 42 46  ->mDbFlags & DBF
2da0: 4c 41 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f  LAG_SchemaKnownO
2db0: 6b 29 3d 3d 30 20 0a 20 20 20 26 26 20 53 51 4c  k)==0 .   && SQL
2dc0: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
2dd0: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
2de0: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
2df0: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20  n 0;.  }..  p = 
2e00: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
2e10: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61  (db, zName, zDba
2e20: 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  se);.  if( p==0 
2e30: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
2e40: 72 20 2a 7a 4d 73 67 20 3d 20 66 6c 61 67 73 20  r *zMsg = flags 
2e50: 26 20 4c 4f 43 41 54 45 5f 56 49 45 57 20 3f 20  & LOCATE_VIEW ? 
2e60: 22 6e 6f 20 73 75 63 68 20 76 69 65 77 22 20 3a  "no such view" :
2e70: 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 22   "no such table"
2e80: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2e90: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2ea0: 4c 45 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61  LE.    /* If zNa
2eb0: 6d 65 20 69 73 20 74 68 65 20 6e 6f 74 20 74 68  me is the not th
2ec0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c  e name of a tabl
2ed0: 65 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20  e in the schema 
2ee0: 63 72 65 61 74 65 64 20 75 73 69 6e 67 0a 20 20  created using.  
2ef0: 20 20 2a 2a 20 43 52 45 41 54 45 2c 20 74 68 65    ** CREATE, the
2f00: 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  n check to see i
2f10: 66 20 69 74 20 69 73 20 74 68 65 20 6e 61 6d 65  f it is the name
2f20: 20 6f 66 20 61 6e 20 76 69 72 74 75 61 6c 20 74   of an virtual t
2f30: 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  able that.    **
2f40: 20 63 61 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79   can be an epony
2f50: 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61 62  mous virtual tab
2f60: 6c 65 2e 20 2a 2f 0a 20 20 20 20 4d 6f 64 75 6c  le. */.    Modul
2f70: 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c  e *pMod = (Modul
2f80: 65 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46 69  e*)sqlite3HashFi
2f90: 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c  nd(&db->aModule,
2fa0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   zName);.    if(
2fb0: 20 70 4d 6f 64 3d 3d 30 20 26 26 20 73 71 6c 69   pMod==0 && sqli
2fc0: 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 4e 61  te3_strnicmp(zNa
2fd0: 6d 65 2c 20 22 70 72 61 67 6d 61 5f 22 2c 20 37  me, "pragma_", 7
2fe0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4d  )==0 ){.      pM
2ff0: 6f 64 20 3d 20 73 71 6c 69 74 65 33 50 72 61 67  od = sqlite3Prag
3000: 6d 61 56 74 61 62 52 65 67 69 73 74 65 72 28 64  maVtabRegister(d
3010: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b, zName);.    }
3020: 0a 20 20 20 20 69 66 28 20 70 4d 6f 64 20 26 26  .    if( pMod &&
3030: 20 73 71 6c 69 74 65 33 56 74 61 62 45 70 6f 6e   sqlite3VtabEpon
3040: 79 6d 6f 75 73 54 61 62 6c 65 49 6e 69 74 28 70  ymousTableInit(p
3050: 50 61 72 73 65 2c 20 70 4d 6f 64 29 20 29 7b 0a  Parse, pMod) ){.
3060: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4d 6f        return pMo
3070: 64 2d 3e 70 45 70 6f 54 61 62 3b 0a 20 20 20 20  d->pEpoTab;.    
3080: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
3090: 20 28 66 6c 61 67 73 20 26 20 4c 4f 43 41 54 45   (flags & LOCATE
30a0: 5f 4e 4f 45 52 52 29 3d 3d 30 20 29 7b 0a 20 20  _NOERR)==0 ){.  
30b0: 20 20 20 20 69 66 28 20 7a 44 62 61 73 65 20 29      if( zDbase )
30c0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
30d0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
30e0: 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a  , "%s: %s.%s", z
30f0: 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61  Msg, zDbase, zNa
3100: 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
3110: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3120: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
3130: 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67  , "%s: %s", zMsg
3140: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
3150: 7d 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  }.      pParse->
3160: 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
3170: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
3180: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
3190: 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
31a0: 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  e identified by 
31b0: 2a 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  *p..**.** This i
31c0: 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
31d0: 6e 64 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  nd sqlite3Locate
31e0: 54 61 62 6c 65 28 29 2e 20 54 68 65 20 64 69 66  Table(). The dif
31f0: 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 0a  ference between.
3200: 2a 2a 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  ** sqlite3Locate
3210: 54 61 62 6c 65 28 29 20 61 6e 64 20 74 68 69 73  Table() and this
3220: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 61   function is tha
3230: 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  t this function 
3240: 72 65 73 74 72 69 63 74 73 0a 2a 2a 20 74 68 65  restricts.** the
3250: 20 73 65 61 72 63 68 20 74 6f 20 73 63 68 65 6d   search to schem
3260: 61 20 28 70 2d 3e 70 53 63 68 65 6d 61 29 20 69  a (p->pSchema) i
3270: 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  f it is not NULL
3280: 2e 20 70 2d 3e 70 53 63 68 65 6d 61 20 6d 61 79  . p->pSchema may
3290: 20 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20   be.** non-NULL 
32a0: 69 66 20 69 74 20 69 73 20 70 61 72 74 20 6f 66  if it is part of
32b0: 20 61 20 76 69 65 77 20 6f 72 20 74 72 69 67 67   a view or trigg
32c0: 65 72 20 70 72 6f 67 72 61 6d 20 64 65 66 69 6e  er program defin
32d0: 69 74 69 6f 6e 2e 20 53 65 65 0a 2a 2a 20 73 71  ition. See.** sq
32e0: 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28  lite3FixSrcList(
32f0: 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  ) for details..*
3300: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
3310: 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28  LocateTableItem(
3320: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
3330: 2c 20 0a 20 20 75 33 32 20 66 6c 61 67 73 2c 0a  , .  u32 flags,.
3340: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
3350: 5f 69 74 65 6d 20 2a 70 0a 29 7b 0a 20 20 63 6f  _item *p.){.  co
3360: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20  nst char *zDb;. 
3370: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 46 69   if( pParse->iFi
3380: 78 44 62 20 26 26 20 70 50 61 72 73 65 2d 3e 69  xDb && pParse->i
3390: 46 69 78 44 62 21 3d 32 20 29 7b 0a 20 20 20 20  FixDb!=2 ){.    
33a0: 7a 44 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  zDb = pParse->db
33b0: 2d 3e 61 44 62 5b 70 50 61 72 73 65 2d 3e 69 46  ->aDb[pParse->iF
33c0: 69 78 44 62 2d 31 5d 2e 7a 44 62 53 4e 61 6d 65  ixDb-1].zDbSName
33d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
33e0: 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c  >zDatabase==0 ||
33f0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
3400: 70 2d 3e 7a 44 61 74 61 62 61 73 65 2c 20 7a 44  p->zDatabase, zD
3410: 62 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  b)==0 );.    if(
3420: 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30   p->zDatabase==0
3430: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 7a 44 61   ){.      p->zDa
3440: 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33  tabase = sqlite3
3450: 44 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d  DbStrDup(pParse-
3460: 3e 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 7d  >db, zDb);.    }
3470: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
3480: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 69  pSchema ){.    i
3490: 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
34a0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 32 28 70  SchemaToIndex2(p
34b0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 53  Parse->db, p->pS
34c0: 63 68 65 6d 61 2c 20 30 29 3b 0a 20 20 20 20 7a  chema, 0);.    z
34d0: 44 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  Db = pParse->db-
34e0: 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
34f0: 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  me;.  }else{.   
3500: 20 7a 44 62 20 3d 20 70 2d 3e 7a 44 61 74 61 62   zDb = p->zDatab
3510: 61 73 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ase;.  }.  retur
3520: 6e 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  n sqlite3LocateT
3530: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 66 6c 61  able(pParse, fla
3540: 67 73 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 44  gs, p->zName, zD
3550: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  b);.}../*.** Loc
3560: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
3570: 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  y structure that
3580: 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61   describes .** a
3590: 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65   particular inde
35a0: 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  x given the name
35b0: 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a   of that index.*
35c0: 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f  * and the name o
35d0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
35e0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
35f0: 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72   index..** Retur
3600: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
3610: 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44  und..**.** If zD
3620: 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c  atabase is 0, al
3630: 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  l databases are 
3640: 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65  searched for the
3650: 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68  .** table and th
3660: 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  e first matching
3670: 20 69 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e   index is return
3680: 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e  ed.  (No checkin
3690: 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61  g.** for duplica
36a0: 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69  te index names i
36b0: 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65  s done.)  The se
36c0: 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a  arch order is.**
36d0: 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65   TEMP first, the
36e0: 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79  n MAIN, then any
36f0: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
3700: 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73  ases added.** us
3710: 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63  ing the ATTACH c
3720: 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78  ommand..*/.Index
3730: 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64   *sqlite3FindInd
3740: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ex(sqlite3 *db, 
3750: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
3760: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
3770: 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20  Db){.  Index *p 
3780: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
3790: 2f 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61  /* All mutexes a
37a0: 72 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  re required for 
37b0: 73 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20  schema access.  
37c0: 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c  Make sure we hol
37d0: 64 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73  d them. */.  ass
37e0: 65 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20 73  ert( zDb!=0 || s
37f0: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
3800: 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29  AllMutexes(db) )
3810: 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54  ;.  for(i=OMIT_T
3820: 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62  EMPDB; i<db->nDb
3830: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
3840: 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20  j = (i<2) ? i^1 
3850: 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20  : i;  /* Search 
3860: 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e  TEMP before MAIN
3870: 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a   */.    Schema *
3880: 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  pSchema = db->aD
3890: 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  b[j].pSchema;.  
38a0: 20 20 61 73 73 65 72 74 28 20 70 53 63 68 65 6d    assert( pSchem
38b0: 61 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 62  a );.    if( zDb
38c0: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
38d0: 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b  mp(zDb, db->aDb[
38e0: 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29 20 29 20 63  j].zDbSName) ) c
38f0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
3900: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
3910: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
3920: 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 20 3d  j, 0) );.    p =
3930: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
3940: 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  (&pSchema->idxHa
3950: 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  sh, zName);.    
3960: 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20  if( p ) break;. 
3970: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
3980: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20  ../*.** Reclaim 
3990: 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  the memory used 
39a0: 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 76  by an index.*/.v
39b0: 6f 69 64 20 73 71 6c 69 74 65 33 46 72 65 65 49  oid sqlite3FreeI
39c0: 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62  ndex(sqlite3 *db
39d0: 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 23 69 66  , Index *p){.#if
39e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
39f0: 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71 6c 69 74  _ANALYZE.  sqlit
3a00: 65 33 44 65 6c 65 74 65 49 6e 64 65 78 53 61 6d  e3DeleteIndexSam
3a10: 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a 23 65 6e  ples(db, p);.#en
3a20: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 45 78 70  dif.  sqlite3Exp
3a30: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
3a40: 50 61 72 74 49 64 78 57 68 65 72 65 29 3b 0a 20  PartIdxWhere);. 
3a50: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
3a60: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 61 43  Delete(db, p->aC
3a70: 6f 6c 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74  olExpr);.  sqlit
3a80: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
3a90: 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 69 66 28 20  zColAff);.  if( 
3aa0: 70 2d 3e 69 73 52 65 73 69 7a 65 64 20 29 20 73  p->isResized ) s
3ab0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3ac0: 20 28 76 6f 69 64 20 2a 29 70 2d 3e 61 7a 43 6f   (void *)p->azCo
3ad0: 6c 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ll);.#ifdef SQLI
3ae0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
3af0: 4f 52 5f 53 54 41 54 34 0a 20 20 73 71 6c 69 74  OR_STAT4.  sqlit
3b00: 65 33 5f 66 72 65 65 28 70 2d 3e 61 69 52 6f 77  e3_free(p->aiRow
3b10: 45 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  Est);.#endif.  s
3b20: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3b30: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f   p);.}../*.** Fo
3b40: 72 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c 6c  r the index call
3b50: 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69 63  ed zIdxName whic
3b60: 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68  h is found in th
3b70: 65 20 64 61 74 61 62 61 73 65 20 69 44 62 2c 0a  e database iDb,.
3b80: 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20 69  ** unlike that i
3b90: 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54 61  ndex from its Ta
3ba0: 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65 20  ble then remove 
3bb0: 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a 2a  the index from.*
3bc0: 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68  * the index hash
3bd0: 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65 20   table and free 
3be0: 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  all memory struc
3bf0: 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64  tures associated
3c00: 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 64  .** with the ind
3c10: 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ex..*/.void sqli
3c20: 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  te3UnlinkAndDele
3c30: 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  teIndex(sqlite3 
3c40: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f  *db, int iDb, co
3c50: 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e 61  nst char *zIdxNa
3c60: 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  me){.  Index *pI
3c70: 6e 64 65 78 3b 0a 20 20 48 61 73 68 20 2a 70 48  ndex;.  Hash *pH
3c80: 61 73 68 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ash;..  assert( 
3c90: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
3ca0: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
3cb0: 30 29 20 29 3b 0a 20 20 70 48 61 73 68 20 3d 20  0) );.  pHash = 
3cc0: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53  &db->aDb[iDb].pS
3cd0: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a  chema->idxHash;.
3ce0: 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
3cf0: 65 33 48 61 73 68 49 6e 73 65 72 74 28 70 48 61  e3HashInsert(pHa
3d00: 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 30 29  sh, zIdxName, 0)
3d10: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
3d20: 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69 66  Index) ){.    if
3d30: 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  ( pIndex->pTable
3d40: 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78  ->pIndex==pIndex
3d50: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78   ){.      pIndex
3d60: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
3d70: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
3d80: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3d90: 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
3da0: 20 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74     /* Justificat
3db0: 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28 29 3b  ion of ALWAYS();
3dc0: 20 20 54 68 65 20 69 6e 64 65 78 20 6d 75 73 74    The index must
3dd0: 20 62 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 20   be on the list 
3de0: 6f 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64 69  of.      ** indi
3df0: 63 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 20  ces. */.      p 
3e00: 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
3e10: 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
3e20: 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 29  while( ALWAYS(p)
3e30: 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49   && p->pNext!=pI
3e40: 6e 64 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e 70  ndex ){ p = p->p
3e50: 4e 65 78 74 3b 20 7d 0a 20 20 20 20 20 20 69 66  Next; }.      if
3e60: 28 20 41 4c 57 41 59 53 28 70 20 26 26 20 70 2d  ( ALWAYS(p && p-
3e70: 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29 20  >pNext==pIndex) 
3e80: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  ){.        p->pN
3e90: 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  ext = pIndex->pN
3ea0: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
3eb0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 72   }.    sqlite3Fr
3ec0: 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  eeIndex(db, pInd
3ed0: 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6d  ex);.  }.  db->m
3ee0: 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41  DbFlags |= DBFLA
3ef0: 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a  G_SchemaChange;.
3f00: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 74 68  }../*.** Look th
3f10: 72 6f 75 67 68 20 74 68 65 20 6c 69 73 74 20 6f  rough the list o
3f20: 66 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  f open database 
3f30: 66 69 6c 65 73 20 69 6e 20 64 62 2d 3e 61 44 62  files in db->aDb
3f40: 5b 5d 20 61 6e 64 20 69 66 0a 2a 2a 20 61 6e 79  [] and if.** any
3f50: 20 68 61 76 65 20 62 65 65 6e 20 63 6c 6f 73 65   have been close
3f60: 64 2c 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66  d, remove them f
3f70: 72 6f 6d 20 74 68 65 20 6c 69 73 74 2e 20 20 52  rom the list.  R
3f80: 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 0a 2a 2a  eallocate the.**
3f90: 20 64 62 2d 3e 61 44 62 5b 5d 20 73 74 72 75 63   db->aDb[] struc
3fa0: 74 75 72 65 20 74 6f 20 61 20 73 6d 61 6c 6c 65  ture to a smalle
3fb0: 72 20 73 69 7a 65 2c 20 69 66 20 70 6f 73 73 69  r size, if possi
3fc0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 79  ble..**.** Entry
3fd0: 20 30 20 28 74 68 65 20 22 6d 61 69 6e 22 20 64   0 (the "main" d
3fe0: 61 74 61 62 61 73 65 29 20 61 6e 64 20 65 6e 74  atabase) and ent
3ff0: 72 79 20 31 20 28 74 68 65 20 22 74 65 6d 70 22  ry 1 (the "temp"
4000: 20 64 61 74 61 62 61 73 65 29 0a 2a 2a 20 61 72   database).** ar
4010: 65 20 6e 65 76 65 72 20 63 61 6e 64 69 64 61 74  e never candidat
4020: 65 73 20 66 6f 72 20 62 65 69 6e 67 20 63 6f 6c  es for being col
4030: 6c 61 70 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  lapsed..*/.void 
4040: 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44  sqlite3CollapseD
4050: 61 74 61 62 61 73 65 41 72 72 61 79 28 73 71 6c  atabaseArray(sql
4060: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
4070: 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a   i, j;.  for(i=j
4080: 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =2; i<db->nDb; i
4090: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
40a0: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
40b0: 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
40c0: 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20  Db->pBt==0 ){.  
40d0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
40e0: 65 28 64 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e  e(db, pDb->zDbSN
40f0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  ame);.      pDb-
4100: 3e 7a 44 62 53 4e 61 6d 65 20 3d 20 30 3b 0a 20  >zDbSName = 0;. 
4110: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
4120: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69     }.    if( j<i
4130: 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44   ){.      db->aD
4140: 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69  b[j] = db->aDb[i
4150: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b  ];.    }.    j++
4160: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 44 62 20  ;.  }.  db->nDb 
4170: 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e  = j;.  if( db->n
4180: 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62  Db<=2 && db->aDb
4190: 21 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20  !=db->aDbStatic 
41a0: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62  ){.    memcpy(db
41b0: 2d 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d  ->aDbStatic, db-
41c0: 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64  >aDb, 2*sizeof(d
41d0: 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20  b->aDb[0]));.   
41e0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
41f0: 62 2c 20 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20  b, db->aDb);.   
4200: 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61   db->aDb = db->a
4210: 44 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a  DbStatic;.  }.}.
4220: 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65  ./*.** Reset the
4230: 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 20   schema for the 
4240: 64 61 74 61 62 61 73 65 20 61 74 20 69 6e 64 65  database at inde
4250: 78 20 69 44 62 2e 20 20 41 6c 73 6f 20 72 65 73  x iDb.  Also res
4260: 65 74 20 74 68 65 0a 2a 2a 20 54 45 4d 50 20 73  et the.** TEMP s
4270: 63 68 65 6d 61 2e 20 20 54 68 65 20 72 65 73 65  chema.  The rese
4280: 74 20 69 73 20 64 65 66 65 72 72 65 64 20 69 66  t is deferred if
4290: 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b   db->nSchemaLock
42a0: 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2e 0a 2a 2a   is not zero..**
42b0: 20 44 65 66 65 72 72 65 64 20 72 65 73 65 74 73   Deferred resets
42c0: 20 6d 61 79 20 62 65 20 72 75 6e 20 62 79 20 63   may be run by c
42d0: 61 6c 6c 69 6e 67 20 77 69 74 68 20 69 44 62 3c  alling with iDb<
42e0: 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
42f0: 65 33 52 65 73 65 74 4f 6e 65 53 63 68 65 6d 61  e3ResetOneSchema
4300: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
4310: 74 20 69 44 62 29 7b 0a 20 20 69 6e 74 20 69 3b  t iDb){.  int i;
4320: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 64  .  assert( iDb<d
4330: 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 69 66 28  b->nDb );..  if(
4340: 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61   iDb>=0 ){.    a
4350: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
4360: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
4370: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20  , iDb, 0) );.   
4380: 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 64   DbSetProperty(d
4390: 62 2c 20 69 44 62 2c 20 44 42 5f 52 65 73 65 74  b, iDb, DB_Reset
43a0: 57 61 6e 74 65 64 29 3b 0a 20 20 20 20 44 62 53  Wanted);.    DbS
43b0: 65 74 50 72 6f 70 65 72 74 79 28 64 62 2c 20 31  etProperty(db, 1
43c0: 2c 20 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64  , DB_ResetWanted
43d0: 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c  );.    db->mDbFl
43e0: 61 67 73 20 26 3d 20 7e 44 42 46 4c 41 47 5f 53  ags &= ~DBFLAG_S
43f0: 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 3b 0a 20 20  chemaKnownOk;.  
4400: 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 63 68  }.  if( db->nSch
4410: 65 6d 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  emaLock==0 ){.  
4420: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
4430: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
4440: 20 20 69 66 28 20 44 62 48 61 73 50 72 6f 70 65    if( DbHasPrope
4450: 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f 52 65  rty(db, i, DB_Re
4460: 73 65 74 57 61 6e 74 65 64 29 20 29 7b 0a 20 20  setWanted) ){.  
4470: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20 29        if( i==1 )
4480: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
4490: 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 64  te3SchemaClear(d
44a0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
44b0: 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  a);.        }els
44c0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
44d0: 69 74 65 33 53 63 68 65 6d 61 55 6e 75 73 65 28  ite3SchemaUnuse(
44e0: 64 62 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  db, i);.        
44f0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
4500: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61    }.}../*.** Era
4510: 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e  se all schema in
4520: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61  formation from a
4530: 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
4540: 62 61 73 65 73 20 28 69 6e 63 6c 75 64 69 6e 67  bases (including
4550: 0a 2a 2a 20 22 6d 61 69 6e 22 20 61 6e 64 20 22  .** "main" and "
4560: 74 65 6d 70 22 29 20 66 6f 72 20 61 20 73 69 6e  temp") for a sin
4570: 67 6c 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  gle database con
4580: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  nection..*/.void
4590: 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
45a0: 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
45b0: 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ion(sqlite3 *db)
45c0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c  {.  int i;.  sql
45d0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c  ite3BtreeEnterAl
45e0: 6c 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74 28  l(db);.  assert(
45f0: 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b   db->nSchemaLock
4600: 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ==0 );.  for(i=0
4610: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 3d 28  ; i<db->nDb; i=(
4620: 69 3f 69 2b 31 3a 32 29 29 7b 0a 20 20 20 20 73  i?i+1:2)){.    s
4630: 71 6c 69 74 65 33 53 63 68 65 6d 61 55 6e 75 73  qlite3SchemaUnus
4640: 65 28 64 62 2c 20 69 29 3b 0a 20 20 7d 0a 20 20  e(db, i);.  }.  
4650: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65  sqlite3SchemaCle
4660: 61 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  ar(db->aDb[1].pS
4670: 63 68 65 6d 61 29 3b 0a 20 20 64 62 2d 3e 6d 44  chema);.  db->mD
4680: 62 46 6c 61 67 73 20 26 3d 20 7e 28 44 42 46 4c  bFlags &= ~(DBFL
4690: 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 7c  AG_SchemaChange|
46a0: 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 4b 6e 6f  DBFLAG_SchemaKno
46b0: 77 6e 4f 6b 29 3b 0a 20 20 73 71 6c 69 74 65 33  wnOk);.  sqlite3
46c0: 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64  VtabUnlockList(d
46d0: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  b);.  sqlite3Btr
46e0: 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a  eeLeaveAll(db);.
46f0: 20 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73    sqlite3Collaps
4700: 65 44 61 74 61 62 61 73 65 41 72 72 61 79 28 64  eDatabaseArray(d
4710: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  b);.}../*.** Thi
4720: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
4730: 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69  led when a commi
4740: 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69  t occurs..*/.voi
4750: 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49  d sqlite3CommitI
4760: 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73  nternalChanges(s
4770: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64  qlite3 *db){.  d
4780: 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 3d 20 7e  b->mDbFlags &= ~
4790: 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61  DBFLAG_SchemaCha
47a0: 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  nge;.}../*.** De
47b0: 6c 65 74 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  lete memory allo
47c0: 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 63 6f  cated for the co
47d0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 20 61 20  lumn names of a 
47e0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 28 74  table or view (t
47f0: 68 65 0a 2a 2a 20 54 61 62 6c 65 2e 61 43 6f 6c  he.** Table.aCol
4800: 5b 5d 20 61 72 72 61 79 29 2e 0a 2a 2f 0a 76 6f  [] array)..*/.vo
4810: 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  id sqlite3Delete
4820: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 73 71 6c 69  ColumnNames(sqli
4830: 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  te3 *db, Table *
4840: 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69  pTable){.  int i
4850: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
4860: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
4870: 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28  le!=0 );.  if( (
4880: 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61  pCol = pTable->a
4890: 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 66  Col)!=0 ){.    f
48a0: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65  or(i=0; i<pTable
48b0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
48c0: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  l++){.      sqli
48d0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43  te3DbFree(db, pC
48e0: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
48f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
4900: 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44  ete(db, pCol->pD
4910: 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  flt);.      sqli
4920: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43  te3DbFree(db, pC
4930: 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  ol->zColl);.    
4940: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
4950: 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e  ree(db, pTable->
4960: 61 43 6f 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  aCol);.  }.}../*
4970: 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d  .** Remove the m
4980: 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63  emory data struc
4990: 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64  tures associated
49a0: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a   with the given.
49b0: 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68  ** Table.  No ch
49c0: 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74  anges are made t
49d0: 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72  o disk by this r
49e0: 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
49f0: 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20  is routine just 
4a00: 64 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61  deletes the data
4a10: 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20   structure.  It 
4a20: 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a  does not unlink.
4a30: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74  ** the table dat
4a40: 61 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d  a structure from
4a50: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e   the hash table.
4a60: 20 20 42 75 74 20 69 74 20 64 6f 65 73 20 64 65    But it does de
4a70: 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20  stroy.** memory 
4a80: 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 74 68  structures of th
4a90: 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f  e indices and fo
4aa0: 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63  reign keys assoc
4ab0: 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74  iated with .** t
4ac0: 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
4ad0: 54 68 65 20 64 62 20 70 61 72 61 6d 65 74 65 72  The db parameter
4ae0: 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49   is optional.  I
4af0: 74 20 69 73 20 6e 65 65 64 65 64 20 69 66 20 74  t is needed if t
4b00: 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20  he Table object 
4b10: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6c 6f 6f  .** contains loo
4b20: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 20 20  kaside memory.  
4b30: 28 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 69  (Table objects i
4b40: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 64 6f 20  n the schema do 
4b50: 6e 6f 74 20 75 73 65 0a 2a 2a 20 6c 6f 6f 6b 61  not use.** looka
4b60: 73 69 64 65 20 6d 65 6d 6f 72 79 2c 20 62 75 74  side memory, but
4b70: 20 73 6f 6d 65 20 65 70 68 65 6d 65 72 61 6c 20   some ephemeral 
4b80: 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 64 6f  Table objects do
4b90: 2e 29 20 20 4f 72 20 74 68 65 0a 2a 2a 20 64 62  .)  Or the.** db
4ba0: 20 70 61 72 61 6d 65 74 65 72 20 63 61 6e 20 62   parameter can b
4bb0: 65 20 75 73 65 64 20 77 69 74 68 20 64 62 2d 3e  e used with db->
4bc0: 70 6e 42 79 74 65 73 46 72 65 65 64 20 74 6f 20  pnBytesFreed to 
4bd0: 6d 65 61 73 75 72 65 20 74 68 65 20 6d 65 6d 6f  measure the memo
4be0: 72 79 0a 2a 2a 20 75 73 65 64 20 62 79 20 74 68  ry.** used by th
4bf0: 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 2e 0a  e Table object..
4c00: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53  */.static void S
4c10: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 64  QLITE_NOINLINE d
4c20: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
4c30: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
4c40: 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20  Table){.  Index 
4c50: 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b  *pIndex, *pNext;
4c60: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
4c70: 44 45 42 55 47 0a 20 20 2f 2a 20 52 65 63 6f 72  DEBUG.  /* Recor
4c80: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
4c90: 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 6f 6b  outstanding look
4ca0: 61 73 69 64 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  aside allocation
4cb0: 73 20 69 6e 20 73 63 68 65 6d 61 20 54 61 62 6c  s in schema Tabl
4cc0: 65 73 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f  es.  ** prior to
4cd0: 20 64 6f 69 6e 67 20 61 6e 79 20 66 72 65 65 28   doing any free(
4ce0: 29 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 53  ) operations.  S
4cf0: 69 6e 63 65 20 73 63 68 65 6d 61 20 54 61 62 6c  ince schema Tabl
4d00: 65 73 20 64 6f 20 6e 6f 74 20 75 73 65 0a 20 20  es do not use.  
4d10: 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 2c 20 74 68  ** lookaside, th
4d20: 69 73 20 6e 75 6d 62 65 72 20 73 68 6f 75 6c 64  is number should
4d30: 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f 0a   not change. */.
4d40: 20 20 69 6e 74 20 6e 4c 6f 6f 6b 61 73 69 64 65    int nLookaside
4d50: 20 3d 20 30 3b 0a 20 20 69 66 28 20 64 62 20 26   = 0;.  if( db &
4d60: 26 20 28 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c  & (pTable->tabFl
4d70: 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
4d80: 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4c  al)==0 ){.    nL
4d90: 6f 6f 6b 61 73 69 64 65 20 3d 20 73 71 6c 69 74  ookaside = sqlit
4da0: 65 33 4c 6f 6f 6b 61 73 69 64 65 55 73 65 64 28  e3LookasideUsed(
4db0: 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64  db, 0);.  }.#end
4dc0: 69 66 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  if..  /* Delete 
4dd0: 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f  all indices asso
4de0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
4df0: 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72   table. */.  for
4e00: 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65  (pIndex = pTable
4e10: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ->pIndex; pIndex
4e20: 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b  ; pIndex=pNext){
4e30: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e  .    pNext = pIn
4e40: 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  dex->pNext;.    
4e50: 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e  assert( pIndex->
4e60: 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65 2d  pSchema==pTable-
4e70: 3e 70 53 63 68 65 6d 61 0a 20 20 20 20 20 20 20  >pSchema.       
4e80: 20 20 7c 7c 20 28 49 73 56 69 72 74 75 61 6c 28    || (IsVirtual(
4e90: 70 54 61 62 6c 65 29 20 26 26 20 70 49 6e 64 65  pTable) && pInde
4ea0: 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49  x->idxType!=SQLI
4eb0: 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45  TE_IDXTYPE_APPDE
4ec0: 46 29 20 29 3b 0a 20 20 20 20 69 66 28 20 28 64  F) );.    if( (d
4ed0: 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 6e 42 79  b==0 || db->pnBy
4ee0: 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26 20  tesFreed==0) && 
4ef0: 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c  !IsVirtual(pTabl
4f00: 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  e) ){.      char
4f10: 20 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e 64 65 78   *zName = pIndex
4f20: 2d 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20 20 20 20  ->zName; .      
4f30: 54 45 53 54 4f 4e 4c 59 20 28 20 49 6e 64 65 78  TESTONLY ( Index
4f40: 20 2a 70 4f 6c 64 20 3d 20 29 20 73 71 6c 69 74   *pOld = ) sqlit
4f50: 65 33 48 61 73 68 49 6e 73 65 72 74 28 0a 20 20  e3HashInsert(.  
4f60: 20 20 20 20 20 20 20 26 70 49 6e 64 65 78 2d 3e         &pIndex->
4f70: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
4f80: 2c 20 7a 4e 61 6d 65 2c 20 30 0a 20 20 20 20 20  , zName, 0.     
4f90: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
4fa0: 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ( db==0 || sqlit
4fb0: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
4fc0: 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d  d(db, 0, pIndex-
4fd0: 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20  >pSchema) );.   
4fe0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d     assert( pOld=
4ff0: 3d 70 49 6e 64 65 78 20 7c 7c 20 70 4f 6c 64 3d  =pIndex || pOld=
5000: 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =0 );.    }.    
5010: 73 71 6c 69 74 65 33 46 72 65 65 49 6e 64 65 78  sqlite3FreeIndex
5020: 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  (db, pIndex);.  
5030: 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61  }..  /* Delete a
5040: 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  ny foreign keys 
5050: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 69 73  attached to this
5060: 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c   table. */.  sql
5070: 69 74 65 33 46 6b 44 65 6c 65 74 65 28 64 62 2c  ite3FkDelete(db,
5080: 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20   pTable);..  /* 
5090: 44 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65  Delete the Table
50a0: 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c   structure itsel
50b0: 66 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  f..  */.#ifdef S
50c0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52  QLITE_ENABLE_NOR
50d0: 4d 41 4c 49 5a 45 0a 20 20 69 66 28 20 70 54 61  MALIZE.  if( pTa
50e0: 62 6c 65 2d 3e 70 43 6f 6c 48 61 73 68 20 29 7b  ble->pColHash ){
50f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68  .    sqlite3Hash
5100: 43 6c 65 61 72 28 70 54 61 62 6c 65 2d 3e 70 43  Clear(pTable->pC
5110: 6f 6c 48 61 73 68 29 3b 0a 20 20 20 20 73 71 6c  olHash);.    sql
5120: 69 74 65 33 5f 66 72 65 65 28 70 54 61 62 6c 65  ite3_free(pTable
5130: 2d 3e 70 43 6f 6c 48 61 73 68 29 3b 0a 20 20 7d  ->pColHash);.  }
5140: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
5150: 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d  3DeleteColumnNam
5160: 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  es(db, pTable);.
5170: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5180: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  db, pTable->zNam
5190: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
51a0: 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e  ree(db, pTable->
51b0: 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69  zColAff);.  sqli
51c0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
51d0: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c  db, pTable->pSel
51e0: 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ect);.  sqlite3E
51f0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
5200: 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b  , pTable->pCheck
5210: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
5220: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
5230: 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61  BLE.  sqlite3Vta
5240: 62 43 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c  bClear(db, pTabl
5250: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  e);.#endif.  sql
5260: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5270: 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65  Table);..  /* Ve
5280: 72 69 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f  rify that no loo
5290: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 77 61  kaside memory wa
52a0: 73 20 75 73 65 64 20 62 79 20 73 63 68 65 6d 61  s used by schema
52b0: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73   tables */.  ass
52c0: 65 72 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d  ert( nLookaside=
52d0: 3d 30 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65  =0 || nLookaside
52e0: 3d 3d 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69  ==sqlite3Lookasi
52f0: 64 65 55 73 65 64 28 64 62 2c 30 29 20 29 3b 0a  deUsed(db,0) );.
5300: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  }.void sqlite3De
5310: 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65  leteTable(sqlite
5320: 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54  3 *db, Table *pT
5330: 61 62 6c 65 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e  able){.  /* Do n
5340: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 74 61  ot delete the ta
5350: 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65  ble until the re
5360: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65  ference count re
5370: 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20  aches zero. */. 
5380: 20 69 66 28 20 21 70 54 61 62 6c 65 20 29 20 72   if( !pTable ) r
5390: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 28 21  eturn;.  if( ((!
53a0: 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65  db || db->pnByte
53b0: 73 46 72 65 65 64 3d 3d 30 29 20 26 26 20 28 2d  sFreed==0) && (-
53c0: 2d 70 54 61 62 6c 65 2d 3e 6e 54 61 62 52 65 66  -pTable->nTabRef
53d0: 29 3e 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  )>0) ) return;. 
53e0: 20 64 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c   deleteTable(db,
53f0: 20 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f 2a   pTable);.}.../*
5400: 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67  .** Unlink the g
5410: 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20  iven table from 
5420: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 73 20  the hash tables 
5430: 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65 20 74  and the delete t
5440: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75  he.** table stru
5450: 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69  cture with all i
5460: 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66  ts indices and f
5470: 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a  oreign keys..*/.
5480: 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69  void sqlite3Unli
5490: 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65  nkAndDeleteTable
54a0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
54b0: 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61  t iDb, const cha
54c0: 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20  r *zTabName){.  
54d0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20 2a  Table *p;.  Db *
54e0: 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pDb;..  assert( 
54f0: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
5500: 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
5510: 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  <db->nDb );.  as
5520: 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 29  sert( zTabName )
5530: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
5540: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
5550: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
5560: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 7a 54  ;.  testcase( zT
5570: 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20  abName[0]==0 ); 
5580: 20 2f 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68 20   /* Zero-length 
5590: 74 61 62 6c 65 20 6e 61 6d 65 73 20 61 72 65 20  table names are 
55a0: 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44 62  allowed */.  pDb
55b0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
55c0: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48  ;.  p = sqlite3H
55d0: 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e  ashInsert(&pDb->
55e0: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
55f0: 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 30 29 3b 0a  , zTabName, 0);.
5600: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
5610: 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64  able(db, p);.  d
5620: 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44  b->mDbFlags |= D
5630: 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e  BFLAG_SchemaChan
5640: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  ge;.}../*.** Giv
5650: 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75  en a token, retu
5660: 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  rn a string that
5670: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65   consists of the
5680: 20 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a   text of that.**
5690: 20 74 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20 74   token.  Space t
56a0: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
56b0: 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73  ned string.** is
56c0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
56d0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
56e0: 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
56f0: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  by the calling.*
5700: 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  * function..**.*
5710: 2a 20 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e 20  * Any quotation 
5720: 6d 61 72 6b 73 20 28 65 78 3a 20 20 22 6e 61 6d  marks (ex:  "nam
5730: 65 22 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d  e", 'name', [nam
5740: 65 5d 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20 74  e], or `name`) t
5750: 68 61 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64 20  hat.** surround 
5760: 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20  the body of the 
5770: 74 6f 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76 65  token are remove
5780: 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20  d..**.** Tokens 
5790: 61 72 65 20 6f 66 74 65 6e 20 6a 75 73 74 20 70  are often just p
57a0: 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65  ointers into the
57b0: 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65   original SQL te
57c0: 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65  xt and so.** are
57d0: 20 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e   not \000 termin
57e0: 61 74 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74  ated and are not
57f0: 20 70 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68   persistent.  Th
5800: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
5810: 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72  g.** is \000 ter
5820: 6d 69 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70  minated and is p
5830: 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68  ersistent..*/.ch
5840: 61 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46  ar *sqlite3NameF
5850: 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65 33  romToken(sqlite3
5860: 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61   *db, Token *pNa
5870: 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  me){.  char *zNa
5880: 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 20  me;.  if( pName 
5890: 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  ){.    zName = s
58a0: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
58b0: 64 62 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d 65  db, (char*)pName
58c0: 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a  ->z, pName->n);.
58d0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
58e0: 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c  te(zName);.  }el
58f0: 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  se{.    zName = 
5900: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
5910: 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zName;.}../*.** 
5920: 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  Open the sqlite_
5930: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f  master table sto
5940: 72 65 64 20 69 6e 20 64 61 74 61 62 61 73 65 20  red in database 
5950: 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a  number iDb for.*
5960: 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74  * writing. The t
5970: 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75  able is opened u
5980: 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a  sing cursor 0..*
5990: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70  /.void sqlite3Op
59a0: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 50 61  enMasterTable(Pa
59b0: 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 29  rse *p, int iDb)
59c0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
59d0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 29 3b  lite3GetVdbe(p);
59e0: 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c  .  sqlite3TableL
59f0: 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53 54  ock(p, iDb, MAST
5a00: 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 4d 41 53 54  ER_ROOT, 1, MAST
5a10: 45 52 5f 4e 41 4d 45 29 3b 0a 20 20 73 71 6c 69  ER_NAME);.  sqli
5a20: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
5a30: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
5a40: 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  , 0, MASTER_ROOT
5a50: 2c 20 69 44 62 2c 20 35 29 3b 0a 20 20 69 66 28  , iDb, 5);.  if(
5a60: 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20   p->nTab==0 ){. 
5a70: 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a     p->nTab = 1;.
5a80: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72    }.}../*.** Par
5a90: 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69  ameter zName poi
5aa0: 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72  nts to a nul-ter
5ab0: 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72 20 63  minated buffer c
5ac0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61  ontaining the na
5ad0: 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61 62  me.** of a datab
5ae0: 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65  ase ("main", "te
5af0: 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20  mp" or the name 
5b00: 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  of an attached d
5b10: 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  b). This.** func
5b20: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
5b30: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61   index of the na
5b40: 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20  med database in 
5b50: 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a  db->aDb[], or.**
5b60: 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64   -1 if the named
5b70: 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f   db cannot be fo
5b80: 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  und..*/.int sqli
5b90: 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 73 71  te3FindDbName(sq
5ba0: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
5bb0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
5bc0: 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20   int i = -1;    
5bd0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
5be0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28   number */.  if(
5bf0: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44 62   zName ){.    Db
5c00: 20 2a 70 44 62 3b 0a 20 20 20 20 66 6f 72 28 69   *pDb;.    for(i
5c10: 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44  =(db->nDb-1), pD
5c20: 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69  b=&db->aDb[i]; i
5c30: 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29  >=0; i--, pDb--)
5c40: 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73  {.      if( 0==s
5c50: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70  qlite3_stricmp(p
5c60: 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a 4e  Db->zDbSName, zN
5c70: 61 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ame) ) break;.  
5c80: 20 20 20 20 2f 2a 20 22 6d 61 69 6e 22 20 69 73      /* "main" is
5c90: 20 61 6c 77 61 79 73 20 61 6e 20 61 63 63 65 70   always an accep
5ca0: 74 61 62 6c 65 20 61 6c 69 61 73 20 66 6f 72 20  table alias for 
5cb0: 74 68 65 20 70 72 69 6d 61 72 79 20 64 61 74 61  the primary data
5cc0: 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 65 76  base.      ** ev
5cd0: 65 6e 20 69 66 20 69 74 20 68 61 73 20 62 65 65  en if it has bee
5ce0: 6e 20 72 65 6e 61 6d 65 64 20 75 73 69 6e 67 20  n renamed using 
5cf0: 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
5d00: 4d 41 49 4e 44 42 4e 41 4d 45 2e 20 2a 2f 0a 20  MAINDBNAME. */. 
5d10: 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20 26 26       if( i==0 &&
5d20: 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69   0==sqlite3_stri
5d30: 63 6d 70 28 22 6d 61 69 6e 22 2c 20 7a 4e 61 6d  cmp("main", zNam
5d40: 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  e) ) break;.    
5d50: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  }.  }.  return i
5d60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  ;.}../*.** The t
5d70: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74  oken *pName cont
5d80: 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  ains the name of
5d90: 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69 74   a database (eit
5da0: 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a  her "main" or.**
5db0: 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e   "temp" or the n
5dc0: 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68  ame of an attach
5dd0: 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75  ed db). This rou
5de0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
5df0: 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65  .** index of the
5e00: 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20   named database 
5e10: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72  in db->aDb[], or
5e20: 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64   -1 if the named
5e30: 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74   db .** does not
5e40: 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73   exist..*/.int s
5e50: 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c  qlite3FindDb(sql
5e60: 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20  ite3 *db, Token 
5e70: 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *pName){.  int i
5e80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ea0: 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62  /* Database numb
5eb0: 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  er */.  char *zN
5ec0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
5ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5ee0: 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65 61 72  Name we are sear
5ef0: 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a  ching for */.  z
5f00: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
5f10: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
5f20: 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71  pName);.  i = sq
5f30: 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
5f40: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  db, zName);.  sq
5f50: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5f60: 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
5f70: 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61   i;.}../* The ta
5f80: 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74  ble or view or t
5f90: 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70  rigger name is p
5fa0: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f  assed to this ro
5fb0: 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73  utine via tokens
5fc0: 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70  .** pName1 and p
5fd0: 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61  Name2. If the ta
5fe0: 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c  ble name was ful
5ff0: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f  ly qualified, fo
6000: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
6010: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
6020: 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20  x.yyy (...);.** 
6030: 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20  .** Then pName1 
6040: 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20  is set to "xxx" 
6050: 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22  and pName2 "yyy"
6060: 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
6070: 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61  and if.** the ta
6080: 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  ble name is not 
6090: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
60a0: 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45   i.e.:.**.** CRE
60b0: 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e  ATE TABLE yyy(..
60c0: 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70  .);.**.** Then p
60d0: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
60e0: 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32  "yyy" and pName2
60f0: 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68   is ""..**.** Th
6100: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
6110: 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f  the *ppUnqual po
6120: 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  inter to point a
6130: 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61  t the token (pNa
6140: 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32  me1 or.** pName2
6150: 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68  ) that stores th
6160: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61  e unqualified ta
6170: 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69  ble name.  The i
6180: 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64  ndex of the.** d
6190: 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69 73  atabase "xxx" is
61a0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
61b0: 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  t sqlite3TwoPart
61c0: 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70  Name(.  Parse *p
61d0: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
61e0: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
61f0: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
6200: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
6210: 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54  Name1,      /* T
6220: 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65 20  he "xxx" in the 
6230: 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f  name "xxx.yyy" o
6240: 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b  r "xxx" */.  Tok
6250: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
6260: 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e   /* The "yyy" in
6270: 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79   the name "xxx.y
6280: 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  yy" */.  Token *
6290: 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20  *pUnqual     /* 
62a0: 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c  Write the unqual
62b0: 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d  ified object nam
62c0: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
62d0: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
62e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
62f0: 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74  tabase holding t
6300: 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  he object */.  s
6310: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
6320: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65  rse->db;..  asse
6330: 72 74 28 20 70 4e 61 6d 65 32 21 3d 30 20 29 3b  rt( pName2!=0 );
6340: 0a 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e  .  if( pName2->n
6350: 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62  >0 ){.    if( db
6360: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a  ->init.busy ) {.
6370: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
6380: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
6390: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 22  orrupt database"
63a0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
63b0: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  -1;.    }.    *p
63c0: 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b  Unqual = pName2;
63d0: 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
63e0: 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61  e3FindDb(db, pNa
63f0: 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44  me1);.    if( iD
6400: 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  b<0 ){.      sql
6410: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
6420: 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61  rse, "unknown da
6430: 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d  tabase %T", pNam
6440: 65 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  e1);.      retur
6450: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n -1;.    }.  }e
6460: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
6470: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30   db->init.iDb==0
6480: 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   || db->init.bus
6490: 79 20 7c 7c 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f  y || IN_RENAME_O
64a0: 42 4a 45 43 54 0a 20 20 20 20 20 20 20 20 20 20  BJECT.          
64b0: 20 20 20 7c 7c 20 28 64 62 2d 3e 6d 44 62 46 6c     || (db->mDbFl
64c0: 61 67 73 20 26 20 44 42 46 4c 41 47 5f 56 61 63  ags & DBFLAG_Vac
64d0: 75 75 6d 29 21 3d 30 29 3b 0a 20 20 20 20 69 44  uum)!=0);.    iD
64e0: 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  b = db->init.iDb
64f0: 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d  ;.    *pUnqual =
6500: 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72   pName1;.  }.  r
6510: 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a  eturn iDb;.}../*
6520: 0a 2a 2a 20 54 72 75 65 20 69 66 20 50 52 41 47  .** True if PRAG
6530: 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65  MA writable_sche
6540: 6d 61 20 69 73 20 4f 4e 0a 2a 2f 0a 69 6e 74 20  ma is ON.*/.int 
6550: 73 71 6c 69 74 65 33 57 72 69 74 61 62 6c 65 53  sqlite3WritableS
6560: 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64  chema(sqlite3 *d
6570: 62 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20  b){.  testcase( 
6580: 28 64 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49  (db->flags&(SQLI
6590: 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c 53  TE_WriteSchema|S
65a0: 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65 29  QLITE_Defensive)
65b0: 29 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  )==0 );.  testca
65c0: 73 65 28 20 28 64 62 2d 3e 66 6c 61 67 73 26 28  se( (db->flags&(
65d0: 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65  SQLITE_WriteSche
65e0: 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e 73  ma|SQLITE_Defens
65f0: 69 76 65 29 29 3d 3d 0a 20 20 20 20 20 20 20 20  ive))==.        
6600: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 72         SQLITE_Wr
6610: 69 74 65 53 63 68 65 6d 61 20 29 3b 0a 20 20 74  iteSchema );.  t
6620: 65 73 74 63 61 73 65 28 20 28 64 62 2d 3e 66 6c  estcase( (db->fl
6630: 61 67 73 26 28 53 51 4c 49 54 45 5f 57 72 69 74  ags&(SQLITE_Writ
6640: 65 53 63 68 65 6d 61 7c 53 51 4c 49 54 45 5f 44  eSchema|SQLITE_D
6650: 65 66 65 6e 73 69 76 65 29 29 3d 3d 0a 20 20 20  efensive))==.   
6660: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
6670: 54 45 5f 44 65 66 65 6e 73 69 76 65 20 29 3b 0a  TE_Defensive );.
6680: 20 20 74 65 73 74 63 61 73 65 28 20 28 64 62 2d    testcase( (db-
6690: 3e 66 6c 61 67 73 26 28 53 51 4c 49 54 45 5f 57  >flags&(SQLITE_W
66a0: 72 69 74 65 53 63 68 65 6d 61 7c 53 51 4c 49 54  riteSchema|SQLIT
66b0: 45 5f 44 65 66 65 6e 73 69 76 65 29 29 3d 3d 0a  E_Defensive))==.
66c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
66d0: 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65  SQLITE_WriteSche
66e0: 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e 73  ma|SQLITE_Defens
66f0: 69 76 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ive) );.  return
6700: 20 28 64 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c   (db->flags&(SQL
6710: 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c  ITE_WriteSchema|
6720: 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65  SQLITE_Defensive
6730: 29 29 3d 3d 53 51 4c 49 54 45 5f 57 72 69 74 65  ))==SQLITE_Write
6740: 53 63 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Schema;.}../*.**
6750: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
6760: 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69   used to check i
6770: 66 20 74 68 65 20 55 54 46 2d 38 20 73 74 72 69  f the UTF-8 stri
6780: 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65  ng zName is a le
6790: 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69  gal.** unqualifi
67a0: 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65  ed name for a ne
67b0: 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20  w schema object 
67c0: 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76  (table, index, v
67d0: 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65  iew or.** trigge
67e0: 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72  r). All names ar
67f0: 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20 74  e legal except t
6800: 68 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e 20  hose that begin 
6810: 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67 0a  with the string.
6820: 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69 6e  ** "sqlite_" (in
6830: 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72   upper, lower or
6840: 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54 68   mixed case). Th
6850: 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  is portion of th
6860: 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69  e namespace.** i
6870: 73 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69  s reserved for i
6880: 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a  nternal use..*/.
6890: 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b  int sqlite3Check
68a0: 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65  ObjectName(Parse
68b0: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
68c0: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
68d0: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d  if( !pParse->db-
68e0: 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50  >init.busy && pP
68f0: 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20  arse->nested==0 
6900: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71  .          && sq
6910: 6c 69 74 65 33 57 72 69 74 61 62 6c 65 53 63 68  lite3WritableSch
6920: 65 6d 61 28 70 50 61 72 73 65 2d 3e 64 62 29 3d  ema(pParse->db)=
6930: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  =0.          && 
6940: 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43  0==sqlite3StrNIC
6950: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
6960: 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73  e_", 7) ){.    s
6970: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
6980: 50 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e  Parse, "object n
6990: 61 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f 72  ame reserved for
69a0: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25   internal use: %
69b0: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
69c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
69d0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
69e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
69f0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
6a00: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
6a10: 65 78 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2f  ex of a table.*/
6a20: 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 50  .Index *sqlite3P
6a30: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 54  rimaryKeyIndex(T
6a40: 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49  able *pTab){.  I
6a50: 6e 64 65 78 20 2a 70 3b 0a 20 20 66 6f 72 28 70  ndex *p;.  for(p
6a60: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
6a70: 20 26 26 20 21 49 73 50 72 69 6d 61 72 79 4b 65   && !IsPrimaryKe
6a80: 79 49 6e 64 65 78 28 70 29 3b 20 70 3d 70 2d 3e  yIndex(p); p=p->
6a90: 70 4e 65 78 74 29 7b 7d 0a 20 20 72 65 74 75 72  pNext){}.  retur
6aa0: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n p;.}../*.** Re
6ab0: 74 75 72 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  turn the column 
6ac0: 6f 66 20 69 6e 64 65 78 20 70 49 64 78 20 74 68  of index pIdx th
6ad0: 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  at corresponds t
6ae0: 6f 20 74 61 62 6c 65 0a 2a 2a 20 63 6f 6c 75 6d  o table.** colum
6af0: 6e 20 69 43 6f 6c 2e 20 20 52 65 74 75 72 6e 20  n iCol.  Return 
6b00: 2d 31 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  -1 if not found.
6b10: 0a 2a 2f 0a 69 31 36 20 73 71 6c 69 74 65 33 43  .*/.i16 sqlite3C
6b20: 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 49 6e 64  olumnOfIndex(Ind
6b30: 65 78 20 2a 70 49 64 78 2c 20 69 31 36 20 69 43  ex *pIdx, i16 iC
6b40: 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ol){.  int i;.  
6b50: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
6b60: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
6b70: 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 49      if( iCol==pI
6b80: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  dx->aiColumn[i] 
6b90: 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a  ) return i;.  }.
6ba0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
6bb0: 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73  /*.** Begin cons
6bc0: 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74  tructing a new t
6bd0: 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74  able representat
6be0: 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20  ion in memory.  
6bf0: 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66  This is.** the f
6c00: 69 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20  irst of several 
6c10: 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  action routines 
6c20: 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20  that get called 
6c30: 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74  in response.** t
6c40: 6f 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  o a CREATE TABLE
6c50: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20   statement.  In 
6c60: 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73  particular, this
6c70: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
6c80: 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69  ed.** after seei
6c90: 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54  ng tokens "CREAT
6ca0: 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61  E" and "TABLE" a
6cb0: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  nd the table nam
6cc0: 65 2e 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a  e. The isTemp.**
6cd0: 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66   flag is true if
6ce0: 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c   the table shoul
6cf0: 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  d be stored in t
6d00: 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
6d10: 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e  abase.** file in
6d20: 73 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20  stead of in the 
6d30: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
6d40: 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  le.  This is nor
6d50: 6d 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a  mally the case.*
6d60: 2a 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50  * when the "TEMP
6d70: 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22  " or "TEMPORARY"
6d80: 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20   keyword occurs 
6d90: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52  in between.** CR
6da0: 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a  EATE and TABLE..
6db0: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61  **.** The new ta
6dc0: 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e  ble record is in
6dd0: 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75  itialized and pu
6de0: 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65  t in pParse->pNe
6df0: 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f  wTable..** As mo
6e00: 72 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  re of the CREATE
6e10: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
6e20: 20 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69   is parsed, addi
6e30: 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a  tional action.**
6e40: 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62   routines will b
6e50: 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20  e called to add 
6e60: 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  more information
6e70: 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e   to this record.
6e80: 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
6e90: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
6ea0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  LE statement, th
6eb0: 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  e sqlite3EndTabl
6ec0: 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  e() routine.** i
6ed0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70  s called to comp
6ee0: 6c 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75  lete the constru
6ef0: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77  ction of the new
6f00: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a   table record..*
6f10: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74  /.void sqlite3St
6f20: 61 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73  artTable(.  Pars
6f30: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
6f40: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
6f50: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
6f60: 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61  1,   /* First pa
6f70: 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f  rt of the name o
6f80: 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76  f the table or v
6f90: 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  iew */.  Token *
6fa0: 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63  pName2,   /* Sec
6fb0: 6f 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ond part of the 
6fc0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
6fd0: 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69  e or view */.  i
6fe0: 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20  nt isTemp,      
6ff0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
7000: 69 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20  is a TEMP table 
7010: 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c  */.  int isView,
7020: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
7030: 20 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20   this is a VIEW 
7040: 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75  */.  int isVirtu
7050: 61 6c 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66  al,   /* True if
7060: 20 74 68 69 73 20 69 73 20 61 20 56 49 52 54 55   this is a VIRTU
7070: 41 4c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  AL table */.  in
7080: 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f  t noErr        /
7090: 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20  * Do nothing if 
70a0: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78  table already ex
70b0: 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ists */.){.  Tab
70c0: 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68  le *pTable;.  ch
70d0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f  ar *zName = 0; /
70e0: 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * The name of th
70f0: 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20  e new table */. 
7100: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
7110: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62  Parse->db;.  Vdb
7120: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b  e *v;.  int iDb;
7130: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
7140: 62 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63  base number to c
7150: 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  reate the table 
7160: 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  in */.  Token *p
7170: 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75  Name;    /* Unqu
7180: 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20  alified name of 
7190: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65  the table to cre
71a0: 61 74 65 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62  ate */..  if( db
71b0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 64  ->init.busy && d
71c0: 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3d  b->init.newTnum=
71d0: 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 53 70 65  =1 ){.    /* Spe
71e0: 63 69 61 6c 20 63 61 73 65 3a 20 20 50 61 72 73  cial case:  Pars
71f0: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ing the sqlite_m
7200: 61 73 74 65 72 20 6f 72 20 73 71 6c 69 74 65 5f  aster or sqlite_
7210: 74 65 6d 70 5f 6d 61 73 74 65 72 20 73 63 68 65  temp_master sche
7220: 6d 61 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20  ma */.    iDb = 
7230: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20  db->init.iDb;.  
7240: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
7250: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 53 43  3DbStrDup(db, SC
7260: 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29  HEMA_TABLE(iDb))
7270: 3b 0a 20 20 20 20 70 4e 61 6d 65 20 3d 20 70 4e  ;.    pName = pN
7280: 61 6d 65 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame1;.  }else{. 
7290: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e     /* The common
72a0: 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 69 44 62   case */.    iDb
72b0: 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72   = sqlite3TwoPar
72c0: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
72d0: 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
72e0: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69  Name);.    if( i
72f0: 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Db<0 ) return;. 
7300: 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
7310: 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 26 26  PDB && isTemp &&
7320: 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 26 26 20   pName2->n>0 && 
7330: 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb!=1 ){.      
7340: 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61  /* If creating a
7350: 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65   temp table, the
7360: 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65   name may not be
7370: 20 71 75 61 6c 69 66 69 65 64 2e 20 55 6e 6c 65   qualified. Unle
7380: 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ss .      ** the
7390: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69   database name i
73a0: 73 20 22 74 65 6d 70 22 20 61 6e 79 77 61 79 2e  s "temp" anyway.
73b0: 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
73c0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
73d0: 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61  e, "temporary ta
73e0: 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65  ble name must be
73f0: 20 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a   unqualified");.
7400: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
7410: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49    }.    if( !OMI
7420: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65  T_TEMPDB && isTe
7430: 6d 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 20 20  mp ) iDb = 1;.  
7440: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
7450: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
7460: 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  b, pName);.    i
7470: 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
7480: 45 43 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ECT ){.      sql
7490: 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d  ite3RenameTokenM
74a0: 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64  ap(pParse, (void
74b0: 2a 29 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 29 3b  *)zName, pName);
74c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61  .    }.  }.  pPa
74d0: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20  rse->sNameToken 
74e0: 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 69 66 28 20  = *pName;.  if( 
74f0: 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
7500: 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  n;.  if( SQLITE_
7510: 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
7520: 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
7530: 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
7540: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
7550: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69  e_error;.  }.  i
7560: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d  f( db->init.iDb=
7570: 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b  =1 ) isTemp = 1;
7580: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7590: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
75a0: 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 69 73 54  ON.  assert( isT
75b0: 65 6d 70 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70  emp==0 || isTemp
75c0: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
75d0: 20 69 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73   isView==0 || is
75e0: 56 69 65 77 3d 3d 31 20 29 3b 0a 20 20 7b 0a 20  View==1 );.  {. 
75f0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
7600: 75 38 20 61 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20  u8 aCode[] = {. 
7610: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45        SQLITE_CRE
7620: 41 54 45 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20  ATE_TABLE,.     
7630: 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f    SQLITE_CREATE_
7640: 54 45 4d 50 5f 54 41 42 4c 45 2c 0a 20 20 20 20  TEMP_TABLE,.    
7650: 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45     SQLITE_CREATE
7660: 5f 56 49 45 57 2c 0a 20 20 20 20 20 20 20 53 51  _VIEW,.       SQ
7670: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
7680: 5f 56 49 45 57 0a 20 20 20 20 7d 3b 0a 20 20 20  _VIEW.    };.   
7690: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
76a0: 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
76b0: 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  me;.    if( sqli
76c0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
76d0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
76e0: 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
76f0: 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62  (isTemp), 0, zDb
7700: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
7710: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
7720: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
7730: 20 21 69 73 56 69 72 74 75 61 6c 20 26 26 20 73   !isVirtual && s
7740: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
7750: 70 50 61 72 73 65 2c 20 28 69 6e 74 29 61 43 6f  pParse, (int)aCo
7760: 64 65 5b 69 73 54 65 6d 70 2b 32 2a 69 73 56 69  de[isTemp+2*isVi
7770: 65 77 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ew],.           
7780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7790: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
77a0: 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  e, 0, zDb) ){.  
77b0: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
77c0: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
77d0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
77e0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
77f0: 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20   new table name 
7800: 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65  does not collide
7810: 20 77 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e   with an existin
7820: 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20  g.  ** index or 
7830: 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68  table name in th
7840: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e  e same database.
7850: 20 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72    Issue an error
7860: 20 6d 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a   message if.  **
7870: 20 69 74 20 64 6f 65 73 2e 20 54 68 65 20 65 78   it does. The ex
7880: 63 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68  ception is if th
7890: 65 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  e statement bein
78a0: 67 20 70 61 72 73 65 64 20 77 61 73 20 70 61 73  g parsed was pas
78b0: 73 65 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73  sed.  ** to an s
78c0: 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76  qlite3_declare_v
78d0: 74 61 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74  tab() call. In t
78e0: 68 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 74 68  hat case only th
78f0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20  e column names. 
7900: 20 2a 2a 20 61 6e 64 20 74 79 70 65 73 20 77 69   ** and types wi
7910: 6c 6c 20 62 65 20 75 73 65 64 2c 20 73 6f 20 74  ll be used, so t
7920: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
7930: 74 6f 20 74 65 73 74 20 66 6f 72 20 6e 61 6d 65  to test for name
7940: 73 70 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69  space.  ** colli
7950: 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  sions..  */.  if
7960: 28 20 21 49 4e 5f 53 50 45 43 49 41 4c 5f 50 41  ( !IN_SPECIAL_PA
7970: 52 53 45 20 29 7b 0a 20 20 20 20 63 68 61 72 20  RSE ){.    char 
7980: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
7990: 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20  Db].zDbSName;.  
79a0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
79b0: 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
79c0: 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
79d0: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
79e0: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
79f0: 7d 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20 73  }.    pTable = s
7a00: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
7a10: 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b  db, zName, zDb);
7a20: 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 20  .    if( pTable 
7a30: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6e 6f  ){.      if( !no
7a40: 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Err ){.        s
7a50: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
7a60: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54  Parse, "table %T
7a70: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
7a80: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , pName);.      
7a90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
7aa0: 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
7ab0: 2e 62 75 73 79 20 7c 7c 20 43 4f 52 52 55 50 54  .busy || CORRUPT
7ac0: 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 20 20 73  _DB );.        s
7ad0: 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
7ae0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
7af0: 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Db);.      }.   
7b00: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
7b10: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
7b20: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
7b30: 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
7b40: 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a  ame, zDb)!=0 ){.
7b50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
7b60: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
7b70: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
7b80: 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 25  an index named %
7b90: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
7ba0: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
7bb0: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
7bc0: 20 20 7d 0a 0a 20 20 70 54 61 62 6c 65 20 3d 20    }..  pTable = 
7bd0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
7be0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
7bf0: 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20 70 54  able));.  if( pT
7c00: 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 61  able==0 ){.    a
7c10: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
7c20: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70  cFailed );.    p
7c30: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
7c40: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
7c50: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
7c60: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69  +;.    goto begi
7c70: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
7c80: 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61   }.  pTable->zNa
7c90: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54  me = zName;.  pT
7ca0: 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  able->iPKey = -1
7cb0: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68  ;.  pTable->pSch
7cc0: 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  ema = db->aDb[iD
7cd0: 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54  b].pSchema;.  pT
7ce0: 61 62 6c 65 2d 3e 6e 54 61 62 52 65 66 20 3d 20  able->nTabRef = 
7cf0: 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  1;.#ifdef SQLITE
7d00: 5f 44 45 46 41 55 4c 54 5f 52 4f 57 45 53 54 0a  _DEFAULT_ROWEST.
7d10: 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f    pTable->nRowLo
7d20: 67 45 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f  gEst = sqlite3Lo
7d30: 67 45 73 74 28 53 51 4c 49 54 45 5f 44 45 46 41  gEst(SQLITE_DEFA
7d40: 55 4c 54 5f 52 4f 57 45 53 54 29 3b 0a 23 65 6c  ULT_ROWEST);.#el
7d50: 73 65 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f  se.  pTable->nRo
7d60: 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61  wLogEst = 200; a
7d70: 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69  ssert( 200==sqli
7d80: 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37  te3LogEst(104857
7d90: 36 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  6) );.#endif.  a
7da0: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
7db0: 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  NewTable==0 );. 
7dc0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
7dd0: 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20  le = pTable;..  
7de0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
7df0: 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73  e magic sqlite_s
7e00: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73  equence table us
7e10: 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d  ed by autoincrem
7e20: 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72  ent,.  ** then r
7e30: 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20  ecord a pointer 
7e40: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e  to this table in
7e50: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
7e60: 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  se structure.  *
7e70: 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54  * so that INSERT
7e80: 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61   can find the ta
7e90: 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f  ble easily..  */
7ea0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7eb0: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
7ec0: 4e 54 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  NT.  if( !pParse
7ed0: 2d 3e 6e 65 73 74 65 64 20 26 26 20 73 74 72 63  ->nested && strc
7ee0: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
7ef0: 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20  e_sequence")==0 
7f00: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
7f10: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
7f20: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
7f30: 29 20 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d  ) );.    pTable-
7f40: 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61  >pSchema->pSeqTa
7f50: 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a  b = pTable;.  }.
7f60: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67  #endif..  /* Beg
7f70: 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  in generating th
7f80: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
7f90: 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c   insert the tabl
7fa0: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20  e record into.  
7fb0: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  ** the SQLITE_MA
7fc0: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74  STER table.  Not
7fd0: 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20  e in particular 
7fe0: 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20  that we must go 
7ff0: 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61  ahead.  ** and a
8000: 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f  llocate the reco
8010: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
8020: 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f  e table entry no
8030: 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20  w.  Before any. 
8040: 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   ** PRIMARY KEY 
8050: 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72  or UNIQUE keywor
8060: 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20  ds are parsed.  
8070: 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77  Those keywords w
8080: 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69  ill cause.  ** i
8090: 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65  ndices to be cre
80a0: 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62  ated and the tab
80b0: 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63  le record must c
80c0: 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a  ome before the .
80d0: 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48    ** indices.  H
80e0: 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64  ence, the record
80f0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
8100: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c  table must be al
8110: 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77  located.  ** now
8120: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ..  */.  if( !db
8130: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28  ->init.busy && (
8140: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
8150: 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29  be(pParse))!=0 )
8160: 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b  {.    int addr1;
8170: 0a 20 20 20 20 69 6e 74 20 66 69 6c 65 46 6f 72  .    int fileFor
8180: 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  mat;.    int reg
8190: 31 2c 20 72 65 67 32 2c 20 72 65 67 33 3b 0a 20  1, reg2, reg3;. 
81a0: 20 20 20 2f 2a 20 6e 75 6c 6c 52 6f 77 5b 5d 20     /* nullRow[] 
81b0: 69 73 20 61 6e 20 4f 50 5f 52 65 63 6f 72 64 20  is an OP_Record 
81c0: 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 6f  encoding of a ro
81d0: 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 35 20 4e  w containing 5 N
81e0: 55 4c 4c 73 20 2a 2f 0a 20 20 20 20 73 74 61 74  ULLs */.    stat
81f0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6e 75  ic const char nu
8200: 6c 6c 52 6f 77 5b 5d 20 3d 20 7b 20 36 2c 20 30  llRow[] = { 6, 0
8210: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a  , 0, 0, 0, 0 };.
8220: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
8230: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
8240: 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a  Parse, 1, iDb);.
8250: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8260: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
8270: 45 0a 20 20 20 20 69 66 28 20 69 73 56 69 72 74  E.    if( isVirt
8280: 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ual ){.      sql
8290: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
82a0: 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20  , OP_VBegin);.  
82b0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
82c0: 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 66  /* If the file f
82d0: 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64 69  ormat and encodi
82e0: 6e 67 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ng in the databa
82f0: 73 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e  se have not been
8300: 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65   set, .    ** se
8310: 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20  t them now..    
8320: 2a 2f 0a 20 20 20 20 72 65 67 31 20 3d 20 70 50  */.    reg1 = pP
8330: 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d  arse->regRowid =
8340: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
8350: 0a 20 20 20 20 72 65 67 32 20 3d 20 70 50 61 72  .    reg2 = pPar
8360: 73 65 2d 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b  se->regRoot = ++
8370: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
8380: 20 20 72 65 67 33 20 3d 20 2b 2b 70 50 61 72 73    reg3 = ++pPars
8390: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
83a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
83b0: 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c  , OP_ReadCookie,
83c0: 20 69 44 62 2c 20 72 65 67 33 2c 20 42 54 52 45   iDb, reg3, BTRE
83d0: 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a  E_FILE_FORMAT);.
83e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
83f0: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
8400: 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71  ;.    addr1 = sq
8410: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
8420: 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b  v, OP_If, reg3);
8430: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
8440: 3b 0a 20 20 20 20 66 69 6c 65 46 6f 72 6d 61 74  ;.    fileFormat
8450: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
8460: 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c  SQLITE_LegacyFil
8470: 65 46 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20 20  eFmt)!=0 ?.     
8480: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 3a               1 :
8490: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45   SQLITE_MAX_FILE
84a0: 5f 46 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c  _FORMAT;.    sql
84b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
84c0: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
84d0: 69 44 62 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f  iDb, BTREE_FILE_
84e0: 46 4f 52 4d 41 54 2c 20 66 69 6c 65 46 6f 72 6d  FORMAT, fileForm
84f0: 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  at);.    sqlite3
8500: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8510: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
8520: 20 42 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f   BTREE_TEXT_ENCO
8530: 44 49 4e 47 2c 20 45 4e 43 28 64 62 29 29 3b 0a  DING, ENC(db));.
8540: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
8550: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
8560: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  );..    /* This 
8570: 6a 75 73 74 20 63 72 65 61 74 65 73 20 61 20 70  just creates a p
8580: 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f  lace-holder reco
8590: 72 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  rd in the sqlite
85a0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20  _master table.. 
85b0: 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64     ** The record
85c0: 20 63 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f   created does no
85d0: 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69  t contain anythi
85e0: 6e 67 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c  ng yet.  It will
85f0: 20 62 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20   be replaced.   
8600: 20 2a 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20   ** by the real 
8610: 65 6e 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65  entry in code ge
8620: 6e 65 72 61 74 65 64 20 61 74 20 73 71 6c 69 74  nerated at sqlit
8630: 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20  e3EndTable()..  
8640: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
8650: 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65  rowid for the ne
8660: 77 20 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20  w entry is left 
8670: 69 6e 20 72 65 67 69 73 74 65 72 20 70 50 61 72  in register pPar
8680: 73 65 2d 3e 72 65 67 52 6f 77 69 64 2e 0a 20 20  se->regRowid..  
8690: 20 20 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61    ** The root pa
86a0: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
86b0: 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 6c 65   new table is le
86c0: 66 74 20 69 6e 20 72 65 67 20 70 50 61 72 73 65  ft in reg pParse
86d0: 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a  ->regRoot..    *
86e0: 2a 20 54 68 65 20 72 6f 77 69 64 20 61 6e 64 20  * The rowid and 
86f0: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
8700: 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65 65 64   values are need
8710: 65 64 20 62 79 20 74 68 65 20 63 6f 64 65 20 74  ed by the code t
8720: 68 61 74 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  hat.    ** sqlit
8730: 65 33 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 20  e3EndTable will 
8740: 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f  generate..    */
8750: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
8760: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
8770: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
8780: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
8790: 41 42 4c 45 29 0a 20 20 20 20 69 66 28 20 69 73  ABLE).    if( is
87a0: 56 69 65 77 20 7c 7c 20 69 73 56 69 72 74 75 61  View || isVirtua
87b0: 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
87c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
87d0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
87e0: 65 67 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  eg2);.    }else.
87f0: 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20  #endif.    {.   
8800: 20 20 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43     pParse->addrC
8810: 72 54 61 62 20 3d 0a 20 20 20 20 20 20 20 20 20  rTab =.         
8820: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8830: 33 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 42 74  3(v, OP_CreateBt
8840: 72 65 65 2c 20 69 44 62 2c 20 72 65 67 32 2c 20  ree, iDb, reg2, 
8850: 42 54 52 45 45 5f 49 4e 54 4b 45 59 29 3b 0a 20  BTREE_INTKEY);. 
8860: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
8870: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
8880: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
8890: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
88a0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
88b0: 69 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20 20  id, 0, reg1);.  
88c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
88d0: 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20  Op4(v, OP_Blob, 
88e0: 36 2c 20 72 65 67 33 2c 20 30 2c 20 6e 75 6c 6c  6, reg3, 0, null
88f0: 52 6f 77 2c 20 50 34 5f 53 54 41 54 49 43 29 3b  Row, P4_STATIC);
8900: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8910: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
8920: 65 72 74 2c 20 30 2c 20 72 65 67 33 2c 20 72 65  ert, 0, reg3, re
8930: 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g1);.    sqlite3
8940: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
8950: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
8960: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8970: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp0(v, OP_Clos
8980: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  e);.  }..  /* No
8990: 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29  rmal (non-error)
89a0: 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65   return. */.  re
89b0: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  turn;..  /* If a
89c0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
89d0: 77 65 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a  we jump here */.
89e0: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
89f0: 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  r:.  sqlite3DbFr
8a00: 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ee(db, zName);. 
8a10: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53   return;.}../* S
8a20: 65 74 20 70 72 6f 70 65 72 74 69 65 73 20 6f 66  et properties of
8a30: 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20   a table column 
8a40: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 28 6d 61  based on the (ma
8a50: 67 69 63 61 6c 29 0a 2a 2a 20 6e 61 6d 65 20 6f  gical).** name o
8a60: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f  f the column..*/
8a70: 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
8a80: 4c 45 5f 48 49 44 44 45 4e 5f 43 4f 4c 55 4d 4e  LE_HIDDEN_COLUMN
8a90: 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  S.void sqlite3Co
8aa0: 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72  lumnPropertiesFr
8ab0: 6f 6d 4e 61 6d 65 28 54 61 62 6c 65 20 2a 70 54  omName(Table *pT
8ac0: 61 62 2c 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ab, Column *pCol
8ad0: 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
8ae0: 5f 73 74 72 6e 69 63 6d 70 28 70 43 6f 6c 2d 3e  _strnicmp(pCol->
8af0: 7a 4e 61 6d 65 2c 20 22 5f 5f 68 69 64 64 65 6e  zName, "__hidden
8b00: 5f 5f 22 2c 20 31 30 29 3d 3d 30 20 29 7b 0a 20  __", 10)==0 ){. 
8b10: 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67     pCol->colFlag
8b20: 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 49 44  s |= COLFLAG_HID
8b30: 44 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  DEN;.  }else if(
8b40: 20 70 54 61 62 20 26 26 20 70 43 6f 6c 21 3d 70   pTab && pCol!=p
8b50: 54 61 62 2d 3e 61 43 6f 6c 20 26 26 20 28 70 43  Tab->aCol && (pC
8b60: 6f 6c 5b 2d 31 5d 2e 63 6f 6c 46 6c 61 67 73 20  ol[-1].colFlags 
8b70: 26 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e  & COLFLAG_HIDDEN
8b80: 29 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 74  ) ){.    pTab->t
8b90: 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 4f 4f  abFlags |= TF_OO
8ba0: 4f 48 69 64 64 65 6e 3b 0a 20 20 7d 0a 7d 0a 23  OHidden;.  }.}.#
8bb0: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64  endif.../*.** Ad
8bc0: 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74  d a new column t
8bd0: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
8be0: 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73  ently being cons
8bf0: 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  tructed..**.** T
8c00: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
8c10: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63  this routine onc
8c20: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
8c30: 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a  n declaration.**
8c40: 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42   in a CREATE TAB
8c50: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73  LE statement.  s
8c60: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
8c70: 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a  () gets called.*
8c80: 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74 20 74  * first to get t
8c90: 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68  hings going.  Th
8ca0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
8cb0: 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61  is called for ea
8cc0: 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f  ch.** column..*/
8cd0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
8ce0: 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50  Column(Parse *pP
8cf0: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
8d00: 6d 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65  me, Token *pType
8d10: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
8d20: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
8d30: 7a 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65  z;.  char *zType
8d40: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
8d50: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
8d60: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
8d70: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
8d80: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
8d90: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
8da0: 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69  ->nCol+1>db->aLi
8db0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
8dc0: 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20  _COLUMN] ){.    
8dd0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
8de0: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
8df0: 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22  y columns on %s"
8e00: 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  , p->zName);.   
8e10: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a   return;.  }.  z
8e20: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
8e30: 6f 63 52 61 77 28 64 62 2c 20 70 4e 61 6d 65 2d  ocRaw(db, pName-
8e40: 3e 6e 20 2b 20 70 54 79 70 65 2d 3e 6e 20 2b 20  >n + pType->n + 
8e50: 32 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  2);.  if( z==0 )
8e60: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 49   return;.  if( I
8e70: 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
8e80: 29 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54  ) sqlite3RenameT
8e90: 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20  okenMap(pParse, 
8ea0: 28 76 6f 69 64 2a 29 7a 2c 20 70 4e 61 6d 65 29  (void*)z, pName)
8eb0: 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 4e  ;.  memcpy(z, pN
8ec0: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
8ed0: 29 3b 0a 20 20 7a 5b 70 4e 61 6d 65 2d 3e 6e 5d  );.  z[pName->n]
8ee0: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
8ef0: 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f 72  equote(z);.  for
8f00: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b  (i=0; i<p->nCol;
8f10: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
8f20: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
8f30: 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  , p->aCol[i].zNa
8f40: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
8f50: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
8f60: 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61  pParse, "duplica
8f70: 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20  te column name: 
8f80: 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73  %s", z);.      s
8f90: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8fa0: 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   z);.      retur
8fb0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  n;.    }.  }.  i
8fc0: 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78  f( (p->nCol & 0x
8fd0: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c  7)==0 ){.    Col
8fe0: 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61  umn *aNew;.    a
8ff0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
9000: 65 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f  ealloc(db,p->aCo
9010: 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69  l,(p->nCol+8)*si
9020: 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29  zeof(p->aCol[0])
9030: 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d  );.    if( aNew=
9040: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
9050: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
9060: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
9070: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f      }.    p->aCo
9080: 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20  l = aNew;.  }.  
9090: 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b  pCol = &p->aCol[
90a0: 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73  p->nCol];.  mems
90b0: 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65  et(pCol, 0, size
90c0: 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b  of(p->aCol[0]));
90d0: 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d  .  pCol->zName =
90e0: 20 7a 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c   z;.  sqlite3Col
90f0: 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f  umnPropertiesFro
9100: 6d 4e 61 6d 65 28 70 2c 20 70 43 6f 6c 29 3b 0a  mName(p, pCol);.
9110: 20 0a 20 20 69 66 28 20 70 54 79 70 65 2d 3e 6e   .  if( pType->n
9120: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
9130: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70   there is no typ
9140: 65 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c  e specified, col
9150: 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64 65  umns have the de
9160: 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20  fault affinity. 
9170: 20 20 20 2a 2a 20 27 42 4c 4f 42 27 20 77 69 74     ** 'BLOB' wit
9180: 68 20 61 20 64 65 66 61 75 6c 74 20 73 69 7a 65  h a default size
9190: 20 6f 66 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a   of 4 bytes. */.
91a0: 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69      pCol->affini
91b0: 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
91c0: 42 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  BLOB;.    pCol->
91d0: 73 7a 45 73 74 20 3d 20 31 3b 0a 23 69 66 64 65  szEst = 1;.#ifde
91e0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
91f0: 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45  SORTER_REFERENCE
9200: 53 0a 20 20 20 20 69 66 28 20 34 3e 3d 73 71 6c  S.    if( 4>=sql
9210: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
9220: 2e 73 7a 53 6f 72 74 65 72 52 65 66 20 29 7b 0a  .szSorterRef ){.
9230: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46        pCol->colF
9240: 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
9250: 53 4f 52 54 45 52 52 45 46 3b 0a 20 20 20 20 7d  SORTERREF;.    }
9260: 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
9270: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 7a 20 2b  .    zType = z +
9280: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
9290: 28 7a 29 20 2b 20 31 3b 0a 20 20 20 20 6d 65 6d  (z) + 1;.    mem
92a0: 63 70 79 28 7a 54 79 70 65 2c 20 70 54 79 70 65  cpy(zType, pType
92b0: 2d 3e 7a 2c 20 70 54 79 70 65 2d 3e 6e 29 3b 0a  ->z, pType->n);.
92c0: 20 20 20 20 7a 54 79 70 65 5b 70 54 79 70 65 2d      zType[pType-
92d0: 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  >n] = 0;.    sql
92e0: 69 74 65 33 44 65 71 75 6f 74 65 28 7a 54 79 70  ite3Dequote(zTyp
92f0: 65 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66  e);.    pCol->af
9300: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
9310: 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79  AffinityType(zTy
9320: 70 65 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 70  pe, pCol);.    p
9330: 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d  Col->colFlags |=
9340: 20 43 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50 45   COLFLAG_HASTYPE
9350: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 2b  ;.  }.  p->nCol+
9360: 2b 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6e  +;.  pParse->con
9370: 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 3d 20  straintName.n = 
9380: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
9390: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
93a0: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
93b0: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
93c0: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
93d0: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
93e0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20  E statement.  A 
93f0: 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74  "NOT NULL" const
9400: 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65  raint has.** bee
9410: 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75  n seen on a colu
9420: 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  mn.  This routin
9430: 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75  e sets the notNu
9440: 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68  ll flag on.** th
9450: 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74  e column current
9460: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
9470: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
9480: 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c  qlite3AddNotNull
9490: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
94a0: 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20  int onError){.  
94b0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75  Table *p;.  Colu
94c0: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 70 20 3d 20  mn *pCol;.  p = 
94d0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
94e0: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  e;.  if( p==0 ||
94f0: 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31   NEVER(p->nCol<1
9500: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43  ) ) return;.  pC
9510: 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d  ol = &p->aCol[p-
9520: 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 70 43 6f 6c  >nCol-1];.  pCol
9530: 2d 3e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29  ->notNull = (u8)
9540: 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 2d 3e 74 61  onError;.  p->ta
9550: 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73  bFlags |= TF_Has
9560: 4e 6f 74 4e 75 6c 6c 3b 0a 0a 20 20 2f 2a 20 53  NotNull;..  /* S
9570: 65 74 20 74 68 65 20 75 6e 69 71 4e 6f 74 4e 75  et the uniqNotNu
9580: 6c 6c 20 66 6c 61 67 20 6f 6e 20 61 6e 79 20 55  ll flag on any U
9590: 4e 49 51 55 45 20 6f 72 20 50 4b 20 69 6e 64 65  NIQUE or PK inde
95a0: 78 65 73 20 61 6c 72 65 61 64 79 20 63 72 65 61  xes already crea
95b0: 74 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73  ted.  ** on this
95c0: 20 63 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a 20 20 69   column.  */.  i
95d0: 66 28 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67  f( pCol->colFlag
95e0: 73 20 26 20 43 4f 4c 46 4c 41 47 5f 55 4e 49 51  s & COLFLAG_UNIQ
95f0: 55 45 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  UE ){.    Index 
9600: 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70  *pIdx;.    for(p
9610: 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70  Idx=p->pIndex; p
9620: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
9630: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73  pNext){.      as
9640: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79  sert( pIdx->nKey
9650: 43 6f 6c 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e  Col==1 && pIdx->
9660: 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
9670: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49   );.      if( pI
9680: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d  dx->aiColumn[0]=
9690: 3d 70 2d 3e 6e 43 6f 6c 2d 31 20 29 7b 0a 20 20  =p->nCol-1 ){.  
96a0: 20 20 20 20 20 20 70 49 64 78 2d 3e 75 6e 69 71        pIdx->uniq
96b0: 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20  NotNull = 1;.   
96c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
96d0: 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65  ../*.** Scan the
96e0: 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d   column type nam
96f0: 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20  e zType (length 
9700: 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74 75 72  nType) and retur
9710: 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61  n the.** associa
9720: 74 65 64 20 61 66 66 69 6e 69 74 79 20 74 79 70  ted affinity typ
9730: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
9740: 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73  utine does a cas
9750: 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65  e-independent se
9760: 61 72 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f  arch of zType fo
9770: 72 20 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72  r the .** substr
9780: 69 6e 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ings in the foll
9790: 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20  owing table. If 
97a0: 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74  one of the subst
97b0: 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e  rings is.** foun
97c0: 64 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  d, the correspon
97d0: 64 69 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73  ding affinity is
97e0: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54   returned. If zT
97f0: 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ype contains.** 
9800: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66  more than one of
9810: 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c   the substrings,
9820: 20 65 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20   entries toward 
9830: 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74  the top of .** t
9840: 68 65 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72  he table take pr
9850: 69 6f 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d  iority. For exam
9860: 70 6c 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73  ple, if zType is
9870: 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20   'BLOBINT', .** 
9880: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
9890: 45 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ER is returned..
98a0: 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20  **.** Substring 
98b0: 20 20 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a      | Affinity.*
98c0: 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
98d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
98e0: 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20  --.** 'INT'     
98f0: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
9900: 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41  _INTEGER.** 'CHA
9910: 52 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  R'        | SQLI
9920: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
9930: 43 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53  CLOB'        | S
9940: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a  QLITE_AFF_TEXT.*
9950: 2a 20 27 54 45 58 54 27 20 20 20 20 20 20 20 20  * 'TEXT'        
9960: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  | SQLITE_AFF_TEX
9970: 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20  T.** 'BLOB'     
9980: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
9990: 42 4c 4f 42 0a 2a 2a 20 27 52 45 41 4c 27 20 20  BLOB.** 'REAL'  
99a0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
99b0: 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41  FF_REAL.** 'FLOA
99c0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
99d0: 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44  E_AFF_REAL.** 'D
99e0: 4f 55 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  OUB'        | SQ
99f0: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a  LITE_AFF_REAL.**
9a00: 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74  .** If none of t
9a10: 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e  he substrings in
9a20: 20 74 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65   the above table
9a30: 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53   are found,.** S
9a40: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
9a50: 43 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  C is returned..*
9a60: 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41 66  /.char sqlite3Af
9a70: 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74  finityType(const
9a80: 20 63 68 61 72 20 2a 7a 49 6e 2c 20 43 6f 6c 75   char *zIn, Colu
9a90: 6d 6e 20 2a 70 43 6f 6c 29 7b 0a 20 20 75 33 32  mn *pCol){.  u32
9aa0: 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61   h = 0;.  char a
9ab0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
9ac0: 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74  NUMERIC;.  const
9ad0: 20 63 68 61 72 20 2a 7a 43 68 61 72 20 3d 20 30   char *zChar = 0
9ae0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 49 6e  ;..  assert( zIn
9af0: 21 3d 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  !=0 );.  while( 
9b00: 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20  zIn[0] ){.    h 
9b10: 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74  = (h<<8) + sqlit
9b20: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28  e3UpperToLower[(
9b30: 2a 7a 49 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20  *zIn)&0xff];.   
9b40: 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20   zIn++;.    if( 
9b50: 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27  h==(('c'<<24)+('
9b60: 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29  h'<<16)+('a'<<8)
9b70: 2b 27 72 27 29 20 29 7b 20 20 20 20 20 20 20 20  +'r') ){        
9b80: 20 20 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a       /* CHAR */.
9b90: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
9ba0: 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
9bb0: 20 20 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a     zChar = zIn;.
9bc0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
9bd0: 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('c'<<24)+('l'
9be0: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
9bf0: 62 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20  b') ){       /* 
9c00: 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66  CLOB */.      af
9c10: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
9c20: 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EXT;.    }else i
9c30: 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29  f( h==(('t'<<24)
9c40: 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c  +('e'<<16)+('x'<
9c50: 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20  <8)+'t') ){     
9c60: 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20    /* TEXT */.   
9c70: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
9c80: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65  AFF_TEXT;.    }e
9c90: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27  lse if( h==(('b'
9ca0: 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b  <<24)+('l'<<16)+
9cb0: 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20  ('o'<<8)+'b')   
9cc0: 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a         /* BLOB *
9cd0: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 28 61 66  /.        && (af
9ce0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
9cf0: 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51  MERIC || aff==SQ
9d00: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29  LITE_AFF_REAL) )
9d10: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
9d20: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
9d30: 20 20 20 20 20 69 66 28 20 7a 49 6e 5b 30 5d 3d       if( zIn[0]=
9d40: 3d 27 28 27 20 29 20 7a 43 68 61 72 20 3d 20 7a  ='(' ) zChar = z
9d50: 49 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  In;.#ifndef SQLI
9d60: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
9d70: 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65  _POINT.    }else
9d80: 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32   if( h==(('r'<<2
9d90: 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61  4)+('e'<<16)+('a
9da0: 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20  '<<8)+'l')      
9db0: 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20      /* REAL */. 
9dc0: 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53         && aff==S
9dd0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
9de0: 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  C ){.      aff =
9df0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
9e00: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9e10: 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27  h==(('f'<<24)+('
9e20: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
9e30: 2b 27 61 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'a')          /
9e40: 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20  * FLOA */.      
9e50: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
9e60: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
9e70: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
9e80: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20  TE_AFF_REAL;.   
9e90: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
9ea0: 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31  'd'<<24)+('o'<<1
9eb0: 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29  6)+('u'<<8)+'b')
9ec0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55            /* DOU
9ed0: 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  B */.        && 
9ee0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
9ef0: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
9f00: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9f10: 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20  F_REAL;.#endif. 
9f20: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26     }else if( (h&
9f30: 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27  0x00FFFFFF)==(('
9f40: 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29  i'<<16)+('n'<<8)
9f50: 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49  +'t') ){    /* I
9f60: 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  NT */.      aff 
9f70: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  = SQLITE_AFF_INT
9f80: 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61  EGER;.      brea
9f90: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
9fa0: 2f 2a 20 49 66 20 70 43 6f 6c 20 69 73 20 6e 6f  /* If pCol is no
9fb0: 74 20 4e 55 4c 4c 2c 20 73 74 6f 72 65 20 61 6e  t NULL, store an
9fc0: 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
9fd0: 20 66 69 65 6c 64 20 73 69 7a 65 2e 20 20 54 68   field size.  Th
9fe0: 65 0a 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 20  e.  ** estimate 
9ff0: 69 73 20 73 63 61 6c 65 64 20 73 6f 20 74 68 61  is scaled so tha
a000: 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e  t the size of an
a010: 20 69 6e 74 65 67 65 72 20 69 73 20 31 2e 20 20   integer is 1.  
a020: 2a 2f 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b  */.  if( pCol ){
a030: 0a 20 20 20 20 69 6e 74 20 76 20 3d 20 30 3b 20  .    int v = 0; 
a040: 20 20 2f 2a 20 64 65 66 61 75 6c 74 20 73 69 7a    /* default siz
a050: 65 20 69 73 20 61 70 70 72 6f 78 20 34 20 62 79  e is approx 4 by
a060: 74 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 61  tes */.    if( a
a070: 66 66 3c 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  ff<SQLITE_AFF_NU
a080: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 69  MERIC ){.      i
a090: 66 28 20 7a 43 68 61 72 20 29 7b 0a 20 20 20 20  f( zChar ){.    
a0a0: 20 20 20 20 77 68 69 6c 65 28 20 7a 43 68 61 72      while( zChar
a0b0: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  [0] ){.         
a0c0: 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 64 69   if( sqlite3Isdi
a0d0: 67 69 74 28 7a 43 68 61 72 5b 30 5d 29 20 29 7b  git(zChar[0]) ){
a0e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
a0f0: 42 4c 4f 42 28 6b 29 2c 20 56 41 52 43 48 41 52  BLOB(k), VARCHAR
a100: 28 6b 29 2c 20 43 48 41 52 28 6b 29 20 2d 3e 20  (k), CHAR(k) -> 
a110: 72 3d 28 6b 2f 34 2b 31 29 20 2a 2f 0a 20 20 20  r=(k/4+1) */.   
a120: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a130: 47 65 74 49 6e 74 33 32 28 7a 43 68 61 72 2c 20  GetInt32(zChar, 
a140: 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  &v);.           
a150: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
a160: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 43    }.          zC
a170: 68 61 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  har++;.        }
a180: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a190: 20 20 20 20 20 20 76 20 3d 20 31 36 3b 20 20 20        v = 16;   
a1a0: 2f 2a 20 42 4c 4f 42 2c 20 54 45 58 54 2c 20 43  /* BLOB, TEXT, C
a1b0: 4c 4f 42 20 2d 3e 20 72 3d 35 20 20 28 61 70 70  LOB -> r=5  (app
a1c0: 72 6f 78 20 32 30 20 62 79 74 65 73 29 2a 2f 0a  rox 20 bytes)*/.
a1d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
a1e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
a1f0: 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45  LE_SORTER_REFERE
a200: 4e 43 45 53 0a 20 20 20 20 69 66 28 20 76 3e 3d  NCES.    if( v>=
a210: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
a220: 66 69 67 2e 73 7a 53 6f 72 74 65 72 52 65 66 20  fig.szSorterRef 
a230: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63  ){.      pCol->c
a240: 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c  olFlags |= COLFL
a250: 41 47 5f 53 4f 52 54 45 52 52 45 46 3b 0a 20 20  AG_SORTERREF;.  
a260: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 76    }.#endif.    v
a270: 20 3d 20 76 2f 34 20 2b 20 31 3b 0a 20 20 20 20   = v/4 + 1;.    
a280: 69 66 28 20 76 3e 32 35 35 20 29 20 76 20 3d 20  if( v>255 ) v = 
a290: 32 35 35 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73  255;.    pCol->s
a2a0: 7a 45 73 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20  zEst = v;.  }.  
a2b0: 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f  return aff;.}../
a2c0: 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73  *.** The express
a2d0: 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61 75  ion is the defau
a2e0: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
a2f0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
a300: 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f  dded column.** o
a310: 66 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  f the table curr
a320: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
a330: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
a340: 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78  Default value ex
a350: 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62  pressions must b
a360: 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69  e constant.  Rai
a370: 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20  se an exception 
a380: 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f  if this.** is no
a390: 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a  t the case..**.*
a3a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
a3b0: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
a3c0: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
a3d0: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
a3e0: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
a3f0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
a400: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
a410: 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75  e3AddDefaultValu
a420: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
a430: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  se,           /*
a440: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
a450: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
a460: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
a470: 2a 20 54 68 65 20 70 61 72 73 65 64 20 65 78 70  * The parsed exp
a480: 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 64  ression of the d
a490: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a  efault value */.
a4a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
a4b0: 74 61 72 74 2c 20 20 20 20 20 20 2f 2a 20 53 74  tart,      /* St
a4c0: 61 72 74 20 6f 66 20 74 68 65 20 64 65 66 61 75  art of the defau
a4d0: 6c 74 20 76 61 6c 75 65 20 74 65 78 74 20 2a 2f  lt value text */
a4e0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
a4f0: 45 6e 64 20 20 20 20 20 20 20 20 20 2f 2a 20 46  End         /* F
a500: 69 72 73 74 20 63 68 61 72 61 63 74 65 72 20 70  irst character p
a510: 61 73 74 20 65 6e 64 20 6f 66 20 64 65 66 61 75  ast end of defau
a520: 74 20 76 61 6c 75 65 20 74 65 78 74 20 2a 2f 0a  t value text */.
a530: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
a540: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
a550: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
a560: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d  Parse->db;.  p =
a570: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
a580: 6c 65 3b 0a 20 20 69 66 28 20 70 21 3d 30 20 29  le;.  if( p!=0 )
a590: 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70  {.    pCol = &(p
a5a0: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31  ->aCol[p->nCol-1
a5b0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c  ]);.    if( !sql
a5c0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
a5d0: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 45 78  ntOrFunction(pEx
a5e0: 70 72 2c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  pr, db->init.bus
a5f0: 79 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  y) ){.      sqli
a600: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
a610: 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c  se, "default val
a620: 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73  ue of column [%s
a630: 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  ] is not constan
a640: 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43  t",.          pC
a650: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
a660: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
a670: 41 20 63 6f 70 79 20 6f 66 20 70 45 78 70 72 20  A copy of pExpr 
a680: 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 20  is used instead 
a690: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c  of the original,
a6a0: 20 61 73 20 70 45 78 70 72 20 63 6f 6e 74 61 69   as pExpr contai
a6b0: 6e 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65  ns.      ** toke
a6c0: 6e 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ns that point to
a6d0: 20 76 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79   volatile memory
a6e0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
a6f0: 20 45 78 70 72 20 78 3b 0a 20 20 20 20 20 20 73   Expr x;.      s
a700: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
a710: 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74  (db, pCol->pDflt
a720: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  );.      memset(
a730: 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78 29  &x, 0, sizeof(x)
a740: 29 3b 0a 20 20 20 20 20 20 78 2e 6f 70 20 3d 20  );.      x.op = 
a750: 54 4b 5f 53 50 41 4e 3b 0a 20 20 20 20 20 20 78  TK_SPAN;.      x
a760: 2e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 73 71 6c 69  .u.zToken = sqli
a770: 74 65 33 44 62 53 70 61 6e 44 75 70 28 64 62 2c  te3DbSpanDup(db,
a780: 20 7a 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a   zStart, zEnd);.
a790: 20 20 20 20 20 20 78 2e 70 4c 65 66 74 20 3d 20        x.pLeft = 
a7a0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 78 2e 66  pExpr;.      x.f
a7b0: 6c 61 67 73 20 3d 20 45 50 5f 53 6b 69 70 3b 0a  lags = EP_Skip;.
a7c0: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c        pCol->pDfl
a7d0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
a7e0: 75 70 28 64 62 2c 20 26 78 2c 20 45 58 50 52 44  up(db, &x, EXPRD
a7f0: 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20  UP_REDUCE);.    
a800: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
a810: 64 62 2c 20 78 2e 75 2e 7a 54 6f 6b 65 6e 29 3b  db, x.u.zToken);
a820: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
a830: 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
a840: 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T ){.    sqlite3
a850: 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d 61 70 28  RenameExprUnmap(
a860: 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
a870: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
a880: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
a890: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 61 63  r);.}../*.** Bac
a8a0: 6b 77 61 72 64 73 20 43 6f 6d 70 61 74 69 62 69  kwards Compatibi
a8b0: 6c 69 74 79 20 48 61 63 6b 3a 0a 2a 2a 20 0a 2a  lity Hack:.** .*
a8c0: 2a 20 48 69 73 74 6f 72 69 63 61 6c 20 76 65 72  * Historical ver
a8d0: 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
a8e0: 61 63 63 65 70 74 65 64 20 73 74 72 69 6e 67 73  accepted strings
a8f0: 20 61 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   as column names
a900: 20 69 6e 0a 2a 2a 20 69 6e 64 65 78 65 73 20 61   in.** indexes a
a910: 6e 64 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  nd PRIMARY KEY c
a920: 6f 6e 73 74 72 61 69 6e 74 73 20 61 6e 64 20 69  onstraints and i
a930: 6e 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  n UNIQUE constra
a940: 69 6e 74 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a  ints.  Example:.
a950: 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45  **.**     CREATE
a960: 20 54 41 42 4c 45 20 78 79 7a 28 61 2c 62 2c 63   TABLE xyz(a,b,c
a970: 2c 64 2c 65 2c 50 52 49 4d 41 52 59 20 4b 45 59  ,d,e,PRIMARY KEY
a980: 28 27 61 27 29 2c 55 4e 49 51 55 45 28 27 62 27  ('a'),UNIQUE('b'
a990: 2c 27 63 27 20 43 4f 4c 4c 41 54 45 20 74 72 69  ,'c' COLLATE tri
a9a0: 6d 29 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45  m).**     CREATE
a9b0: 20 49 4e 44 45 58 20 61 62 63 20 4f 4e 20 78 79   INDEX abc ON xy
a9c0: 7a 28 27 63 27 2c 27 64 27 20 44 45 53 43 2c 27  z('c','d' DESC,'
a9d0: 65 27 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  e' COLLATE nocas
a9e0: 65 20 44 45 53 43 29 3b 0a 2a 2a 0a 2a 2a 20 54  e DESC);.**.** T
a9f0: 68 69 73 20 69 73 20 67 6f 6f 66 79 2e 20 20 42  his is goofy.  B
aa00: 75 74 20 74 6f 20 70 72 65 73 65 72 76 65 20 62  ut to preserve b
aa10: 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
aa20: 62 69 6c 69 74 79 20 77 65 20 63 6f 6e 74 69 6e  bility we contin
aa30: 75 65 20 74 6f 0a 2a 2a 20 61 63 63 65 70 74 20  ue to.** accept 
aa40: 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  it.  This routin
aa50: 65 20 64 6f 65 73 20 74 68 65 20 6e 65 63 65 73  e does the neces
aa60: 73 61 72 79 20 63 6f 6e 76 65 72 73 69 6f 6e 2e  sary conversion.
aa70: 20 20 49 74 20 63 6f 6e 76 65 72 74 73 0a 2a 2a    It converts.**
aa80: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
aa90: 67 69 76 65 6e 20 69 6e 20 69 74 73 20 61 72 67  given in its arg
aaa0: 75 6d 65 6e 74 20 66 72 6f 6d 20 61 20 54 4b 5f  ument from a TK_
aab0: 53 54 52 49 4e 47 20 69 6e 74 6f 20 61 20 54 4b  STRING into a TK
aac0: 5f 49 44 0a 2a 2a 20 69 66 20 74 68 65 20 65 78  _ID.** if the ex
aad0: 70 72 65 73 73 69 6f 6e 20 69 73 20 6a 75 73 74  pression is just
aae0: 20 61 20 54 4b 5f 53 54 52 49 4e 47 20 77 69 74   a TK_STRING wit
aaf0: 68 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 43 4f  h an optional CO
ab00: 4c 4c 41 54 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  LLATE clause..**
ab10: 20 49 66 20 74 68 65 20 65 70 78 72 65 73 73 69   If the epxressi
ab20: 6f 6e 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6f  on is anything o
ab30: 74 68 65 72 20 74 68 61 6e 20 54 4b 5f 53 54 52  ther than TK_STR
ab40: 49 4e 47 2c 20 74 68 65 20 65 78 70 72 65 73 73  ING, the express
ab50: 69 6f 6e 20 69 73 0a 2a 2a 20 75 6e 63 68 61 6e  ion is.** unchan
ab60: 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ged..*/.static v
ab70: 6f 69 64 20 73 71 6c 69 74 65 33 53 74 72 69 6e  oid sqlite3Strin
ab80: 67 54 6f 49 64 28 45 78 70 72 20 2a 70 29 7b 0a  gToId(Expr *p){.
ab90: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
aba0: 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 70 2d  STRING ){.    p-
abb0: 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d  >op = TK_ID;.  }
abc0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  else if( p->op==
abd0: 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 70 2d  TK_COLLATE && p-
abe0: 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53  >pLeft->op==TK_S
abf0: 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e  TRING ){.    p->
ac00: 70 4c 65 66 74 2d 3e 6f 70 20 3d 20 54 4b 5f 49  pLeft->op = TK_I
ac10: 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  D;.  }.}../*.** 
ac20: 44 65 73 69 67 6e 61 74 65 20 74 68 65 20 50 52  Designate the PR
ac30: 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68  IMARY KEY for th
ac40: 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20  e table.  pList 
ac50: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d  is a list of nam
ac60: 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e  es .** of column
ac70: 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20  s that form the 
ac80: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66  primary key.  If
ac90: 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20   pList is NULL, 
aca0: 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74  then the.** most
acb0: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
acc0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61  column of the ta
acd0: 62 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d 61  ble is the prima
ace0: 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20  ry key..**.** A 
acf0: 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61  table can have a
ad00: 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61  t most one prima
ad10: 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20  ry key.  If the 
ad20: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61  table already ha
ad30: 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b  s.** a primary k
ad40: 65 79 20 28 61 6e 64 20 74 68 69 73 20 69 73 20  ey (and this is 
ad50: 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61  the second prima
ad60: 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65  ry key) then cre
ad70: 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e  ate an.** error.
ad80: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52  .**.** If the PR
ad90: 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20  IMARY KEY is on 
ada0: 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
adb0: 77 68 6f 73 65 20 64 61 74 61 74 79 70 65 20 69  whose datatype i
adc0: 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68  s INTEGER,.** th
add0: 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74  en we will try t
ade0: 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d  o use that colum
adf0: 6e 20 61 73 20 74 68 65 20 72 6f 77 69 64 2e 20  n as the rowid. 
ae00: 20 53 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69   Set the Table.i
ae10: 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66  PKey.** field of
ae20: 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72   the table under
ae30: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f   construction to
ae40: 20 62 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66   be the index of
ae50: 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20   the.** INTEGER 
ae60: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
ae70: 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79  mn.  Table.iPKey
ae80: 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66   is set to -1 if
ae90: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20   there is.** no 
aea0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
aeb0: 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  KEY..**.** If th
aec0: 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20  e key is not an 
aed0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
aee0: 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65  KEY, then create
aef0: 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64   a unique.** ind
af00: 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20  ex for the key. 
af10: 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65   No index is cre
af20: 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52  ated for INTEGER
af30: 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a   PRIMARY KEYs..*
af40: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
af50: 64 50 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 50  dPrimaryKey(.  P
af60: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
af70: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
af80: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
af90: 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  t *pList,  /* Li
afa0: 73 74 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65  st of field name
afb0: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  s to be indexed 
afc0: 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
afd0: 2c 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  ,      /* What t
afe0: 6f 20 64 6f 20 77 69 74 68 20 61 20 75 6e 69 71  o do with a uniq
aff0: 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20  ueness conflict 
b000: 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e 63  */.  int autoInc
b010: 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ,      /* True i
b020: 66 20 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d  f the AUTOINCREM
b030: 45 4e 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  ENT keyword is p
b040: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
b050: 73 6f 72 74 4f 72 64 65 72 20 20 20 20 20 2f 2a  sortOrder     /*
b060: 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f   SQLITE_SO_ASC o
b070: 72 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43  r SQLITE_SO_DESC
b080: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
b090: 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
b0a0: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 43 6f 6c 75  NewTable;.  Colu
b0b0: 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20  mn *pCol = 0;.  
b0c0: 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69  int iCol = -1, i
b0d0: 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20  ;.  int nTerm;. 
b0e0: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67   if( pTab==0 ) g
b0f0: 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f  oto primary_key_
b100: 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62  exit;.  if( pTab
b110: 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
b120: 48 61 73 50 72 69 6d 61 72 79 4b 65 79 20 29 7b  HasPrimaryKey ){
b130: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
b140: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
b150: 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c      "table \"%s\
b160: 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20  " has more than 
b170: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22  one primary key"
b180: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
b190: 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79      goto primary
b1a0: 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20  _key_exit;.  }. 
b1b0: 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
b1c0: 7c 3d 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79  |= TF_HasPrimary
b1d0: 4b 65 79 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  Key;.  if( pList
b1e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20  ==0 ){.    iCol 
b1f0: 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31  = pTab->nCol - 1
b200: 3b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54  ;.    pCol = &pT
b210: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a  ab->aCol[iCol];.
b220: 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
b230: 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52  gs |= COLFLAG_PR
b240: 49 4d 4b 45 59 3b 0a 20 20 20 20 6e 54 65 72 6d  IMKEY;.    nTerm
b250: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
b260: 20 20 20 6e 54 65 72 6d 20 3d 20 70 4c 69 73 74     nTerm = pList
b270: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72  ->nExpr;.    for
b280: 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69  (i=0; i<nTerm; i
b290: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
b2a0: 2a 70 43 45 78 70 72 20 3d 20 73 71 6c 69 74 65  *pCExpr = sqlite
b2b0: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
b2c0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  (pList->a[i].pEx
b2d0: 70 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  pr);.      asser
b2e0: 74 28 20 70 43 45 78 70 72 21 3d 30 20 29 3b 0a  t( pCExpr!=0 );.
b2f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
b300: 69 6e 67 54 6f 49 64 28 70 43 45 78 70 72 29 3b  ingToId(pCExpr);
b310: 0a 20 20 20 20 20 20 69 66 28 20 70 43 45 78 70  .      if( pCExp
b320: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a  r->op==TK_ID ){.
b330: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
b340: 61 72 20 2a 7a 43 4e 61 6d 65 20 3d 20 70 43 45  ar *zCName = pCE
b350: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
b360: 20 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d         for(iCol=
b370: 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  0; iCol<pTab->nC
b380: 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ol; iCol++){.   
b390: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
b3a0: 65 33 53 74 72 49 43 6d 70 28 7a 43 4e 61 6d 65  e3StrICmp(zCName
b3b0: 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  , pTab->aCol[iCo
b3c0: 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  l].zName)==0 ){.
b3d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
b3e0: 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69   = &pTab->aCol[i
b3f0: 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  Col];.          
b400: 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73    pCol->colFlags
b410: 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d   |= COLFLAG_PRIM
b420: 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KEY;.           
b430: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
b440: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
b450: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
b460: 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d 31 0a 20    if( nTerm==1. 
b470: 20 20 26 26 20 70 43 6f 6c 0a 20 20 20 26 26 20    && pCol.   && 
b480: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 73  sqlite3StrICmp(s
b490: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65  qlite3ColumnType
b4a0: 28 70 43 6f 6c 2c 22 22 29 2c 20 22 49 4e 54 45  (pCol,""), "INTE
b4b0: 47 45 52 22 29 3d 3d 30 0a 20 20 20 26 26 20 73  GER")==0.   && s
b4c0: 6f 72 74 4f 72 64 65 72 21 3d 53 51 4c 49 54 45  ortOrder!=SQLITE
b4d0: 5f 53 4f 5f 44 45 53 43 0a 20 20 29 7b 0a 20 20  _SO_DESC.  ){.  
b4e0: 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
b4f0: 4f 42 4a 45 43 54 20 26 26 20 70 4c 69 73 74 20  OBJECT && pList 
b500: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
b510: 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70  RenameTokenRemap
b520: 28 70 50 61 72 73 65 2c 20 26 70 54 61 62 2d 3e  (pParse, &pTab->
b530: 69 50 4b 65 79 2c 20 70 4c 69 73 74 2d 3e 61 5b  iPKey, pList->a[
b540: 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  0].pExpr);.    }
b550: 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  .    pTab->iPKey
b560: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61   = iCol;.    pTa
b570: 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75 38  b->keyConf = (u8
b580: 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61 73  )onError;.    as
b590: 73 65 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d 30  sert( autoInc==0
b5a0: 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20 29   || autoInc==1 )
b5b0: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46  ;.    pTab->tabF
b5c0: 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63 2a  lags |= autoInc*
b5d0: 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  TF_Autoincrement
b5e0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20  ;.    if( pList 
b5f0: 29 20 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72  ) pParse->iPkSor
b600: 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 2d 3e  tOrder = pList->
b610: 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[0].sortOrder;.
b620: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f    }else if( auto
b630: 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  Inc ){.#ifndef S
b640: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
b650: 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c  NCREMENT.    sql
b660: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
b670: 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d  rse, "AUTOINCREM
b680: 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f  ENT is only allo
b690: 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20  wed on an ".    
b6a0: 20 20 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d     "INTEGER PRIM
b6b0: 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69  ARY KEY");.#endi
b6c0: 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  f.  }else{.    s
b6d0: 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65  qlite3CreateInde
b6e0: 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20  x(pParse, 0, 0, 
b6f0: 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f  0, pList, onErro
b700: 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  r, 0,.          
b710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b720: 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20 30   0, sortOrder, 0
b730: 2c 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  , SQLITE_IDXTYPE
b740: 5f 50 52 49 4d 41 52 59 4b 45 59 29 3b 0a 20 20  _PRIMARYKEY);.  
b750: 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d    pList = 0;.  }
b760: 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  ..primary_key_ex
b770: 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70  it:.  sqlite3Exp
b780: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  rListDelete(pPar
b790: 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a  se->db, pList);.
b7a0: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a    return;.}../*.
b7b0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 43 48 45  ** Add a new CHE
b7c0: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f  CK constraint to
b7d0: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
b7e0: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
b7f0: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
b800: 20 73 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b   sqlite3AddCheck
b810: 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61  Constraint(.  Pa
b820: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
b830: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
b840: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43  xt */.  Expr *pC
b850: 68 65 63 6b 45 78 70 72 20 20 2f 2a 20 54 68 65  heckExpr  /* The
b860: 20 63 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f   check expressio
b870: 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20  n */.){.#ifndef 
b880: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
b890: 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  K.  Table *pTab 
b8a0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
b8b0: 62 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ble;.  sqlite3 *
b8c0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
b8d0: 0a 20 20 69 66 28 20 70 54 61 62 20 26 26 20 21  .  if( pTab && !
b8e0: 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 0a  IN_DECLARE_VTAB.
b8f0: 20 20 20 26 26 20 21 73 71 6c 69 74 65 33 42 74     && !sqlite3Bt
b900: 72 65 65 49 73 52 65 61 64 6f 6e 6c 79 28 64 62  reeIsReadonly(db
b910: 2d 3e 61 44 62 5b 64 62 2d 3e 69 6e 69 74 2e 69  ->aDb[db->init.i
b920: 44 62 5d 2e 70 42 74 29 0a 20 20 29 7b 0a 20 20  Db].pBt).  ){.  
b930: 20 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d    pTab->pCheck =
b940: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
b950: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
b960: 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 70 43 68  Tab->pCheck, pCh
b970: 65 63 6b 45 78 70 72 29 3b 0a 20 20 20 20 69 66  eckExpr);.    if
b980: 28 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72  ( pParse->constr
b990: 61 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a 20 20  aintName.n ){.  
b9a0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
b9b0: 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73  istSetName(pPars
b9c0: 65 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c  e, pTab->pCheck,
b9d0: 20 26 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72   &pParse->constr
b9e0: 61 69 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a 20 20  aintName, 1);.  
b9f0: 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64    }.  }else.#end
ba00: 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74  if.  {.    sqlit
ba10: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
ba20: 72 73 65 2d 3e 64 62 2c 20 70 43 68 65 63 6b 45  rse->db, pCheckE
ba30: 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  xpr);.  }.}../*.
ba40: 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61  ** Set the colla
ba50: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66  tion function of
ba60: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
ba70: 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c 65 20  ly parsed table 
ba80: 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65  column.** to the
ba90: 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a   CollSeq given..
baa0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
bab0: 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61  ddCollateType(Pa
bac0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
bad0: 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 54  en *pToken){.  T
bae0: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
baf0: 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b  ;.  char *zColl;
bb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bb10: 20 44 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f   Dequoted name o
bb20: 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  f collation sequ
bb30: 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ence */.  sqlite
bb40: 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28 70  3 *db;..  if( (p
bb50: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
bb60: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
bb70: 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c  n;.  i = p->nCol
bb80: 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  -1;.  db = pPars
bb90: 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d  e->db;.  zColl =
bba0: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
bbb0: 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e  Token(db, pToken
bbc0: 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20  );.  if( !zColl 
bbd0: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28  ) return;..  if(
bbe0: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
bbf0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43  llSeq(pParse, zC
bc00: 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64 65  oll) ){.    Inde
bc10: 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 73 71 6c  x *pIdx;.    sql
bc20: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
bc30: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29  ->aCol[i].zColl)
bc40: 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d  ;.    p->aCol[i]
bc50: 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a  .zColl = zColl;.
bc60: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
bc70: 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61   column is decla
bc80: 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50  red as "<name> P
bc90: 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41  RIMARY KEY COLLA
bca0: 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20 20  TE <type>",.    
bcb0: 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78  ** then an index
bcc0: 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 63   may have been c
bcd0: 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63  reated on this c
bce0: 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65  olumn before the
bcf0: 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  .    ** collatio
bd00: 6e 20 74 79 70 65 20 77 61 73 20 61 64 64 65 64  n type was added
bd10: 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73 20 69  . Correct this i
bd20: 66 20 69 74 20 69 73 20 74 68 65 20 63 61 73 65  f it is the case
bd30: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
bd40: 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b  (pIdx=p->pIndex;
bd50: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
bd60: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
bd70: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 4b  assert( pIdx->nK
bd80: 65 79 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20  eyCol==1 );.    
bd90: 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
bda0: 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20  lumn[0]==i ){.  
bdb0: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
bdc0: 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b  ll[0] = p->aCol[
bdd0: 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  i].zColl;.      
bde0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
bdf0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
be00: 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  ee(db, zColl);. 
be10: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
be20: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
be30: 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
be40: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74  sequence for dat
be50: 61 62 61 73 65 20 6e 61 74 69 76 65 20 74 65 78  abase native tex
be60: 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64  t.** encoding id
be70: 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20  entified by the 
be80: 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65  string zName, le
be90: 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a  ngth nName..**.*
bea0: 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  * If the request
beb0: 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
bec0: 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61  uence is not ava
bed0: 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61  ilable, or not a
bee0: 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74  vailable.** in t
bef0: 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 74 69  he database nati
bf00: 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65  ve encoding, the
bf10: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f   collation facto
bf20: 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  ry is invoked to
bf30: 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20  .** request it. 
bf40: 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  If the collation
bf50: 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f   factory does no
bf60: 74 20 73 75 70 70 6c 79 20 73 75 63 68 20 61 20  t supply such a 
bf70: 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64  sequence,.** and
bf80: 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 69 73   the sequence is
bf90: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e   available in an
bfa0: 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64  other text encod
bfb0: 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69  ing, then that i
bfc0: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e  s.** returned in
bfd0: 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  stead..**.** If 
bfe0: 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  no versions of t
bff0: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
c000: 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65  lations sequence
c010: 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20   are available, 
c020: 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72  or.** another er
c030: 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c  ror occurs, NULL
c040: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
c050: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
c060: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  e written into.*
c070: 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20  * pParse..**.** 
c080: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
c090: 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  a wrapper around
c0a0: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
c0b0: 53 65 71 28 29 2e 20 20 54 68 69 73 20 72 6f 75  Seq().  This rou
c0c0: 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20  tine.** invokes 
c0d0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
c0e0: 63 74 6f 72 79 20 69 66 20 74 68 65 20 6e 61 6d  ctory if the nam
c0f0: 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e  ed collation can
c100: 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a 20  not be found.** 
c110: 61 6e 64 20 67 65 6e 65 72 61 74 65 73 20 61 6e  and generates an
c120: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a   error message..
c130: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
c140: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
c150: 65 71 28 29 2c 20 73 71 6c 69 74 65 33 47 65 74  eq(), sqlite3Get
c160: 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43 6f 6c  CollSeq().*/.Col
c170: 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63  lSeq *sqlite3Loc
c180: 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  ateCollSeq(Parse
c190: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
c1a0: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
c1b0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
c1c0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65  arse->db;.  u8 e
c1d0: 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20  nc = ENC(db);.  
c1e0: 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20 64 62  u8 initbusy = db
c1f0: 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43  ->init.busy;.  C
c200: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a  ollSeq *pColl;..
c210: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
c220: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
c230: 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69 6e 69   enc, zName, ini
c240: 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20 21 69  tbusy);.  if( !i
c250: 6e 69 74 62 75 73 79 20 26 26 20 28 21 70 43 6f  nitbusy && (!pCo
c260: 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43  ll || !pColl->xC
c270: 6d 70 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c  mp) ){.    pColl
c280: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c   = sqlite3GetCol
c290: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 65 6e 63  lSeq(pParse, enc
c2a0: 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29 3b  , pColl, zName);
c2b0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
c2c0: 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Coll;.}.../*.** 
c2d0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
c2e0: 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e  at will incremen
c2f0: 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  t the schema coo
c300: 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  kie..**.** The s
c310: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20  chema cookie is 
c320: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
c330: 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d  e when the schem
c340: 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74  a for the.** dat
c350: 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20  abase changes.  
c360: 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65 6d  After each schem
c370: 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f  a change, the co
c380: 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68  okie value.** ch
c390: 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70  anges.  When a p
c3a0: 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65 61  rocess first rea
c3b0: 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69 74  ds the schema it
c3c0: 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20   records the.** 
c3d0: 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66  cookie.  Thereaf
c3e0: 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74  ter, whenever it
c3f0: 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20   goes to access 
c400: 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a  the database,.**
c410: 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20 63   it checks the c
c420: 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75  ookie to make su
c430: 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68 61  re the schema ha
c440: 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a  s not changed.**
c450: 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61   since it was la
c460: 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54  st read..**.** T
c470: 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20  his plan is not 
c480: 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65  completely bulle
c490: 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20  t-proof.  It is 
c4a0: 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20  possible for.** 
c4b0: 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68  the schema to ch
c4c0: 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69  ange multiple ti
c4d0: 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20  mes and for the 
c4e0: 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20  cookie to be.** 
c4f0: 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f  set back to prio
c500: 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63  r value.  But sc
c510: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65  hema changes are
c520: 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61   infrequent.** a
c530: 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69  nd the probabili
c540: 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68  ty of hitting th
c550: 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61  e same cookie va
c560: 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31  lue is only.** 1
c570: 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e   chance in 2^32.
c580: 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65 20    So we're safe 
c590: 65 6e 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 49 4d  enough..**.** IM
c5a0: 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
c5b0: 20 52 2d 33 34 32 33 30 2d 35 36 30 34 39 20 53   R-34230-56049 S
c5c0: 51 4c 69 74 65 20 61 75 74 6f 6d 61 74 69 63 61  QLite automatica
c5d0: 6c 6c 79 20 69 6e 63 72 65 6d 65 6e 74 73 0a 2a  lly increments.*
c5e0: 2a 20 74 68 65 20 73 63 68 65 6d 61 2d 76 65 72  * the schema-ver
c5f0: 73 69 6f 6e 20 77 68 65 6e 65 76 65 72 20 74 68  sion whenever th
c600: 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  e schema changes
c610: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
c620: 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50 61  3ChangeCookie(Pa
c630: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
c640: 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33   iDb){.  sqlite3
c650: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
c660: 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  b;.  Vdbe *v = p
c670: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
c680: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
c690: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
c6a0: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
c6b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c6c0: 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  3(v, OP_SetCooki
c6d0: 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 53 43  e, iDb, BTREE_SC
c6e0: 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 0a 20  HEMA_VERSION, . 
c6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c700: 20 20 28 69 6e 74 29 28 31 2b 28 75 6e 73 69 67    (int)(1+(unsig
c710: 6e 65 64 29 64 62 2d 3e 61 44 62 5b 69 44 62 5d  ned)db->aDb[iDb]
c720: 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  .pSchema->schema
c730: 5f 63 6f 6f 6b 69 65 29 29 3b 0a 7d 0a 0a 2f 2a  _cookie));.}../*
c740: 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20  .** Measure the 
c750: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  number of charac
c760: 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f  ters needed to o
c770: 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a  utput the given.
c780: 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20  ** identifier.  
c790: 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72  The number retur
c7a0: 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79  ned includes any
c7b0: 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20   quotes used.** 
c7c0: 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63  but does not inc
c7d0: 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65  lude the null te
c7e0: 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  rminator..**.** 
c7f0: 54 68 65 20 65 73 74 69 6d 61 74 65 20 69 73 20  The estimate is 
c800: 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49  conservative.  I
c810: 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65  t might be large
c820: 72 20 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a  r that what is.*
c830: 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e  * really needed.
c840: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
c850: 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74  dentLength(const
c860: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
c870: 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a   n;.  for(n=0; *
c880: 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20  z; n++, z++){.  
c890: 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b    if( *z=='"' ){
c8a0: 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65   n++; }.  }.  re
c8b0: 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f  turn n + 2;.}../
c8c0: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70  *.** The first p
c8d0: 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f  arameter is a po
c8e0: 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75 74 70  inter to an outp
c8f0: 75 74 20 62 75 66 66 65 72 2e 20 54 68 65 20 73  ut buffer. The s
c900: 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65  econd .** parame
c910: 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
c920: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 74   to an integer t
c930: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
c940: 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20 77 68   offset at.** wh
c950: 69 63 68 20 74 6f 20 77 72 69 74 65 20 69 6e 74  ich to write int
c960: 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  o the output buf
c970: 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69  fer. This functi
c980: 6f 6e 20 63 6f 70 69 65 73 20 74 68 65 0a 2a 2a  on copies the.**
c990: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
c9a0: 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74  string pointed t
c9b0: 6f 20 62 79 20 74 68 65 20 74 68 69 72 64 20 70  o by the third p
c9c0: 61 72 61 6d 65 74 65 72 2c 20 7a 53 69 67 6e 65  arameter, zSigne
c9d0: 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74 68  dIdent,.** to th
c9e0: 65 20 73 70 65 63 69 66 69 65 64 20 6f 66 66 73  e specified offs
c9f0: 65 74 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  et in the buffer
ca00: 20 61 6e 64 20 75 70 64 61 74 65 73 20 2a 70 49   and updates *pI
ca10: 64 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20 74  dx to refer.** t
ca20: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
ca30: 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20   after the last 
ca40: 62 79 74 65 20 77 72 69 74 74 65 6e 20 62 65 66  byte written bef
ca50: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
ca60: 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 73 74 72  * .** If the str
ca70: 69 6e 67 20 7a 53 69 67 6e 65 64 49 64 65 6e 74  ing zSignedIdent
ca80: 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65   consists entire
ca90: 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75 6d 65  ly of alpha-nume
caa0: 72 69 63 0a 2a 2a 20 63 68 61 72 61 63 74 65 72  ric.** character
cab0: 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69  s, does not begi
cac0: 6e 20 77 69 74 68 20 61 20 64 69 67 69 74 20 61  n with a digit a
cad0: 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20 53 51 4c  nd is not an SQL
cae0: 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74 68 65   keyword,.** the
caf0: 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74  n it is copied t
cb00: 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  o the output buf
cb10: 66 65 72 20 65 78 61 63 74 6c 79 20 61 73 20 69  fer exactly as i
cb20: 74 20 69 73 2e 20 4f 74 68 65 72 77 69 73 65 2c  t is. Otherwise,
cb30: 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f 74 65 64  .** it is quoted
cb40: 20 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d 71 75   using double-qu
cb50: 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  otes..*/.static 
cb60: 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68  void identPut(ch
cb70: 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78  ar *z, int *pIdx
cb80: 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49  , char *zSignedI
cb90: 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65  dent){.  unsigne
cba0: 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d  d char *zIdent =
cbb0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
cbc0: 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20  )zSignedIdent;. 
cbd0: 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51   int i, j, needQ
cbe0: 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64  uote;.  i = *pId
cbf0: 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  x;..  for(j=0; z
cc00: 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a  Ident[j]; j++){.
cc10: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
cc20: 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a  Isalnum(zIdent[j
cc30: 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21  ]) && zIdent[j]!
cc40: 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20  ='_' ) break;.  
cc50: 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20  }.  needQuote = 
cc60: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a  sqlite3Isdigit(z
cc70: 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20  Ident[0]).      
cc80: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
cc90: 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65  KeywordCode(zIde
cca0: 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a 20 20  nt, j)!=TK_ID.  
ccb0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 7a 49 64            || zId
ccc0: 65 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20 20 20 20  ent[j]!=0.      
ccd0: 20 20 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b 0a 0a        || j==0;..
cce0: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
ccf0: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
cd00: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
cd10: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
cd20: 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b  z[i++] = zIdent[
cd30: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65  j];.    if( zIde
cd40: 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69  nt[j]=='"' ) z[i
cd50: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20  ++] = '"';.  }. 
cd60: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
cd70: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
cd80: 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49   z[i] = 0;.  *pI
cd90: 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dx = i;.}../*.**
cda0: 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41   Generate a CREA
cdb0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
cdc0: 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  nt appropriate f
cdd0: 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
cde0: 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74  table.  Memory t
cdf0: 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20  o hold the text 
ce00: 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
ce10: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
ce20: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
ce30: 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20  c() and must be 
ce40: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
ce50: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
ce60: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63  /.static char *c
ce70: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73  reateTableStmt(s
ce80: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c  qlite3 *db, Tabl
ce90: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20  e *p){.  int i, 
cea0: 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53  k, n;.  char *zS
ceb0: 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65  tmt;.  char *zSe
cec0: 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64  p, *zSep2, *zEnd
ced0: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
cee0: 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72  ;.  n = 0;.  for
cef0: 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c  (pCol = p->aCol,
cf00: 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b   i=0; i<p->nCol;
cf10: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
cf20: 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e     n += identLen
cf30: 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  gth(pCol->zName)
cf40: 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d   + 5;.  }.  n +=
cf50: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e   identLength(p->
cf60: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c  zName);.  if( n<
cf70: 35 30 20 29 7b 20 0a 20 20 20 20 7a 53 65 70 20  50 ){ .    zSep 
cf80: 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20  = "";.    zSep2 
cf90: 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20  = ",";.    zEnd 
cfa0: 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = ")";.  }else{.
cfb0: 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20      zSep = "\n  
cfc0: 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22  ";.    zSep2 = "
cfd0: 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64  ,\n  ";.    zEnd
cfe0: 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20   = "\n)";.  }.  
cff0: 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e  n += 35 + 6*p->n
d000: 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73  Col;.  zStmt = s
d010: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
d020: 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a  w(0, n);.  if( z
d030: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Stmt==0 ){.    s
d040: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
d050: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  b);.    return 0
d060: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
d070: 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d  snprintf(n, zStm
d080: 74 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  t, "CREATE TABLE
d090: 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74   ");.  k = sqlit
d0a0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74  e3Strlen30(zStmt
d0b0: 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53  );.  identPut(zS
d0c0: 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d  tmt, &k, p->zNam
d0d0: 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d  e);.  zStmt[k++]
d0e0: 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43   = '(';.  for(pC
d0f0: 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b  ol=p->aCol, i=0;
d100: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c   i<p->nCol; i++,
d110: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74   pCol++){.    st
d120: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
d130: 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d  * const azType[]
d140: 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20   = {.        /* 
d150: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
d160: 20 20 20 2a 2f 20 22 22 2c 0a 20 20 20 20 20 20     */ "",.      
d170: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f    /* SQLITE_AFF_
d180: 54 45 58 54 20 20 20 20 2a 2f 20 22 20 54 45 58  TEXT    */ " TEX
d190: 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  T",.        /* S
d1a0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
d1b0: 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20  C */ " NUM",.   
d1c0: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
d1d0: 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22 20  FF_INTEGER */ " 
d1e0: 49 4e 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a  INT",.        /*
d1f0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
d200: 20 20 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20      */ " REAL". 
d210: 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65     };.    int le
d220: 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  n;.    const cha
d230: 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73  r *zType;..    s
d240: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
d250: 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20  n-k, &zStmt[k], 
d260: 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20  zSep);.    k += 
d270: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
d280: 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20  &zStmt[k]);.    
d290: 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20  zSep = zSep2;.  
d2a0: 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74    identPut(zStmt
d2b0: 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  , &k, pCol->zNam
d2c0: 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
d2d0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53  pCol->affinity-S
d2e0: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 3e  QLITE_AFF_BLOB >
d2f0: 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  = 0 );.    asser
d300: 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  t( pCol->affinit
d310: 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  y-SQLITE_AFF_BLO
d320: 42 20 3c 20 41 72 72 61 79 53 69 7a 65 28 61 7a  B < ArraySize(az
d330: 54 79 70 65 29 20 29 3b 0a 20 20 20 20 74 65 73  Type) );.    tes
d340: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
d350: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
d360: 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 74 65  F_BLOB );.    te
d370: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
d380: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
d390: 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 74  FF_TEXT );.    t
d3a0: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
d3b0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
d3c0: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20  AFF_NUMERIC );. 
d3d0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f     testcase( pCo
d3e0: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
d3f0: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
d400: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
d410: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
d420: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
d430: 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54 79   );.    .    zTy
d440: 70 65 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f 6c  pe = azType[pCol
d450: 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20 53 51 4c  ->affinity - SQL
d460: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 3b 0a 20  ITE_AFF_BLOB];. 
d470: 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33     len = sqlite3
d480: 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b  Strlen30(zType);
d490: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f  .    assert( pCo
d4a0: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
d4b0: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 0a 20 20  ITE_AFF_BLOB .  
d4c0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 6f            || pCo
d4d0: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71 6c  l->affinity==sql
d4e0: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
d4f0: 28 7a 54 79 70 65 2c 20 30 29 20 29 3b 0a 20 20  (zType, 0) );.  
d500: 20 20 6d 65 6d 63 70 79 28 26 7a 53 74 6d 74 5b    memcpy(&zStmt[
d510: 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c 65 6e 29 3b  k], zType, len);
d520: 0a 20 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20  .    k += len;. 
d530: 20 20 20 61 73 73 65 72 74 28 20 6b 3c 3d 6e 20     assert( k<=n 
d540: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
d550: 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26  _snprintf(n-k, &
d560: 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20  zStmt[k], "%s", 
d570: 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  zEnd);.  return 
d580: 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zStmt;.}../*.** 
d590: 52 65 73 69 7a 65 20 61 6e 20 49 6e 64 65 78 20  Resize an Index 
d5a0: 6f 62 6a 65 63 74 20 74 6f 20 68 6f 6c 64 20 4e  object to hold N
d5b0: 20 63 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c 2e 20   columns total. 
d5c0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
d5d0: 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  K.** on success 
d5e0: 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  and SQLITE_NOMEM
d5f0: 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   on an OOM error
d600: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d610: 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63  resizeIndexObjec
d620: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  t(sqlite3 *db, I
d630: 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20  ndex *pIdx, int 
d640: 4e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 78 74  N){.  char *zExt
d650: 72 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  ra;.  int nByte;
d660: 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f  .  if( pIdx->nCo
d670: 6c 75 6d 6e 3e 3d 4e 20 29 20 72 65 74 75 72 6e  lumn>=N ) return
d680: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
d690: 73 65 72 74 28 20 70 49 64 78 2d 3e 69 73 52 65  sert( pIdx->isRe
d6a0: 73 69 7a 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 42  sized==0 );.  nB
d6b0: 79 74 65 20 3d 20 28 73 69 7a 65 6f 66 28 63 68  yte = (sizeof(ch
d6c0: 61 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28 69 31  ar*) + sizeof(i1
d6d0: 36 29 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a 45 78  6) + 1)*N;.  zEx
d6e0: 74 72 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  tra = sqlite3DbM
d6f0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
d700: 79 74 65 29 3b 0a 20 20 69 66 28 20 7a 45 78 74  yte);.  if( zExt
d710: 72 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ra==0 ) return S
d720: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
d730: 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72  ;.  memcpy(zExtr
d740: 61 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 2c  a, pIdx->azColl,
d750: 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70   sizeof(char*)*p
d760: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Idx->nColumn);. 
d770: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20   pIdx->azColl = 
d780: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 7a 45  (const char**)zE
d790: 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b  xtra;.  zExtra +
d7a0: 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a  = sizeof(char*)*
d7b0: 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74  N;.  memcpy(zExt
d7c0: 72 61 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  ra, pIdx->aiColu
d7d0: 6d 6e 2c 20 73 69 7a 65 6f 66 28 69 31 36 29 2a  mn, sizeof(i16)*
d7e0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a  pIdx->nColumn);.
d7f0: 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
d800: 20 3d 20 28 69 31 36 2a 29 7a 45 78 74 72 61 3b   = (i16*)zExtra;
d810: 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a  .  zExtra += siz
d820: 65 6f 66 28 69 31 36 29 2a 4e 3b 0a 20 20 6d 65  eof(i16)*N;.  me
d830: 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64  mcpy(zExtra, pId
d840: 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 70  x->aSortOrder, p
d850: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Idx->nColumn);. 
d860: 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
d870: 72 20 3d 20 28 75 38 2a 29 7a 45 78 74 72 61 3b  r = (u8*)zExtra;
d880: 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  .  pIdx->nColumn
d890: 20 3d 20 4e 3b 0a 20 20 70 49 64 78 2d 3e 69 73   = N;.  pIdx->is
d8a0: 52 65 73 69 7a 65 64 20 3d 20 31 3b 0a 20 20 72  Resized = 1;.  r
d8b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d8c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  .}../*.** Estima
d8d0: 74 65 20 74 68 65 20 74 6f 74 61 6c 20 72 6f 77  te the total row
d8e0: 20 77 69 64 74 68 20 66 6f 72 20 61 20 74 61 62   width for a tab
d8f0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
d900: 69 64 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65  id estimateTable
d910: 57 69 64 74 68 28 54 61 62 6c 65 20 2a 70 54 61  Width(Table *pTa
d920: 62 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77  b){.  unsigned w
d930: 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 63 6f 6e  Table = 0;.  con
d940: 73 74 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43  st Column *pTabC
d950: 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  ol;.  int i;.  f
d960: 6f 72 28 69 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2c  or(i=pTab->nCol,
d970: 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61   pTabCol=pTab->a
d980: 43 6f 6c 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  Col; i>0; i--, p
d990: 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 77  TabCol++){.    w
d9a0: 54 61 62 6c 65 20 2b 3d 20 70 54 61 62 43 6f 6c  Table += pTabCol
d9b0: 2d 3e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 69  ->szEst;.  }.  i
d9c0: 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30  f( pTab->iPKey<0
d9d0: 20 29 20 77 54 61 62 6c 65 2b 2b 3b 0a 20 20 70   ) wTable++;.  p
d9e0: 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20  Tab->szTabRow = 
d9f0: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77 54  sqlite3LogEst(wT
da00: 61 62 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  able*4);.}../*.*
da10: 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 61  * Estimate the a
da20: 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20 61  verage size of a
da30: 20 72 6f 77 20 66 6f 72 20 61 6e 20 69 6e 64 65   row for an inde
da40: 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
da50: 64 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57  d estimateIndexW
da60: 69 64 74 68 28 49 6e 64 65 78 20 2a 70 49 64 78  idth(Index *pIdx
da70: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77 49  ){.  unsigned wI
da80: 6e 64 65 78 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ndex = 0;.  int 
da90: 69 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d  i;.  const Colum
daa0: 6e 20 2a 61 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  n *aCol = pIdx->
dab0: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a 20 20  pTable->aCol;.  
dac0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
dad0: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
dae0: 20 20 20 20 69 31 36 20 78 20 3d 20 70 49 64 78      i16 x = pIdx
daf0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
db00: 20 20 20 61 73 73 65 72 74 28 20 78 3c 70 49 64     assert( x<pId
db10: 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  x->pTable->nCol 
db20: 29 3b 0a 20 20 20 20 77 49 6e 64 65 78 20 2b 3d  );.    wIndex +=
db30: 20 78 3c 30 20 3f 20 31 20 3a 20 61 43 6f 6c 5b   x<0 ? 1 : aCol[
db40: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
db50: 5d 5d 2e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20  ]].szEst;.  }.  
db60: 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 20 3d  pIdx->szIdxRow =
db70: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77   sqlite3LogEst(w
db80: 49 6e 64 65 78 2a 34 29 3b 0a 7d 0a 0a 2f 2a 20  Index*4);.}../* 
db90: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 76  Return true if v
dba0: 61 6c 75 65 20 78 20 69 73 20 66 6f 75 6e 64 20  alue x is found 
dbb0: 61 6e 79 20 6f 66 20 74 68 65 20 66 69 72 73 74  any of the first
dbc0: 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20 6f 66   nCol entries of
dbd0: 20 61 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74 61 74   aiCol[].*/.stat
dbe0: 69 63 20 69 6e 74 20 68 61 73 43 6f 6c 75 6d 6e  ic int hasColumn
dbf0: 28 63 6f 6e 73 74 20 69 31 36 20 2a 61 69 43 6f  (const i16 *aiCo
dc00: 6c 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 6e 74  l, int nCol, int
dc10: 20 78 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 43   x){.  while( nC
dc20: 6f 6c 2d 2d 20 3e 20 30 20 29 20 69 66 28 20 78  ol-- > 0 ) if( x
dc30: 3d 3d 2a 28 61 69 43 6f 6c 2b 2b 29 20 29 20 72  ==*(aiCol++) ) r
dc40: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
dc50: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 63 6f 6d  n 0;.}../* Recom
dc60: 70 75 74 65 20 74 68 65 20 63 6f 6c 4e 6f 74 49  pute the colNotI
dc70: 64 78 65 64 20 66 69 65 6c 64 20 6f 66 20 74 68  dxed field of th
dc80: 65 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 63  e Index..**.** c
dc90: 6f 6c 4e 6f 74 49 64 78 65 64 20 69 73 20 61 20  olNotIdxed is a 
dca0: 62 69 74 6d 61 73 6b 20 74 68 61 74 20 68 61 73  bitmask that has
dcb0: 20 61 20 30 20 62 69 74 20 72 65 70 72 65 73 65   a 0 bit represe
dcc0: 6e 74 69 6e 67 20 65 61 63 68 20 69 6e 64 65 78  nting each index
dcd0: 65 64 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68  ed.** columns th
dce0: 61 74 20 61 72 65 20 77 69 74 68 69 6e 20 74 68  at are within th
dcf0: 65 20 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d  e first 63 colum
dd00: 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ns of the table.
dd10: 20 20 54 68 65 0a 2a 2a 20 68 69 67 68 2d 6f 72    The.** high-or
dd20: 64 65 72 20 62 69 74 20 6f 66 20 63 6f 6c 4e 6f  der bit of colNo
dd30: 74 49 64 78 65 64 20 69 73 20 61 6c 77 61 79 73  tIdxed is always
dd40: 20 31 2e 20 20 41 6c 6c 20 75 6e 69 6e 64 65 78   1.  All unindex
dd50: 65 64 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66  ed columns.** of
dd60: 20 74 68 65 20 74 61 62 6c 65 20 68 61 76 65 20   the table have 
dd70: 61 20 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  a 1..**.** The c
dd80: 6f 6c 4e 6f 74 49 64 78 65 64 20 6d 61 73 6b 20  olNotIdxed mask 
dd90: 69 73 20 41 4e 44 2d 65 64 20 77 69 74 68 20 74  is AND-ed with t
dda0: 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63  he SrcList.a[].c
ddb0: 6f 6c 55 73 65 64 20 6d 61 73 6b 0a 2a 2a 20 74  olUsed mask.** t
ddc0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
ddd0: 68 65 20 69 6e 64 65 78 20 69 73 20 63 6f 76 65  he index is cove
dde0: 72 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  ring index..*/.s
ddf0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 63 6f 6d  tatic void recom
de00: 70 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74 49 6e  puteColumnsNotIn
de10: 64 65 78 65 64 28 49 6e 64 65 78 20 2a 70 49 64  dexed(Index *pId
de20: 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 20  x){.  Bitmask m 
de30: 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  = 0;.  int j;.  
de40: 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c  for(j=pIdx->nCol
de50: 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d  umn-1; j>=0; j--
de60: 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70  ){.    int x = p
de70: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
de80: 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29  ;.    if( x>=0 )
de90: 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
dea0: 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  ( x==BMS-1 );.  
deb0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
dec0: 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20 20  =BMS-2 );.      
ded0: 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20  if( x<BMS-1 ) m 
dee0: 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20  |= MASKBIT(x);. 
def0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 64 78 2d     }.  }.  pIdx-
df00: 3e 63 6f 6c 4e 6f 74 49 64 78 65 64 20 3d 20 7e  >colNotIdxed = ~
df10: 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49  m;.  assert( (pI
df20: 64 78 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65 64 3e  dx->colNotIdxed>
df30: 3e 36 33 29 3d 3d 31 20 29 3b 0a 7d 0a 0a 2f 2a  >63)==1 );.}../*
df40: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
df50: 20 72 75 6e 73 20 61 74 20 74 68 65 20 65 6e 64   runs at the end
df60: 20 6f 66 20 70 61 72 73 69 6e 67 20 61 20 43 52   of parsing a CR
df70: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
df80: 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20 68 61 73  ment that.** has
df90: 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
dfa0: 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6a 6f   clause.  The jo
dfb0: 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  b of this routin
dfc0: 65 20 69 73 20 74 6f 20 63 6f 6e 76 65 72 74 20  e is to convert 
dfd0: 62 6f 74 68 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c  both.** internal
dfe0: 20 73 63 68 65 6d 61 20 64 61 74 61 20 73 74 72   schema data str
dff0: 75 63 74 75 72 65 73 20 61 6e 64 20 74 68 65 20  uctures and the 
e000: 67 65 6e 65 72 61 74 65 64 20 56 44 42 45 20 63  generated VDBE c
e010: 6f 64 65 20 73 6f 20 74 68 61 74 20 74 68 65 79  ode so that they
e020: 0a 2a 2a 20 61 72 65 20 61 70 70 72 6f 70 72 69  .** are appropri
e030: 61 74 65 20 66 6f 72 20 61 20 57 49 54 48 4f 55  ate for a WITHOU
e040: 54 20 52 4f 57 49 44 20 74 61 62 6c 65 20 69 6e  T ROWID table in
e050: 73 74 65 61 64 20 6f 66 20 61 20 72 6f 77 69 64  stead of a rowid
e060: 20 74 61 62 6c 65 2e 0a 2a 2a 20 43 68 61 6e 67   table..** Chang
e070: 65 73 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a  es include:.**.*
e080: 2a 20 20 20 20 20 28 31 29 20 20 53 65 74 20 61  *     (1)  Set a
e090: 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  ll columns of th
e0a0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 73 63  e PRIMARY KEY sc
e0b0: 68 65 6d 61 20 6f 62 6a 65 63 74 20 74 6f 20 62  hema object to b
e0c0: 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a 20 20  e NOT NULL..**  
e0d0: 20 20 20 28 32 29 20 20 43 6f 6e 76 65 72 74 20     (2)  Convert 
e0e0: 50 33 20 70 61 72 61 6d 65 74 65 72 20 6f 66 20  P3 parameter of 
e0f0: 74 68 65 20 4f 50 5f 43 72 65 61 74 65 42 74 72  the OP_CreateBtr
e100: 65 65 20 66 72 6f 6d 20 42 54 52 45 45 5f 49 4e  ee from BTREE_IN
e110: 54 4b 45 59 20 0a 2a 2a 20 20 20 20 20 20 20 20  TKEY .**        
e120: 20 20 69 6e 74 6f 20 42 54 52 45 45 5f 42 4c 4f    into BTREE_BLO
e130: 42 4b 45 59 2e 0a 2a 2a 20 20 20 20 20 28 33 29  BKEY..**     (3)
e140: 20 20 42 79 70 61 73 73 20 74 68 65 20 63 72 65    Bypass the cre
e150: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c  ation of the sql
e160: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
e170: 20 65 6e 74 72 79 0a 2a 2a 20 20 20 20 20 20 20   entry.**       
e180: 20 20 20 66 6f 72 20 74 68 65 20 50 52 49 4d 41     for the PRIMA
e190: 52 59 20 4b 45 59 20 61 73 20 74 68 65 20 70 72  RY KEY as the pr
e1a0: 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20  imary key index 
e1b0: 69 73 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20  is now.**       
e1c0: 20 20 20 69 64 65 6e 74 69 66 69 65 64 20 62 79     identified by
e1d0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
e1e0: 65 72 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6f  er table entry o
e1f0: 66 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65  f the table itse
e200: 6c 66 2e 0a 2a 2a 20 20 20 20 20 28 34 29 20 20  lf..**     (4)  
e210: 53 65 74 20 74 68 65 20 49 6e 64 65 78 2e 74 6e  Set the Index.tn
e220: 75 6d 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52  um of the PRIMAR
e230: 59 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65  Y KEY Index obje
e240: 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20  ct in the.**    
e250: 20 20 20 20 20 20 73 63 68 65 6d 61 20 74 6f 20        schema to 
e260: 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 72 6f  the rootpage fro
e270: 6d 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  m the main table
e280: 2e 0a 2a 2a 20 20 20 20 20 28 35 29 20 20 41 64  ..**     (5)  Ad
e290: 64 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75  d all table colu
e2a0: 6d 6e 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41  mns to the PRIMA
e2b0: 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a  RY KEY Index obj
e2c0: 65 63 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ect.**          
e2d0: 73 6f 20 74 68 61 74 20 74 68 65 20 50 52 49 4d  so that the PRIM
e2e0: 41 52 59 20 4b 45 59 20 69 73 20 61 20 63 6f 76  ARY KEY is a cov
e2f0: 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 54 68  ering index.  Th
e300: 65 20 73 75 72 70 6c 75 73 0a 2a 2a 20 20 20 20  e surplus.**    
e310: 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 61 72        columns ar
e320: 65 20 70 61 72 74 20 6f 66 20 4b 65 79 49 6e 66  e part of KeyInf
e330: 6f 2e 6e 41 6c 6c 46 69 65 6c 64 20 61 6e 64 20  o.nAllField and 
e340: 61 72 65 20 6e 6f 74 20 75 73 65 64 20 66 6f 72  are not used for
e350: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f 72  .**          sor
e360: 74 69 6e 67 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f  ting or lookup o
e370: 72 20 75 6e 69 71 75 65 6e 65 73 73 20 63 68 65  r uniqueness che
e380: 63 6b 73 2e 0a 2a 2a 20 20 20 20 20 28 36 29 20  cks..**     (6) 
e390: 20 52 65 70 6c 61 63 65 20 74 68 65 20 72 6f 77   Replace the row
e3a0: 69 64 20 74 61 69 6c 20 6f 6e 20 61 6c 6c 20 61  id tail on all a
e3b0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e  utomatically gen
e3c0: 65 72 61 74 65 64 20 55 4e 49 51 55 45 0a 2a 2a  erated UNIQUE.**
e3d0: 20 20 20 20 20 20 20 20 20 20 69 6e 64 69 63 65            indice
e3e0: 73 20 77 69 74 68 20 74 68 65 20 50 52 49 4d 41  s with the PRIMA
e3f0: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a  RY KEY columns..
e400: 2a 2a 0a 2a 2a 20 46 6f 72 20 76 69 72 74 75 61  **.** For virtua
e410: 6c 20 74 61 62 6c 65 73 2c 20 6f 6e 6c 79 20 28  l tables, only (
e420: 31 29 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e  1) is performed.
e430: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e440: 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74  convertToWithout
e450: 52 6f 77 69 64 54 61 62 6c 65 28 50 61 72 73 65  RowidTable(Parse
e460: 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
e470: 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20  *pTab){.  Index 
e480: 2a 70 49 64 78 3b 0a 20 20 49 6e 64 65 78 20 2a  *pIdx;.  Index *
e490: 70 50 6b 3b 0a 20 20 69 6e 74 20 6e 50 6b 3b 0a  pPk;.  int nPk;.
e4a0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71    int i, j;.  sq
e4b0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
e4c0: 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a  se->db;.  Vdbe *
e4d0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
e4e0: 65 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 65 76  e;..  /* Mark ev
e4f0: 65 72 79 20 50 52 49 4d 41 52 59 20 4b 45 59 20  ery PRIMARY KEY 
e500: 63 6f 6c 75 6d 6e 20 61 73 20 4e 4f 54 20 4e 55  column as NOT NU
e510: 4c 4c 20 28 65 78 63 65 70 74 20 66 6f 72 20 69  LL (except for i
e520: 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73 29 0a  mposter tables).
e530: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
e540: 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62  init.imposterTab
e550: 6c 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  le ){.    for(i=
e560: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
e570: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
e580: 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e   (pTab->aCol[i].
e590: 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c  colFlags & COLFL
e5a0: 41 47 5f 50 52 49 4d 4b 45 59 29 21 3d 30 20 29  AG_PRIMKEY)!=0 )
e5b0: 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  {.        pTab->
e5c0: 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20  aCol[i].notNull 
e5d0: 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20  = OE_Abort;.    
e5e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
e5f0: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
e600: 50 33 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68  P3 operand of th
e610: 65 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65  e OP_CreateBtree
e620: 20 6f 70 63 6f 64 65 20 66 72 6f 6d 20 42 54 52   opcode from BTR
e630: 45 45 5f 49 4e 54 4b 45 59 0a 20 20 2a 2a 20 69  EE_INTKEY.  ** i
e640: 6e 74 6f 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45  nto BTREE_BLOBKE
e650: 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  Y..  */.  if( pP
e660: 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 20  arse->addrCrTab 
e670: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76  ){.    assert( v
e680: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
e690: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 70  dbeChangeP3(v, p
e6a0: 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62  Parse->addrCrTab
e6b0: 2c 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 29  , BTREE_BLOBKEY)
e6c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61  ;.  }..  /* Loca
e6d0: 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  te the PRIMARY K
e6e0: 45 59 20 69 6e 64 65 78 2e 20 20 4f 72 2c 20 69  EY index.  Or, i
e6f0: 66 20 74 68 69 73 20 74 61 62 6c 65 20 77 61 73  f this table was
e700: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
e710: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
e720: 41 52 59 20 4b 45 59 20 74 61 62 6c 65 2c 20 63  ARY KEY table, c
e730: 72 65 61 74 65 20 61 20 6e 65 77 20 50 52 49 4d  reate a new PRIM
e740: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 0a  ARY KEY index. .
e750: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d    */.  if( pTab-
e760: 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20  >iPKey>=0 ){.   
e770: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
e780: 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 69 70 6b 54  ;.    Token ipkT
e790: 6f 6b 65 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  oken;.    sqlite
e7a0: 33 54 6f 6b 65 6e 49 6e 69 74 28 26 69 70 6b 54  3TokenInit(&ipkT
e7b0: 6f 6b 65 6e 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  oken, pTab->aCol
e7c0: 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e  [pTab->iPKey].zN
e7d0: 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  ame);.    pList 
e7e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
e7f0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
e800: 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
e810: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
e820: 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44  rAlloc(db, TK_ID
e830: 2c 20 26 69 70 6b 54 6f 6b 65 6e 2c 20 30 29 29  , &ipkToken, 0))
e840: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
e850: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
e860: 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72   pList->a[0].sor
e870: 74 4f 72 64 65 72 20 3d 20 70 50 61 72 73 65 2d  tOrder = pParse-
e880: 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72 3b 0a 20  >iPkSortOrder;. 
e890: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
e8a0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 70 54  e->pNewTable==pT
e8b0: 61 62 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ab );.    sqlite
e8c0: 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61  3CreateIndex(pPa
e8d0: 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c  rse, 0, 0, 0, pL
e8e0: 69 73 74 2c 20 70 54 61 62 2d 3e 6b 65 79 43 6f  ist, pTab->keyCo
e8f0: 6e 66 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a  nf, 0, 0, 0, 0,.
e900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e910: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 44         SQLITE_ID
e920: 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59  XTYPE_PRIMARYKEY
e930: 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
e940: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
e950: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
e960: 74 75 72 6e 3b 0a 20 20 20 20 70 50 6b 20 3d 20  turn;.    pPk = 
e970: 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
e980: 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
e990: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
e9a0: 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  -1;.  }else{.   
e9b0: 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72   pPk = sqlite3Pr
e9c0: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
e9d0: 61 62 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  ab);..    /*.   
e9e0: 20 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 72   ** Remove all r
e9f0: 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73  edundant columns
ea00: 20 66 72 6f 6d 20 74 68 65 20 50 52 49 4d 41 52   from the PRIMAR
ea10: 59 20 4b 45 59 2e 20 20 46 6f 72 20 65 78 61 6d  Y KEY.  For exam
ea20: 70 6c 65 2c 20 63 68 61 6e 67 65 0a 20 20 20 20  ple, change.    
ea30: 2a 2a 20 22 50 52 49 4d 41 52 59 20 4b 45 59 28  ** "PRIMARY KEY(
ea40: 61 2c 62 2c 61 2c 62 2c 63 2c 62 2c 63 2c 64 29  a,b,a,b,c,b,c,d)
ea50: 22 20 69 6e 74 6f 20 6a 75 73 74 20 22 50 52 49  " into just "PRI
ea60: 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c 63 2c 64  MARY KEY(a,b,c,d
ea70: 29 22 2e 20 20 4c 61 74 65 72 0a 20 20 20 20 2a  )".  Later.    *
ea80: 2a 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74  * code assumes t
ea90: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  he PRIMARY KEY c
eaa0: 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 65 70 65 61  ontains no repea
eab0: 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20  ted columns..   
eac0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d   */.    for(i=j=
ead0: 31 3b 20 69 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f  1; i<pPk->nKeyCo
eae0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
eaf0: 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b  f( hasColumn(pPk
eb00: 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 70  ->aiColumn, j, p
eb10: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29  Pk->aiColumn[i])
eb20: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d   ){.        pPk-
eb30: 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 0a 20 20 20 20  >nColumn--;.    
eb40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
eb50: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a   pPk->aiColumn[j
eb60: 2b 2b 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c  ++] = pPk->aiCol
eb70: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  umn[i];.      }.
eb80: 20 20 20 20 7d 0a 20 20 20 20 70 50 6b 2d 3e 6e      }.    pPk->n
eb90: 4b 65 79 43 6f 6c 20 3d 20 6a 3b 0a 20 20 7d 0a  KeyCol = j;.  }.
eba0: 20 20 61 73 73 65 72 74 28 20 70 50 6b 21 3d 30    assert( pPk!=0
ebb0: 20 29 3b 0a 20 20 70 50 6b 2d 3e 69 73 43 6f 76   );.  pPk->isCov
ebc0: 65 72 69 6e 67 20 3d 20 31 3b 0a 20 20 69 66 28  ering = 1;.  if(
ebd0: 20 21 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73   !db->init.impos
ebe0: 74 65 72 54 61 62 6c 65 20 29 20 70 50 6b 2d 3e  terTable ) pPk->
ebf0: 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b  uniqNotNull = 1;
ec00: 0a 20 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b  .  nPk = pPk->nK
ec10: 65 79 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 42 79 70  eyCol;..  /* Byp
ec20: 61 73 73 20 74 68 65 20 63 72 65 61 74 69 6f 6e  ass the creation
ec30: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
ec40: 4b 45 59 20 62 74 72 65 65 20 61 6e 64 20 74 68  KEY btree and th
ec50: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a  e sqlite_master.
ec60: 20 20 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79    ** table entry
ec70: 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 72  . This is only r
ec80: 65 71 75 69 72 65 64 20 69 66 20 63 75 72 72 65  equired if curre
ec90: 6e 74 6c 79 20 67 65 6e 65 72 61 74 69 6e 67 20  ntly generating 
eca0: 56 44 42 45 0a 20 20 2a 2a 20 63 6f 64 65 20 66  VDBE.  ** code f
ecb0: 6f 72 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  or a CREATE TABL
ecc0: 45 20 28 6e 6f 74 20 77 68 65 6e 20 70 61 72 73  E (not when pars
ecd0: 69 6e 67 20 6f 6e 65 20 61 73 20 70 61 72 74 20  ing one as part 
ece0: 6f 66 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20  of reading.  ** 
ecf0: 61 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  a database schem
ed00: 61 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 76 20  a).  */.  if( v 
ed10: 26 26 20 70 50 6b 2d 3e 74 6e 75 6d 3e 30 20 29  && pPk->tnum>0 )
ed20: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
ed30: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29  ->init.busy==0 )
ed40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
ed50: 65 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c  eChangeOpcode(v,
ed60: 20 70 50 6b 2d 3e 74 6e 75 6d 2c 20 4f 50 5f 47   pPk->tnum, OP_G
ed70: 6f 74 6f 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  oto);.  }..  /* 
ed80: 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  The root page of
ed90: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
eda0: 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 72 6f   is the table ro
edb0: 6f 74 20 70 61 67 65 20 2a 2f 0a 20 20 70 50 6b  ot page */.  pPk
edc0: 2d 3e 74 6e 75 6d 20 3d 20 70 54 61 62 2d 3e 74  ->tnum = pTab->t
edd0: 6e 75 6d 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74  num;..  /* Updat
ede0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
edf0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
ee00: 66 20 61 6c 6c 20 55 4e 49 51 55 45 20 69 6e 64  f all UNIQUE ind
ee10: 69 63 65 73 20 62 79 20 63 6f 6e 76 65 72 74 69  ices by converti
ee20: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e 61  ng.  ** the fina
ee30: 6c 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 69  l rowid column i
ee40: 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  nto one or more 
ee50: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 50  columns of the P
ee60: 52 49 4d 41 52 59 20 4b 45 59 2e 0a 20 20 2a 2f  RIMARY KEY..  */
ee70: 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
ee80: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
ee90: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
eea0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
eeb0: 20 20 69 66 28 20 49 73 50 72 69 6d 61 72 79 4b    if( IsPrimaryK
eec0: 65 79 49 6e 64 65 78 28 70 49 64 78 29 20 29 20  eyIndex(pIdx) ) 
eed0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f  continue;.    fo
eee0: 72 28 69 3d 6e 3d 30 3b 20 69 3c 6e 50 6b 3b 20  r(i=n=0; i<nPk; 
eef0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
ef00: 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d  !hasColumn(pIdx-
ef10: 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d  >aiColumn, pIdx-
ef20: 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61  >nKeyCol, pPk->a
ef30: 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 20 6e 2b  iColumn[i]) ) n+
ef40: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
ef50: 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f   n==0 ){.      /
ef60: 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 73 20  * This index is 
ef70: 61 20 73 75 70 65 72 73 65 74 20 6f 66 20 74 68  a superset of th
ef80: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f  e primary key */
ef90: 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f  .      pIdx->nCo
efa0: 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 6e 4b 65  lumn = pIdx->nKe
efb0: 79 43 6f 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 74  yCol;.      cont
efc0: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
efd0: 69 66 28 20 72 65 73 69 7a 65 49 6e 64 65 78 4f  if( resizeIndexO
efe0: 62 6a 65 63 74 28 64 62 2c 20 70 49 64 78 2c 20  bject(db, pIdx, 
eff0: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 29  pIdx->nKeyCol+n)
f000: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66   ) return;.    f
f010: 6f 72 28 69 3d 30 2c 20 6a 3d 70 49 64 78 2d 3e  or(i=0, j=pIdx->
f020: 6e 4b 65 79 43 6f 6c 3b 20 69 3c 6e 50 6b 3b 20  nKeyCol; i<nPk; 
f030: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
f040: 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d  !hasColumn(pIdx-
f050: 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d  >aiColumn, pIdx-
f060: 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61  >nKeyCol, pPk->a
f070: 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20  iColumn[i]) ){. 
f080: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43         pIdx->aiC
f090: 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 50 6b 2d 3e  olumn[j] = pPk->
f0a0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
f0b0: 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
f0c0: 6c 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f  l[j] = pPk->azCo
f0d0: 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 6a  ll[i];.        j
f0e0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
f0f0: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  }.    assert( pI
f100: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 49 64  dx->nColumn>=pId
f110: 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 20 29 3b 0a  x->nKeyCol+n );.
f120: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
f130: 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 3b 0a  ->nColumn>=j );.
f140: 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c    }..  /* Add al
f150: 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  l table columns 
f160: 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  to the PRIMARY K
f170: 45 59 20 69 6e 64 65 78 0a 20 20 2a 2f 0a 20 20  EY index.  */.  
f180: 69 66 28 20 6e 50 6b 3c 70 54 61 62 2d 3e 6e 43  if( nPk<pTab->nC
f190: 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65  ol ){.    if( re
f1a0: 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  sizeIndexObject(
f1b0: 64 62 2c 20 70 50 6b 2c 20 70 54 61 62 2d 3e 6e  db, pPk, pTab->n
f1c0: 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  Col) ) return;. 
f1d0: 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 6e 50     for(i=0, j=nP
f1e0: 6b 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  k; i<pTab->nCol;
f1f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
f200: 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d   !hasColumn(pPk-
f210: 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 69 29  >aiColumn, j, i)
f220: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
f230: 72 74 28 20 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c 75  rt( j<pPk->nColu
f240: 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  mn );.        pP
f250: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d  k->aiColumn[j] =
f260: 20 69 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d   i;.        pPk-
f270: 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 73 71 6c  >azColl[j] = sql
f280: 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20  ite3StrBINARY;. 
f290: 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
f2a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
f2b0: 73 65 72 74 28 20 70 50 6b 2d 3e 6e 43 6f 6c 75  sert( pPk->nColu
f2c0: 6d 6e 3d 3d 6a 20 29 3b 0a 20 20 20 20 61 73 73  mn==j );.    ass
f2d0: 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d  ert( pTab->nCol=
f2e0: 3d 6a 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  =j );.  }else{. 
f2f0: 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20     pPk->nColumn 
f300: 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  = pTab->nCol;.  
f310: 7d 0a 20 20 72 65 63 6f 6d 70 75 74 65 43 6f 6c  }.  recomputeCol
f320: 75 6d 6e 73 4e 6f 74 49 6e 64 65 78 65 64 28 70  umnsNotIndexed(p
f330: 50 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Pk);.}../*.** Re
f340: 74 75 72 6e 20 74 72 75 65 20 69 66 20 7a 4e 61  turn true if zNa
f350: 6d 65 20 69 73 20 61 20 73 68 61 64 6f 77 20 74  me is a shadow t
f360: 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65  able name in the
f370: 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73   current databas
f380: 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  e.** connection.
f390: 0a 2a 2a 0a 2a 2a 20 7a 4e 61 6d 65 20 69 73 20  .**.** zName is 
f3a0: 74 65 6d 70 6f 72 61 72 69 6c 79 20 6d 6f 64 69  temporarily modi
f3b0: 66 69 65 64 20 77 68 69 6c 65 20 74 68 69 73 20  fied while this 
f3c0: 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 6e 69  routine is runni
f3d0: 6e 67 2c 20 62 75 74 20 69 73 0a 2a 2a 20 72 65  ng, but is.** re
f3e0: 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
f3f0: 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 70 72 69  iginal value pri
f400: 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  or to this routi
f410: 6e 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  ne returning..*/
f420: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 53 68  .static int isSh
f430: 61 64 6f 77 54 61 62 6c 65 4e 61 6d 65 28 73 71  adowTableName(sq
f440: 6c 69 74 65 33 20 2a 64 62 2c 20 63 68 61 72 20  lite3 *db, char 
f450: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  *zName){.  char 
f460: 2a 7a 54 61 69 6c 3b 20 20 20 20 20 20 20 20 20  *zTail;         
f470: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
f480: 74 65 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20  ter to the last 
f490: 22 5f 22 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a  "_" in zName */.
f4a0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
f4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4c0: 2f 2a 20 54 61 62 6c 65 20 74 68 61 74 20 7a 4e  /* Table that zN
f4d0: 61 6d 65 20 69 73 20 61 20 73 68 61 64 6f 77 20  ame is a shadow 
f4e0: 6f 66 20 2a 2f 0a 20 20 4d 6f 64 75 6c 65 20 2a  of */.  Module *
f4f0: 70 4d 6f 64 3b 20 20 20 20 20 20 20 20 20 20 20  pMod;           
f500: 20 20 20 20 20 20 2f 2a 20 4d 6f 64 75 6c 65 20        /* Module 
f510: 66 6f 72 20 74 68 65 20 76 69 72 74 75 61 6c 20  for the virtual 
f520: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 7a 54 61 69  table */..  zTai
f530: 6c 20 3d 20 73 74 72 72 63 68 72 28 7a 4e 61 6d  l = strrchr(zNam
f540: 65 2c 20 27 5f 27 29 3b 0a 20 20 69 66 28 20 7a  e, '_');.  if( z
f550: 54 61 69 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  Tail==0 ) return
f560: 20 30 3b 0a 20 20 2a 7a 54 61 69 6c 20 3d 20 30   0;.  *zTail = 0
f570: 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
f580: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
f590: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 2a 7a 54  zName, 0);.  *zT
f5a0: 61 69 6c 20 3d 20 27 5f 27 3b 0a 20 20 69 66 28  ail = '_';.  if(
f5b0: 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
f5c0: 6e 20 30 3b 0a 20 20 69 66 28 20 21 49 73 56 69  n 0;.  if( !IsVi
f5d0: 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
f5e0: 74 75 72 6e 20 30 3b 0a 20 20 70 4d 6f 64 20 3d  turn 0;.  pMod =
f5f0: 20 28 4d 6f 64 75 6c 65 2a 29 73 71 6c 69 74 65   (Module*)sqlite
f600: 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
f610: 4d 6f 64 75 6c 65 2c 20 70 54 61 62 2d 3e 61 7a  Module, pTab->az
f620: 4d 6f 64 75 6c 65 41 72 67 5b 30 5d 29 3b 0a 20  ModuleArg[0]);. 
f630: 20 69 66 28 20 70 4d 6f 64 3d 3d 30 20 29 20 72   if( pMod==0 ) r
f640: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
f650: 4d 6f 64 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 69 56  Mod->pModule->iV
f660: 65 72 73 69 6f 6e 3c 33 20 29 20 72 65 74 75 72  ersion<3 ) retur
f670: 6e 20 30 3b 0a 20 20 69 66 28 20 70 4d 6f 64 2d  n 0;.  if( pMod-
f680: 3e 70 4d 6f 64 75 6c 65 2d 3e 78 53 68 61 64 6f  >pModule->xShado
f690: 77 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  wName==0 ) retur
f6a0: 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 4d  n 0;.  return pM
f6b0: 6f 64 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 53 68  od->pModule->xSh
f6c0: 61 64 6f 77 4e 61 6d 65 28 7a 54 61 69 6c 2b 31  adowName(zTail+1
f6d0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
f6e0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
f6f0: 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65  ed to report the
f700: 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20   final ")" that 
f710: 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20  terminates.** a 
f720: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
f730: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
f740: 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  e table structur
f750: 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74  e that other act
f760: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76  ion routines hav
f770: 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a  e been building.
f780: 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ** is added to t
f790: 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  he internal hash
f7a0: 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e   tables, assumin
f7b0: 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65  g no errors have
f7c0: 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  .** occurred..**
f7d0: 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72  .** An entry for
f7e0: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61   the table is ma
f7f0: 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  de in the master
f800: 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20   table on disk, 
f810: 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69  unless.** this i
f820: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  s a temporary ta
f830: 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e  ble or db->init.
f840: 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64  busy==1.  When d
f850: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a  b->init.busy==1.
f860: 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61  ** it means we a
f870: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73  re reading the s
f880: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
f890: 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75  le because we ju
f8a0: 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20  st.** connected 
f8b0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
f8c0: 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73  or because the s
f8d0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
f8e0: 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74  le has.** recent
f8f0: 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74  ly changed, so t
f900: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69  he entry for thi
f910: 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  s table already 
f920: 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65  exists in.** the
f930: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
f940: 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74  able.  We do not
f950: 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20   want to create 
f960: 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  it again..**.** 
f970: 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61  If the pSelect a
f980: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e  rgument is not N
f990: 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ULL, it means th
f9a0: 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  at this routine.
f9b0: 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  ** was called to
f9c0: 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20   create a table 
f9d0: 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61  generated from a
f9e0: 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42   .** "CREATE TAB
f9f0: 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54  LE ... AS SELECT
fa00: 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e   ..." statement.
fa10: 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d    The column nam
fa20: 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  es of.** the new
fa30: 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63   table will matc
fa40: 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  h the result set
fa50: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a   of the SELECT..
fa60: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
fa70: 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  ndTable(.  Parse
fa80: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
fa90: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
faa0: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
fab0: 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20  pCons,          
fac0: 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65   /* The ',' toke
fad0: 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74  n after the last
fae0: 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f   column defn. */
faf0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20  .  Token *pEnd, 
fb00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
fb10: 65 20 27 29 27 20 62 65 66 6f 72 65 20 6f 70 74  e ')' before opt
fb20: 69 6f 6e 73 20 69 6e 20 74 68 65 20 43 52 45 41  ions in the CREA
fb30: 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 75 38  TE TABLE */.  u8
fb40: 20 74 61 62 4f 70 74 73 2c 20 20 20 20 20 20 20   tabOpts,       
fb50: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 74        /* Extra t
fb60: 61 62 6c 65 20 6f 70 74 69 6f 6e 73 2e 20 55 73  able options. Us
fb70: 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a 20 20 53 65  ually 0. */.  Se
fb80: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20  lect *pSelect   
fb90: 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20        /* Select 
fba0: 66 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e  from a "CREATE .
fbb0: 2e 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f  .. AS SELECT" */
fbc0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 20  .){.  Table *p; 
fbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbe0: 2f 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65  /* The new table
fbf0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
fc00: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
fc10: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
fc20: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
fc30: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
fc40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
fc50: 61 62 61 73 65 20 69 6e 20 77 68 69 63 68 20 74  abase in which t
fc60: 68 65 20 74 61 62 6c 65 20 6c 69 76 65 73 20 2a  he table lives *
fc70: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  /.  Index *pIdx;
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fc90: 20 41 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65   An implied inde
fca0: 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  x of the table *
fcb0: 2f 0a 0a 20 20 69 66 28 20 70 45 6e 64 3d 3d 30  /..  if( pEnd==0
fcc0: 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 20 29   && pSelect==0 )
fcd0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
fce0: 7d 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  }.  assert( !db-
fcf0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
fd00: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
fd10: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
fd20: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  p==0 ) return;..
fd30: 20 20 69 66 28 20 70 53 65 6c 65 63 74 3d 3d 30    if( pSelect==0
fd40: 20 26 26 20 69 73 53 68 61 64 6f 77 54 61 62 6c   && isShadowTabl
fd50: 65 4e 61 6d 65 28 64 62 2c 20 70 2d 3e 7a 4e 61  eName(db, p->zNa
fd60: 6d 65 29 20 29 7b 0a 20 20 20 20 70 2d 3e 74 61  me) ){.    p->ta
fd70: 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 53 68 61  bFlags |= TF_Sha
fd80: 64 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  dow;.  }..  /* I
fd90: 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  f the db->init.b
fda0: 75 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e  usy is 1 it mean
fdb0: 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
fdc0: 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65   the SQL off the
fdd0: 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61  .  ** "sqlite_ma
fde0: 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65  ster" or "sqlite
fdf0: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61  _temp_master" ta
fe00: 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e  ble on the disk.
fe10: 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20  .  ** So do not 
fe20: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73  write to the dis
fe30: 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63  k again.  Extrac
fe40: 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  t the root page 
fe50: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20  number.  ** for 
fe60: 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  the table from t
fe70: 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  he db->init.newT
fe80: 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65  num field.  (The
fe90: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
fea0: 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  * should have be
feb0: 65 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20  en put there by 
fec0: 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62  the sqliteOpenCb
fed0: 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2a 0a   routine.).  **.
fee0: 20 20 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f 74    ** If the root
fef0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
ff00: 31 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  1, that means th
ff10: 69 73 20 69 73 20 74 68 65 20 73 71 6c 69 74 65  is is the sqlite
ff20: 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62  _master.  ** tab
ff30: 6c 65 20 69 74 73 65 6c 66 2e 20 20 53 6f 20 6d  le itself.  So m
ff40: 61 72 6b 20 69 74 20 72 65 61 64 2d 6f 6e 6c 79  ark it read-only
ff50: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
ff60: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
ff70: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
ff80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
ff90: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
ffa0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
ffb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74  ;.    }.    p->t
ffc0: 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e  num = db->init.n
ffd0: 65 77 54 6e 75 6d 3b 0a 20 20 20 20 69 66 28 20  ewTnum;.    if( 
ffe0: 70 2d 3e 74 6e 75 6d 3d 3d 31 20 29 20 70 2d 3e  p->tnum==1 ) p->
fff0: 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 52  tabFlags |= TF_R
10000 65 61 64 6f 6e 6c 79 3b 0a 20 20 7d 0a 0a 20 20  eadonly;.  }..  
10010 2f 2a 20 53 70 65 63 69 61 6c 20 70 72 6f 63 65  /* Special proce
10020 73 73 69 6e 67 20 66 6f 72 20 57 49 54 48 4f 55  ssing for WITHOU
10030 54 20 52 4f 57 49 44 20 54 61 62 6c 65 73 20 2a  T ROWID Tables *
10040 2f 0a 20 20 69 66 28 20 74 61 62 4f 70 74 73 20  /.  if( tabOpts 
10050 26 20 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69  & TF_WithoutRowi
10060 64 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d  d ){.    if( (p-
10070 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41  >tabFlags & TF_A
10080 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 20 29 7b  utoincrement) ){
10090 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
100a0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
100b0 20 20 20 20 20 20 20 20 20 22 41 55 54 4f 49 4e           "AUTOIN
100c0 43 52 45 4d 45 4e 54 20 6e 6f 74 20 61 6c 6c 6f  CREMENT not allo
100d0 77 65 64 20 6f 6e 20 57 49 54 48 4f 55 54 20 52  wed on WITHOUT R
100e0 4f 57 49 44 20 74 61 62 6c 65 73 22 29 3b 0a 20  OWID tables");. 
100f0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
10100 20 7d 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74   }.    if( (p->t
10110 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73  abFlags & TF_Has
10120 50 72 69 6d 61 72 79 4b 65 79 29 3d 3d 30 20 29  PrimaryKey)==0 )
10130 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
10140 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
10150 22 50 52 49 4d 41 52 59 20 4b 45 59 20 6d 69 73  "PRIMARY KEY mis
10160 73 69 6e 67 20 6f 6e 20 74 61 62 6c 65 20 25 73  sing on table %s
10170 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  ", p->zName);.  
10180 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
10190 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
101a0 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20 7c 20  _WithoutRowid | 
101b0 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69  TF_NoVisibleRowi
101c0 64 3b 0a 20 20 20 20 20 20 63 6f 6e 76 65 72 74  d;.      convert
101d0 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61  ToWithoutRowidTa
101e0 62 6c 65 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ble(pParse, p);.
101f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 44 62      }.  }..  iDb
10200 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
10210 54 6f 49 6e 64 65 78 32 28 64 62 2c 20 70 2d 3e  ToIndex2(db, p->
10220 70 53 63 68 65 6d 61 2c 20 30 29 3b 0a 0a 23 69  pSchema, 0);..#i
10230 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10240 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73  T_CHECK.  /* Res
10250 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c  olve names in al
10260 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  l CHECK constrai
10270 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a  nt expressions..
10280 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43    */.  if( p->pC
10290 68 65 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  heck ){.    sqli
102a0 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65  te3ResolveSelfRe
102b0 66 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20  ference(pParse, 
102c0 70 2c 20 4e 43 5f 49 73 43 68 65 63 6b 2c 20 30  p, NC_IsCheck, 0
102d0 2c 20 70 2d 3e 70 43 68 65 63 6b 29 3b 0a 20 20  , p->pCheck);.  
102e0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
102f0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
10300 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a  _CHECK) */..  /*
10310 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 61 76   Estimate the av
10320 65 72 61 67 65 20 72 6f 77 20 73 69 7a 65 20 66  erage row size f
10330 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  or the table and
10340 20 66 6f 72 20 61 6c 6c 20 69 6d 70 6c 69 65 64   for all implied
10350 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 65 73   indices */.  es
10360 74 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68  timateTableWidth
10370 28 70 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d  (p);.  for(pIdx=
10380 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  p->pIndex; pIdx;
10390 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
103a0 74 29 7b 0a 20 20 20 20 65 73 74 69 6d 61 74 65  t){.    estimate
103b0 49 6e 64 65 78 57 69 64 74 68 28 70 49 64 78 29  IndexWidth(pIdx)
103c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  ;.  }..  /* If n
103d0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c  ot initializing,
103e0 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72   then create a r
103f0 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65  ecord for the ne
10400 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20  w table.  ** in 
10410 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
10420 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64  R table of the d
10430 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  atabase..  **.  
10440 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
10450 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c  TEMPORARY table,
10460 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79   write the entry
10470 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69   into the auxili
10480 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e  ary.  ** file in
10490 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68  stead of into th
104a0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
104b0 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
104c0 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
104d0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
104e0 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63    Vdbe *v;.    c
104f0 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f  har *zType;    /
10500 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74 61 62  * "view" or "tab
10510 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  le" */.    char 
10520 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56  *zType2;   /* "V
10530 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20  IEW" or "TABLE" 
10540 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  */.    char *zSt
10550 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  mt;    /* Text o
10560 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
10570 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56 49 45  LE or CREATE VIE
10580 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a  W statement */..
10590 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
105a0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
105b0 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d      if( NEVER(v=
105c0 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  =0) ) return;.. 
105d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
105e0 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
105f0 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20  , 0);..    /* . 
10600 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65     ** Initialize
10610 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 6e   zType for the n
10620 65 77 20 76 69 65 77 20 6f 72 20 74 61 62 6c 65  ew view or table
10630 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
10640 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29   p->pSelect==0 )
10650 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67  {.      /* A reg
10660 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ular table */.  
10670 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61 62      zType = "tab
10680 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  le";.      zType
10690 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69 66  2 = "TABLE";.#if
106a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
106b0 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b  _VIEW.    }else{
106c0 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77  .      /* A view
106d0 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20   */.      zType 
106e0 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20  = "view";.      
106f0 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b  zType2 = "VIEW";
10700 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
10710 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
10720 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
10730 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e  xx AS SELECT ...
10740 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53 45  , execute the SE
10750 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74  LECT.    ** stat
10760 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74  ement to populat
10770 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  e the new table.
10780 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e   The root-page n
10790 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20  umber for the.  
107a0 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69    ** new table i
107b0 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50  s in register pP
107c0 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20  arse->regRoot.. 
107d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63     **.    ** Onc
107e0 65 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73  e the SELECT has
107f0 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73   been coded by s
10800 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20  qlite3Select(), 
10810 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a  it is in a.    *
10820 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61 74 65  * suitable state
10830 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68   to query for th
10840 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
10850 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65 20 75  nd types to be u
10860 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  sed.    ** by th
10870 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20  e new table..   
10880 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68 61   **.    ** A sha
10890 72 65 64 2d 63 61 63 68 65 20 77 72 69 74 65 2d  red-cache write-
108a0 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
108b0 69 72 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  ired to write to
108c0 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a   the new table,.
108d0 20 20 20 20 2a 2a 20 61 73 20 61 20 73 63 68 65      ** as a sche
108e0 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76  ma-lock must hav
108f0 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  e already been o
10900 62 74 61 69 6e 65 64 20 74 6f 20 63 72 65 61 74  btained to creat
10910 65 20 69 74 2e 20 53 69 6e 63 65 0a 20 20 20 20  e it. Since.    
10920 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b  ** a schema-lock
10930 20 65 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74   excludes all ot
10940 68 65 72 20 64 61 74 61 62 61 73 65 20 75 73 65  her database use
10950 72 73 2c 20 74 68 65 20 77 72 69 74 65 2d 6c 6f  rs, the write-lo
10960 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20  ck would.    ** 
10970 62 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20  be redundant..  
10980 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65    */.    if( pSe
10990 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 53 65  lect ){.      Se
109a0 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20  lectDest dest;  
109b0 20 20 2f 2a 20 57 68 65 72 65 20 74 68 65 20 53    /* Where the S
109c0 45 4c 45 43 54 20 73 68 6f 75 6c 64 20 73 74 6f  ELECT should sto
109d0 72 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  re results */.  
109e0 20 20 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64      int regYield
109f0 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  ;       /* Regis
10a00 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 2d 72  ter holding co-r
10a10 6f 75 74 69 6e 65 20 65 6e 74 72 79 2d 70 6f 69  outine entry-poi
10a20 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  nt */.      int 
10a30 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20  addrTop;        
10a40 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 63 6f  /* Top of the co
10a50 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  -routine */.    
10a60 20 20 69 6e 74 20 72 65 67 52 65 63 3b 20 20 20    int regRec;   
10a70 20 20 20 20 20 20 2f 2a 20 41 20 72 65 63 6f 72        /* A recor
10a80 64 20 74 6f 20 62 65 20 69 6e 73 65 72 74 20 69  d to be insert i
10a90 6e 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c  nto the new tabl
10aa0 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  e */.      int r
10ab0 65 67 52 6f 77 69 64 3b 20 20 20 20 20 20 20 2f  egRowid;       /
10ac0 2a 20 52 6f 77 69 64 20 6f 66 20 74 68 65 20 6e  * Rowid of the n
10ad0 65 78 74 20 72 6f 77 20 74 6f 20 69 6e 73 65 72  ext row to inser
10ae0 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  t */.      int a
10af0 64 64 72 49 6e 73 4c 6f 6f 70 3b 20 20 20 20 2f  ddrInsLoop;    /
10b00 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  * Top of the loo
10b10 70 20 66 6f 72 20 69 6e 73 65 72 74 69 6e 67 20  p for inserting 
10b20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 54 61  rows */.      Ta
10b30 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20  ble *pSelTab;   
10b40 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 74 68 61    /* A table tha
10b50 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
10b60 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a  SELECT results *
10b70 2f 0a 0a 20 20 20 20 20 20 72 65 67 59 69 65 6c  /..      regYiel
10b80 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
10b90 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 65 63  em;.      regRec
10ba0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
10bb0 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69  m;.      regRowi
10bc0 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
10bd0 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  em;.      assert
10be0 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 31  (pParse->nTab==1
10bf0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10c00 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
10c10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10c20 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
10c30 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 70 50  OpenWrite, 1, pP
10c40 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69  arse->regRoot, i
10c50 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
10c60 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
10c70 2c 20 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47  , OPFLAG_P2ISREG
10c80 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
10c90 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20  >nTab = 2;.     
10ca0 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
10cb0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
10cc0 72 28 76 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  r(v) + 1;.      
10cd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10ce0 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
10cf0 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c  utine, regYield,
10d00 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20   0, addrTop);.  
10d10 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
10d20 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20  nErr ) return;. 
10d30 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73       pSelTab = s
10d40 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
10d50 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
10d60 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
10d70 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29  if( pSelTab==0 )
10d80 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 61   return;.      a
10d90 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d  ssert( p->aCol==
10da0 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43  0 );.      p->nC
10db0 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43  ol = pSelTab->nC
10dc0 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 43 6f  ol;.      p->aCo
10dd0 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
10de0 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  l;.      pSelTab
10df0 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
10e00 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
10e10 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
10e20 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
10e30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20  , pSelTab);.    
10e40 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
10e50 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
10e60 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  RT_Coroutine, re
10e70 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 73  gYield);.      s
10e80 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
10e90 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64  rse, pSelect, &d
10ea0 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  est);.      if( 
10eb0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
10ec0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 73 71 6c  eturn;.      sql
10ed0 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75  ite3VdbeEndCorou
10ee0 74 69 6e 65 28 76 2c 20 72 65 67 59 69 65 6c 64  tine(v, regYield
10ef0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10f00 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
10f10 61 64 64 72 54 6f 70 20 2d 20 31 29 3b 0a 20 20  addrTop - 1);.  
10f20 20 20 20 20 61 64 64 72 49 6e 73 4c 6f 6f 70 20      addrInsLoop 
10f30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
10f40 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
10f50 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a   dest.iSDParm);.
10f60 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
10f70 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
10f80 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
10f90 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
10fa0 20 64 65 73 74 2e 69 53 64 73 74 2c 20 64 65 73   dest.iSdst, des
10fb0 74 2e 6e 53 64 73 74 2c 20 72 65 67 52 65 63 29  t.nSdst, regRec)
10fc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
10fd0 61 62 6c 65 41 66 66 69 6e 69 74 79 28 76 2c 20  ableAffinity(v, 
10fe0 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  p, 0);.      sql
10ff0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11000 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 31  , OP_NewRowid, 1
11010 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
11020 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11030 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
11040 74 2c 20 31 2c 20 72 65 67 52 65 63 2c 20 72 65  t, 1, regRec, re
11050 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
11060 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
11070 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a  , addrInsLoop);.
11080 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11090 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
110a0 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  rInsLoop);.     
110b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
110c0 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
110d0 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  1);.    }..    /
110e0 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
110f0 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
11100 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d  he CREATE statem
11110 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ent */.    if( p
11120 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
11130 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61  zStmt = createTa
11140 62 6c 65 53 74 6d 74 28 64 62 2c 20 70 29 3b 0a  bleStmt(db, p);.
11150 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11160 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 32 20 3d 20   Token *pEnd2 = 
11170 74 61 62 4f 70 74 73 20 3f 20 26 70 50 61 72 73  tabOpts ? &pPars
11180 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 20 3a 20  e->sLastToken : 
11190 70 45 6e 64 3b 0a 20 20 20 20 20 20 6e 20 3d 20  pEnd;.      n = 
111a0 28 69 6e 74 29 28 70 45 6e 64 32 2d 3e 7a 20 2d  (int)(pEnd2->z -
111b0 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
111c0 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 69 66  ken.z);.      if
111d0 28 20 70 45 6e 64 32 2d 3e 7a 5b 30 5d 21 3d 27  ( pEnd2->z[0]!='
111e0 3b 27 20 29 20 6e 20 2b 3d 20 70 45 6e 64 32 2d  ;' ) n += pEnd2-
111f0 3e 6e 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20  >n;.      zStmt 
11200 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
11210 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  (db, .          
11220 22 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22  "CREATE %s %.*s"
11230 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61  , zType2, n, pPa
11240 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
11250 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  z.      );.    }
11260 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20  ..    /* A slot 
11270 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 68  for the record h
11280 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
11290 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65  allocated in the
112a0 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f   .    ** SQLITE_
112b0 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57  MASTER table.  W
112c0 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75  e just need to u
112d0 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20  pdate that slot 
112e0 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20  with all.    ** 
112f0 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
11300 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e  we've collected.
11310 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
11320 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
11330 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50  Parse,.      "UP
11340 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20  DATE %Q.%s ".   
11350 20 20 20 20 20 20 22 53 45 54 20 74 79 70 65 3d        "SET type=
11360 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74  '%s', name=%Q, t
11370 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74  bl_name=%Q, root
11380 70 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51  page=#%d, sql=%Q
11390 20 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45   ".       "WHERE
113a0 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20 20   rowid=#%d",.   
113b0 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
113c0 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52  zDbSName, MASTER
113d0 5f 4e 41 4d 45 2c 0a 20 20 20 20 20 20 7a 54 79  _NAME,.      zTy
113e0 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61  pe,.      p->zNa
113f0 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61  me,.      p->zNa
11400 6d 65 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65  me,.      pParse
11410 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20 20 20  ->regRoot,.     
11420 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 70 50   zStmt,.      pP
11430 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20  arse->regRowid. 
11440 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
11450 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d  3DbFree(db, zStm
11460 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  t);.    sqlite3C
11470 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
11480 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64  se, iDb);..#ifnd
11490 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
114a0 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
114b0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
114c0 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63   if we need to c
114d0 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f  reate an sqlite_
114e0 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66  sequence table f
114f0 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e  or.    ** keepin
11500 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69  g track of autoi
11510 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20  ncrement keys.. 
11520 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
11530 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
11540 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d  Autoincrement)!=
11550 30 20 29 7b 0a 20 20 20 20 20 20 44 62 20 2a 70  0 ){.      Db *p
11560 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
11570 62 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  b];.      assert
11580 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
11590 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
115a0 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66  , 0) );.      if
115b0 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  ( pDb->pSchema->
115c0 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20  pSeqTab==0 ){.  
115d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
115e0 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
115f0 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41  .          "CREA
11600 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69  TE TABLE %Q.sqli
11610 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65  te_sequence(name
11620 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20  ,seq)",.        
11630 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 0a    pDb->zDbSName.
11640 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
11650 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
11660 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20  .    /* Reparse 
11670 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70  everything to up
11680 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61  date our interna
11690 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  l data structure
116a0 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  s */.    sqlite3
116b0 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65  VdbeAddParseSche
116c0 6d 61 4f 70 28 70 50 61 72 73 65 2c 20 69 44 62  maOp(pParse, iDb
116d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
116e0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
116f0 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 20 41  "tbl_name='%q' A
11700 4e 44 20 74 79 70 65 21 3d 27 74 72 69 67 67 65  ND type!='trigge
11710 72 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 29 3b  r'", p->zName));
11720 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20  .  }...  /* Add 
11730 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65  the table to the
11740 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
11750 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
11760 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
11770 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
11780 75 73 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  usy ){.    Table
11790 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65   *pOld;.    Sche
117a0 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d  ma *pSchema = p-
117b0 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 61 73  >pSchema;.    as
117c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
117d0 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
117e0 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
117f0 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61  pOld = sqlite3Ha
11800 73 68 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d  shInsert(&pSchem
11810 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a  a->tblHash, p->z
11820 4e 61 6d 65 2c 20 70 29 3b 0a 20 20 20 20 69 66  Name, p);.    if
11830 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  ( pOld ){.      
11840 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20  assert( p==pOld 
11850 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75  );  /* Malloc mu
11860 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 69  st have failed i
11870 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65 72 74  nside HashInsert
11880 28 29 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  () */.      sqli
11890 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
118a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
118b0 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
118c0 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a  >pNewTable = 0;.
118d0 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73      db->mDbFlags
118e0 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d   |= DBFLAG_Schem
118f0 61 43 68 61 6e 67 65 3b 0a 0a 23 69 66 6e 64 65  aChange;..#ifnde
11900 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c  f SQLITE_OMIT_AL
11910 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28  TERTABLE.    if(
11920 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a   !p->pSelect ){.
11930 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
11940 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74   *zName = (const
11950 20 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e   char *)pParse->
11960 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20  sNameToken.z;.  
11970 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20      int nName;. 
11980 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53       assert( !pS
11990 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26  elect && pCons &
119a0 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  & pEnd );.      
119b0 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20  if( pCons->z==0 
119c0 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 73  ){.        pCons
119d0 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d   = pEnd;.      }
119e0 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28  .      nName = (
119f0 69 6e 74 29 28 28 63 6f 6e 73 74 20 63 68 61 72  int)((const char
11a00 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e   *)pCons->z - zN
11a10 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  ame);.      p->a
11a20 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33  ddColOffset = 13
11a30 20 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43 68   + sqlite3Utf8Ch
11a40 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61  arLen(zName, nNa
11a50 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  me);.    }.#endi
11a60 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  f.  }.}..#ifndef
11a70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
11a80 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  W./*.** The pars
11a90 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
11aa0 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74  utine in order t
11ab0 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56  o create a new V
11ac0 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  IEW.*/.void sqli
11ad0 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20  te3CreateView(. 
11ae0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
11af0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
11b00 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
11b10 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20  Token *pBegin,  
11b20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
11b30 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
11b40 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ns the statement
11b50 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
11b60 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me1,     /* The 
11b70 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
11b80 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
11b90 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e   view */.  Token
11ba0 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a   *pName2,     /*
11bb0 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20   The token that 
11bc0 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f  holds the name o
11bd0 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  f the view */.  
11be0 45 78 70 72 4c 69 73 74 20 2a 70 43 4e 61 6d 65  ExprList *pCName
11bf0 73 2c 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 6c  s, /* Optional l
11c00 69 73 74 20 6f 66 20 76 69 65 77 20 63 6f 6c 75  ist of view colu
11c10 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 53 65  mn names */.  Se
11c20 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
11c30 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61   /* A SELECT sta
11c40 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c  tement that will
11c50 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
11c60 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73  view */.  int is
11c70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
11c80 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f  TRUE for a TEMPO
11c90 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69  RARY view */.  i
11ca0 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20  nt noErr        
11cb0 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72    /* Suppress er
11cc0 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 66 20  ror messages if 
11cd0 56 49 45 57 20 61 6c 72 65 61 64 79 20 65 78 69  VIEW already exi
11ce0 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  sts */.){.  Tabl
11cf0 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  e *p;.  int n;. 
11d00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
11d10 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20    Token sEnd;.  
11d20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20  DbFixer sFix;.  
11d30 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30  Token *pName = 0
11d40 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73  ;.  int iDb;.  s
11d50 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
11d60 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
11d70 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29  pParse->nVar>0 )
11d80 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
11d90 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70  orMsg(pParse, "p
11da0 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f  arameters are no
11db0 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65  t allowed in vie
11dc0 77 73 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 63  ws");.    goto c
11dd0 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b  reate_view_fail;
11de0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74  .  }.  sqlite3St
11df0 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c  artTable(pParse,
11e00 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
11e10 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e   isTemp, 1, 0, n
11e20 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20 70 50 61  oErr);.  p = pPa
11e30 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
11e40 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50    if( p==0 || pP
11e50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74  arse->nErr ) got
11e60 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61  o create_view_fa
11e70 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33 54 77 6f  il;.  sqlite3Two
11e80 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
11e90 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
11ea0 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62 20   &pName);.  iDb 
11eb0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
11ec0 6f 49 6e 64 65 78 32 28 64 62 2c 20 70 2d 3e 70  oIndex2(db, p->p
11ed0 53 63 68 65 6d 61 2c 20 30 29 3b 0a 20 20 73 71  Schema, 0);.  sq
11ee0 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46  lite3FixInit(&sF
11ef0 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c  ix, pParse, iDb,
11f00 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 3b   "view", pName);
11f10 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  .  if( sqlite3Fi
11f20 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70  xSelect(&sFix, p
11f30 53 65 6c 65 63 74 29 20 29 20 67 6f 74 6f 20 63  Select) ) goto c
11f40 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b  reate_view_fail;
11f50 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f  ..  /* Make a co
11f60 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  py of the entire
11f70 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
11f80 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
11f90 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68  he view..  ** Th
11fa0 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c  is will force al
11fb0 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e  l the Expr.token
11fc0 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  .z values to be 
11fd0 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a  dynamically.  **
11fe0 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65   allocated rathe
11ff0 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20  r than point to 
12000 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67  the input string
12010 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74   - which means t
12020 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69  hat.  ** they wi
12030 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74 65 72  ll persist after
12040 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c   the current sql
12050 69 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c  ite3_exec() call
12060 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20   returns..  */. 
12070 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
12080 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 70 2d 3e  BJECT ){.    p->
12090 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63  pSelect = pSelec
120a0 74 3b 0a 20 20 20 20 70 53 65 6c 65 63 74 20 3d  t;.    pSelect =
120b0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
120c0 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71   p->pSelect = sq
120d0 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
120e0 62 2c 20 70 53 65 6c 65 63 74 2c 20 45 58 50 52  b, pSelect, EXPR
120f0 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 7d  DUP_REDUCE);.  }
12100 0a 20 20 70 2d 3e 70 43 68 65 63 6b 20 3d 20 73  .  p->pCheck = s
12110 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
12120 70 28 64 62 2c 20 70 43 4e 61 6d 65 73 2c 20 45  p(db, pCNames, E
12130 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
12140 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
12150 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 63 72  Failed ) goto cr
12160 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a  eate_view_fail;.
12170 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
12180 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41   end of the CREA
12190 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e  TE VIEW statemen
121a0 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f  t.  Make sEnd po
121b0 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  int to.  ** the 
121c0 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64  end..  */.  sEnd
121d0 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74   = pParse->sLast
121e0 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28  Token;.  assert(
121f0 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 7c 7c   sEnd.z[0]!=0 ||
12200 20 73 45 6e 64 2e 6e 3d 3d 30 20 29 3b 0a 20 20   sEnd.n==0 );.  
12210 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27  if( sEnd.z[0]!='
12220 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a  ;' ){.    sEnd.z
12230 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a   += sEnd.n;.  }.
12240 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20    sEnd.n = 0;.  
12250 6e 20 3d 20 28 69 6e 74 29 28 73 45 6e 64 2e 7a  n = (int)(sEnd.z
12260 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20   - pBegin->z);. 
12270 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a   assert( n>0 );.
12280 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b    z = pBegin->z;
12290 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65  .  while( sqlite
122a0 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29  3Isspace(z[n-1])
122b0 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e   ){ n--; }.  sEn
122c0 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20  d.z = &z[n-1];. 
122d0 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20   sEnd.n = 1;..  
122e0 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e  /* Use sqlite3En
122f0 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20  dTable() to add 
12300 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65 20  the view to the 
12310 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
12320 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
12330 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c  EndTable(pParse,
12340 20 30 2c 20 26 73 45 6e 64 2c 20 30 2c 20 30 29   0, &sEnd, 0, 0)
12350 3b 0a 0a 63 72 65 61 74 65 5f 76 69 65 77 5f 66  ;..create_view_f
12360 61 69 6c 3a 0a 20 20 73 71 6c 69 74 65 33 53 65  ail:.  sqlite3Se
12370 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
12380 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 49  Select);.  if( I
12390 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
123a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
123b0 6e 61 6d 65 45 78 70 72 6c 69 73 74 55 6e 6d 61  nameExprlistUnma
123c0 70 28 70 50 61 72 73 65 2c 20 70 43 4e 61 6d 65  p(pParse, pCName
123d0 73 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  s);.  }.  sqlite
123e0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
123f0 64 62 2c 20 70 43 4e 61 6d 65 73 29 3b 0a 20 20  db, pCNames);.  
12400 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66  return;.}.#endif
12410 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
12420 56 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65  VIEW */..#if !de
12430 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
12440 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
12450 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
12460 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a  VIRTUALTABLE)./*
12470 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74  .** The Table st
12480 72 75 63 74 75 72 65 20 70 54 61 62 6c 65 20 69  ructure pTable i
12490 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e  s really a VIEW.
124a0 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61    Fill in the na
124b0 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f  mes of.** the co
124c0 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65  lumns of the vie
124d0 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20  w in the pTable 
124e0 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 74 75  structure.  Retu
124f0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  rn the number.**
12500 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
12510 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e  an error is seen
12520 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
12530 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
12540 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69  e->zErrMsg..*/.i
12550 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  nt sqlite3ViewGe
12560 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72  tColumnNames(Par
12570 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
12580 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54 61  e *pTable){.  Ta
12590 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20  ble *pSelTab;   
125a0 2f 2a 20 41 20 66 61 6b 65 20 74 61 62 6c 65 20  /* A fake table 
125b0 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20 67 65  from which we ge
125c0 74 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  t the result set
125d0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
125e0 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  el;     /* Copy 
125f0 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 74 68  of the SELECT th
12600 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
12610 65 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  e view */.  int 
12620 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a  nErr = 0;     /*
12630 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   Number of error
12640 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f  s encountered */
12650 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
12660 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
12670 69 6c 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 75  ily holds the nu
12680 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20  mber of cursors 
12690 61 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20 73 71  assigned */.  sq
126a0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
126b0 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61  se->db;  /* Data
126c0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
126d0 66 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  for malloc error
126e0 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  s */.#ifndef SQL
126f0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
12700 54 41 42 4c 45 0a 20 20 69 6e 74 20 72 63 3b 0a  TABLE.  int rc;.
12710 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
12720 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
12730 52 49 5a 41 54 49 4f 4e 0a 20 20 73 71 6c 69 74  RIZATION.  sqlit
12740 65 33 5f 78 61 75 74 68 20 78 41 75 74 68 3b 20  e3_xauth xAuth; 
12750 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 78        /* Saved x
12760 41 75 74 68 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  Auth pointer */.
12770 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
12780 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66  ( pTable );..#if
12790 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
127a0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
127b0 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 2b  db->nSchemaLock+
127c0 2b 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  +;.  rc = sqlite
127d0 33 56 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74  3VtabCallConnect
127e0 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29  (pParse, pTable)
127f0 3b 0a 20 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c  ;.  db->nSchemaL
12800 6f 63 6b 2d 2d 3b 0a 20 20 69 66 28 20 72 63 20  ock--;.  if( rc 
12810 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
12820 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56 69 72  .  }.  if( IsVir
12830 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29 20 72  tual(pTable) ) r
12840 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
12850 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12860 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41  OMIT_VIEW.  /* A
12870 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d   positive nCol m
12880 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73  eans the columns
12890 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20   names for this 
128a0 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c  view are.  ** al
128b0 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a  ready known..  *
128c0 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
128d0 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20  nCol>0 ) return 
128e0 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74  0;..  /* A negat
128f0 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70  ive nCol is a sp
12900 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61  ecial marker mea
12910 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72 65  ning that we are
12920 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20   currently.  ** 
12930 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74  trying to comput
12940 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
12950 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72  es.  If we enter
12960 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
12970 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69  th.  ** a negati
12980 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e  ve nCol, it mean
12990 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69  s two or more vi
129a0 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c  ews form a loop,
129b0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a   like this:.  **
129c0 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
129d0 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c   VIEW one AS SEL
129e0 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a  ECT * FROM two;.
129f0 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
12a00 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45  VIEW two AS SELE
12a10 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20  CT * FROM one;. 
12a20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c   **.  ** Actuall
12a30 79 2c 20 74 68 65 20 65 72 72 6f 72 20 61 62 6f  y, the error abo
12a40 76 65 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74  ve is now caught
12a50 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69   prior to reachi
12a60 6e 67 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20  ng this point.. 
12a70 20 2a 2a 20 42 75 74 20 74 68 65 20 66 6f 6c 6c   ** But the foll
12a80 6f 77 69 6e 67 20 74 65 73 74 20 69 73 20 73 74  owing test is st
12a90 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74 20 61 73  ill important as
12aa0 20 69 74 20 64 6f 65 73 20 63 6f 6d 65 20 75 70   it does come up
12ab0 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c  .  ** in the fol
12ac0 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20 20  lowing:.  ** .  
12ad0 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41  **     CREATE TA
12ae0 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28 61 29 3b  BLE main.ex1(a);
12af0 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
12b00 20 54 45 4d 50 20 56 49 45 57 20 65 78 31 20 41   TEMP VIEW ex1 A
12b10 53 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20  S SELECT a FROM 
12b20 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20 20 53 45  ex1;.  **     SE
12b30 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 6d 70  LECT * FROM temp
12b40 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20 69 66 28  .ex1;.  */.  if(
12b50 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20   pTable->nCol<0 
12b60 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
12b70 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
12b80 76 69 65 77 20 25 73 20 69 73 20 63 69 72 63 75  view %s is circu
12b90 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20  larly defined", 
12ba0 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
12bb0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
12bc0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  }.  assert( pTab
12bd0 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a  le->nCol>=0 );..
12be0 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74    /* If we get t
12bf0 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e  his far, it mean
12c00 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d  s we need to com
12c10 70 75 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e  pute the table n
12c20 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20  ames..  ** Note 
12c30 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f  that the call to
12c40 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
12c50 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c  tOfSelect() will
12c60 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a   expand any.  **
12c70 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e   "*" elements in
12c80 20 74 68 65 20 72 65 73 75 6c 74 73 20 73 65 74   the results set
12c90 20 6f 66 20 74 68 65 20 76 69 65 77 20 61 6e 64   of the view and
12ca0 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63 75 72   will assign cur
12cb0 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  sors.  ** to the
12cc0 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
12cd0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42   FROM clause.  B
12ce0 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e  ut we do not wan
12cf0 74 20 74 68 65 73 65 20 63 68 61 6e 67 65 73 0a  t these changes.
12d00 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d 61    ** to be perma
12d10 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20 63 6f  nent.  So the co
12d20 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e  mputation is don
12d30 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20 74  e on a copy of t
12d40 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73  he SELECT.  ** s
12d50 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
12d60 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
12d70 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
12d80 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29  Table->pSelect )
12d90 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c 69 74  ;.  pSel = sqlit
12da0 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
12db0 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 2c  pTable->pSelect,
12dc0 20 30 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 20   0);.  if( pSel 
12dd0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
12de0 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c  E_OMIT_ALTERTABL
12df0 45 0a 20 20 20 20 75 38 20 65 50 61 72 73 65 4d  E.    u8 eParseM
12e00 6f 64 65 20 3d 20 70 50 61 72 73 65 2d 3e 65 50  ode = pParse->eP
12e10 61 72 73 65 4d 6f 64 65 3b 0a 20 20 20 20 70 50  arseMode;.    pP
12e20 61 72 73 65 2d 3e 65 50 61 72 73 65 4d 6f 64 65  arse->eParseMode
12e30 20 3d 20 50 41 52 53 45 5f 4d 4f 44 45 5f 4e 4f   = PARSE_MODE_NO
12e40 52 4d 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  RMAL;.#endif.   
12e50 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61   n = pParse->nTa
12e60 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72  b;.    sqlite3Sr
12e70 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
12e80 72 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  rs(pParse, pSel-
12e90 3e 70 53 72 63 29 3b 0a 20 20 20 20 70 54 61 62  >pSrc);.    pTab
12ea0 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20  le->nCol = -1;. 
12eb0 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
12ec0 2e 62 44 69 73 61 62 6c 65 2b 2b 3b 0a 23 69 66  .bDisable++;.#if
12ed0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12ee0 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
12ef0 20 20 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78     xAuth = db->x
12f00 41 75 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41  Auth;.    db->xA
12f10 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 70 53 65  uth = 0;.    pSe
12f20 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65  lTab = sqlite3Re
12f30 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
12f40 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 20  pParse, pSel);. 
12f50 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 78     db->xAuth = x
12f60 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20  Auth;.#else.    
12f70 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
12f80 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
12f90 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29  ct(pParse, pSel)
12fa0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61  ;.#endif.    pPa
12fb0 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20  rse->nTab = n;. 
12fc0 20 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 70     if( pTable->p
12fd0 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f  Check ){.      /
12fe0 2a 20 43 52 45 41 54 45 20 56 49 45 57 20 6e 61  * CREATE VIEW na
12ff0 6d 65 28 61 72 67 6c 69 73 74 29 20 41 53 20 2e  me(arglist) AS .
13000 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  ...      ** The 
13010 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c  names of the col
13020 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c  umns in the tabl
13030 65 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d  e are taken from
13040 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 6c 69 73  .      ** arglis
13050 74 20 77 68 69 63 68 20 69 73 20 73 74 6f 72 65  t which is store
13060 64 20 69 6e 20 70 54 61 62 6c 65 2d 3e 70 43 68  d in pTable->pCh
13070 65 63 6b 2e 20 20 54 68 65 20 70 43 68 65 63 6b  eck.  The pCheck
13080 20 66 69 65 6c 64 0a 20 20 20 20 20 20 2a 2a 20   field.      ** 
13090 6e 6f 72 6d 61 6c 6c 79 20 68 6f 6c 64 73 20 43  normally holds C
130a0 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73  HECK constraints
130b0 20 6f 6e 20 61 6e 20 6f 72 64 69 6e 61 72 79 20   on an ordinary 
130c0 74 61 62 6c 65 2c 20 62 75 74 20 66 6f 72 0a 20  table, but for. 
130d0 20 20 20 20 20 2a 2a 20 61 20 56 49 45 57 20 69       ** a VIEW i
130e0 74 20 68 6f 6c 64 73 20 74 68 65 20 6c 69 73 74  t holds the list
130f0 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
13100 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
13110 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46   sqlite3ColumnsF
13120 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
13130 73 65 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65  se, pTable->pChe
13140 63 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ck, .           
13150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13160 20 20 20 20 20 20 26 70 54 61 62 6c 65 2d 3e 6e        &pTable->n
13170 43 6f 6c 2c 20 26 70 54 61 62 6c 65 2d 3e 61 43  Col, &pTable->aC
13180 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  ol);.      if( d
13190 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
131a0 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 50  =0 .       && pP
131b0 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 0a 20 20  arse->nErr==0.  
131c0 20 20 20 20 20 26 26 20 70 54 61 62 6c 65 2d 3e       && pTable->
131d0 6e 43 6f 6c 3d 3d 70 53 65 6c 2d 3e 70 45 4c 69  nCol==pSel->pELi
131e0 73 74 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20  st->nExpr.      
131f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
13200 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d  e3SelectAddColum
13210 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
13220 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65  n(pParse, pTable
13230 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d  , pSel);.      }
13240 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
13250 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20  SelTab ){.      
13260 2f 2a 20 43 52 45 41 54 45 20 56 49 45 57 20 6e  /* CREATE VIEW n
13270 61 6d 65 20 41 53 2e 2e 2e 20 20 77 69 74 68 6f  ame AS...  witho
13280 75 74 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 6c  ut an argument l
13290 69 73 74 2e 20 20 43 6f 6e 73 74 72 75 63 74 0a  ist.  Construct.
132a0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6c        ** the col
132b0 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74  umn names from t
132c0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
132d0 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
132e0 20 74 68 65 20 76 69 65 77 2e 0a 20 20 20 20 20   the view..     
132f0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
13300 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d  ( pTable->aCol==
13310 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c  0 );.      pTabl
13320 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  e->nCol = pSelTa
13330 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70  b->nCol;.      p
13340 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53  Table->aCol = pS
13350 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20  elTab->aCol;.   
13360 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
13370 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c   = 0;.      pSel
13380 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
13390 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
133a0 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
133b0 65 6c 64 28 64 62 2c 20 30 2c 20 70 54 61 62 6c  eld(db, 0, pTabl
133c0 65 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20  e->pSchema) );. 
133d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
133e0 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
133f0 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  ;.      nErr++;.
13400 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
13410 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
13420 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 73   pSelTab);.    s
13430 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
13440 74 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20  te(db, pSel);.  
13450 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
13460 62 44 69 73 61 62 6c 65 2d 2d 3b 0a 23 69 66 6e  bDisable--;.#ifn
13470 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13480 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20 70  ALTERTABLE.    p
13490 50 61 72 73 65 2d 3e 65 50 61 72 73 65 4d 6f 64  Parse->eParseMod
134a0 65 20 3d 20 65 50 61 72 73 65 4d 6f 64 65 3b 0a  e = eParseMode;.
134b0 23 65 6e 64 69 66 0a 20 20 7d 20 65 6c 73 65 20  #endif.  } else 
134c0 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20  {.    nErr++;.  
134d0 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68  }.  pTable->pSch
134e0 65 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73  ema->schemaFlags
134f0 20 7c 3d 20 44 42 5f 55 6e 72 65 73 65 74 56 69   |= DB_UnresetVi
13500 65 77 73 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ews;.  if( db->m
13510 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
13520 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
13530 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20  ColumnNames(db, 
13540 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 54 61  pTable);.    pTa
13550 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  ble->aCol = 0;. 
13560 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
13570 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  = 0;.  }.#endif 
13580 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
13590 49 45 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  IEW */.  return 
135a0 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66  nErr;  .}.#endif
135b0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
135c0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
135d0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
135e0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
135f0 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  BLE) */..#ifndef
13600 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
13610 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  W./*.** Clear th
13620 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  e column names f
13630 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20 69  rom every VIEW i
13640 6e 20 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a  n database idx..
13650 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
13660 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
13670 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  l(sqlite3 *db, i
13680 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45  nt idx){.  HashE
13690 6c 65 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72 74  lem *i;.  assert
136a0 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
136b0 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 64 78  utexHeld(db, idx
136c0 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20 21 44  , 0) );.  if( !D
136d0 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c  bHasProperty(db,
136e0 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74   idx, DB_Unreset
136f0 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b  Views) ) return;
13700 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48  .  for(i=sqliteH
13710 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44  ashFirst(&db->aD
13720 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[idx].pSchema->
13730 74 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73 71  tblHash); i;i=sq
13740 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29  liteHashNext(i))
13750 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
13760 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
13770 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70  ta(i);.    if( p
13780 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
13790 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
137a0 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64  eteColumnNames(d
137b0 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  b, pTab);.      
137c0 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  pTab->aCol = 0;.
137d0 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c        pTab->nCol
137e0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
137f0 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74    DbClearPropert
13800 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
13810 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23  resetViews);.}.#
13820 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71  else.# define sq
13830 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
13840 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20  (A,B).#endif /* 
13850 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
13860 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
13870 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
13880 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20 74  ed by the VDBE t
13890 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74  o adjust the int
138a0 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20  ernal schema.** 
138b0 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 20 77  used by SQLite w
138c0 68 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61  hen the btree la
138d0 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c  yer moves a tabl
138e0 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65  e root page. The
138f0 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  .** root-page of
13900 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
13910 78 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44  x in database iD
13920 62 20 68 61 73 20 63 68 61 6e 67 65 64 20 66 72  b has changed fr
13930 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69  om iFrom.** to i
13940 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74  To..**.** Ticket
13950 20 23 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d   #1728:  The sym
13960 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20  bol table might 
13970 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e  still contain in
13980 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20  formation.** on 
13990 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e  tables and/or in
139a0 64 69 63 65 73 20 74 68 61 74 20 61 72 65 20 74  dices that are t
139b0 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65  he process of be
139c0 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20  ing deleted..** 
139d0 49 66 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63  If you are unluc
139e0 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  ky, one of those
139f0 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73   deleted indices
13a00 20 6f 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74   or tables might
13a10 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d  .** have the sam
13a20 65 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65  e rootpage numbe
13a30 72 20 61 73 20 74 68 65 20 72 65 61 6c 20 74 61  r as the real ta
13a40 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61  ble or index tha
13a50 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f  t is.** being mo
13a60 76 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e  ved.  So we cann
13a70 6f 74 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e  ot stop searchin
13a80 67 20 61 66 74 65 72 20 74 68 65 20 66 69 72 73  g after the firs
13a90 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61  t match .** beca
13aa0 75 73 65 20 74 68 65 20 66 69 72 73 74 20 6d 61  use the first ma
13ab0 74 63 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72  tch might be for
13ac0 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65   one of the dele
13ad0 74 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f  ted indices.** o
13ae0 72 20 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74  r tables and not
13af0 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
13b00 20 74 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c   that is actuall
13b10 79 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a  y being moved..*
13b20 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e  * We must contin
13b30 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ue looping until
13b40 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20   all tables and 
13b50 69 6e 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20  indices with.** 
13b60 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20  rootpage==iFrom 
13b70 68 61 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72  have been conver
13b80 74 65 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f  ted to have a ro
13b90 6f 74 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a  otpage of iTo.**
13ba0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20   in order to be 
13bb0 63 65 72 74 61 69 6e 20 74 68 61 74 20 77 65 20  certain that we 
13bc0 67 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e  got the right on
13bd0 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
13be0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
13bf0 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65  CUUM.void sqlite
13c00 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 73  3RootPageMoved(s
13c10 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
13c20 69 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20  iDb, int iFrom, 
13c30 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68  int iTo){.  Hash
13c40 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48  Elem *pElem;.  H
13c50 61 73 68 20 2a 70 48 61 73 68 3b 0a 20 20 44 62  ash *pHash;.  Db
13c60 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74   *pDb;..  assert
13c70 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
13c80 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
13c90 2c 20 30 29 20 29 3b 0a 20 20 70 44 62 20 3d 20  , 0) );.  pDb = 
13ca0 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20  &db->aDb[iDb];. 
13cb0 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70   pHash = &pDb->p
13cc0 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b  Schema->tblHash;
13cd0 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c  .  for(pElem=sql
13ce0 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61  iteHashFirst(pHa
13cf0 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  sh); pElem; pEle
13d00 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
13d10 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61  (pElem)){.    Ta
13d20 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
13d30 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
13d40 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  );.    if( pTab-
13d50 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a  >tnum==iFrom ){.
13d60 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d        pTab->tnum
13d70 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20   = iTo;.    }.  
13d80 7d 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62  }.  pHash = &pDb
13d90 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
13da0 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d  sh;.  for(pElem=
13db0 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
13dc0 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  pHash); pElem; p
13dd0 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
13de0 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
13df0 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73   Index *pIdx = s
13e00 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
13e10 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49  lem);.    if( pI
13e20 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20  dx->tnum==iFrom 
13e30 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74  ){.      pIdx->t
13e40 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d  num = iTo;.    }
13e50 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
13e60 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20  *.** Write code 
13e70 74 6f 20 65 72 61 73 65 20 74 68 65 20 74 61 62  to erase the tab
13e80 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
13e90 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61  e iTable from da
13ea0 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41  tabase iDb..** A
13eb0 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74  lso write code t
13ec0 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c  o modify the sql
13ed0 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
13ee0 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63   and internal sc
13ef0 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f  hema.** if a roo
13f00 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65  t-page of anothe
13f10 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64  r table is moved
13f20 20 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61   by the btree-la
13f30 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72  yer whilst.** er
13f40 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68  asing iTable (th
13f50 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69  is can happen wi
13f60 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  th an auto-vacuu
13f70 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20  m database)..*/ 
13f80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73  .static void des
13f90 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72  troyRootPage(Par
13fa0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
13fb0 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29  iTable, int iDb)
13fc0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
13fd0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
13fe0 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d  rse);.  int r1 =
13ff0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
14000 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  eg(pParse);.  if
14010 28 20 69 54 61 62 6c 65 3c 32 20 29 20 73 71 6c  ( iTable<2 ) sql
14020 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
14030 72 73 65 2c 20 22 63 6f 72 72 75 70 74 20 73 63  rse, "corrupt sc
14040 68 65 6d 61 22 29 3b 0a 20 20 73 71 6c 69 74 65  hema");.  sqlite
14050 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
14060 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c  P_Destroy, iTabl
14070 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a 20 20 73  e, r1, iDb);.  s
14080 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
14090 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20  Parse);.#ifndef 
140a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
140b0 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44  VACUUM.  /* OP_D
140c0 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20 61 6e  estroy stores an
140d0 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31 2e 20   in integer r1. 
140e0 49 66 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a  If this integer.
140f0 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f    ** is non-zero
14100 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  , then it is the
14110 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
14120 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76  r of a table mov
14130 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74  ed to.  ** locat
14140 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20  ion iTable. The 
14150 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d  following code m
14160 6f 64 69 66 69 65 73 20 74 68 65 20 73 71 6c 69  odifies the sqli
14170 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
14180 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20  to.  ** reflect 
14190 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this..  **.  ** 
141a0 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68  The "#NNN" in th
141b0 65 20 53 51 4c 20 69 73 20 61 20 73 70 65 63 69  e SQL is a speci
141c0 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74  al constant that
141d0 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72 20   means whatever 
141e0 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e  value.  ** is in
141f0 20 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20   register NNN.  
14200 53 65 65 20 67 72 61 6d 6d 61 72 20 72 75 6c 65  See grammar rule
14210 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
14220 68 20 74 68 65 20 54 4b 5f 52 45 47 49 53 54 45  h the TK_REGISTE
14230 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72  R.  ** token for
14240 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
14250 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  rmation..  */.  
14260 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
14270 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
14280 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 53   "UPDATE %Q.%s S
14290 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57  ET rootpage=%d W
142a0 48 45 52 45 20 23 25 64 20 41 4e 44 20 72 6f 6f  HERE #%d AND roo
142b0 74 70 61 67 65 3d 23 25 64 22 2c 0a 20 20 20 20  tpage=#%d",.    
142c0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62   pParse->db->aDb
142d0 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20  [iDb].zDbSName, 
142e0 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 69 54 61  MASTER_NAME, iTa
142f0 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23 65  ble, r1, r1);.#e
14300 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 52 65  ndif.  sqlite3Re
14310 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
14320 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a  rse, r1);.}../*.
14330 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20 63 6f  ** Write VDBE co
14340 64 65 20 74 6f 20 65 72 61 73 65 20 74 61 62 6c  de to erase tabl
14350 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20 61  e pTab and all a
14360 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63 65  ssociated indice
14370 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f  s on disk..** Co
14380 64 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  de to update the
14390 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
143a0 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72 6e  ables and intern
143b0 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e 69  al schema defini
143c0 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65  tions.** in case
143d0 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c   a root-page bel
143e0 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65  onging to anothe
143f0 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64  r table is moved
14400 20 62 79 20 74 68 65 20 62 74 72 65 65 20 6c 61   by the btree la
14410 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61  yer.** is also a
14420 64 64 65 64 20 28 74 68 69 73 20 63 61 6e 20 68  dded (this can h
14430 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75  appen with an au
14440 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
14450 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  se)..*/.static v
14460 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c 65  oid destroyTable
14470 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
14480 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20  Table *pTab){.  
14490 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
144a0 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f 2d 76  se may be auto-v
144b0 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 28 69  acuum capable (i
144c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
144d0 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73  TOVACUUM.  ** is
144e0 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c 20 74   not defined), t
144f0 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 72 74  hen it is import
14500 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44  ant to call OP_D
14510 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20  estroy on the.  
14520 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64  ** table and ind
14530 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e  ex root-pages in
14540 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69 6e 67   order, starting
14550 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65 72 69   with the numeri
14560 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67  cally .  ** larg
14570 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  est root-page nu
14580 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61 72 61  mber. This guara
14590 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e 65 20  ntees that none 
145a0 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  of the root-page
145b0 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 65 73  s.  ** to be des
145c0 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f 63 61  troyed is reloca
145d0 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ted by an earlie
145e0 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e  r OP_Destroy. i.
145f0 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 66  e. if the.  ** f
14600 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 63 6f  ollowing were co
14610 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f  ded:.  **.  ** O
14620 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a 20 20  P_Destroy 4 0.  
14630 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44  ** ....  ** OP_D
14640 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a  estroy 5 0.  **.
14650 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61    ** and root pa
14660 67 65 20 35 20 68 61 70 70 65 6e 65 64 20 74 6f  ge 5 happened to
14670 20 62 65 20 74 68 65 20 6c 61 72 67 65 73 74 20   be the largest 
14680 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
14690 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   in the.  ** dat
146a0 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74  abase, then root
146b0 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20 62 65   page 5 would be
146c0 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 20 34   moved to page 4
146d0 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f   by the .  ** "O
146e0 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22 20 6f  P_Destroy 4 0" o
146f0 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62 73 65  pcode. The subse
14700 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f  quent "OP_Destro
14710 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68 69 74  y 5 0" would hit
14720 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73  .  ** a free-lis
14730 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  t page..  */.  i
14740 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62 2d 3e  nt iTab = pTab->
14750 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73  tnum;.  int iDes
14760 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77  troyed = 0;..  w
14770 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 49  hile( 1 ){.    I
14780 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
14790 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d 20 30  int iLargest = 0
147a0 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65 73 74  ;..    if( iDest
147b0 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62  royed==0 || iTab
147c0 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b 0a 20  <iDestroyed ){. 
147d0 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20       iLargest = 
147e0 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iTab;.    }.    
147f0 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
14800 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
14810 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
14820 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d        int iIdx =
14830 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20   pIdx->tnum;.   
14840 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
14850 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
14860 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20  pSchema );.     
14870 20 69 66 28 20 28 69 44 65 73 74 72 6f 79 65 64   if( (iDestroyed
14880 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65  ==0 || (iIdx<iDe
14890 73 74 72 6f 79 65 64 29 29 20 26 26 20 69 49 64  stroyed)) && iId
148a0 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20  x>iLargest ){.  
148b0 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d        iLargest =
148c0 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20   iIdx;.      }. 
148d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61     }.    if( iLa
148e0 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  rgest==0 ){.    
148f0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65    return;.    }e
14900 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
14910 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
14920 6d 61 54 6f 49 6e 64 65 78 32 28 70 50 61 72 73  maToIndex2(pPars
14930 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
14940 68 65 6d 61 2c 20 30 29 3b 0a 20 20 20 20 20 20  hema, 0);.      
14950 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
14960 26 20 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62  & iDb<pParse->db
14970 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 20 20 64  ->nDb );.      d
14980 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
14990 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c  Parse, iLargest,
149a0 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69 44 65   iDb);.      iDe
149b0 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65  stroyed = iLarge
149c0 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  st;.    }.  }.}.
149d0 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 65 6e  ./*.** Remove en
149e0 74 72 69 65 73 20 66 72 6f 6d 20 74 68 65 20 73  tries from the s
149f0 71 6c 69 74 65 5f 73 74 61 74 4e 20 74 61 62 6c  qlite_statN tabl
14a00 65 73 20 28 66 6f 72 20 4e 20 69 6e 20 28 31 2c  es (for N in (1,
14a10 32 2c 33 29 29 0a 2a 2a 20 61 66 74 65 72 20 61  2,3)).** after a
14a20 20 44 52 4f 50 20 49 4e 44 45 58 20 6f 72 20 44   DROP INDEX or D
14a30 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e  ROP TABLE comman
14a40 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
14a50 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74  d sqlite3ClearSt
14a60 61 74 54 61 62 6c 65 73 28 0a 20 20 50 61 72 73  atTables(.  Pars
14a70 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
14a80 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
14a90 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
14aa0 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20 20 20  nt iDb,         
14ab0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
14ac0 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  abase number */.
14ad0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
14ae0 79 70 65 2c 20 20 20 20 20 2f 2a 20 22 69 64 78  ype,     /* "idx
14af0 22 20 6f 72 20 22 74 62 6c 22 20 2a 2f 0a 20 20  " or "tbl" */.  
14b00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
14b10 65 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  e      /* Name o
14b20 66 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  f index or table
14b30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
14b40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
14b50 62 4e 61 6d 65 20 3d 20 70 50 61 72 73 65 2d 3e  bName = pParse->
14b60 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
14b70 53 4e 61 6d 65 3b 0a 20 20 66 6f 72 28 69 3d 31  SName;.  for(i=1
14b80 3b 20 69 3c 3d 34 3b 20 69 2b 2b 29 7b 0a 20 20  ; i<=4; i++){.  
14b90 20 20 63 68 61 72 20 7a 54 61 62 5b 32 34 5d 3b    char zTab[24];
14ba0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
14bb0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 61  rintf(sizeof(zTa
14bc0 62 29 2c 7a 54 61 62 2c 22 73 71 6c 69 74 65 5f  b),zTab,"sqlite_
14bd0 73 74 61 74 25 64 22 2c 69 29 3b 0a 20 20 20 20  stat%d",i);.    
14be0 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
14bf0 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
14c00 20 7a 54 61 62 2c 20 7a 44 62 4e 61 6d 65 29 20   zTab, zDbName) 
14c10 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14c20 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
14c30 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c  se,.        "DEL
14c40 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57  ETE FROM %Q.%s W
14c50 48 45 52 45 20 25 73 3d 25 51 22 2c 0a 20 20 20  HERE %s=%Q",.   
14c60 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54       zDbName, zT
14c70 61 62 2c 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65  ab, zType, zName
14c80 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
14c90 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
14ca0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64 72  erate code to dr
14cb0 6f 70 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76  op a table..*/.v
14cc0 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 44  oid sqlite3CodeD
14cd0 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a  ropTable(Parse *
14ce0 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
14cf0 54 61 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e  Tab, int iDb, in
14d00 74 20 69 73 56 69 65 77 29 7b 0a 20 20 56 64 62  t isView){.  Vdb
14d10 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *v;.  sqlite3 
14d20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
14d30 3b 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72  ;.  Trigger *pTr
14d40 69 67 67 65 72 3b 0a 20 20 44 62 20 2a 70 44 62  igger;.  Db *pDb
14d50 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
14d60 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
14d70 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
14d80 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
14d90 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
14da0 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
14db0 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
14dc0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
14dd0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
14de0 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  LE.  if( IsVirtu
14df0 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
14e00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14e10 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b  0(v, OP_VBegin);
14e20 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
14e30 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67  * Drop all trigg
14e40 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ers associated w
14e50 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 62 65  ith the table be
14e60 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64  ing dropped. Cod
14e70 65 0a 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61  e.  ** is genera
14e80 74 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e  ted to remove en
14e90 74 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74  tries from sqlit
14ea0 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a  e_master and/or.
14eb0 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70    ** sqlite_temp
14ec0 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71 75 69  _master if requi
14ed0 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 72 69  red..  */.  pTri
14ee0 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54 72  gger = sqlite3Tr
14ef0 69 67 67 65 72 4c 69 73 74 28 70 50 61 72 73 65  iggerList(pParse
14f00 2c 20 70 54 61 62 29 3b 0a 20 20 77 68 69 6c 65  , pTab);.  while
14f10 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20  ( pTrigger ){.  
14f20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67    assert( pTrigg
14f30 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  er->pSchema==pTa
14f40 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20  b->pSchema || . 
14f50 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72 2d         pTrigger-
14f60 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44  >pSchema==db->aD
14f70 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a  b[1].pSchema );.
14f80 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54      sqlite3DropT
14f90 72 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65  riggerPtr(pParse
14fa0 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20  , pTrigger);.   
14fb0 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69   pTrigger = pTri
14fc0 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  gger->pNext;.  }
14fd0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
14fe0 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
14ff0 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ENT.  /* Remove 
15000 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74  any entries of t
15010 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  he sqlite_sequen
15020 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61  ce table associa
15030 74 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68  ted with.  ** th
15040 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
15050 6f 70 70 65 64 2e 20 54 68 69 73 20 69 73 20 64  opped. This is d
15060 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20 74  one before the t
15070 61 62 6c 65 20 69 73 20 64 72 6f 70 70 65 64 0a  able is dropped.
15080 20 20 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65    ** at the btre
15090 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65  e level, in case
150a0 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75   the sqlite_sequ
150b0 65 6e 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73  ence table needs
150c0 20 74 6f 0a 20 20 2a 2a 20 6d 6f 76 65 20 61 73   to.  ** move as
150d0 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
150e0 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65   drop (can happe
150f0 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  n in auto-vacuum
15100 20 6d 6f 64 65 29 2e 0a 20 20 2a 2f 0a 20 20 69   mode)..  */.  i
15110 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  f( pTab->tabFlag
15120 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65  s & TF_Autoincre
15130 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  ment ){.    sqli
15140 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
15150 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 44 45  Parse,.      "DE
15160 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c  LETE FROM %Q.sql
15170 69 74 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45  ite_sequence WHE
15180 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20  RE name=%Q",.   
15190 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65     pDb->zDbSName
151a0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20  , pTab->zName.  
151b0 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a    );.  }.#endif.
151c0 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53  .  /* Drop all S
151d0 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
151e0 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74  le and index ent
151f0 72 69 65 73 20 74 68 61 74 20 72 65 66 65 72 20  ries that refer 
15200 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c  to the.  ** tabl
15210 65 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e  e. The program n
15220 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67  ame loops throug
15230 68 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  h the master tab
15240 6c 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20  le and deletes. 
15250 20 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68   ** every row th
15260 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  at refers to a t
15270 61 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65  able of the same
15280 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65   name as the one
15290 20 62 65 69 6e 67 0a 20 20 2a 2a 20 64 72 6f 70   being.  ** drop
152a0 70 65 64 2e 20 54 72 69 67 67 65 72 73 20 61 72  ped. Triggers ar
152b0 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61  e handled separa
152c0 74 65 6c 79 20 62 65 63 61 75 73 65 20 61 20 74  tely because a t
152d0 72 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20  rigger can be.  
152e0 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  ** created in th
152f0 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  e temp database 
15300 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61  that refers to a
15310 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65   table in anothe
15320 72 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  r.  ** database.
15330 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e  .  */.  sqlite3N
15340 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
15350 65 2c 20 0a 20 20 20 20 20 20 22 44 45 4c 45 54  e, .      "DELET
15360 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45  E FROM %Q.%s WHE
15370 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61  RE tbl_name=%Q a
15380 6e 64 20 74 79 70 65 21 3d 27 74 72 69 67 67 65  nd type!='trigge
15390 72 27 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e  r'",.      pDb->
153a0 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52  zDbSName, MASTER
153b0 5f 4e 41 4d 45 2c 20 70 54 61 62 2d 3e 7a 4e 61  _NAME, pTab->zNa
153c0 6d 65 29 3b 0a 20 20 69 66 28 20 21 69 73 56 69  me);.  if( !isVi
153d0 65 77 20 26 26 20 21 49 73 56 69 72 74 75 61 6c  ew && !IsVirtual
153e0 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 64 65  (pTab) ){.    de
153f0 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73  stroyTable(pPars
15400 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a 0a 20  e, pTab);.  }.. 
15410 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74   /* Remove the t
15420 61 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20  able entry from 
15430 53 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61  SQLite's interna
15440 6c 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64  l schema and mod
15450 69 66 79 0a 20 20 2a 2a 20 74 68 65 20 73 63 68  ify.  ** the sch
15460 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a 2f  ema cookie..  */
15470 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
15480 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71  (pTab) ){.    sq
15490 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
154a0 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20  v, OP_VDestroy, 
154b0 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d  iDb, 0, 0, pTab-
154c0 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a  >zName, 0);.  }.
154d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
154e0 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61  Op4(v, OP_DropTa
154f0 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  ble, iDb, 0, 0, 
15500 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pTab->zName, 0);
15510 0a 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65  .  sqlite3Change
15520 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
15530 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 56 69 65  Db);.  sqliteVie
15540 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44  wResetAll(db, iD
15550 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  b);.}../*.** Thi
15560 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
15570 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  led to do the wo
15580 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42  rk of a DROP TAB
15590 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
155a0 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61   pName is the na
155b0 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
155c0 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a  to be dropped..*
155d0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72  /.void sqlite3Dr
155e0 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  opTable(Parse *p
155f0 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
15600 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65  pName, int isVie
15610 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20  w, int noErr){. 
15620 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
15630 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
15640 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
15650 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
15660 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
15670 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
15680 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
15690 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ble;.  }.  asser
156a0 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  t( pParse->nErr=
156b0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
156c0 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29  pName->nSrc==1 )
156d0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 52  ;.  if( sqlite3R
156e0 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
156f0 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 64 72  ) ) goto exit_dr
15700 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 69 66 28 20  op_table;.  if( 
15710 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70  noErr ) db->supp
15720 72 65 73 73 45 72 72 2b 2b 3b 0a 20 20 61 73 73  ressErr++;.  ass
15730 65 72 74 28 20 69 73 56 69 65 77 3d 3d 30 20 7c  ert( isView==0 |
15740 7c 20 69 73 56 69 65 77 3d 3d 4c 4f 43 41 54 45  | isView==LOCATE
15750 5f 56 49 45 57 20 29 3b 0a 20 20 70 54 61 62 20  _VIEW );.  pTab 
15760 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
15770 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c  ableItem(pParse,
15780 20 69 73 56 69 65 77 2c 20 26 70 4e 61 6d 65 2d   isView, &pName-
15790 3e 61 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 6f  >a[0]);.  if( no
157a0 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65  Err ) db->suppre
157b0 73 73 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20  ssErr--;..  if( 
157c0 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69  pTab==0 ){.    i
157d0 66 28 20 6e 6f 45 72 72 20 29 20 73 71 6c 69 74  f( noErr ) sqlit
157e0 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65  e3CodeVerifyName
157f0 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  dSchema(pParse, 
15800 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
15810 61 62 61 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f  abase);.    goto
15820 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
15830 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  ;.  }.  iDb = sq
15840 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
15850 65 78 32 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  ex2(db, pTab->pS
15860 63 68 65 6d 61 2c 20 30 29 3b 0a 20 20 61 73 73  chema, 0);.  ass
15870 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
15880 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
15890 73 71 6c 69 74 65 33 53 63 68 65 6d 61 57 72 69  sqlite3SchemaWri
158a0 74 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44  table(pParse, iD
158b0 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61  b);..  /* If pTa
158c0 62 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74  b is a virtual t
158d0 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69 65 77 47  able, call ViewG
158e0 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20  etColumnNames() 
158f0 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a 2a 20 69  to ensure.  ** i
15900 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  t is initialized
15910 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  ..  */.  if( IsV
15920 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26 20  irtual(pTab) && 
15930 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
15940 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
15950 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 67  , pTab) ){.    g
15960 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
15970 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  ble;.  }.#ifndef
15980 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
15990 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
159a0 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20     int code;.   
159b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
159c0 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
159d0 28 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74  (iDb);.    const
159e0 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
159f0 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
15a00 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  me;.    const ch
15a10 61 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b 0a 20  ar *zArg2 = 0;. 
15a20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
15a30 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
15a40 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
15a50 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20  Tab, 0, zDb)){. 
15a60 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
15a70 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
15a80 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20  .    if( isView 
15a90 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  ){.      if( !OM
15aa0 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
15ab0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
15ac0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
15ad0 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20  P_TEMP_VIEW;.   
15ae0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15af0 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
15b00 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  DROP_VIEW;.     
15b10 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
15b20 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
15b30 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  BLE.    }else if
15b40 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
15b50 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 20  ) ){.      code 
15b60 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54  = SQLITE_DROP_VT
15b70 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41 72 67  ABLE;.      zArg
15b80 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54  2 = sqlite3GetVT
15b90 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 2d 3e  able(db, pTab)->
15ba0 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e  pMod->zName;.#en
15bb0 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
15bc0 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
15bd0 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
15be0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
15bf0 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
15c00 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  MP_TABLE;.      
15c10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
15c20 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
15c30 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
15c40 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
15c50 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
15c60 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54  pParse, code, pT
15c70 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67 32  ab->zName, zArg2
15c80 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
15c90 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
15ca0 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  able;.    }.    
15cb0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
15cc0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
15cd0 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62  ITE_DELETE, pTab
15ce0 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  ->zName, 0, zDb)
15cf0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
15d00 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
15d10 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
15d20 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
15d30 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rNICmp(pTab->zNa
15d40 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
15d50 29 3d 3d 30 20 0a 20 20 20 20 26 26 20 73 71 6c  )==0 .    && sql
15d60 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61  ite3StrNICmp(pTa
15d70 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  b->zName, "sqlit
15d80 65 5f 73 74 61 74 22 2c 20 31 31 29 21 3d 30 20  e_stat", 11)!=0 
15d90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
15da0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
15db0 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
15dc0 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70 54   be dropped", pT
15dd0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
15de0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
15df0 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  able;.  }..#ifnd
15e00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
15e10 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20  IEW.  /* Ensure 
15e20 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20 6e 6f  DROP TABLE is no
15e30 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69 65 77  t used on a view
15e40 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45 57 20  , and DROP VIEW 
15e50 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a  is not used.  **
15e60 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a   on a table..  *
15e70 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 26  /.  if( isView &
15e80 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  & pTab->pSelect=
15e90 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
15ea0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15eb0 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c  , "use DROP TABL
15ec0 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c  E to delete tabl
15ed0 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  e %s", pTab->zNa
15ee0 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
15ef0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
15f00 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65 77   }.  if( !isView
15f10 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
15f20 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
15f30 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
15f40 20 22 75 73 65 20 44 52 4f 50 20 56 49 45 57 20   "use DROP VIEW 
15f50 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20 25  to delete view %
15f60 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s", pTab->zName)
15f70 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
15f80 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
15f90 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
15fa0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
15fb0 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 66  move the table f
15fc0 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
15fd0 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73  able.  ** on dis
15fe0 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  k..  */.  v = sq
15ff0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
16000 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
16010 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
16020 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
16030 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
16040 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77  .    if( !isView
16050 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
16060 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73  3ClearStatTables
16070 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74  (pParse, iDb, "t
16080 62 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  bl", pTab->zName
16090 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
160a0 46 6b 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72  FkDropTable(pPar
160b0 73 65 2c 20 70 4e 61 6d 65 2c 20 70 54 61 62 29  se, pName, pTab)
160c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
160d0 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65  te3CodeDropTable
160e0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69  (pParse, pTab, i
160f0 44 62 2c 20 69 73 56 69 65 77 29 3b 0a 20 20 7d  Db, isView);.  }
16100 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  ..exit_drop_tabl
16110 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  e:.  sqlite3SrcL
16120 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e  istDelete(db, pN
16130 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ame);.}../*.** T
16140 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
16150 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
16160 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65  a new foreign ke
16170 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a  y on the table.*
16180 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  * currently unde
16190 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
161a0 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d   pFromCol determ
161b0 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d  ines which colum
161c0 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72  ns.** in the cur
161d0 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74  rent table point
161e0 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20   to the foreign 
161f0 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f  key.  If pFromCo
16200 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e  l==0 then.** con
16210 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20  nect the key to 
16220 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
16230 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69  inserted.  pTo i
16240 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a  s the name of.**
16250 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65 72   the table refer
16260 72 65 64 20 74 6f 20 28 61 2e 6b 2e 61 20 74 68  red to (a.k.a th
16270 65 20 22 70 61 72 65 6e 74 22 20 74 61 62 6c 65  e "parent" table
16280 29 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20  ).  pToCol is a 
16290 6c 69 73 74 0a 2a 2a 20 6f 66 20 74 61 62 6c 65  list.** of table
162a0 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20  s in the parent 
162b0 70 54 6f 20 74 61 62 6c 65 2e 20 20 66 6c 61 67  pTo table.  flag
162c0 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a  s contains all.*
162d0 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * information ab
162e0 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74  out the conflict
162f0 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
16300 72 69 74 68 6d 73 20 73 70 65 63 69 66 69 65 64  rithms specified
16310 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44 45  .** in the ON DE
16320 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45 20  LETE, ON UPDATE 
16330 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c  and ON INSERT cl
16340 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  auses..**.** An 
16350 46 4b 65 79 20 73 74 72 75 63 74 75 72 65 20 69  FKey structure i
16360 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 64  s created and ad
16370 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ded to the table
16380 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e   currently.** un
16390 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
163a0 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e   in the pParse->
163b0 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64 2e  pNewTable field.
163c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69  .**.** The forei
163d0 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f  gn key is set fo
163e0 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63  r IMMEDIATE proc
163f0 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65  essing.  A subse
16400 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f  quent call.** to
16410 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72   sqlite3DeferFor
16420 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20  eignKey() might 
16430 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44  change this to D
16440 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64  EFERRED..*/.void
16450 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f   sqlite3CreateFo
16460 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73  reignKey(.  Pars
16470 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
16480 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
16490 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
164a0 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a  t *pFromCol,  /*
164b0 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73   Columns in this
164c0 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e   table that poin
164d0 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65  t to other table
164e0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f   */.  Token *pTo
164f0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ,          /* Na
16500 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20  me of the other 
16510 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  table */.  ExprL
16520 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20  ist *pToCol,    
16530 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  /* Columns in th
16540 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  e other table */
16550 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
16560 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c          /* Confl
16570 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
16580 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b  lgorithms. */.){
16590 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
165a0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66   pParse->db;.#if
165b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
165c0 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46  _FOREIGN_KEY.  F
165d0 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a  Key *pFKey = 0;.
165e0 20 20 46 4b 65 79 20 2a 70 4e 65 78 74 54 6f 3b    FKey *pNextTo;
165f0 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70 50  .  Table *p = pP
16600 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
16610 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
16620 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f  int i;.  int nCo
16630 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20  l;.  char *z;.. 
16640 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20   assert( pTo!=0 
16650 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  );.  if( p==0 ||
16660 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42   IN_DECLARE_VTAB
16670 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
16680 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d    if( pFromCol==
16690 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f  0 ){.    int iCo
166a0 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  l = p->nCol-1;. 
166b0 20 20 20 69 66 28 20 4e 45 56 45 52 28 69 43 6f     if( NEVER(iCo
166c0 6c 3c 30 29 20 29 20 67 6f 74 6f 20 66 6b 5f 65  l<0) ) goto fk_e
166d0 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43  nd;.    if( pToC
166e0 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45  ol && pToCol->nE
166f0 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr!=1 ){.      
16700 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
16710 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e  pParse, "foreign
16720 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20   key on %s".    
16730 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65       " should re
16740 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65  ference only one
16750 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
16760 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70   %T",.         p
16770 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
16780 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20  me, pTo);.      
16790 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
167a0 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b   }.    nCol = 1;
167b0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f  .  }else if( pTo
167c0 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e  Col && pToCol->n
167d0 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e  Expr!=pFromCol->
167e0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c  nExpr ){.    sql
167f0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
16800 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75  rse,.        "nu
16810 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
16820 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
16830 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
16840 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20  e number of ".  
16850 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69        "columns i
16860 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  n the referenced
16870 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f   table");.    go
16880 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c  to fk_end;.  }el
16890 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70  se{.    nCol = p
168a0 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a  FromCol->nExpr;.
168b0 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69    }.  nByte = si
168c0 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 28  zeof(*pFKey) + (
168d0 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 70  nCol-1)*sizeof(p
168e0 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b  FKey->aCol[0]) +
168f0 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69   pTo->n + 1;.  i
16900 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20  f( pToCol ){.   
16910 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43   for(i=0; i<pToC
16920 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ol->nExpr; i++){
16930 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  .      nByte += 
16940 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
16950 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
16960 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20  me) + 1;.    }. 
16970 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c   }.  pFKey = sql
16980 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
16990 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20  (db, nByte );.  
169a0 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a  if( pFKey==0 ){.
169b0 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
169c0 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46  .  }.  pFKey->pF
169d0 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79  rom = p;.  pFKey
169e0 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d  ->pNextFrom = p-
169f0 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63  >pFKey;.  z = (c
16a00 68 61 72 2a 29 26 70 46 4b 65 79 2d 3e 61 43 6f  har*)&pFKey->aCo
16a10 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79  l[nCol];.  pFKey
16a20 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 69 66 28  ->zTo = z;.  if(
16a30 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
16a40 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T ){.    sqlite3
16a50 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70  RenameTokenMap(p
16a60 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 7a 2c  Parse, (void*)z,
16a70 20 70 54 6f 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d   pTo);.  }.  mem
16a80 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70  cpy(z, pTo->z, p
16a90 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d  To->n);.  z[pTo-
16aa0 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  >n] = 0;.  sqlit
16ab0 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20  e3Dequote(z);.  
16ac0 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20  z += pTo->n+1;. 
16ad0 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e   pFKey->nCol = n
16ae0 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  Col;.  if( pFrom
16af0 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  Col==0 ){.    pF
16b00 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72  Key->aCol[0].iFr
16b10 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  om = p->nCol-1;.
16b20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
16b30 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
16b40 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  +){.      int j;
16b50 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
16b60 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  j<p->nCol; j++){
16b70 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
16b80 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61  ite3StrICmp(p->a
16b90 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46  Col[j].zName, pF
16ba0 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
16bb0 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
16bc0 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
16bd0 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20  i].iFrom = j;.  
16be0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16bf0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16c00 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d  .      if( j>=p-
16c10 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  >nCol ){.       
16c20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
16c30 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
16c40 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c      "unknown col
16c50 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f  umn \"%s\" in fo
16c60 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
16c70 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  tion", .        
16c80 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d    pFromCol->a[i]
16c90 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
16ca0 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
16cb0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
16cc0 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
16cd0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
16ce0 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65  te3RenameTokenRe
16cf0 6d 61 70 28 70 50 61 72 73 65 2c 20 26 70 46 4b  map(pParse, &pFK
16d00 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2c 20 70 46 72  ey->aCol[i], pFr
16d10 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  omCol->a[i].zNam
16d20 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
16d30 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43  }.  }.  if( pToC
16d40 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
16d50 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
16d60 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
16d70 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
16d80 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
16d90 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  e);.      pFKey-
16da0 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20  >aCol[i].zCol = 
16db0 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 49 4e 5f  z;.      if( IN_
16dc0 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
16dd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16de0 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70  RenameTokenRemap
16df0 28 70 50 61 72 73 65 2c 20 7a 2c 20 70 54 6f 43  (pParse, z, pToC
16e00 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ol->a[i].zName);
16e10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
16e20 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d  emcpy(z, pToCol-
16e30 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b  >a[i].zName, n);
16e40 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b  .      z[n] = 0;
16e50 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b  .      z += n+1;
16e60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
16e70 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
16e80 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63   0;.  pFKey->aAc
16e90 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29 28 66  tion[0] = (u8)(f
16ea0 6c 61 67 73 20 26 20 30 78 66 66 29 3b 20 20 20  lags & 0xff);   
16eb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 44           /* ON D
16ec0 45 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a  ELETE action */.
16ed0 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e    pFKey->aAction
16ee0 5b 31 5d 20 3d 20 28 75 38 29 28 28 66 6c 61 67  [1] = (u8)((flag
16ef0 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66 29  s >> 8 ) & 0xff)
16f00 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54  ;    /* ON UPDAT
16f10 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61  E action */..  a
16f20 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
16f30 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
16f40 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  , 0, p->pSchema)
16f50 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20 3d 20   );.  pNextTo = 
16f60 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65 33 48  (FKey *)sqlite3H
16f70 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 53  ashInsert(&p->pS
16f80 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68 2c  chema->fkeyHash,
16f90 20 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a   .      pFKey->z
16fa0 54 6f 2c 20 28 76 6f 69 64 20 2a 29 70 46 4b 65  To, (void *)pFKe
16fb0 79 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  y.  );.  if( pNe
16fc0 78 74 54 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a 20  xtTo==pFKey ){. 
16fd0 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
16fe0 6c 74 28 64 62 29 3b 0a 20 20 20 20 67 6f 74 6f  lt(db);.    goto
16ff0 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69   fk_end;.  }.  i
17000 66 28 20 70 4e 65 78 74 54 6f 20 29 7b 0a 20 20  f( pNextTo ){.  
17010 20 20 61 73 73 65 72 74 28 20 70 4e 65 78 74 54    assert( pNextT
17020 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30 20 29 3b  o->pPrevTo==0 );
17030 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78  .    pFKey->pNex
17040 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f 3b 0a 20  tTo = pNextTo;. 
17050 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65     pNextTo->pPre
17060 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a 20 20 7d  vTo = pFKey;.  }
17070 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
17080 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74  foreign key to t
17090 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65 20  he table as the 
170a0 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a  last step..  */.
170b0 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b    p->pFKey = pFK
170c0 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b  ey;.  pFKey = 0;
170d0 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69  ..fk_end:.  sqli
170e0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 46  te3DbFree(db, pF
170f0 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  Key);.#endif /* 
17100 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
17110 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
17120 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78  ) */.  sqlite3Ex
17130 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
17140 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71   pFromCol);.  sq
17150 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
17160 65 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29 3b  ete(db, pToCol);
17170 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
17180 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
17190 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c   when an INITIAL
171a0 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20  LY IMMEDIATE or 
171b0 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
171c0 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20  ED.** clause is 
171d0 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20  seen as part of 
171e0 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  a foreign key de
171f0 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69  finition.  The i
17200 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72  sDeferred.** par
17210 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72 20  ameter is 1 for 
17220 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
17230 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49  ED and 0 for INI
17240 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
17250 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f  ..** The behavio
17260 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  r of the most re
17270 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66  cently created f
17280 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64  oreign key is ad
17290 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64  justed.** accord
172a0 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ingly..*/.void s
172b0 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69  qlite3DeferForei
172c0 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61  gnKey(Parse *pPa
172d0 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72  rse, int isDefer
172e0 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  red){.#ifndef SQ
172f0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
17300 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70  N_KEY.  Table *p
17310 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b  Tab;.  FKey *pFK
17320 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20  ey;.  if( (pTab 
17330 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
17340 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65  ble)==0 || (pFKe
17350 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29  y = pTab->pFKey)
17360 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
17370 61 73 73 65 72 74 28 20 69 73 44 65 66 65 72 72  assert( isDeferr
17380 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65 72  ed==0 || isDefer
17390 72 65 64 3d 3d 31 20 29 3b 20 2f 2a 20 45 56 3a  red==1 ); /* EV:
173a0 20 52 2d 33 30 33 32 33 2d 32 31 39 31 37 20 2a   R-30323-21917 *
173b0 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  /.  pFKey->isDef
173c0 65 72 72 65 64 20 3d 20 28 75 38 29 69 73 44 65  erred = (u8)isDe
173d0 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d  ferred;.#endif.}
173e0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
173f0 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
17400 65 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c  erase and refill
17410 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54   index *pIdx.  T
17420 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  his is.** used t
17430 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  o initialize a n
17440 65 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ewly created ind
17450 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75  ex or to recompu
17460 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  te the.** conten
17470 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e  t of an index in
17480 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52   response to a R
17490 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a  EINDEX command..
174a0 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74  **.** if memRoot
174b0 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61  Page is not nega
174c0 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  tive, it means t
174d0 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73  hat the index is
174e0 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65   newly.** create
174f0 64 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72  d.  The register
17500 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6d 65   specified by me
17510 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69  mRootPage contai
17520 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  ns the.** root p
17530 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
17540 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d  e index.  If mem
17550 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61  RootPage is nega
17560 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  tive, then.** th
17570 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  e index already 
17580 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20  exists and must 
17590 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72  be cleared befor
175a0 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64  e being refilled
175b0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74   and.** the root
175c0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
175d0 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b  the index is tak
175e0 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e  en from pIndex->
175f0 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tnum..*/.static 
17600 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66 69  void sqlite3Refi
17610 6c 6c 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  llIndex(.  Parse
17620 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 69 6e 74   *pParse, .  int
17630 20 69 44 62 2c 0a 20 20 49 6e 64 65 78 20 2a 70   iDb,.  Index *p
17640 49 6e 64 65 78 2c 20 0a 20 20 69 6e 74 20 6d 65  Index, .  int me
17650 6d 52 6f 6f 74 50 61 67 65 0a 29 7b 0a 20 20 54  mRootPage.){.  T
17660 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
17670 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a  dex->pTable;  /*
17680 20 54 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   The table that 
17690 69 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  is indexed */.  
176a0 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73  int iTab = pPars
176b0 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f  e->nTab++;     /
176c0 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75  * Btree cursor u
176d0 73 65 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a  sed for pTab */.
176e0 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61    int iIdx = pPa
176f0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20  rse->nTab++;    
17700 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72   /* Btree cursor
17710 20 75 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78   used for pIndex
17720 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 65   */.  int iSorte
17730 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
17740 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
17750 70 65 6e 65 64 20 62 79 20 4f 70 65 6e 53 6f 72  pened by OpenSor
17760 74 65 72 20 28 69 66 20 69 6e 20 75 73 65 29 20  ter (if in use) 
17770 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20  */.  int addr1; 
17780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17790 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
177a0 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f  f top of loop */
177b0 0a 20 20 69 6e 74 20 61 64 64 72 32 3b 20 20 20  .  int addr2;   
177c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177d0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 74 6f 20    /* Address to 
177e0 6a 75 6d 70 20 74 6f 20 66 6f 72 20 6e 65 78 74  jump to for next
177f0 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   iteration */.  
17800 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20  int tnum;       
17810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17820 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69  * Root page of i
17830 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 50  ndex */.  int iP
17840 61 72 74 49 64 78 4c 61 62 65 6c 3b 20 20 20 20  artIdxLabel;    
17850 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
17860 20 74 6f 20 74 68 69 73 20 6c 61 62 65 6c 20 74   to this label t
17870 6f 20 73 6b 69 70 20 61 20 72 6f 77 20 2a 2f 0a  o skip a row */.
17880 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
17890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178a0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
178b0 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74  e into this virt
178c0 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20  ual machine */. 
178d0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20   KeyInfo *pKey; 
178e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178f0 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69  /* KeyInfo for i
17900 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ndex */.  int re
17910 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20  gRecord;        
17920 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
17930 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 73 73  ster holding ass
17940 65 6d 62 6c 65 64 20 69 6e 64 65 78 20 72 65 63  embled index rec
17950 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ord */.  sqlite3
17960 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
17970 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64  b;      /* The d
17980 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
17990 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  on */..#ifndef S
179a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
179b0 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73  RIZATION.  if( s
179c0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
179d0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52  pParse, SQLITE_R
179e0 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e  EINDEX, pIndex->
179f0 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20  zName, 0,.      
17a00 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
17a10 53 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72  SName ) ){.    r
17a20 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
17a30 66 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72 65 20  f..  /* Require 
17a40 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
17a50 74 68 65 20 74 61 62 6c 65 20 74 6f 20 70 65 72  the table to per
17a60 66 6f 72 6d 20 74 68 69 73 20 6f 70 65 72 61 74  form this operat
17a70 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
17a80 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
17a90 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
17aa0 6d 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 1, pTab->zNam
17ab0 65 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  e);..  v = sqlit
17ac0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
17ad0 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
17ae0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65  return;.  if( me
17af0 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a  mRootPage>=0 ){.
17b00 20 20 20 20 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f      tnum = memRo
17b10 6f 74 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b  otPage;.  }else{
17b20 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64  .    tnum = pInd
17b30 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 7d 0a 20 20  ex->tnum;.  }.  
17b40 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65  pKey = sqlite3Ke
17b50 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61  yInfoOfIndex(pPa
17b60 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  rse, pIndex);.  
17b70 61 73 73 65 72 74 28 20 70 4b 65 79 21 3d 30 20  assert( pKey!=0 
17b80 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
17b90 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
17ba0 45 72 72 20 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65  Err );..  /* Ope
17bb0 6e 20 74 68 65 20 73 6f 72 74 65 72 20 63 75 72  n the sorter cur
17bc0 73 6f 72 20 69 66 20 77 65 20 61 72 65 20 74 6f  sor if we are to
17bd0 20 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69   use one. */.  i
17be0 53 6f 72 74 65 72 20 3d 20 70 50 61 72 73 65 2d  Sorter = pParse-
17bf0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74  >nTab++;.  sqlit
17c00 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
17c10 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 69  OP_SorterOpen, i
17c20 53 6f 72 74 65 72 2c 20 30 2c 20 70 49 6e 64 65  Sorter, 0, pInde
17c30 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 28 63 68 61  x->nKeyCol, (cha
17c40 72 2a 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  r*).            
17c50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b          sqlite3K
17c60 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 29 2c  eyInfoRef(pKey),
17c70 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20   P4_KEYINFO);.. 
17c80 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 74 61 62   /* Open the tab
17c90 6c 65 2e 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  le. Loop through
17ca0 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65   all rows of the
17cb0 20 74 61 62 6c 65 2c 20 69 6e 73 65 72 74 69 6e   table, insertin
17cc0 67 20 69 6e 64 65 78 0a 20 20 2a 2a 20 72 65 63  g index.  ** rec
17cd0 6f 72 64 73 20 69 6e 74 6f 20 74 68 65 20 73 6f  ords into the so
17ce0 72 74 65 72 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  rter. */.  sqlit
17cf0 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
17d00 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70  se, iTab, iDb, p
17d10 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  Tab, OP_OpenRead
17d20 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  );.  addr1 = sql
17d30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17d40 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61  , OP_Rewind, iTa
17d50 62 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72  b, 0); VdbeCover
17d60 61 67 65 28 76 29 3b 0a 20 20 72 65 67 52 65 63  age(v);.  regRec
17d70 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ord = sqlite3Get
17d80 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
17d90 0a 20 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57  .  sqlite3MultiW
17da0 72 69 74 65 28 70 50 61 72 73 65 29 3b 0a 0a 20  rite(pParse);.. 
17db0 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
17dc0 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c  IndexKey(pParse,
17dd0 70 49 6e 64 65 78 2c 69 54 61 62 2c 72 65 67 52  pIndex,iTab,regR
17de0 65 63 6f 72 64 2c 30 2c 26 69 50 61 72 74 49 64  ecord,0,&iPartId
17df0 78 4c 61 62 65 6c 2c 30 2c 30 29 3b 0a 20 20 73  xLabel,0,0);.  s
17e00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17e10 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73  (v, OP_SorterIns
17e20 65 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 72 65  ert, iSorter, re
17e30 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
17e40 74 65 33 52 65 73 6f 6c 76 65 50 61 72 74 49 64  te3ResolvePartId
17e50 78 4c 61 62 65 6c 28 70 50 61 72 73 65 2c 20 69  xLabel(pParse, i
17e60 50 61 72 74 49 64 78 4c 61 62 65 6c 29 3b 0a 20  PartIdxLabel);. 
17e70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17e80 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  p2(v, OP_Next, i
17e90 54 61 62 2c 20 61 64 64 72 31 2b 31 29 3b 20 56  Tab, addr1+1); V
17ea0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
17eb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
17ec0 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
17ed0 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61  .  if( memRootPa
17ee0 67 65 3c 30 20 29 20 73 71 6c 69 74 65 33 56 64  ge<0 ) sqlite3Vd
17ef0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
17f00 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29  lear, tnum, iDb)
17f10 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
17f20 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
17f30 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75  Write, iIdx, tnu
17f40 6d 2c 20 69 44 62 2c 20 0a 20 20 20 20 20 20 20  m, iDb, .       
17f50 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
17f60 61 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45  ar *)pKey, P4_KE
17f70 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65  YINFO);.  sqlite
17f80 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
17f90 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52 7c   OPFLAG_BULKCSR|
17fa0 28 28 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30  ((memRootPage>=0
17fb0 29 3f 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47  )?OPFLAG_P2ISREG
17fc0 3a 30 29 29 3b 0a 0a 20 20 61 64 64 72 31 20 3d  :0));..  addr1 =
17fd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17fe0 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53  p2(v, OP_SorterS
17ff0 6f 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 30 29  ort, iSorter, 0)
18000 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
18010 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75  );.  if( IsUniqu
18020 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20 29  eIndex(pIndex) )
18030 7b 0a 20 20 20 20 69 6e 74 20 6a 32 20 3d 20 73  {.    int j2 = s
18040 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
18050 2c 20 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20  , 1);.    addr2 
18060 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
18070 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
18080 20 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69   sqlite3VdbeVeri
18090 66 79 41 62 6f 72 74 61 62 6c 65 28 76 2c 20 4f  fyAbortable(v, O
180a0 45 5f 41 62 6f 72 74 29 3b 0a 20 20 20 20 73 71  E_Abort);.    sq
180b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
180c0 6e 74 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 43  nt(v, OP_SorterC
180d0 6f 6d 70 61 72 65 2c 20 69 53 6f 72 74 65 72 2c  ompare, iSorter,
180e0 20 6a 32 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a   j2, regRecord,.
180f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18100 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d           pIndex-
18110 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65 43  >nKeyCol); VdbeC
18120 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
18130 73 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e  sqlite3UniqueCon
18140 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20  straint(pParse, 
18150 4f 45 5f 41 62 6f 72 74 2c 20 70 49 6e 64 65 78  OE_Abort, pIndex
18160 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
18170 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 32  beJumpHere(v, j2
18180 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
18190 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
181a0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
181b0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
181c0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
181d0 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69 53 6f  _SorterData, iSo
181e0 72 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 2c  rter, regRecord,
181f0 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65   iIdx);.  sqlite
18200 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
18210 50 5f 53 65 65 6b 45 6e 64 2c 20 69 49 64 78 29  P_SeekEnd, iIdx)
18220 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
18230 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
18240 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 72 65 67  nsert, iIdx, reg
18250 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
18260 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
18270 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  , OPFLAG_USESEEK
18280 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74  RESULT);.  sqlit
18290 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
182a0 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f  (pParse, regReco
182b0 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rd);.  sqlite3Vd
182c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
182d0 6f 72 74 65 72 4e 65 78 74 2c 20 69 53 6f 72 74  orterNext, iSort
182e0 65 72 2c 20 61 64 64 72 32 29 3b 20 56 64 62 65  er, addr2); Vdbe
182f0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
18300 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
18310 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20  re(v, addr1);.. 
18320 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18330 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
18340 69 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  iTab);.  sqlite3
18350 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
18360 5f 43 6c 6f 73 65 2c 20 69 49 64 78 29 3b 0a 20  _Close, iIdx);. 
18370 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18380 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
18390 69 53 6f 72 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  iSorter);.}../*.
183a0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 68 65 61 70  ** Allocate heap
183b0 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 61   space to hold a
183c0 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 77  n Index object w
183d0 69 74 68 20 6e 43 6f 6c 20 63 6f 6c 75 6d 6e 73  ith nCol columns
183e0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65  ..**.** Increase
183f0 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
18400 73 69 7a 65 20 74 6f 20 70 72 6f 76 69 64 65 20  size to provide 
18410 61 6e 20 65 78 74 72 61 20 6e 45 78 74 72 61 20  an extra nExtra 
18420 62 79 74 65 73 0a 2a 2a 20 6f 66 20 38 2d 62 79  bytes.** of 8-by
18430 74 65 20 61 6c 69 67 6e 65 64 20 73 70 61 63 65  te aligned space
18440 20 61 66 74 65 72 20 74 68 65 20 49 6e 64 65 78   after the Index
18450 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75   object and retu
18460 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20  rn a.** pointer 
18470 74 6f 20 74 68 69 73 20 65 78 74 72 61 20 73 70  to this extra sp
18480 61 63 65 20 69 6e 20 2a 70 70 45 78 74 72 61 2e  ace in *ppExtra.
18490 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
184a0 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f  e3AllocateIndexO
184b0 62 6a 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33  bject(.  sqlite3
184c0 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a   *db,         /*
184d0 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
184e0 74 69 6f 6e 20 2a 2f 0a 20 20 69 31 36 20 6e 43  tion */.  i16 nC
184f0 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ol,            /
18500 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
18510 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
18520 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
18530 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  nExtra,         
18540 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
18550 74 65 73 20 6f 66 20 65 78 74 72 61 20 73 70 61  tes of extra spa
18560 63 65 20 74 6f 20 61 6c 6c 6f 63 20 2a 2f 0a 20  ce to alloc */. 
18570 20 63 68 61 72 20 2a 2a 70 70 45 78 74 72 61 20   char **ppExtra 
18580 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
18590 20 74 6f 20 74 68 65 20 22 65 78 74 72 61 22 20   to the "extra" 
185a0 73 70 61 63 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e  space */.){.  In
185b0 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20 20 20  dex *p;         
185c0 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
185d0 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a  index object */.
185e0 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
185f0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
18600 6f 66 20 73 70 61 63 65 20 66 6f 72 20 49 6e 64  of space for Ind
18610 65 78 20 6f 62 6a 65 63 74 20 2b 20 61 72 72 61  ex object + arra
18620 79 73 20 2a 2f 0a 0a 20 20 6e 42 79 74 65 20 3d  ys */..  nByte =
18630 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 49   ROUND8(sizeof(I
18640 6e 64 65 78 29 29 20 2b 20 20 20 20 20 20 20 20  ndex)) +        
18650 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73        /* Index s
18660 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20 20 20  tructure  */.   
18670 20 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69         ROUND8(si
18680 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c  zeof(char*)*nCol
18690 29 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ) +         /* I
186a0 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20  ndex.azColl     
186b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52 4f 55  */.          ROU
186c0 4e 44 38 28 73 69 7a 65 6f 66 28 4c 6f 67 45 73  ND8(sizeof(LogEs
186d0 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20 20 20  t)*(nCol+1) +   
186e0 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77    /* Index.aiRow
186f0 4c 6f 67 45 73 74 20 20 20 2a 2f 0a 20 20 20 20  LogEst   */.    
18700 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
18710 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 20 2b 20  eof(i16)*nCol + 
18720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
18730 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a  dex.aiColumn   *
18740 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
18750 20 20 20 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43     sizeof(u8)*nC
18760 6f 6c 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ol);            
18770 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f   /* Index.aSortO
18780 72 64 65 72 20 2a 2f 0a 20 20 70 20 3d 20 73 71  rder */.  p = sq
18790 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
187a0 6f 28 64 62 2c 20 6e 42 79 74 65 20 2b 20 6e 45  o(db, nByte + nE
187b0 78 74 72 61 29 3b 0a 20 20 69 66 28 20 70 20 29  xtra);.  if( p )
187c0 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 45 78 74  {.    char *pExt
187d0 72 61 20 3d 20 28 28 63 68 61 72 2a 29 70 29 2b  ra = ((char*)p)+
187e0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e  ROUND8(sizeof(In
187f0 64 65 78 29 29 3b 0a 20 20 20 20 70 2d 3e 61 7a  dex));.    p->az
18800 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68  Coll = (const ch
18810 61 72 2a 2a 29 70 45 78 74 72 61 3b 20 70 45 78  ar**)pExtra; pEx
18820 74 72 61 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69  tra += ROUND8(si
18830 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c  zeof(char*)*nCol
18840 29 3b 0a 20 20 20 20 70 2d 3e 61 69 52 6f 77 4c  );.    p->aiRowL
18850 6f 67 45 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a  ogEst = (LogEst*
18860 29 70 45 78 74 72 61 3b 20 70 45 78 74 72 61 20  )pExtra; pExtra 
18870 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74  += sizeof(LogEst
18880 29 2a 28 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20 20  )*(nCol+1);.    
18890 70 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69  p->aiColumn = (i
188a0 31 36 2a 29 70 45 78 74 72 61 3b 20 20 20 20 20  16*)pExtra;     
188b0 20 20 70 45 78 74 72 61 20 2b 3d 20 73 69 7a 65    pExtra += size
188c0 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 3b 0a 20 20  of(i16)*nCol;.  
188d0 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20    p->aSortOrder 
188e0 3d 20 28 75 38 2a 29 70 45 78 74 72 61 3b 0a 20  = (u8*)pExtra;. 
188f0 20 20 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20     p->nColumn = 
18900 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 6e 4b 65  nCol;.    p->nKe
18910 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2d 20 31 3b  yCol = nCol - 1;
18920 0a 20 20 20 20 2a 70 70 45 78 74 72 61 20 3d 20  .    *ppExtra = 
18930 28 28 63 68 61 72 2a 29 70 29 20 2b 20 6e 42 79  ((char*)p) + nBy
18940 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  te;.  }.  return
18950 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   p;.}../*.** Cre
18960 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20  ate a new index 
18970 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65  for an SQL table
18980 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32  .  pName1.pName2
18990 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
189a0 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e  the index .** an
189b0 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74 68  d pTblList is th
189c0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
189d0 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62  ble that is to b
189e0 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68  e indexed.  Both
189f0 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c   will .** be NUL
18a00 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20  L for a primary 
18a10 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20  key or an index 
18a20 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20  that is created 
18a30 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20  to satisfy a.** 
18a40 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
18a50 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e  t.  If pTable an
18a60 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c  d pIndex are NUL
18a70 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70  L, use pParse->p
18a80 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74  NewTable.** as t
18a90 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69  he table to be i
18aa0 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d  ndexed.  pParse-
18ab0 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20  >pNewTable is a 
18ac0 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a  table that is.**
18ad0 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
18ae0 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
18af0 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
18b00 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
18b10 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
18b20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  of columns to be
18b30 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74   indexed.  pList
18b40 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66   will be NULL if
18b50 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72   this.** is a pr
18b60 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69  imary key or uni
18b70 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f  que-constraint o
18b80 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
18b90 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a  t column added.*
18ba0 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  * to the table c
18bb0 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
18bc0 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a  onstruction.  .*
18bd0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
18be0 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72  eateIndex(.  Par
18bf0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
18c00 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  /* All informati
18c10 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61  on about this pa
18c20 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  rse */.  Token *
18c30 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46  pName1,     /* F
18c40 69 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64  irst part of ind
18c50 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20  ex name. May be 
18c60 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
18c70 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20  *pName2,     /* 
18c80 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69  Second part of i
18c90 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62  ndex name. May b
18ca0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c  e NULL */.  SrcL
18cb0 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f  ist *pTblName, /
18cc0 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78  * Table to index
18cd0 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e  . Use pParse->pN
18ce0 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a  ewTable if 0 */.
18cf0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
18d00 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f  t,   /* A list o
18d10 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
18d20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
18d30 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20   onError,       
18d40 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f  /* OE_Abort, OE_
18d50 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61  Ignore, OE_Repla
18d60 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a  ce, or OE_None *
18d70 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72  /.  Token *pStar
18d80 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52  t,     /* The CR
18d90 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20  EATE token that 
18da0 62 65 67 69 6e 73 20 74 68 69 73 20 73 74 61 74  begins this stat
18db0 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20  ement */.  Expr 
18dc0 2a 70 50 49 57 68 65 72 65 2c 20 20 20 20 2f 2a  *pPIWhere,    /*
18dd0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f   WHERE clause fo
18de0 72 20 70 61 72 74 69 61 6c 20 69 6e 64 69 63 65  r partial indice
18df0 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f  s */.  int sortO
18e00 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72  rder,     /* Sor
18e10 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69 6d 61  t order of prima
18e20 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c 69 73  ry key when pLis
18e30 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  t==NULL */.  int
18e40 20 69 66 4e 6f 74 45 78 69 73 74 2c 20 20 20 20   ifNotExist,    
18e50 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20 69 66  /* Omit error if
18e60 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65   index already e
18e70 78 69 73 74 73 20 2a 2f 0a 20 20 75 38 20 69 64  xists */.  u8 id
18e80 78 54 79 70 65 20 20 20 20 20 20 20 20 20 2f 2a  xType         /*
18e90 20 54 68 65 20 69 6e 64 65 78 20 74 79 70 65 20   The index type 
18ea0 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
18eb0 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Tab = 0;     /* 
18ec0 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  Table to be inde
18ed0 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  xed */.  Index *
18ee0 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a  pIndex = 0;   /*
18ef0 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   The index to be
18f00 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68   created */.  ch
18f10 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20  ar *zName = 0;  
18f20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
18f30 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  e index */.  int
18f40 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
18f50 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
18f60 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61  haracters in zNa
18f70 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  me */.  int i, j
18f80 3b 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  ;.  int sortOrde
18f90 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f  rMask;   /* 1 to
18fa0 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69   honor DESC in i
18fb0 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f  ndex.  0 to igno
18fc0 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  re. */.  sqlite3
18fd0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
18fe0 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20  b;.  Db *pDb;   
18ff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19000 20 73 70 65 63 69 66 69 63 20 74 61 62 6c 65 20   specific table 
19010 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69  containing the i
19020 6e 64 65 78 65 64 20 64 61 74 61 62 61 73 65 20  ndexed database 
19030 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
19040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
19050 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
19060 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  se that is being
19070 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f   written */.  To
19080 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20  ken *pName = 0; 
19090 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65     /* Unqualifie
190a0 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  d name of the in
190b0 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f  dex to create */
190c0 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
190d0 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74  st_item *pListIt
190e0 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  em; /* For loopi
190f0 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f  ng over pList */
19100 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20  .  int nExtra = 
19110 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
19120 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c      /* Space all
19130 6f 63 61 74 65 64 20 66 6f 72 20 7a 45 78 74 72  ocated for zExtr
19140 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  a[] */.  int nEx
19150 74 72 61 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  traCol;         
19160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
19170 62 65 72 20 6f 66 20 65 78 74 72 61 20 63 6f 6c  ber of extra col
19180 75 6d 6e 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20  umns needed */. 
19190 20 63 68 61 72 20 2a 7a 45 78 74 72 61 20 3d 20   char *zExtra = 
191a0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
191b0 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65    /* Extra space
191c0 20 61 66 74 65 72 20 74 68 65 20 49 6e 64 65 78   after the Index
191d0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 49 6e 64   object */.  Ind
191e0 65 78 20 2a 70 50 6b 20 3d 20 30 3b 20 20 20 20  ex *pPk = 0;    
191f0 20 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45 59    /* PRIMARY KEY
19200 20 69 6e 64 65 78 20 66 6f 72 20 57 49 54 48 4f   index for WITHO
19210 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20  UT ROWID tables 
19220 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  */..  if( db->ma
19230 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
19240 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a  arse->nErr>0 ){.
19250 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
19260 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
19270 20 20 69 66 28 20 49 4e 5f 44 45 43 4c 41 52 45    if( IN_DECLARE
19280 5f 56 54 41 42 20 26 26 20 69 64 78 54 79 70 65  _VTAB && idxType
19290 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  !=SQLITE_IDXTYPE
192a0 5f 50 52 49 4d 41 52 59 4b 45 59 20 29 7b 0a 20  _PRIMARYKEY ){. 
192b0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
192c0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
192d0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
192e0 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
192f0 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
19300 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
19310 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  e_index;.  }..  
19320 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
19330 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
19340 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52  o be indexed.  R
19350 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e  eturn early if n
19360 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20  ot found..  */. 
19370 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
19380 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20   ){..    /* Use 
19390 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64  the two-part ind
193a0 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72  ex name to deter
193b0 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62 61 73  mine the databas
193c0 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61  e .    ** to sea
193d0 72 63 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c  rch for the tabl
193e0 65 2e 20 27 46 69 78 27 20 74 68 65 20 74 61 62  e. 'Fix' the tab
193f0 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20  le name to this 
19400 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  db.    ** before
19410 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20   looking up the 
19420 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
19430 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31    assert( pName1
19440 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20   && pName2 );.  
19450 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
19460 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
19470 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
19480 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20  2, &pName);.    
19490 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f  if( iDb<0 ) goto
194a0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
194b0 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
194c0 70 4e 61 6d 65 20 26 26 20 70 4e 61 6d 65 2d 3e  pName && pName->
194d0 7a 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  z );..#ifndef SQ
194e0 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42  LITE_OMIT_TEMPDB
194f0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69  .    /* If the i
19500 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e  ndex name was un
19510 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b  qualified, check
19520 20 69 66 20 74 68 65 20 74 61 62 6c 65 0a 20 20   if the table.  
19530 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74    ** is a temp t
19540 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74  able. If so, set
19550 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
19560 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68   1. Do not do th
19570 69 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e 69  is.    ** if ini
19580 74 69 61 6c 69 73 69 6e 67 20 61 20 64 61 74 61  tialising a data
19590 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20  base schema..   
195a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 64 62 2d   */.    if( !db-
195b0 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
195c0 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
195d0 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28  e3SrcListLookup(
195e0 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65  pParse, pTblName
195f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61  );.      if( pNa
19600 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61  me2->n==0 && pTa
19610 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65  b && pTab->pSche
19620 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ma==db->aDb[1].p
19630 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
19640 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 20    iDb = 1;.     
19650 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
19660 0a 20 20 20 20 69 66 28 20 69 44 62 21 3d 31 20  .    if( iDb!=1 
19670 29 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d  ) pTblName->a[0]
19680 2e 7a 44 61 74 61 62 61 73 65 20 3d 20 64 62 2d  .zDatabase = db-
19690 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
196a0 6d 65 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73  me;.    pTab = s
196b0 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
196c0 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c  eItem(pParse, 0,
196d0 20 26 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d   &pTblName->a[0]
196e0 29 3b 0a 20 20 20 20 70 54 62 6c 4e 61 6d 65 2d  );.    pTblName-
196f0 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 20  >a[0].zDatabase 
19700 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
19710 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
19720 64 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d 30 20  d==0 || pTab==0 
19730 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d  );.    if( pTab=
19740 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
19750 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
19760 20 69 66 28 20 69 44 62 3d 3d 31 20 26 26 20 64   if( iDb==1 && d
19770 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
19780 65 6d 61 21 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema!=pTab->pSche
19790 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ma ){.      sqli
197a0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
197b0 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
197c0 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 61  "cannot create a
197d0 20 54 45 4d 50 20 69 6e 64 65 78 20 6f 6e 20 6e   TEMP index on n
197e0 6f 6e 2d 54 45 4d 50 20 74 61 62 6c 65 20 5c 22  on-TEMP table \"
197f0 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\"",.         
19800 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a    pTab->zName);.
19810 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
19820 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
19830 20 20 7d 0a 20 20 20 20 69 66 28 20 21 48 61 73    }.    if( !Has
19840 52 6f 77 69 64 28 70 54 61 62 29 20 29 20 70 50  Rowid(pTab) ) pP
19850 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  k = sqlite3Prima
19860 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
19870 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
19880 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20  ssert( pName==0 
19890 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
198a0 53 74 61 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Start==0 );.    
198b0 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
198c0 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 66  NewTable;.    if
198d0 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65  ( !pTab ) goto e
198e0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
198f0 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
19900 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
19910 32 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  2(db, pTab->pSch
19920 65 6d 61 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70  ema, 0);.  }.  p
19930 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
19940 62 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  b];..  assert( p
19950 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Tab!=0 );.  asse
19960 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  rt( pParse->nErr
19970 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  ==0 );.  if( sql
19980 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61  ite3StrNICmp(pTa
19990 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  b->zName, "sqlit
199a0 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20  e_", 7)==0 .    
199b0 20 20 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62     && db->init.b
199c0 75 73 79 3d 3d 30 0a 23 69 66 20 53 51 4c 49 54  usy==0.#if SQLIT
199d0 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
199e0 41 54 49 4f 4e 0a 20 20 20 20 20 20 20 26 26 20  ATION.       && 
199f0 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54  sqlite3UserAuthT
19a00 61 62 6c 65 28 70 54 61 62 2d 3e 7a 4e 61 6d 65  able(pTab->zName
19a10 29 3d 3d 30 0a 23 65 6e 64 69 66 0a 23 69 66 64  )==0.#endif.#ifd
19a20 65 66 20 53 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f  ef SQLITE_ALLOW_
19a30 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 5f 49 4e  SQLITE_MASTER_IN
19a40 44 45 58 0a 20 20 20 20 20 20 20 26 26 20 73 71  DEX.       && sq
19a50 6c 69 74 65 33 53 74 72 49 43 6d 70 28 26 70 54  lite3StrICmp(&pT
19a60 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 6d 61  ab->zName[7],"ma
19a70 73 74 65 72 22 29 21 3d 30 0a 23 65 6e 64 69 66  ster")!=0.#endif
19a80 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
19a90 65 33 53 74 72 4e 49 43 6d 70 28 26 70 54 61 62  e3StrNICmp(&pTab
19aa0 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 61 6c 74 65  ->zName[7],"alte
19ab0 72 74 61 62 5f 22 2c 39 29 21 3d 30 0a 20 29 7b  rtab_",9)!=0. ){
19ac0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
19ad0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
19ae0 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62  ble %s may not b
19af0 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62  e indexed", pTab
19b00 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
19b10 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
19b20 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  ndex;.  }.#ifnde
19b30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
19b40 45 57 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70  EW.  if( pTab->p
19b50 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
19b60 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
19b70 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79  arse, "views may
19b80 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22   not be indexed"
19b90 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
19ba0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
19bb0 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   }.#endif.#ifnde
19bc0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
19bd0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
19be0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
19bf0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
19c00 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
19c10 22 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20  "virtual tables 
19c20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
19c30 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ed");.    goto e
19c40 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
19c50 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
19c60 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
19c70 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
19c80 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  ex.  Make sure t
19c90 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  here is not alre
19ca0 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a  ady another.  **
19cb0 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
19cc0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
19cd0 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  me.  .  **.  ** 
19ce0 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77  Exception:  If w
19cf0 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
19d00 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61  e names of perma
19d10 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f  nent indices fro
19d20 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  m the.  ** sqlit
19d30 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28  e_master table (
19d40 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68  because some oth
19d50 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67  er process chang
19d60 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20 61  ed the schema) a
19d70 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74  nd.  ** one of t
19d80 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63  he index names c
19d90 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68 65  ollides with the
19da0 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f   name of a tempo
19db0 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20  rary table or.  
19dc0 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77  ** index, then w
19dd0 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20  e will continue 
19de0 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73 20  to process this 
19df0 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
19e00 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20   If pName==0 it 
19e10 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72  means that we ar
19e20 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77  e.  ** dealing w
19e30 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65  ith a primary ke
19e40 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  y or UNIQUE cons
19e50 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65  traint.  We have
19e60 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20   to invent our. 
19e70 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20   ** own name..  
19e80 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29  */.  if( pName )
19e90 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  {.    zName = sq
19ea0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
19eb0 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  en(db, pName);. 
19ec0 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
19ed0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
19ee0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73  te_index;.    as
19ef0 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 7a 21 3d  sert( pName->z!=
19f00 30 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  0 );.    if( SQL
19f10 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43  ITE_OK!=sqlite3C
19f20 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70  heckObjectName(p
19f30 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b  Parse, zName) ){
19f40 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
19f50 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
19f60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 49 4e     }.    if( !IN
19f70 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29  _RENAME_OBJECT )
19f80 7b 0a 20 20 20 20 20 20 69 66 28 20 21 64 62 2d  {.      if( !db-
19f90 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
19fa0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
19fb0 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
19fc0 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20  Name, 0)!=0 ){. 
19fd0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
19fe0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
19ff0 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61   "there is alrea
1a000 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64  dy a table named
1a010 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
1a020 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
1a030 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1a040 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a050 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  }.      if( sqli
1a060 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
1a070 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 44 62   zName, pDb->zDb
1a080 53 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  SName)!=0 ){.   
1a090 20 20 20 20 20 69 66 28 20 21 69 66 4e 6f 74 45       if( !ifNotE
1a0a0 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  xist ){.        
1a0b0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1a0c0 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78  g(pParse, "index
1a0d0 20 25 73 20 61 6c 72 65 61 64 79 20 65 78 69 73   %s already exis
1a0e0 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ts", zName);.   
1a0f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1a100 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64        assert( !d
1a110 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a  b->init.busy );.
1a120 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1a130 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
1a140 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
1a150 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a160 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
1a170 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
1a180 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
1a190 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
1a1a0 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20  Index *pLoop;.  
1a1b0 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62    for(pLoop=pTab
1a1c0 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70  ->pIndex, n=1; p
1a1d0 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
1a1e0 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d  p->pNext, n++){}
1a1f0 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
1a200 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
1a210 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65  "sqlite_autoinde
1a220 78 5f 25 73 5f 25 64 22 2c 20 70 54 61 62 2d 3e  x_%s_%d", pTab->
1a230 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69  zName, n);.    i
1a240 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  f( zName==0 ){. 
1a250 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
1a260 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
1a270 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 75 74 6f 6d   }..    /* Autom
1a280 61 74 69 63 20 69 6e 64 65 78 20 6e 61 6d 65 73  atic index names
1a290 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
1a2a0 77 69 74 68 69 6e 20 73 71 6c 69 74 65 33 5f 64  within sqlite3_d
1a2b0 65 63 6c 61 72 65 5f 76 74 61 62 28 29 0a 20 20  eclare_vtab().  
1a2c0 20 20 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 6e    ** must have n
1a2d0 61 6d 65 73 20 74 68 61 74 20 61 72 65 20 64 69  ames that are di
1a2e0 73 74 69 6e 63 74 20 66 72 6f 6d 20 6e 6f 72 6d  stinct from norm
1a2f0 61 6c 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  al automatic ind
1a300 65 78 20 6e 61 6d 65 73 2e 0a 20 20 20 20 2a 2a  ex names..    **
1a310 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
1a320 74 61 74 65 6d 65 6e 74 20 63 6f 6e 76 65 72 74  tatement convert
1a330 73 20 22 73 71 6c 69 74 65 33 5f 61 75 74 6f 69  s "sqlite3_autoi
1a340 6e 64 65 78 2e 2e 2e 22 20 69 6e 74 6f 0a 20 20  ndex..." into.  
1a350 20 20 2a 2a 20 22 73 71 6c 69 74 65 33 5f 62 75    ** "sqlite3_bu
1a360 74 6f 69 6e 64 65 78 2e 2e 2e 22 20 69 6e 20 6f  toindex..." in o
1a370 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 74 68 65  rder to make the
1a380 20 6e 61 6d 65 73 20 64 69 73 74 69 6e 63 74 2e   names distinct.
1a390 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 76 74 61  .    ** The "vta
1a3a0 62 5f 65 72 72 2e 74 65 73 74 22 20 74 65 73 74  b_err.test" test
1a3b0 20 64 65 6d 6f 6e 73 74 72 61 74 65 73 20 74 68   demonstrates th
1a3c0 65 20 6e 65 65 64 20 6f 66 20 74 68 69 73 20 73  e need of this s
1a3d0 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20  tatement. */.   
1a3e0 20 69 66 28 20 49 4e 5f 53 50 45 43 49 41 4c 5f   if( IN_SPECIAL_
1a3f0 50 41 52 53 45 20 29 20 7a 4e 61 6d 65 5b 37 5d  PARSE ) zName[7]
1a400 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  ++;.  }..  /* Ch
1a410 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a  eck for authoriz
1a420 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20  ation to create 
1a430 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23  an index..  */.#
1a440 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a450 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
1a460 0a 20 20 69 66 28 20 21 49 4e 5f 52 45 4e 41 4d  .  if( !IN_RENAM
1a470 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20  E_OBJECT ){.    
1a480 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
1a490 3d 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 3b  = pDb->zDbSName;
1a4a0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1a4b0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1a4c0 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
1a4d0 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
1a4e0 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  b), 0, zDb) ){. 
1a4f0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
1a500 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
1a510 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54   }.    i = SQLIT
1a520 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a  E_CREATE_INDEX;.
1a530 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
1a540 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
1a550 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
1a560 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  TE_TEMP_INDEX;. 
1a570 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
1a580 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
1a590 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i, zName, pTab->
1a5a0 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
1a5b0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
1a5c0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
1a5d0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1a5e0 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c   /* If pList==0,
1a5f0 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72   it means this r
1a600 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
1a610 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d  d to make a prim
1a620 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74  ary.  ** key out
1a630 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   of the last col
1a640 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65  umn added to the
1a650 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
1a660 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  struction..  ** 
1a670 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65  So create a fake
1a680 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74   list to simulat
1a690 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69  e this..  */.  i
1a6a0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
1a6b0 20 20 20 54 6f 6b 65 6e 20 70 72 65 76 43 6f 6c     Token prevCol
1a6c0 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  ;.    Column *pC
1a6d0 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c  ol = &pTab->aCol
1a6e0 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a  [pTab->nCol-1];.
1a6f0 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
1a700 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 55 4e  gs |= COLFLAG_UN
1a710 49 51 55 45 3b 0a 20 20 20 20 73 71 6c 69 74 65  IQUE;.    sqlite
1a720 33 54 6f 6b 65 6e 49 6e 69 74 28 26 70 72 65 76  3TokenInit(&prev
1a730 43 6f 6c 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  Col, pCol->zName
1a740 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  );.    pList = s
1a750 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
1a760 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 0a  pend(pParse, 0,.
1a770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1a780 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
1a790 62 2c 20 54 4b 5f 49 44 2c 20 26 70 72 65 76 43  b, TK_ID, &prevC
1a7a0 6f 6c 2c 20 30 29 29 3b 0a 20 20 20 20 69 66 28  ol, 0));.    if(
1a7b0 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f   pList==0 ) goto
1a7c0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1a7d0 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
1a7e0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20  pList->nExpr==1 
1a7f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1a800 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f 72 64  prListSetSortOrd
1a810 65 72 28 70 4c 69 73 74 2c 20 73 6f 72 74 4f 72  er(pList, sortOr
1a820 64 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  der);.  }else{. 
1a830 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
1a840 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 70 50  stCheckLength(pP
1a850 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 22 69 6e  arse, pList, "in
1a860 64 65 78 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  dex");.  }..  /*
1a870 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
1a880 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 73 70  many bytes of sp
1a890 61 63 65 20 61 72 65 20 72 65 71 75 69 72 65 64  ace are required
1a8a0 20 74 6f 20 73 74 6f 72 65 20 65 78 70 6c 69 63   to store explic
1a8b0 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69 66  itly.  ** specif
1a8c0 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ied collation se
1a8d0 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20  quence names..  
1a8e0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
1a8f0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
1a900 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
1a910 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  xpr = pList->a[i
1a920 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ].pExpr;.    ass
1a930 65 72 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b  ert( pExpr!=0 );
1a940 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
1a950 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29  op==TK_COLLATE )
1a960 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b  {.      nExtra +
1a970 3d 20 28 31 20 2b 20 73 71 6c 69 74 65 33 53 74  = (1 + sqlite3St
1a980 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e  rlen30(pExpr->u.
1a990 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 7d 0a  zToken));.    }.
1a9a0 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20    }..  /* .  ** 
1a9b0 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64  Allocate the ind
1a9c0 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20  ex structure. . 
1a9d0 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71   */.  nName = sq
1a9e0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
1a9f0 61 6d 65 29 3b 0a 20 20 6e 45 78 74 72 61 43 6f  ame);.  nExtraCo
1aa00 6c 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 6e  l = pPk ? pPk->n
1aa10 4b 65 79 43 6f 6c 20 3a 20 31 3b 0a 20 20 70 49  KeyCol : 1;.  pI
1aa20 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 41 6c  ndex = sqlite3Al
1aa30 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63  locateIndexObjec
1aa40 74 28 64 62 2c 20 70 4c 69 73 74 2d 3e 6e 45 78  t(db, pList->nEx
1aa50 70 72 20 2b 20 6e 45 78 74 72 61 43 6f 6c 2c 0a  pr + nExtraCol,.
1aa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa80 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20 6e 45        nName + nE
1aa90 78 74 72 61 20 2b 20 31 2c 20 26 7a 45 78 74 72  xtra + 1, &zExtr
1aaa0 61 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  a);.  if( db->ma
1aab0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
1aac0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
1aad0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  te_index;.  }.  
1aae0 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
1aaf0 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e  TE_ALIGNMENT(pIn
1ab00 64 65 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  dex->aiRowLogEst
1ab10 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45  ) );.  assert( E
1ab20 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
1ab30 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  ENT(pIndex->azCo
1ab40 6c 6c 29 20 29 3b 0a 20 20 70 49 6e 64 65 78 2d  ll) );.  pIndex-
1ab50 3e 7a 4e 61 6d 65 20 3d 20 7a 45 78 74 72 61 3b  >zName = zExtra;
1ab60 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 4e 61  .  zExtra += nNa
1ab70 6d 65 20 2b 20 31 3b 0a 20 20 6d 65 6d 63 70 79  me + 1;.  memcpy
1ab80 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20  (pIndex->zName, 
1ab90 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b  zName, nName+1);
1aba0 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  .  pIndex->pTabl
1abb0 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64  e = pTab;.  pInd
1abc0 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 28 75  ex->onError = (u
1abd0 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e  8)onError;.  pIn
1abe0 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  dex->uniqNotNull
1abf0 20 3d 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e   = onError!=OE_N
1ac00 6f 6e 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69  one;.  pIndex->i
1ac10 64 78 54 79 70 65 20 3d 20 69 64 78 54 79 70 65  dxType = idxType
1ac20 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  ;.  pIndex->pSch
1ac30 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  ema = db->aDb[iD
1ac40 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 49  b].pSchema;.  pI
1ac50 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20  ndex->nKeyCol = 
1ac60 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
1ac70 69 66 28 20 70 50 49 57 68 65 72 65 20 29 7b 0a  if( pPIWhere ){.
1ac80 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c      sqlite3Resol
1ac90 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28  veSelfReference(
1aca0 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43  pParse, pTab, NC
1acb0 5f 50 61 72 74 49 64 78 2c 20 70 50 49 57 68 65  _PartIdx, pPIWhe
1acc0 72 65 2c 20 30 29 3b 0a 20 20 20 20 70 49 6e 64  re, 0);.    pInd
1acd0 65 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  ex->pPartIdxWher
1ace0 65 20 3d 20 70 50 49 57 68 65 72 65 3b 0a 20 20  e = pPIWhere;.  
1acf0 20 20 70 50 49 57 68 65 72 65 20 3d 20 30 3b 0a    pPIWhere = 0;.
1ad00 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71    }.  assert( sq
1ad10 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
1ad20 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
1ad30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
1ad40 74 6f 20 73 65 65 20 69 66 20 77 65 20 73 68 6f  to see if we sho
1ad50 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72  uld honor DESC r
1ad60 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78  equests on index
1ad70 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20   columns.  */.  
1ad80 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
1ad90 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34  ->file_format>=4
1ada0 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65   ){.    sortOrde
1adb0 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a  rMask = -1;   /*
1adc0 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20   Honor DESC */. 
1add0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74   }else{.    sort
1ade0 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20  OrderMask = 0;  
1adf0 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43    /* Ignore DESC
1ae00 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e   */.  }..  /* An
1ae10 61 6c 79 7a 65 20 74 68 65 20 6c 69 73 74 20 6f  alyze the list o
1ae20 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  f expressions th
1ae30 61 74 20 66 6f 72 6d 20 74 68 65 20 74 65 72 6d  at form the term
1ae40 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61  s of the index a
1ae50 6e 64 0a 20 20 2a 2a 20 72 65 70 6f 72 74 20 61  nd.  ** report a
1ae60 6e 79 20 65 72 72 6f 72 73 2e 20 20 49 6e 20 74  ny errors.  In t
1ae70 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
1ae80 68 65 72 65 20 74 68 65 20 65 78 70 72 65 73 73  here the express
1ae90 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 0a 20  ion is exactly. 
1aea0 20 2a 2a 20 61 20 74 61 62 6c 65 20 63 6f 6c 75   ** a table colu
1aeb0 6d 6e 2c 20 73 74 6f 72 65 20 74 68 61 74 20 63  mn, store that c
1aec0 6f 6c 75 6d 6e 20 69 6e 20 61 69 43 6f 6c 75 6d  olumn in aiColum
1aed0 6e 5b 5d 2e 20 20 46 6f 72 20 67 65 6e 65 72 61  n[].  For genera
1aee0 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 20  l expressions,. 
1aef0 20 2a 2a 20 70 6f 70 75 6c 61 74 65 20 70 49 6e   ** populate pIn
1af00 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20 61 6e  dex->aColExpr an
1af10 64 20 73 74 6f 72 65 20 58 4e 5f 45 58 50 52 20  d store XN_EXPR 
1af20 28 2d 32 29 20 69 6e 20 61 69 43 6f 6c 75 6d 6e  (-2) in aiColumn
1af30 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f  []..  **.  ** TO
1af40 44 4f 3a 20 49 73 73 75 65 20 61 20 77 61 72 6e  DO: Issue a warn
1af50 69 6e 67 20 69 66 20 74 77 6f 20 6f 72 20 6d 6f  ing if two or mo
1af60 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  re columns of th
1af70 65 20 69 6e 64 65 78 20 61 72 65 20 69 64 65 6e  e index are iden
1af80 74 69 63 61 6c 2e 0a 20 20 2a 2a 20 54 4f 44 4f  tical..  ** TODO
1af90 3a 20 49 73 73 75 65 20 61 20 77 61 72 6e 69 6e  : Issue a warnin
1afa0 67 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 70  g if the table p
1afb0 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75 73  rimary key is us
1afc0 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
1afd0 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6b 65 79  e.  ** index key
1afe0 2e 0a 20 20 2a 2f 0a 20 20 70 4c 69 73 74 49 74  ..  */.  pListIt
1aff0 65 6d 20 3d 20 70 4c 69 73 74 2d 3e 61 3b 0a 20  em = pList->a;. 
1b000 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
1b010 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 70 49 6e  BJECT ){.    pIn
1b020 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20 3d 20  dex->aColExpr = 
1b030 70 4c 69 73 74 3b 0a 20 20 20 20 70 4c 69 73 74  pList;.    pList
1b040 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28   = 0;.  }.  for(
1b050 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e  i=0; i<pIndex->n
1b060 4b 65 79 43 6f 6c 3b 20 69 2b 2b 2c 20 70 4c 69  KeyCol; i++, pLi
1b070 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45  stItem++){.    E
1b080 78 70 72 20 2a 70 43 45 78 70 72 3b 20 20 20 20  xpr *pCExpr;    
1b090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b0a0 20 54 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20   The i-th index 
1b0b0 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
1b0c0 20 20 69 6e 74 20 72 65 71 75 65 73 74 65 64 53    int requestedS
1b0d0 6f 72 74 4f 72 64 65 72 3b 20 20 20 20 20 20 20  ortOrder;       
1b0e0 20 2f 2a 20 41 53 43 20 6f 72 20 44 45 53 43 20   /* ASC or DESC 
1b0f0 6f 6e 20 74 68 65 20 69 2d 74 68 20 65 78 70 72  on the i-th expr
1b100 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f  ession */.    co
1b110 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b  nst char *zColl;
1b120 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b130 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  Collation sequen
1b140 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20  ce name */..    
1b150 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49  sqlite3StringToI
1b160 64 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  d(pListItem->pEx
1b170 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pr);.    sqlite3
1b180 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72  ResolveSelfRefer
1b190 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70 54 61  ence(pParse, pTa
1b1a0 62 2c 20 4e 43 5f 49 64 78 45 78 70 72 2c 20 70  b, NC_IdxExpr, p
1b1b0 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2c  ListItem->pExpr,
1b1c0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61   0);.    if( pPa
1b1d0 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f  rse->nErr ) goto
1b1e0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1b1f0 65 78 3b 0a 20 20 20 20 70 43 45 78 70 72 20 3d  ex;.    pCExpr =
1b200 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
1b210 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 49 74 65  Collate(pListIte
1b220 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  m->pExpr);.    i
1b230 66 28 20 70 43 45 78 70 72 2d 3e 6f 70 21 3d 54  f( pCExpr->op!=T
1b240 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
1b250 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72    if( pTab==pPar
1b260 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b  se->pNewTable ){
1b270 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b280 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1b290 20 22 65 78 70 72 65 73 73 69 6f 6e 73 20 70 72   "expressions pr
1b2a0 6f 68 69 62 69 74 65 64 20 69 6e 20 50 52 49 4d  ohibited in PRIM
1b2b0 41 52 59 20 4b 45 59 20 61 6e 64 20 22 0a 20 20  ARY KEY and ".  
1b2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55                "U
1b2e0 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
1b2f0 73 22 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  s");.        got
1b300 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1b310 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
1b320 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61     if( pIndex->a
1b330 43 6f 6c 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  ColExpr==0 ){.  
1b340 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 43        pIndex->aC
1b350 6f 6c 45 78 70 72 20 3d 20 70 4c 69 73 74 3b 0a  olExpr = pList;.
1b360 20 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20          pList = 
1b370 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1b380 20 6a 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20   j = XN_EXPR;.  
1b390 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
1b3a0 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 45 58 50  lumn[i] = XN_EXP
1b3b0 52 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  R;.      pIndex-
1b3c0 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30  >uniqNotNull = 0
1b3d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b3e0 20 20 20 6a 20 3d 20 70 43 45 78 70 72 2d 3e 69     j = pCExpr->i
1b3f0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 61 73  Column;.      as
1b400 73 65 72 74 28 20 6a 3c 3d 30 78 37 66 66 66 20  sert( j<=0x7fff 
1b410 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 30  );.      if( j<0
1b420 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20   ){.        j = 
1b430 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
1b440 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61     }else if( pTa
1b450 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75  b->aCol[j].notNu
1b460 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ll==0 ){.       
1b470 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74   pIndex->uniqNot
1b480 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Null = 0;.      
1b490 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  }.      pIndex->
1b4a0 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 28 69  aiColumn[i] = (i
1b4b0 31 36 29 6a 3b 0a 20 20 20 20 7d 0a 20 20 20 20  16)j;.    }.    
1b4c0 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69  zColl = 0;.    i
1b4d0 66 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45  f( pListItem->pE
1b4e0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c  xpr->op==TK_COLL
1b4f0 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ATE ){.      int
1b500 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7a 43   nColl;.      zC
1b510 6f 6c 6c 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d  oll = pListItem-
1b520 3e 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  >pExpr->u.zToken
1b530 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 6c 20 3d 20  ;.      nColl = 
1b540 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1b550 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20 20 20  zColl) + 1;.    
1b560 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61    assert( nExtra
1b570 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20  >=nColl );.     
1b580 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20   memcpy(zExtra, 
1b590 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20  zColl, nColl);. 
1b5a0 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78       zColl = zEx
1b5b0 74 72 61 3b 0a 20 20 20 20 20 20 7a 45 78 74 72  tra;.      zExtr
1b5c0 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20  a += nColl;.    
1b5d0 20 20 6e 45 78 74 72 61 20 2d 3d 20 6e 43 6f 6c    nExtra -= nCol
1b5e0 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  l;.    }else if(
1b5f0 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a   j>=0 ){.      z
1b600 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Coll = pTab->aCo
1b610 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  l[j].zColl;.    
1b620 7d 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c  }.    if( !zColl
1b630 20 29 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74   ) zColl = sqlit
1b640 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20  e3StrBINARY;.   
1b650 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
1b660 75 73 79 20 26 26 20 21 73 71 6c 69 74 65 33 4c  usy && !sqlite3L
1b670 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
1b680 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20  rse, zColl) ){. 
1b690 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
1b6a0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
1b6b0 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61   }.    pIndex->a
1b6c0 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c  zColl[i] = zColl
1b6d0 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65 64 53  ;.    requestedS
1b6e0 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74  ortOrder = pList
1b6f0 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20  Item->sortOrder 
1b700 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b  & sortOrderMask;
1b710 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f  .    pIndex->aSo
1b720 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 28 75 38  rtOrder[i] = (u8
1b730 29 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72  )requestedSortOr
1b740 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  der;.  }..  /* A
1b750 70 70 65 6e 64 20 74 68 65 20 74 61 62 6c 65 20  ppend the table 
1b760 6b 65 79 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  key to the end o
1b770 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 46 6f  f the index.  Fo
1b780 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a  r WITHOUT ROWID.
1b790 20 20 2a 2a 20 74 61 62 6c 65 73 20 28 77 68 65    ** tables (whe
1b7a0 6e 20 70 50 6b 21 3d 30 29 20 74 68 69 73 20 77  n pPk!=0) this w
1b7b0 69 6c 6c 20 62 65 20 74 68 65 20 64 65 63 6c 61  ill be the decla
1b7c0 72 65 64 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  red PRIMARY KEY.
1b7d0 20 20 46 6f 72 0a 20 20 2a 2a 20 6e 6f 72 6d 61    For.  ** norma
1b7e0 6c 20 74 61 62 6c 65 73 20 28 77 68 65 6e 20 70  l tables (when p
1b7f0 50 6b 3d 3d 30 29 20 74 68 69 73 20 77 69 6c 6c  Pk==0) this will
1b800 20 62 65 20 74 68 65 20 72 6f 77 69 64 2e 0a 20   be the rowid.. 
1b810 20 2a 2f 0a 20 20 69 66 28 20 70 50 6b 20 29 7b   */.  if( pPk ){
1b820 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
1b830 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b  pPk->nKeyCol; j+
1b840 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20  +){.      int x 
1b850 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  = pPk->aiColumn[
1b860 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  j];.      assert
1b870 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( x>=0 );.      
1b880 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70 49  if( hasColumn(pI
1b890 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20  ndex->aiColumn, 
1b8a0 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c  pIndex->nKeyCol,
1b8b0 20 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70   x) ){.        p
1b8c0 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d  Index->nColumn--
1b8d0 3b 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ; .      }else{.
1b8e0 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
1b8f0 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 78 3b  aiColumn[i] = x;
1b900 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
1b910 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50 6b  >azColl[i] = pPk
1b920 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20  ->azColl[j];.   
1b930 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f       pIndex->aSo
1b940 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 50 6b  rtOrder[i] = pPk
1b950 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b  ->aSortOrder[j];
1b960 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  .        i++;.  
1b970 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1b980 61 73 73 65 72 74 28 20 69 3d 3d 70 49 6e 64 65  assert( i==pInde
1b990 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  x->nColumn );.  
1b9a0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 64 65  }else{.    pInde
1b9b0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d  x->aiColumn[i] =
1b9c0 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20 70   XN_ROWID;.    p
1b9d0 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  Index->azColl[i]
1b9e0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e   = sqlite3StrBIN
1b9f0 41 52 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ARY;.  }.  sqlit
1ba00 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28  e3DefaultRowEst(
1ba10 70 49 6e 64 65 78 29 3b 0a 20 20 69 66 28 20 70  pIndex);.  if( p
1ba20 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
1ba30 3d 3d 30 20 29 20 65 73 74 69 6d 61 74 65 49 6e  ==0 ) estimateIn
1ba40 64 65 78 57 69 64 74 68 28 70 49 6e 64 65 78 29  dexWidth(pIndex)
1ba50 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1ba60 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e 73 20 65  index contains e
1ba70 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69  very column of i
1ba80 74 73 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d  ts table, then m
1ba90 61 72 6b 0a 20 20 2a 2a 20 69 74 20 61 73 20 61  ark.  ** it as a
1baa0 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
1bab0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 48 61 73  */.  assert( Has
1bac0 52 6f 77 69 64 28 70 54 61 62 29 20 0a 20 20 20  Rowid(pTab) .   
1bad0 20 20 20 7c 7c 20 70 54 61 62 2d 3e 69 50 4b 65     || pTab->iPKe
1bae0 79 3c 30 20 7c 7c 20 73 71 6c 69 74 65 33 43 6f  y<0 || sqlite3Co
1baf0 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 6e 64  lumnOfIndex(pInd
1bb00 65 78 2c 20 70 54 61 62 2d 3e 69 50 4b 65 79 29  ex, pTab->iPKey)
1bb10 3e 3d 30 20 29 3b 0a 20 20 72 65 63 6f 6d 70 75  >=0 );.  recompu
1bb20 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74 49 6e 64 65  teColumnsNotInde
1bb30 78 65 64 28 70 49 6e 64 65 78 29 3b 0a 20 20 69  xed(pIndex);.  i
1bb40 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 26  f( pTblName!=0 &
1bb50 26 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  & pIndex->nColum
1bb60 6e 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  n>=pTab->nCol ){
1bb70 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 69 73 43  .    pIndex->isC
1bb80 6f 76 65 72 69 6e 67 20 3d 20 31 3b 0a 20 20 20  overing = 1;.   
1bb90 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
1bba0 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
1bbb0 20 20 20 20 69 66 28 20 6a 3d 3d 70 54 61 62 2d      if( j==pTab-
1bbc0 3e 69 50 4b 65 79 20 29 20 63 6f 6e 74 69 6e 75  >iPKey ) continu
1bbd0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  e;.      if( sql
1bbe0 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65  ite3ColumnOfInde
1bbf0 78 28 70 49 6e 64 65 78 2c 6a 29 3e 3d 30 20 29  x(pIndex,j)>=0 )
1bc00 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1bc10 20 70 49 6e 64 65 78 2d 3e 69 73 43 6f 76 65 72   pIndex->isCover
1bc20 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  ing = 0;.      b
1bc30 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
1bc40 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61  .  if( pTab==pPa
1bc50 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29  rse->pNewTable )
1bc60 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f  {.    /* This ro
1bc70 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63  utine has been c
1bc80 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
1bc90 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
1bca0 65 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72  ex as a.    ** r
1bcb0 65 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41  esult of a PRIMA
1bcc0 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
1bcd0 20 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c   clause on a col
1bce0 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20  umn definition, 
1bcf0 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d  or.    ** a PRIM
1bd00 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
1bd10 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69  E clause followi
1bd20 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65  ng the column de
1bd30 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a  finitions..    *
1bd40 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20  * i.e. one of:. 
1bd50 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45     **.    ** CRE
1bd60 41 54 45 20 54 41 42 4c 45 20 74 28 78 20 50 52  ATE TABLE t(x PR
1bd70 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20  IMARY KEY, y);. 
1bd80 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42     ** CREATE TAB
1bd90 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55  LE t(x, y, UNIQU
1bda0 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a  E(x, y));.    **
1bdb0 0a 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77  .    ** Either w
1bdc0 61 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65  ay, check to see
1bdd0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c   if the table al
1bde0 72 65 61 64 79 20 68 61 73 20 73 75 63 68 20 61  ready has such a
1bdf0 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20  n index. If.    
1be00 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74  ** so, don't bot
1be10 68 65 72 20 63 72 65 61 74 69 6e 67 20 74 68 69  her creating thi
1be20 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79  s one. This only
1be30 20 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20   applies to.    
1be40 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
1be50 20 63 72 65 61 74 65 64 20 69 6e 64 69 63 65 73   created indices
1be60 2e 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61  . Users can do a
1be70 73 20 74 68 65 79 20 77 69 73 68 20 77 69 74 68  s they wish with
1be80 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74  .    ** explicit
1be90 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a   indices..    **
1bea0 0a 20 20 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51  .    ** Two UNIQ
1beb0 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45  UE or PRIMARY KE
1bec0 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  Y constraints ar
1bed0 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75  e considered equ
1bee0 69 76 61 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28  ivalent.    ** (
1bef0 61 6e 64 20 74 68 75 73 20 73 75 70 70 72 65 73  and thus suppres
1bf00 73 69 6e 67 20 74 68 65 20 73 65 63 6f 6e 64 20  sing the second 
1bf10 6f 6e 65 29 20 65 76 65 6e 20 69 66 20 74 68 65  one) even if the
1bf20 79 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74  y have different
1bf30 0a 20 20 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64  .    ** sort ord
1bf40 65 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ers..    **.    
1bf50 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
1bf60 64 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74  different collat
1bf70 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 6f 72  ing sequences or
1bf80 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   if the columns 
1bf90 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  of.    ** the co
1bfa0 6e 73 74 72 61 69 6e 74 20 6f 63 63 75 72 20 69  nstraint occur i
1bfb0 6e 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65  n different orde
1bfc0 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e  rs, then the con
1bfd0 73 74 72 61 69 6e 74 73 20 61 72 65 0a 20 20 20  straints are.   
1bfe0 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 64   ** considered d
1bff0 69 73 74 69 6e 63 74 20 61 6e 64 20 62 6f 74 68  istinct and both
1c000 20 72 65 73 75 6c 74 20 69 6e 20 73 65 70 61 72   result in separ
1c010 61 74 65 20 69 6e 64 69 63 65 73 2e 0a 20 20 20  ate indices..   
1c020 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
1c030 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
1c040 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
1c050 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
1c060 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
1c070 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65  nt k;.      asse
1c080 72 74 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65  rt( IsUniqueInde
1c090 78 28 70 49 64 78 29 20 29 3b 0a 20 20 20 20 20  x(pIdx) );.     
1c0a0 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69   assert( pIdx->i
1c0b0 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49  dxType!=SQLITE_I
1c0c0 44 58 54 59 50 45 5f 41 50 50 44 45 46 20 29 3b  DXTYPE_APPDEF );
1c0d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49  .      assert( I
1c0e0 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e  sUniqueIndex(pIn
1c0f0 64 65 78 29 20 29 3b 0a 0a 20 20 20 20 20 20 69  dex) );..      i
1c100 66 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  f( pIdx->nKeyCol
1c110 21 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  !=pIndex->nKeyCo
1c120 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  l ) continue;.  
1c130 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
1c140 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 2b  Idx->nKeyCol; k+
1c150 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
1c160 74 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 20 20  t char *z1;.    
1c170 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1c180 7a 32 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  z2;.        asse
1c190 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  rt( pIdx->aiColu
1c1a0 6d 6e 5b 6b 5d 3e 3d 30 20 29 3b 0a 20 20 20 20  mn[k]>=0 );.    
1c1b0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
1c1c0 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65  Column[k]!=pInde
1c1d0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29  x->aiColumn[k] )
1c1e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1c1f0 7a 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  z1 = pIdx->azCol
1c200 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32  l[k];.        z2
1c210 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c   = pIndex->azCol
1c220 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[k];.        if
1c230 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
1c240 28 7a 31 2c 20 7a 32 29 20 29 20 62 72 65 61 6b  (z1, z2) ) break
1c250 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c260 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 4b 65  if( k==pIdx->nKe
1c270 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  yCol ){.        
1c280 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
1c290 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  r!=pIndex->onErr
1c2a0 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
1c2b0 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72 61 69  /* This constrai
1c2c0 6e 74 20 63 72 65 61 74 65 73 20 74 68 65 20 73  nt creates the s
1c2d0 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61 20 70  ame index as a p
1c2e0 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20  revious.        
1c2f0 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20    ** constraint 
1c300 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65 77 68  specified somewh
1c310 65 72 65 20 69 6e 20 74 68 65 20 43 52 45 41 54  ere in the CREAT
1c320 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
1c330 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  t..          ** 
1c340 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e 20 43  However the ON C
1c350 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20  ONFLICT clauses 
1c360 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20 49  are different. I
1c370 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20 20 20  f both this .   
1c380 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72         ** constr
1c390 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70 72 65  aint and the pre
1c3a0 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65 6e 74  vious equivalent
1c3b0 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 76 65   constraint have
1c3c0 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20 20 20   explicit.      
1c3d0 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49      ** ON CONFLI
1c3e0 43 54 20 63 6c 61 75 73 65 73 20 74 68 69 73 20  CT clauses this 
1c3f0 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68  is an error. Oth
1c400 65 72 77 69 73 65 2c 20 75 73 65 20 74 68 65 0a  erwise, use the.
1c410 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70            ** exp
1c420 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66 69 65  licitly specifie
1c430 64 20 62 65 68 61 76 69 6f 72 20 66 6f 72 20 74  d behavior for t
1c440 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  he index..      
1c450 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
1c460 20 69 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45   if( !(pIdx->onE
1c470 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
1c480 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72   || pIndex->onEr
1c490 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29  ror==OE_Default)
1c4a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1c4b0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1c4c0 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
1c4d0 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69           "confli
1c4e0 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43  cting ON CONFLIC
1c4f0 54 20 63 6c 61 75 73 65 73 20 73 70 65 63 69 66  T clauses specif
1c500 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ied", 0);.      
1c510 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1c520 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
1c530 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b  r==OE_Default ){
1c540 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64  .            pId
1c550 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e  x->onError = pIn
1c560 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20  dex->onError;.  
1c570 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c580 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1c590 69 64 78 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  idxType==SQLITE_
1c5a0 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b  IDXTYPE_PRIMARYK
1c5b0 45 59 20 29 20 70 49 64 78 2d 3e 69 64 78 54 79  EY ) pIdx->idxTy
1c5c0 70 65 20 3d 20 69 64 78 54 79 70 65 3b 0a 20 20  pe = idxType;.  
1c5d0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1c5e0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1c5f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1c600 0a 20 20 69 66 28 20 21 49 4e 5f 52 45 4e 41 4d  .  if( !IN_RENAM
1c610 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 0a 20 20 20  E_OBJECT ){..   
1c620 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77   /* Link the new
1c630 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
1c640 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e   to its table an
1c650 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20  d to the other. 
1c660 20 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20     ** in-memory 
1c670 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
1c680 72 65 73 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  res. .    */.   
1c690 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1c6a0 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 20 20  >nErr==0 );.    
1c6b0 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
1c6c0 79 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  y ){.      Index
1c6d0 20 2a 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72   *p;.      asser
1c6e0 74 28 20 21 49 4e 5f 53 50 45 43 49 41 4c 5f 50  t( !IN_SPECIAL_P
1c6f0 41 52 53 45 20 29 3b 0a 20 20 20 20 20 20 61 73  ARSE );.      as
1c700 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
1c710 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
1c720 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68   0, pIndex->pSch
1c730 65 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 70 20  ema) );.      p 
1c740 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
1c750 65 72 74 28 26 70 49 6e 64 65 78 2d 3e 70 53 63  ert(&pIndex->pSc
1c760 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a  hema->idxHash, .
1c770 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78            pIndex
1c780 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 29  ->zName, pIndex)
1c790 3b 0a 20 20 20 20 20 20 69 66 28 20 70 20 29 7b  ;.      if( p ){
1c7a0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1c7b0 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f   p==pIndex );  /
1c7c0 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
1c7d0 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  ve failed */.   
1c7e0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46       sqlite3OomF
1c7f0 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20  ault(db);.      
1c800 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
1c810 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
1c820 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6d 44 62 46  }.      db->mDbF
1c830 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53  lags |= DBFLAG_S
1c840 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20 20  chemaChange;.   
1c850 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21     if( pTblName!
1c860 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  =0 ){.        pI
1c870 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d  ndex->tnum = db-
1c880 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20  >init.newTnum;. 
1c890 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1c8a0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1c8b0 74 68 65 20 69 6e 69 74 69 61 6c 20 43 52 45 41  the initial CREA
1c8c0 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
1c8d0 6e 74 20 28 6f 72 20 43 52 45 41 54 45 20 54 41  nt (or CREATE TA
1c8e0 42 4c 45 20 69 66 20 74 68 65 0a 20 20 20 20 2a  BLE if the.    *
1c8f0 2a 20 69 6e 64 65 78 20 69 73 20 61 6e 20 69 6d  * index is an im
1c900 70 6c 69 65 64 20 69 6e 64 65 78 20 66 6f 72 20  plied index for 
1c910 61 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d  a UNIQUE or PRIM
1c920 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
1c930 6e 74 29 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  nt) then.    ** 
1c940 65 6d 69 74 20 63 6f 64 65 20 74 6f 20 61 6c 6c  emit code to all
1c950 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
1c960 72 6f 6f 74 70 61 67 65 20 6f 6e 20 64 69 73 6b  rootpage on disk
1c970 20 61 6e 64 20 6d 61 6b 65 20 61 6e 20 65 6e 74   and make an ent
1c980 72 79 20 66 6f 72 0a 20 20 20 20 2a 2a 20 74 68  ry for.    ** th
1c990 65 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 73  e index in the s
1c9a0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
1c9b0 6c 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  le and populate 
1c9c0 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 0a 20  the index with. 
1c9d0 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20     ** content.  
1c9e0 42 75 74 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74  But, do not do t
1c9f0 68 69 73 20 69 66 20 77 65 20 61 72 65 20 73 69  his if we are si
1ca00 6d 70 6c 79 20 72 65 61 64 69 6e 67 20 74 68 65  mply reading the
1ca10 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20   sqlite_master. 
1ca20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 70     ** table to p
1ca30 61 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 2c  arse the schema,
1ca40 20 6f 72 20 69 66 20 74 68 69 73 20 69 6e 64 65   or if this inde
1ca50 78 20 69 73 20 74 68 65 20 50 52 49 4d 41 52 59  x is the PRIMARY
1ca60 20 4b 45 59 20 69 6e 64 65 78 0a 20 20 20 20 2a   KEY index.    *
1ca70 2a 20 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52  * of a WITHOUT R
1ca80 4f 57 49 44 20 74 61 62 6c 65 2e 0a 20 20 20 20  OWID table..    
1ca90 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 70 54 62  **.    ** If pTb
1caa0 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e  lName==0 it mean
1cab0 73 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  s this index is 
1cac0 67 65 6e 65 72 61 74 65 64 20 61 73 20 61 6e 20  generated as an 
1cad0 69 6d 70 6c 69 65 64 20 50 52 49 4d 41 52 59 20  implied PRIMARY 
1cae0 4b 45 59 0a 20 20 20 20 2a 2a 20 6f 72 20 55 4e  KEY.    ** or UN
1caf0 49 51 55 45 20 69 6e 64 65 78 20 69 6e 20 61 20  IQUE index in a 
1cb00 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
1cb10 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74  tement.  Since t
1cb20 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20  he table.    ** 
1cb30 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72  has just been cr
1cb40 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69  eated, it contai
1cb50 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74  ns no data and t
1cb60 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c  he index initial
1cb70 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 73  ization.    ** s
1cb80 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70  tep can be skipp
1cb90 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 65  ed..    */.    e
1cba0 6c 73 65 20 69 66 28 20 48 61 73 52 6f 77 69 64  lse if( HasRowid
1cbb0 28 70 54 61 62 29 20 7c 7c 20 70 54 62 6c 4e 61  (pTab) || pTblNa
1cbc0 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 56  me!=0 ){.      V
1cbd0 64 62 65 20 2a 76 3b 0a 20 20 20 20 20 20 63 68  dbe *v;.      ch
1cbe0 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 20  ar *zStmt;.     
1cbf0 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50   int iMem = ++pP
1cc00 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20  arse->nMem;..   
1cc10 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
1cc20 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1cc30 20 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20       if( v==0 ) 
1cc40 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1cc50 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20 20 20 73  _index;..      s
1cc60 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
1cc70 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
1cc80 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20  , 1, iDb);..    
1cc90 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
1cca0 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65  rootpage for the
1ccb0 20 69 6e 64 65 78 20 75 73 69 6e 67 20 43 72 65   index using Cre
1ccc0 61 74 65 49 6e 64 65 78 2e 20 42 75 74 20 62 65  ateIndex. But be
1ccd0 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 64 6f  fore.      ** do
1cce0 69 6e 67 20 73 6f 2c 20 63 6f 64 65 20 61 20 4e  ing so, code a N
1ccf0 6f 6f 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  oop instruction 
1cd00 61 6e 64 20 73 74 6f 72 65 20 69 74 73 20 61 64  and store its ad
1cd10 64 72 65 73 73 20 69 6e 20 0a 20 20 20 20 20 20  dress in .      
1cd20 2a 2a 20 49 6e 64 65 78 2e 74 6e 75 6d 2e 20 54  ** Index.tnum. T
1cd30 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
1cd40 69 6e 20 63 61 73 65 20 74 68 69 73 20 69 6e 64  in case this ind
1cd50 65 78 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  ex is actually a
1cd60 20 0a 20 20 20 20 20 20 2a 2a 20 50 52 49 4d 41   .      ** PRIMA
1cd70 52 59 20 4b 45 59 20 61 6e 64 20 74 68 65 20 74  RY KEY and the t
1cd80 61 62 6c 65 20 69 73 20 61 63 74 75 61 6c 6c 79  able is actually
1cd90 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
1cda0 20 74 61 62 6c 65 2e 20 49 6e 20 0a 20 20 20 20   table. In .    
1cdb0 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 74    ** that case t
1cdc0 68 65 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68  he convertToWith
1cdd0 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28 29 20  outRowidTable() 
1cde0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 70  routine will rep
1cdf0 6c 61 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  lace.      ** th
1ce00 65 20 4e 6f 6f 70 20 77 69 74 68 20 61 20 47 6f  e Noop with a Go
1ce10 74 6f 20 74 6f 20 6a 75 6d 70 20 6f 76 65 72 20  to to jump over 
1ce20 74 68 65 20 56 44 42 45 20 63 6f 64 65 20 67 65  the VDBE code ge
1ce30 6e 65 72 61 74 65 64 20 62 65 6c 6f 77 2e 20 2a  nerated below. *
1ce40 2f 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  /.      pIndex->
1ce50 74 6e 75 6d 20 3d 20 73 71 6c 69 74 65 33 56 64  tnum = sqlite3Vd
1ce60 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4e  beAddOp0(v, OP_N
1ce70 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  oop);.      sqli
1ce80 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1ce90 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65 2c   OP_CreateBtree,
1cea0 20 69 44 62 2c 20 69 4d 65 6d 2c 20 42 54 52 45   iDb, iMem, BTRE
1ceb0 45 5f 42 4c 4f 42 4b 45 59 29 3b 0a 0a 20 20 20  E_BLOBKEY);..   
1cec0 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65     /* Gather the
1ced0 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   complete text o
1cee0 66 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44  f the CREATE IND
1cef0 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74  EX statement int
1cf00 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 7a  o.      ** the z
1cf10 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20  Stmt variable.  
1cf20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1cf30 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20   pStart ){.     
1cf40 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29     int n = (int)
1cf50 28 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f  (pParse->sLastTo
1cf60 6b 65 6e 2e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a  ken.z - pName->z
1cf70 29 20 2b 20 70 50 61 72 73 65 2d 3e 73 4c 61 73  ) + pParse->sLas
1cf80 74 54 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20  tToken.n;.      
1cf90 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e 7a 5b 6e    if( pName->z[n
1cfa0 2d 31 5d 3d 3d 27 3b 27 20 29 20 6e 2d 2d 3b 0a  -1]==';' ) n--;.
1cfb0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d          /* A nam
1cfc0 65 64 20 69 6e 64 65 78 20 77 69 74 68 20 61 6e  ed index with an
1cfd0 20 65 78 70 6c 69 63 69 74 20 43 52 45 41 54 45   explicit CREATE
1cfe0 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
1cff0 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 53 74 6d   */.        zStm
1d000 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
1d010 74 66 28 64 62 2c 20 22 43 52 45 41 54 45 25 73  tf(db, "CREATE%s
1d020 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20   INDEX %.*s",.  
1d030 20 20 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f            onErro
1d040 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20  r==OE_None ? "" 
1d050 3a 20 22 20 55 4e 49 51 55 45 22 2c 20 6e 2c 20  : " UNIQUE", n, 
1d060 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 20  pName->z);.     
1d070 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d080 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63 20  /* An automatic 
1d090 69 6e 64 65 78 20 63 72 65 61 74 65 64 20 62 79  index created by
1d0a0 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
1d0b0 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
1d0c0 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 2f  int */.        /
1d0d0 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  * zStmt = sqlite
1d0e0 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f  3MPrintf(""); */
1d0f0 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  .        zStmt =
1d100 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   0;.      }..   
1d110 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74     /* Add an ent
1d120 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73  ry in sqlite_mas
1d130 74 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e 64  ter for this ind
1d140 65 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ex.      */.    
1d150 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
1d160 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
1d170 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20          "INSERT 
1d180 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45  INTO %Q.%s VALUE
1d190 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c  S('index',%Q,%Q,
1d1a0 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20  #%d,%Q);",.     
1d1b0 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
1d1c0 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54  ].zDbSName, MAST
1d1d0 45 52 5f 4e 41 4d 45 2c 0a 20 20 20 20 20 20 20  ER_NAME,.       
1d1e0 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
1d1f0 2c 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62  ,.          pTab
1d200 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
1d210 20 20 20 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20     iMem,.       
1d220 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 20 20 20     zStmt.       
1d230 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69     );.      sqli
1d240 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
1d250 74 6d 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  tmt);..      /* 
1d260 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20 77  Fill the index w
1d270 69 74 68 20 64 61 74 61 20 61 6e 64 20 72 65 70  ith data and rep
1d280 61 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 2e  arse the schema.
1d290 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70 69   Code an OP_Expi
1d2a0 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 69  re.      ** to i
1d2b0 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72  nvalidate all pr
1d2c0 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  e-compiled state
1d2d0 6d 65 6e 74 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  ments..      */.
1d2e0 20 20 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61        if( pTblNa
1d2f0 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        sq
1d300 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
1d310 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 49  (pParse, iDb, pI
1d320 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  ndex, iMem);.   
1d330 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e       sqlite3Chan
1d340 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
1d350 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73   iDb);.        s
1d360 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72  qlite3VdbeAddPar
1d370 73 65 53 63 68 65 6d 61 4f 70 28 70 50 61 72 73  seSchemaOp(pPars
1d380 65 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20  e, iDb,.        
1d390 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
1d3a0 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25 71  tf(db, "name='%q
1d3b0 27 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65  ' AND type='inde
1d3c0 78 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  x'", pIndex->zNa
1d3d0 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71  me));.        sq
1d3e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1d3f0 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 2c  v, OP_Expire, 0,
1d400 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   1);.      }..  
1d410 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
1d420 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 64 65  umpHere(v, pInde
1d430 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 7d 0a  x->tnum);.    }.
1d440 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61    }..  /* When a
1d450 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74  dding an index t
1d460 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
1d470 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c  dices for a tabl
1d480 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72  e, make.  ** sur
1d490 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61  e all indices la
1d4a0 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65  beled OE_Replace
1d4b0 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20   come after all 
1d4c0 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20  those labeled.  
1d4d0 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54  ** OE_Ignore.  T
1d4e0 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
1d4f0 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74   for the correct
1d500 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 65 63   constraint chec
1d510 6b 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e  k.  ** processin
1d520 67 20 28 69 6e 20 73 71 6c 69 74 65 33 47 65 6e  g (in sqlite3Gen
1d530 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43  erateConstraintC
1d540 68 65 63 6b 73 28 29 29 20 61 73 20 70 61 72 74  hecks()) as part
1d550 20 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54 45 20   of.  ** UPDATE 
1d560 61 6e 64 20 49 4e 53 45 52 54 20 73 74 61 74 65  and INSERT state
1d570 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  ments..  */.  if
1d580 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
1d590 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29  || pTblName==0 )
1d5a0 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f  {.    if( onErro
1d5b0 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c  r!=OE_Replace ||
1d5c0 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30   pTab->pIndex==0
1d5d0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61  .         || pTa
1d5e0 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  b->pIndex->onErr
1d5f0 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b  or==OE_Replace){
1d600 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
1d610 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e  Next = pTab->pIn
1d620 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  dex;.      pTab-
1d630 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
1d640 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d650 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72     Index *pOther
1d660 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
1d670 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f  .      while( pO
1d680 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70  ther->pNext && p
1d690 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e  Other->pNext->on
1d6a0 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
1d6b0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74  e ){.        pOt
1d6c0 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  her = pOther->pN
1d6d0 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
1d6e0 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
1d6f0 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74   = pOther->pNext
1d700 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e  ;.      pOther->
1d710 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a  pNext = pIndex;.
1d720 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78      }.    pIndex
1d730 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 65 6c 73 65   = 0;.  }.  else
1d740 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
1d750 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73  BJECT ){.    ass
1d760 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65  ert( pParse->pNe
1d770 77 49 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20 20  wIndex==0 );.   
1d780 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e 64   pParse->pNewInd
1d790 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  ex = pIndex;.   
1d7a0 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d   pIndex = 0;.  }
1d7b0 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20  ..  /* Clean up 
1d7c0 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a  before exiting *
1d7d0 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  /.exit_create_in
1d7e0 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65  dex:.  if( pInde
1d7f0 78 20 29 20 73 71 6c 69 74 65 33 46 72 65 65 49  x ) sqlite3FreeI
1d800 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
1d810 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
1d820 65 6c 65 74 65 28 64 62 2c 20 70 50 49 57 68 65  elete(db, pPIWhe
1d830 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  re);.  sqlite3Ex
1d840 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
1d850 20 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74   pList);.  sqlit
1d860 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
1d870 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  db, pTblName);. 
1d880 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1d890 62 2c 20 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  b, zName);.}../*
1d8a0 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64  .** Fill the Ind
1d8b0 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72  ex.aiRowEst[] ar
1d8c0 72 61 79 20 77 69 74 68 20 64 65 66 61 75 6c 74  ray with default
1d8d0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69   information - i
1d8e0 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f  nformation.** to
1d8f0 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 77 65   be used when we
1d900 20 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68   have not run th
1d910 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e  e ANALYZE comman
1d920 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73  d..**.** aiRowEs
1d930 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65 64  t[0] is supposed
1d940 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
1d950 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
1d960 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e  ts in the index.
1d970 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20  .** Since we do 
1d980 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20  not know, guess 
1d990 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f  1 million.  aiRo
1d9a0 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73  wEst[1] is an es
1d9b0 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a  timate of the.**
1d9c0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1d9d0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  in the table tha
1d9e0 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74  t match any part
1d9f0 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20  icular value of 
1da00 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c  the.** first col
1da10 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
1da20 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69  .  aiRowEst[2] i
1da30 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
1da40 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
1da50 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63  f rows that matc
1da60 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72  h any particular
1da70 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
1da80 74 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75  the first 2 colu
1da90 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e  mns.** of the in
1daa0 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  dex.  And so for
1dab0 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77  th.  It must alw
1dac0 61 79 73 20 62 65 20 74 68 65 20 63 61 73 65 20  ays be the case 
1dad0 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20  that.*.**       
1dae0 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c      aiRowEst[N]<
1daf0 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a  =aiRowEst[N-1].*
1db00 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f  *           aiRo
1db10 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a  wEst[N]>=1.**.**
1db20 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74   Apart from that
1db30 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65  , we have little
1db40 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65   to go on beside
1db50 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74  s intuition as t
1db60 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73  o.** how aiRowEs
1db70 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  t[] should be in
1db80 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20  itialized.  The 
1db90 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65  numbers generate
1dba0 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61  d here.** are ba
1dbb0 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76  sed on typical v
1dbc0 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61  alues found in a
1dbd0 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a  ctual indices..*
1dbe0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
1dbf0 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65  faultRowEst(Inde
1dc00 78 20 2a 70 49 64 78 29 7b 0a 20 20 2f 2a 20 20  x *pIdx){.  /*  
1dc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 30                10
1dc20 2c 20 20 39 2c 20 20 38 2c 20 20 37 2c 20 20 36  ,  9,  8,  7,  6
1dc30 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61 56 61   */.  LogEst aVa
1dc40 6c 5b 5d 20 3d 20 7b 20 33 33 2c 20 33 32 2c 20  l[] = { 33, 32, 
1dc50 33 30 2c 20 32 38 2c 20 32 36 20 7d 3b 0a 20 20  30, 28, 26 };.  
1dc60 4c 6f 67 45 73 74 20 2a 61 20 3d 20 70 49 64 78  LogEst *a = pIdx
1dc70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 3b 0a 20  ->aiRowLogEst;. 
1dc80 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 4d 49 4e   int nCopy = MIN
1dc90 28 41 72 72 61 79 53 69 7a 65 28 61 56 61 6c 29  (ArraySize(aVal)
1dca0 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29  , pIdx->nKeyCol)
1dcb0 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  ;.  int i;..  /*
1dcc0 20 49 6e 64 65 78 65 73 20 77 69 74 68 20 64 65   Indexes with de
1dcd0 66 61 75 6c 74 20 72 6f 77 20 65 73 74 69 6d 61  fault row estima
1dce0 74 65 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68  tes should not h
1dcf0 61 76 65 20 73 74 61 74 31 20 64 61 74 61 20 2a  ave stat1 data *
1dd00 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 49 64  /.  assert( !pId
1dd10 78 2d 3e 68 61 73 53 74 61 74 31 20 29 3b 0a 0a  x->hasStat1 );..
1dd20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 66 69 72    /* Set the fir
1dd30 73 74 20 65 6e 74 72 79 20 28 6e 75 6d 62 65 72  st entry (number
1dd40 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
1dd50 69 6e 64 65 78 29 20 74 6f 20 74 68 65 20 65 73  index) to the es
1dd60 74 69 6d 61 74 65 64 20 0a 20 20 2a 2a 20 6e 75  timated .  ** nu
1dd70 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
1dd80 74 68 65 20 74 61 62 6c 65 2c 20 6f 72 20 68 61  the table, or ha
1dd90 6c 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  lf the number of
1dda0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
1ddb0 6c 65 0a 20 20 2a 2a 20 66 6f 72 20 61 20 70 61  le.  ** for a pa
1ddc0 72 74 69 61 6c 20 69 6e 64 65 78 2e 20 20 20 42  rtial index.   B
1ddd0 75 74 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74 68  ut do not let th
1dde0 65 20 65 73 74 69 6d 61 74 65 20 64 72 6f 70 20  e estimate drop 
1ddf0 62 65 6c 6f 77 20 31 30 2e 20 2a 2f 0a 20 20 61  below 10. */.  a
1de00 5b 30 5d 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  [0] = pIdx->pTab
1de10 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a  le->nRowLogEst;.
1de20 20 20 69 66 28 20 70 49 64 78 2d 3e 70 50 61 72    if( pIdx->pPar
1de30 74 49 64 78 57 68 65 72 65 21 3d 30 20 29 20 61  tIdxWhere!=0 ) a
1de40 5b 30 5d 20 2d 3d 20 31 30 3b 20 20 61 73 73 65  [0] -= 10;  asse
1de50 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 10==sqlite3L
1de60 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 69 66  ogEst(2) );.  if
1de70 28 20 61 5b 30 5d 3c 33 33 20 29 20 61 5b 30 5d  ( a[0]<33 ) a[0]
1de80 20 3d 20 33 33 3b 20 20 20 20 20 20 20 20 20 20   = 33;          
1de90 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1dea0 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  33==sqlite3LogEs
1deb0 74 28 31 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 45  t(10) );..  /* E
1dec0 73 74 69 6d 61 74 65 20 74 68 61 74 20 61 5b 31  stimate that a[1
1ded0 5d 20 69 73 20 31 30 2c 20 61 5b 32 5d 20 69 73  ] is 10, a[2] is
1dee0 20 39 2c 20 61 5b 33 5d 20 69 73 20 38 2c 20 61   9, a[3] is 8, a
1def0 5b 34 5d 20 69 73 20 37 2c 20 61 5b 35 5d 20 69  [4] is 7, a[5] i
1df00 73 0a 20 20 2a 2a 20 36 20 61 6e 64 20 65 61 63  s.  ** 6 and eac
1df10 68 20 73 75 62 73 65 71 75 65 6e 74 20 76 61 6c  h subsequent val
1df20 75 65 20 28 69 66 20 61 6e 79 29 20 69 73 20 35  ue (if any) is 5
1df30 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26  .  */.  memcpy(&
1df40 61 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f 70  a[1], aVal, nCop
1df50 79 2a 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29  y*sizeof(LogEst)
1df60 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 70 79  );.  for(i=nCopy
1df70 2b 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b 65  +1; i<=pIdx->nKe
1df80 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  yCol; i++){.    
1df90 61 5b 69 5d 20 3d 20 32 33 3b 20 20 20 20 20 20  a[i] = 23;      
1dfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
1dfb0 73 65 72 74 28 20 32 33 3d 3d 73 71 6c 69 74 65  sert( 23==sqlite
1dfc0 33 4c 6f 67 45 73 74 28 35 29 20 29 3b 0a 20 20  3LogEst(5) );.  
1dfd0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  }..  assert( 0==
1dfe0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29  sqlite3LogEst(1)
1dff0 20 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71   );.  if( IsUniq
1e000 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 20  ueIndex(pIdx) ) 
1e010 61 5b 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 5d  a[pIdx->nKeyCol]
1e020 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
1e030 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1e040 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e   drop an existin
1e050 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20  g named index.  
1e060 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
1e070 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44  implements the D
1e080 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ROP INDEX statem
1e090 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
1e0a0 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61  ite3DropIndex(Pa
1e0b0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
1e0c0 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  List *pName, int
1e0d0 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e   ifExists){.  In
1e0e0 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56  dex *pIndex;.  V
1e0f0 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
1e100 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1e110 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
1e120 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1e130 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f  ->nErr==0 );   /
1e140 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77  * Never called w
1e150 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73  ith prior errors
1e160 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   */.  if( db->ma
1e170 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
1e180 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
1e190 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73  _index;.  }.  as
1e1a0 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
1e1b0 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51  c==1 );.  if( SQ
1e1c0 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
1e1d0 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
1e1e0 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  e) ){.    goto e
1e1f0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
1e200 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73    }.  pIndex = s
1e210 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
1e220 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  db, pName->a[0].
1e230 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  zName, pName->a[
1e240 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
1e250 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29   if( pIndex==0 )
1e260 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45 78 69  {.    if( !ifExi
1e270 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  sts ){.      sql
1e280 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1e290 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e  rse, "no such in
1e2a0 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c  dex: %S", pName,
1e2b0 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
1e2c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
1e2d0 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65  eVerifyNamedSche
1e2e0 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  ma(pParse, pName
1e2f0 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
1e300 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
1e310 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
1e320 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65   = 1;.    goto e
1e330 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
1e340 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78    }.  if( pIndex
1e350 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54  ->idxType!=SQLIT
1e360 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46  E_IDXTYPE_APPDEF
1e370 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1e380 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1e390 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65  "index associate
1e3a0 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a  d with UNIQUE ".
1e3b0 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52        "or PRIMAR
1e3c0 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
1e3d0 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70   cannot be dropp
1e3e0 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74  ed", 0);.    got
1e3f0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1e400 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73  x;.  }.  iDb = s
1e410 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
1e420 64 65 78 32 28 64 62 2c 20 70 49 6e 64 65 78 2d  dex2(db, pIndex-
1e430 3e 70 53 63 68 65 6d 61 2c 20 30 29 3b 0a 20 20  >pSchema, 0);.  
1e440 73 71 6c 69 74 65 33 53 63 68 65 6d 61 57 72 69  sqlite3SchemaWri
1e450 74 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44  table(pParse, iD
1e460 62 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  b);.#ifndef SQLI
1e470 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
1e480 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
1e490 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  t code = SQLITE_
1e4a0 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  DROP_INDEX;.    
1e4b0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
1e4c0 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20  ndex->pTable;.  
1e4d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
1e4e0 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
1e4f0 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63  .zDbSName;.    c
1e500 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
1e510 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  = SCHEMA_TABLE(i
1e520 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  Db);.    if( sql
1e530 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1e540 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
1e550 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44  ETE, zTab, 0, zD
1e560 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
1e570 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1e580 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1e590 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
1e5a0 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c  iDb ) code = SQL
1e5b0 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
1e5c0 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
1e5d0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1e5e0 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64  arse, code, pInd
1e5f0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  ex->zName, pTab-
1e600 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a  >zName, zDb) ){.
1e610 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1e620 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
1e630 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
1e640 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1e650 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69   to remove the i
1e660 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68  ndex and from th
1e670 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a  e master table *
1e680 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
1e690 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
1e6a0 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
1e6b0 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
1e6c0 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
1e6d0 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 1, iDb);.    s
1e6e0 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
1e6f0 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
1e700 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
1e710 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25  .%s WHERE name=%
1e720 51 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65  Q AND type='inde
1e730 78 27 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e  x'",.       db->
1e740 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
1e750 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20  e, MASTER_NAME, 
1e760 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20  pIndex->zName.  
1e770 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
1e780 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28  ClearStatTables(
1e790 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69 64  pParse, iDb, "id
1e7a0 78 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  x", pIndex->zNam
1e7b0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  e);.    sqlite3C
1e7c0 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
1e7d0 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 64 65  se, iDb);.    de
1e7e0 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
1e7f0 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e  arse, pIndex->tn
1e800 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  um, iDb);.    sq
1e810 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1e820 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c  v, OP_DropIndex,
1e830 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64   iDb, 0, 0, pInd
1e840 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ex->zName, 0);. 
1e850 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e   }..exit_drop_in
1e860 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72  dex:.  sqlite3Sr
1e870 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  cListDelete(db, 
1e880 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pName);.}../*.**
1e890 20 70 41 72 72 61 79 20 69 73 20 61 20 70 6f 69   pArray is a poi
1e8a0 6e 74 65 72 20 74 6f 20 61 6e 20 61 72 72 61 79  nter to an array
1e8b0 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 45 61 63   of objects. Eac
1e8c0 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a  h object in the.
1e8d0 2a 2a 20 61 72 72 61 79 20 69 73 20 73 7a 45 6e  ** array is szEn
1e8e0 74 72 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a  try bytes in siz
1e8f0 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  e. This routine 
1e900 75 73 65 73 20 73 71 6c 69 74 65 33 44 62 52 65  uses sqlite3DbRe
1e910 61 6c 6c 6f 63 28 29 0a 2a 2a 20 74 6f 20 65 78  alloc().** to ex
1e920 74 65 6e 64 20 74 68 65 20 61 72 72 61 79 20 73  tend the array s
1e930 6f 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  o that there is 
1e940 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20  space for a new 
1e950 6f 62 6a 65 63 74 20 61 74 20 74 68 65 20 65 6e  object at the en
1e960 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  d..**.** When th
1e970 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1e980 61 6c 6c 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20  alled, *pnEntry 
1e990 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 75 72  contains the cur
1e9a0 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 2a 2a 20  rent size of.** 
1e9b0 74 68 65 20 61 72 72 61 79 20 28 69 6e 20 65 6e  the array (in en
1e9c0 74 72 69 65 73 20 2d 20 73 6f 20 74 68 65 20 61  tries - so the a
1e9d0 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 28 28 2a  llocation is ((*
1e9e0 70 6e 45 6e 74 72 79 29 20 2a 20 73 7a 45 6e 74  pnEntry) * szEnt
1e9f0 72 79 29 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20  ry) bytes.** in 
1ea00 74 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  total)..**.** If
1ea10 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 69   the realloc() i
1ea20 73 20 73 75 63 63 65 73 73 66 75 6c 20 28 69 2e  s successful (i.
1ea30 65 2e 20 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f 6e  e. if no OOM con
1ea40 64 69 74 69 6f 6e 20 6f 63 63 75 72 73 29 2c 20  dition occurs), 
1ea50 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 61 6c 6c  the.** space all
1ea60 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 6e  ocated for the n
1ea70 65 77 20 6f 62 6a 65 63 74 20 69 73 20 7a 65 72  ew object is zer
1ea80 6f 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 75 70  oed, *pnEntry up
1ea90 64 61 74 65 64 20 74 6f 0a 2a 2a 20 72 65 66 6c  dated to.** refl
1eaa0 65 63 74 20 74 68 65 20 6e 65 77 20 73 69 7a 65  ect the new size
1eab0 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 61 6e   of the array an
1eac0 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  d a pointer to t
1ead0 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f  he new allocatio
1eae0 6e 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 2a  n.** returned. *
1eaf0 70 49 64 78 20 69 73 20 73 65 74 20 74 6f 20 74  pIdx is set to t
1eb00 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
1eb10 6e 65 77 20 61 72 72 61 79 20 65 6e 74 72 79 20  new array entry 
1eb20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
1eb30 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
1eb40 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20  f the realloc() 
1eb50 66 61 69 6c 73 2c 20 2a 70 49 64 78 20 69 73 20  fails, *pIdx is 
1eb60 73 65 74 20 74 6f 20 2d 31 2c 20 2a 70 6e 45 6e  set to -1, *pnEn
1eb70 74 72 79 20 72 65 6d 61 69 6e 73 0a 2a 2a 20 75  try remains.** u
1eb80 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 63  nchanged and a c
1eb90 6f 70 79 20 6f 66 20 70 41 72 72 61 79 20 72 65  opy of pArray re
1eba0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  turned..*/.void 
1ebb0 2a 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c  *sqlite3ArrayAll
1ebc0 6f 63 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33  ocate(.  sqlite3
1ebd0 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f   *db,      /* Co
1ebe0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69  nnection to noti
1ebf0 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69  fy of malloc fai
1ec00 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20  lures */.  void 
1ec10 2a 70 41 72 72 61 79 2c 20 20 20 20 20 2f 2a 20  *pArray,     /* 
1ec20 41 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73  Array of objects
1ec30 2e 20 20 4d 69 67 68 74 20 62 65 20 72 65 61 6c  .  Might be real
1ec40 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74  located */.  int
1ec50 20 73 7a 45 6e 74 72 79 2c 20 20 20 20 20 20 2f   szEntry,      /
1ec60 2a 20 53 69 7a 65 20 6f 66 20 65 61 63 68 20 6f  * Size of each o
1ec70 62 6a 65 63 74 20 69 6e 20 74 68 65 20 61 72 72  bject in the arr
1ec80 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45  ay */.  int *pnE
1ec90 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d  ntry,     /* Num
1eca0 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 63  ber of objects c
1ecb0 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20  urrently in use 
1ecc0 2a 2f 0a 20 20 69 6e 74 20 2a 70 49 64 78 20 20  */.  int *pIdx  
1ecd0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1ece0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 6e  the index of a n
1ecf0 65 77 20 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a  ew slot here */.
1ed00 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
1ed10 69 6e 74 20 6e 20 3d 20 2a 70 6e 45 6e 74 72 79  int n = *pnEntry
1ed20 3b 0a 20 20 69 66 28 20 28 6e 20 26 20 28 6e 2d  ;.  if( (n & (n-
1ed30 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  1))==0 ){.    in
1ed40 74 20 73 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f 20  t sz = (n==0) ? 
1ed50 31 20 3a 20 32 2a 6e 3b 0a 20 20 20 20 76 6f 69  1 : 2*n;.    voi
1ed60 64 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  d *pNew = sqlite
1ed70 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
1ed80 41 72 72 61 79 2c 20 73 7a 2a 73 7a 45 6e 74 72  Array, sz*szEntr
1ed90 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  y);.    if( pNew
1eda0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 49  ==0 ){.      *pI
1edb0 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72  dx = -1;.      r
1edc0 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 20 20  eturn pArray;.  
1edd0 20 20 7d 0a 20 20 20 20 70 41 72 72 61 79 20 3d    }.    pArray =
1ede0 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d   pNew;.  }.  z =
1edf0 20 28 63 68 61 72 2a 29 70 41 72 72 61 79 3b 0a   (char*)pArray;.
1ee00 20 20 6d 65 6d 73 65 74 28 26 7a 5b 6e 20 2a 20    memset(&z[n * 
1ee10 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45  szEntry], 0, szE
1ee20 6e 74 72 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d  ntry);.  *pIdx =
1ee30 20 6e 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79   n;.  ++*pnEntry
1ee40 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72 72 61  ;.  return pArra
1ee50 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  y;.}../*.** Appe
1ee60 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  nd a new element
1ee70 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64   to the given Id
1ee80 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20  List.  Create a 
1ee90 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a  new IdList if.**
1eea0 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20   need be..**.** 
1eeb0 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20  A new IdList is 
1eec0 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c  returned, or NUL
1eed0 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61  L if malloc() fa
1eee0 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a  ils..*/.IdList *
1eef0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70  sqlite3IdListApp
1ef00 65 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73  end(Parse *pPars
1ef10 65 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  e, IdList *pList
1ef20 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
1ef30 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
1ef40 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1ef50 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
1ef60 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
1ef70 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
1ef80 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
1ef90 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20  eof(IdList) );. 
1efa0 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
1efb0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
1efc0 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c    pList->a = sql
1efd0 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
1efe0 65 28 0a 20 20 20 20 20 20 64 62 2c 0a 20 20 20  e(.      db,.   
1eff0 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20     pList->a,.   
1f000 20 20 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d     sizeof(pList-
1f010 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20 26 70  >a[0]),.      &p
1f020 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20 20  List->nId,.     
1f030 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28 20 69   &i.  );.  if( i
1f040 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
1f050 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
1f060 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65  , pList);.    re
1f070 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c  turn 0;.  }.  pL
1f080 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
1f090 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1f0a0 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65  mToken(db, pToke
1f0b0 6e 29 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e  n);.  if( IN_REN
1f0c0 41 4d 45 5f 4f 42 4a 45 43 54 20 26 26 20 70 4c  AME_OBJECT && pL
1f0d0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
1f0e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
1f0f0 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61  nameTokenMap(pPa
1f100 72 73 65 2c 20 28 76 6f 69 64 2a 29 70 4c 69 73  rse, (void*)pLis
1f110 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70  t->a[i].zName, p
1f120 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65  Token);.  }.  re
1f130 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
1f140 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49  *.** Delete an I
1f150 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dList..*/.void s
1f160 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
1f170 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
1f180 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  IdList *pList){.
1f190 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1f1a0 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1f1b0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1f1c0 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
1f1d0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1f1e0 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  ee(db, pList->a[
1f1f0 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  i].zName);.  }. 
1f200 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1f210 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  b, pList->a);.  
1f220 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
1f230 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  db, pList);.}../
1f240 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1f250 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f  index in pList o
1f260 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  f the identifier
1f270 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74   named zId.  Ret
1f280 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74  urn -1.** if not
1f290 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73   found..*/.int s
1f2a0 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
1f2b0 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  x(IdList *pList,
1f2c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1f2d0 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
1f2e0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1f2f0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28  eturn -1;.  for(
1f300 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
1f310 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  d; i++){.    if(
1f320 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1f330 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1f340 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72  e, zName)==0 ) r
1f350 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
1f360 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
1f370 2a 2a 20 45 78 70 61 6e 64 20 74 68 65 20 73 70  ** Expand the sp
1f380 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
1f390 72 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c  r the given SrcL
1f3a0 69 73 74 20 6f 62 6a 65 63 74 20 62 79 0a 2a 2a  ist object by.**
1f3b0 20 63 72 65 61 74 69 6e 67 20 6e 45 78 74 72 61   creating nExtra
1f3c0 20 6e 65 77 20 73 6c 6f 74 73 20 62 65 67 69 6e   new slots begin
1f3d0 6e 69 6e 67 20 61 74 20 69 53 74 61 72 74 2e 20  ning at iStart. 
1f3e0 20 69 53 74 61 72 74 20 69 73 20 7a 65 72 6f 20   iStart is zero 
1f3f0 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c  based..** New sl
1f400 6f 74 73 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a  ots are zeroed..
1f410 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1f420 65 2c 20 73 75 70 70 6f 73 65 20 61 20 53 72 63  e, suppose a Src
1f430 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 63  List initially c
1f440 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65 6e 74 72  ontains two entr
1f450 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20  ies: A,B..** To 
1f460 61 70 70 65 6e 64 20 33 20 6e 65 77 20 65 6e 74  append 3 new ent
1f470 72 69 65 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e  ries onto the en
1f480 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a  d, do this:.**.*
1f490 2a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  *    sqlite3SrcL
1f4a0 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70  istEnlarge(db, p
1f4b0 53 72 63 6c 69 73 74 2c 20 33 2c 20 32 29 3b 0a  Srclist, 3, 2);.
1f4c0 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  **.** After the 
1f4d0 63 61 6c 6c 20 61 62 6f 76 65 20 69 74 20 77 6f  call above it wo
1f4e0 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20 20 41 2c  uld contain:  A,
1f4f0 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69   B, nil, nil, ni
1f500 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 53 74  l..** If the iSt
1f510 61 72 74 20 61 72 67 75 6d 65 6e 74 20 68 61 64  art argument had
1f520 20 62 65 65 6e 20 31 20 69 6e 73 74 65 61 64 20   been 1 instead 
1f530 6f 66 20 32 2c 20 74 68 65 6e 20 74 68 65 20 72  of 2, then the r
1f540 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20 68  esult.** would h
1f550 61 76 65 20 62 65 65 6e 3a 20 20 41 2c 20 6e 69  ave been:  A, ni
1f560 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20  l, nil, nil, B. 
1f570 20 54 6f 20 70 72 65 70 65 6e 64 20 74 68 65 20   To prepend the 
1f580 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68  new slots,.** th
1f590 65 20 69 53 74 61 72 74 20 76 61 6c 75 65 20 77  e iStart value w
1f5a0 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20  ould be 0.  The 
1f5b0 72 65 73 75 6c 74 20 74 68 65 6e 20 77 6f 75 6c  result then woul
1f5c0 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e 69  d.** be: nil, ni
1f5d0 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a  l, nil, A, B..**
1f5e0 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
1f5f0 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
1f600 20 74 68 65 20 53 72 63 4c 69 73 74 20 69 73 20   the SrcList is 
1f610 75 6e 63 68 61 6e 67 65 64 2e 20 20 54 68 65 0a  unchanged.  The.
1f620 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ** db->mallocFai
1f630 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c 20 62 65  led flag will be
1f640 20 73 65 74 20 74 6f 20 74 72 75 65 2e 0a 2a 2f   set to true..*/
1f650 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
1f660 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28  3SrcListEnlarge(
1f670 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
1f680 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1f690 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
1f6a0 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d 20 65 72  notify of OOM er
1f6b0 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73  rors */.  SrcLis
1f6c0 74 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20  t *pSrc,     /* 
1f6d0 54 68 65 20 53 72 63 4c 69 73 74 20 74 6f 20 62  The SrcList to b
1f6e0 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20  e enlarged */.  
1f6f0 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
1f700 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1f710 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20 61 64 64  new slots to add
1f720 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f   to pSrc->a[] */
1f730 0a 20 20 69 6e 74 20 69 53 74 61 72 74 20 20 20  .  int iStart   
1f740 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
1f750 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66  n pSrc->a[] of f
1f760 69 72 73 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f  irst new slot */
1f770 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  .){.  int i;..  
1f780 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
1f790 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61  ng on calling pa
1f7a0 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61 73  rameters */.  as
1f7b0 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d 30 20  sert( iStart>=0 
1f7c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78  );.  assert( nEx
1f7d0 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  tra>=1 );.  asse
1f7e0 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20  rt( pSrc!=0 );. 
1f7f0 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3c   assert( iStart<
1f800 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a  =pSrc->nSrc );..
1f810 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 64    /* Allocate ad
1f820 64 69 74 69 6f 6e 61 6c 20 73 70 61 63 65 20 69  ditional space i
1f830 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69 66  f needed */.  if
1f840 28 20 28 75 33 32 29 70 53 72 63 2d 3e 6e 53 72  ( (u32)pSrc->nSr
1f850 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e  c+nExtra>pSrc->n
1f860 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63  Alloc ){.    Src
1f870 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  List *pNew;.    
1f880 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72  int nAlloc = pSr
1f890 63 2d 3e 6e 53 72 63 2a 32 2b 6e 45 78 74 72 61  c->nSrc*2+nExtra
1f8a0 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a  ;.    int nGot;.
1f8b0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
1f8c0 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
1f8d0 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20  pSrc,.          
1f8e0 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53 72       sizeof(*pSr
1f8f0 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a  c) + (nAlloc-1)*
1f900 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
1f910 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ]) );.    if( pN
1f920 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ew==0 ){.      a
1f930 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
1f940 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
1f950 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 20 20   return pSrc;.  
1f960 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d 20 70    }.    pSrc = p
1f970 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20  New;.    nGot = 
1f980 28 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  (sqlite3DbMalloc
1f990 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29 20 2d  Size(db, pNew) -
1f9a0 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f   sizeof(*pSrc))/
1f9b0 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
1f9c0 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e  ])+1;.    pSrc->
1f9d0 6e 41 6c 6c 6f 63 20 3d 20 6e 47 6f 74 3b 0a 20  nAlloc = nGot;. 
1f9e0 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 65 78   }..  /* Move ex
1f9f0 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74 68 61  isting slots tha
1fa00 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74 68 65  t come after the
1fa10 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65 64 20   newly inserted 
1fa20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74 20 6f  slots.  ** out o
1fa30 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20 20 66  f the way */.  f
1fa40 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d  or(i=pSrc->nSrc-
1fa50 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20 69 2d  1; i>=iStart; i-
1fa60 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b  -){.    pSrc->a[
1fa70 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53 72 63  i+nExtra] = pSrc
1fa80 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70 53  ->a[i];.  }.  pS
1fa90 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 6e 45 78 74  rc->nSrc += nExt
1faa0 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74  ra;..  /* Zero t
1fab0 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  he newly allocat
1fac0 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65  ed slots */.  me
1fad0 6d 73 65 74 28 26 70 53 72 63 2d 3e 61 5b 69 53  mset(&pSrc->a[iS
1fae0 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  tart], 0, sizeof
1faf0 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78  (pSrc->a[0])*nEx
1fb00 74 72 61 29 3b 0a 20 20 66 6f 72 28 69 3d 69 53  tra);.  for(i=iS
1fb10 74 61 72 74 3b 20 69 3c 69 53 74 61 72 74 2b 6e  tart; i<iStart+n
1fb20 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a 20 20 20  Extra; i++){.   
1fb30 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72   pSrc->a[i].iCur
1fb40 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  sor = -1;.  }.. 
1fb50 20 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69   /* Return a poi
1fb60 6e 74 65 72 20 74 6f 20 74 68 65 20 65 6e 6c 61  nter to the enla
1fb70 72 67 65 64 20 53 72 63 4c 69 73 74 20 2a 2f 0a  rged SrcList */.
1fb80 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d    return pSrc;.}
1fb90 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  .../*.** Append 
1fba0 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65  a new table name
1fbb0 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72   to the given Sr
1fbc0 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61  cList.  Create a
1fbd0 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a   new SrcList if.
1fbe0 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e  ** need be.  A n
1fbf0 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65 61  ew entry is crea
1fc00 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69  ted in the SrcLi
1fc10 73 74 20 65 76 65 6e 20 69 66 20 70 54 61 62 6c  st even if pTabl
1fc20 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  e is NULL..**.**
1fc30 20 41 20 53 72 63 4c 69 73 74 20 69 73 20 72 65   A SrcList is re
1fc40 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  turned, or NULL 
1fc50 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  if there is an O
1fc60 4f 4d 20 65 72 72 6f 72 2e 20 20 54 68 65 20 72  OM error.  The r
1fc70 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72 63 4c 69  eturned.** SrcLi
1fc80 73 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20  st might be the 
1fc90 73 61 6d 65 20 61 73 20 74 68 65 20 53 72 63 4c  same as the SrcL
1fca0 69 73 74 20 74 68 61 74 20 77 61 73 20 69 6e 70  ist that was inp
1fcb0 75 74 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62  ut or it might b
1fcc0 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 2e 20  e.** a new one. 
1fcd0 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
1fce0 20 64 6f 65 73 20 6f 63 63 75 72 73 2c 20 74 68   does occurs, th
1fcf0 65 6e 20 74 68 65 20 70 72 69 6f 72 20 76 61 6c  en the prior val
1fd00 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a 2a 20 74  ue of pList.** t
1fd10 68 61 74 20 69 73 20 69 6e 70 75 74 20 74 6f 20  hat is input to 
1fd20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1fd30 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66 72  automatically fr
1fd40 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44  eed..**.** If pD
1fd50 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e  atabase is not n
1fd60 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ull, it means th
1fd70 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  at the table has
1fd80 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20   an optional.** 
1fd90 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72  database name pr
1fda0 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73  efix.  Like this
1fdb0 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61 62  :  "database.tab
1fdc0 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61 62  le".  The pDatab
1fdd0 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  ase.** points to
1fde0 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
1fdf0 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20 70  and the pTable p
1fe00 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74  oints to the dat
1fe10 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54  abase name..** T
1fe20 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  he SrcList.a[].z
1fe30 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69  Name field is fi
1fe40 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 61  lled with the ta
1fe50 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d  ble name which m
1fe60 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f  ight.** come fro
1fe70 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44 61  m pTable (if pDa
1fe80 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20  tabase is NULL) 
1fe90 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73  or from pDatabas
1fea0 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e  e.  .** SrcList.
1feb0 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73  a[].zDatabase is
1fec0 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
1fed0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66   database name f
1fee0 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f  rom pTable,.** o
1fef0 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e  r with NULL if n
1ff00 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73 70  o database is sp
1ff10 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ecified..**.** I
1ff20 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
1ff30 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73  f call like this
1ff40 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1ff50 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1ff60 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a  pend(D,A,B,0);.*
1ff70 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61  *.** Then B is a
1ff80 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
1ff90 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1ffa0 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65 64  e is unspecified
1ffb0 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20  .  If called.** 
1ffc0 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
1ffd0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1ffe0 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c  SrcListAppend(D,
1fff0 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,C);.**.** Th
20000 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c  en C is the tabl
20010 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20  e name and B is 
20020 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
20030 65 2e 20 20 49 66 20 43 20 69 73 20 64 65 66 69  e.  If C is defi
20040 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73 6f 20 69  ned.** then so i
20050 73 20 42 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  s B.  In other w
20060 6f 72 64 73 2c 20 77 65 20 6e 65 76 65 72 20 68  ords, we never h
20070 61 76 65 20 61 20 63 61 73 65 20 77 68 65 72 65  ave a case where
20080 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
20090 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
200a0 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29 3b 0a 2a  pend(D,A,0,C);.*
200b0 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61 62 6c 65  *.** Both pTable
200c0 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 20 61   and pDatabase a
200d0 72 65 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65  re assumed to be
200e0 20 71 75 6f 74 65 64 2e 20 20 54 68 65 79 20 61   quoted.  They a
200f0 72 65 20 64 65 71 75 6f 74 65 64 0a 2a 2a 20 62  re dequoted.** b
20100 65 66 6f 72 65 20 62 65 69 6e 67 20 61 64 64 65  efore being adde
20110 64 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74  d to the SrcList
20120 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
20130 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
20140 6e 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  nd(.  sqlite3 *d
20150 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  b,        /* Con
20160 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66  nection to notif
20170 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  y of malloc fail
20180 75 72 65 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73  ures */.  SrcLis
20190 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a  t *pList,     /*
201a0 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20   Append to this 
201b0 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72  SrcList. NULL cr
201c0 65 61 74 65 73 20 61 20 6e 65 77 20 53 72 63 4c  eates a new SrcL
201d0 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ist */.  Token *
201e0 70 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20  pTable,      /* 
201f0 54 61 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20  Table to append 
20200 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74  */.  Token *pDat
20210 61 62 61 73 65 20 20 20 20 2f 2a 20 44 61 74 61  abase    /* Data
20220 62 61 73 65 20 6f 66 20 74 68 65 20 74 61 62 6c  base of the tabl
20230 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  e */.){.  struct
20240 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
20250 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 20  Item;.  assert( 
20260 70 44 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20  pDatabase==0 || 
20270 70 54 61 62 6c 65 21 3d 30 20 29 3b 20 20 2f 2a  pTable!=0 );  /*
20280 20 43 61 6e 6e 6f 74 20 68 61 76 65 20 43 20 77   Cannot have C w
20290 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20 20 61 73  ithout B */.  as
202a0 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
202b0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
202c0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
202d0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
202e0 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 53 72 63  N(db, sizeof(Src
202f0 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
20300 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
20310 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d  rn 0;.    pList-
20320 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 20  >nAlloc = 1;.   
20330 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20 3d 20 31   pList->nSrc = 1
20340 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4c  ;.    memset(&pL
20350 69 73 74 2d 3e 61 5b 30 5d 2c 20 30 2c 20 73 69  ist->a[0], 0, si
20360 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
20370 29 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  ));.    pList->a
20380 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31  [0].iCursor = -1
20390 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
203a0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 53 72  List = sqlite3Sr
203b0 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c  cListEnlarge(db,
203c0 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c 69 73 74   pList, 1, pList
203d0 2d 3e 6e 53 72 63 29 3b 0a 20 20 7d 0a 20 20 69  ->nSrc);.  }.  i
203e0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
203f0 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  led ){.    sqlit
20400 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
20410 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  db, pList);.    
20420 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
20430 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
20440 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d  a[pList->nSrc-1]
20450 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73  ;.  if( pDatabas
20460 65 20 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e  e && pDatabase->
20470 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74  z==0 ){.    pDat
20480 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  abase = 0;.  }. 
20490 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20 29   if( pDatabase )
204a0 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61  {.    pItem->zNa
204b0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
204c0 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 44  FromToken(db, pD
204d0 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 49  atabase);.    pI
204e0 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
204f0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
20500 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65  Token(db, pTable
20510 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
20520 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
20530 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
20540 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  ken(db, pTable);
20550 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74  .    pItem->zDat
20560 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  abase = 0;.  }. 
20570 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
20580 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 56  ../*.** Assign V
20590 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78 20  dbeCursor index 
205a0 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20 74  numbers to all t
205b0 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69  ables in a SrcLi
205c0 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  st.*/.void sqlit
205d0 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
205e0 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50  ursors(Parse *pP
205f0 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
20600 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
20610 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
20620 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
20630 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c 20  assert(pList || 
20640 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
20650 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
20660 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
20670 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(i=0, pItem=pL
20680 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d  ist->a; i<pList-
20690 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
206a0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  m++){.      if( 
206b0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d  pItem->iCursor>=
206c0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
206d0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20   pItem->iCursor 
206e0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
206f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
20700 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  m->pSelect ){.  
20710 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
20720 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
20730 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  s(pParse, pItem-
20740 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b  >pSelect->pSrc);
20750 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20760 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
20770 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63  te an entire Src
20780 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61  List including a
20790 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74  ll its substruct
207a0 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ure..*/.void sql
207b0 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
207c0 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  e(sqlite3 *db, S
207d0 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
207e0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
207f0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
20800 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69  pItem;.  if( pLi
20810 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
20820 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
20830 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69  t->a, i=0; i<pLi
20840 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
20850 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
20860 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
20870 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  Item->zDatabase)
20880 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
20890 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
208a0 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
208b0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
208c0 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
208d0 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69   if( pItem->fg.i
208e0 73 49 6e 64 65 78 65 64 42 79 20 29 20 73 71 6c  sIndexedBy ) sql
208f0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
20900 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65  Item->u1.zIndexe
20910 64 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49  dBy);.    if( pI
20920 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  tem->fg.isTabFun
20930 63 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 4c  c ) sqlite3ExprL
20940 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49  istDelete(db, pI
20950 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67  tem->u1.pFuncArg
20960 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
20970 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 49  leteTable(db, pI
20980 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20  tem->pTab);.    
20990 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
209a0 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
209b0 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c  Select);.    sql
209c0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
209d0 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a  b, pItem->pOn);.
209e0 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
209f0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  tDelete(db, pIte
20a00 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a  m->pUsing);.  }.
20a10 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
20a20 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  N(db, pList);.}.
20a30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
20a40 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
20a50 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 61   the parser to a
20a60 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f  dd a new term to
20a70 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61   the.** end of a
20a80 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c   growing FROM cl
20a90 61 75 73 65 2e 20 20 54 68 65 20 22 70 22 20 70  ause.  The "p" p
20aa0 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
20ab0 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46  part of.** the F
20ac0 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74 20  ROM clause that 
20ad0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
20ae0 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20 22   constructed.  "
20af0 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66  p" is NULL.** if
20b00 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
20b10 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46  st term of the F
20b20 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54 61  ROM clause.  pTa
20b30 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73  ble and pDatabas
20b40 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d  e.** are the nam
20b50 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61  e of the table a
20b60 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  nd database name
20b70 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  d in the FROM cl
20b80 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44  ause term..** pD
20b90 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 20  atabase is NULL 
20ba0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
20bb0 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20 69  name qualifier i
20bc0 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65 0a  s missing - the.
20bd0 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20 20  ** usual case.  
20be0 49 66 20 74 68 65 20 74 65 72 6d 20 68 61 73 20  If the term has 
20bf0 61 6e 20 61 6c 69 61 73 2c 20 74 68 65 6e 20 70  an alias, then p
20c00 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f 20  Alias points to 
20c10 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b  the.** alias tok
20c20 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d  en.  If the term
20c30 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2c 20   is a subquery, 
20c40 74 68 65 6e 20 70 53 75 62 71 75 65 72 79 20 69  then pSubquery i
20c50 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20  s the.** SELECT 
20c60 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 74  statement that t
20c70 68 65 20 73 75 62 71 75 65 72 79 20 65 6e 63 6f  he subquery enco
20c80 64 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c 65  des.  The pTable
20c90 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61 73   and.** pDatabas
20ca0 65 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65  e parameters are
20cb0 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75 65   NULL for subque
20cc0 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20 61  ries.  The pOn a
20cd0 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72  nd pUsing.** par
20ce0 61 6d 65 74 65 72 73 20 61 72 65 20 74 68 65 20  ameters are the 
20cf0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 4f  content of the O
20d00 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
20d10 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ses..**.** Retur
20d20 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  n a new SrcList 
20d30 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69 73  which encodes is
20d40 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20 74   the FROM with t
20d50 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61  he new.** term a
20d60 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74  dded..*/.SrcList
20d70 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
20d80 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a  AppendFromTerm(.
20d90 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
20da0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
20db0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
20dc0 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20 20    SrcList *p,   
20dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
20de0 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74 68   left part of th
20df0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c  e FROM clause al
20e00 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20  ready seen */.  
20e10 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20  Token *pTable,  
20e20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
20e30 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
20e40 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d 20  add to the FROM 
20e50 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65  clause */.  Toke
20e60 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20 20  n *pDatabase,   
20e70 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
20e80 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
20e90 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f  aining pTable */
20ea0 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73  .  Token *pAlias
20eb0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
20ec0 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
20ed0 65 20 6f 66 20 74 68 65 20 41 53 20 73 75 62 65  e of the AS sube
20ee0 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53  xpression */.  S
20ef0 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72 79  elect *pSubquery
20f00 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 71  ,      /* A subq
20f10 75 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c 61  uery used in pla
20f20 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61  ce of a table na
20f30 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f  me */.  Expr *pO
20f40 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
20f50 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75 73 65  /* The ON clause
20f60 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20   of a join */.  
20f70 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 20 20  IdList *pUsing  
20f80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55          /* The U
20f90 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61  SING clause of a
20fa0 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74   join */.){.  st
20fb0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
20fc0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69  m *pItem;.  sqli
20fd0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
20fe0 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21 70 20 26  ->db;.  if( !p &
20ff0 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69 6e 67  & (pOn || pUsing
21000 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
21010 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
21020 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65 20   "a JOIN clause 
21030 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  is required befo
21040 72 65 20 25 73 22 2c 20 0a 20 20 20 20 20 20 28  re %s", .      (
21050 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22 55 53  pOn ? "ON" : "US
21060 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20 20 20  ING").    );.   
21070 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f   goto append_fro
21080 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  m_error;.  }.  p
21090 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
210a0 74 41 70 70 65 6e 64 28 64 62 2c 20 70 2c 20 70  tAppend(db, p, p
210b0 54 61 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65  Table, pDatabase
210c0 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
210d0 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64  .    goto append
210e0 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d  _from_error;.  }
210f0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53  .  assert( p->nS
21100 72 63 3e 30 20 29 3b 0a 20 20 70 49 74 65 6d 20  rc>0 );.  pItem 
21110 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d  = &p->a[p->nSrc-
21120 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  1];.  assert( (p
21130 54 61 62 6c 65 3d 3d 30 29 3d 3d 28 70 44 61 74  Table==0)==(pDat
21140 61 62 61 73 65 3d 3d 30 29 20 29 3b 0a 20 20 61  abase==0) );.  a
21150 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e  ssert( pItem->zN
21160 61 6d 65 3d 3d 30 20 7c 7c 20 70 44 61 74 61 62  ame==0 || pDatab
21170 61 73 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ase!=0 );.  if( 
21180 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
21190 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65   && pItem->zName
211a0 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70   ){.    Token *p
211b0 54 6f 6b 65 6e 20 3d 20 28 41 4c 57 41 59 53 28  Token = (ALWAYS(
211c0 70 44 61 74 61 62 61 73 65 29 20 26 26 20 70 44  pDatabase) && pD
211d0 61 74 61 62 61 73 65 2d 3e 7a 29 20 3f 20 70 44  atabase->z) ? pD
211e0 61 74 61 62 61 73 65 20 3a 20 70 54 61 62 6c 65  atabase : pTable
211f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e  ;.    sqlite3Ren
21200 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72  ameTokenMap(pPar
21210 73 65 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  se, pItem->zName
21220 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20  , pToken);.  }. 
21230 20 61 73 73 65 72 74 28 20 70 41 6c 69 61 73 21   assert( pAlias!
21240 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 41 6c 69  =0 );.  if( pAli
21250 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74  as->n ){.    pIt
21260 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c  em->zAlias = sql
21270 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
21280 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20  n(db, pAlias);. 
21290 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c   }.  pItem->pSel
212a0 65 63 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b  ect = pSubquery;
212b0 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20  .  pItem->pOn = 
212c0 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55  pOn;.  pItem->pU
212d0 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20  sing = pUsing;. 
212e0 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61 70 70   return p;.. app
212f0 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a  end_from_error:.
21300 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29    assert( p==0 )
21310 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
21320 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a  elete(db, pOn);.
21330 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
21340 65 6c 65 74 65 28 64 62 2c 20 70 55 73 69 6e 67  elete(db, pUsing
21350 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
21360 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75  ctDelete(db, pSu
21370 62 71 75 65 72 79 29 3b 0a 20 20 72 65 74 75 72  bquery);.  retur
21380 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n 0;.}../*.** Ad
21390 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  d an INDEXED BY 
213a0 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63  or NOT INDEXED c
213b0 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d 6f 73  lause to the mos
213c0 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
213d0 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20   .** element of 
213e0 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20  the source-list 
213f0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
21400 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
21410 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
21420 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28 50  cListIndexedBy(P
21430 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
21440 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20  cList *p, Token 
21450 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a 20 20  *pIndexedBy){.  
21460 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 65 64  assert( pIndexed
21470 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  By!=0 );.  if( p
21480 20 26 26 20 70 49 6e 64 65 78 65 64 42 79 2d 3e   && pIndexedBy->
21490 6e 3e 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63  n>0 ){.    struc
214a0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
214b0 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73 65 72  pItem;.    asser
214c0 74 28 20 70 2d 3e 6e 53 72 63 3e 30 20 29 3b 0a  t( p->nSrc>0 );.
214d0 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e      pItem = &p->
214e0 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20  a[p->nSrc-1];.  
214f0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
21500 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d  >fg.notIndexed==
21510 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
21520 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64   pItem->fg.isInd
21530 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20  exedBy==0 );.   
21540 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
21550 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20  fg.isTabFunc==0 
21560 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  );.    if( pInde
21570 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21  xedBy->n==1 && !
21580 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b  pIndexedBy->z ){
21590 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54  .      /* A "NOT
215a0 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75 73 65   INDEXED" clause
215b0 20 77 61 73 20 73 75 70 70 6c 69 65 64 2e 20 53   was supplied. S
215c0 65 65 20 70 61 72 73 65 2e 79 20 0a 20 20 20 20  ee parse.y .    
215d0 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 22    ** construct "
215e0 69 6e 64 65 78 65 64 5f 6f 70 74 22 20 66 6f 72  indexed_opt" for
215f0 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20   details. */.   
21600 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74     pItem->fg.not
21610 49 6e 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20  Indexed = 1;.   
21620 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
21630 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64  tem->u1.zIndexed
21640 42 79 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  By = sqlite3Name
21650 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
21660 2d 3e 64 62 2c 20 70 49 6e 64 65 78 65 64 42 79  ->db, pIndexedBy
21670 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
21680 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 3d  fg.isIndexedBy =
21690 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   1;.    }.  }.}.
216a0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 6c  ./*.** Add the l
216b0 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ist of function 
216c0 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65  arguments to the
216d0 20 53 72 63 4c 69 73 74 20 65 6e 74 72 79 20 66   SrcList entry f
216e0 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 2d 76 61  or a.** table-va
216f0 6c 75 65 64 2d 66 75 6e 63 74 69 6f 6e 2e 0a 2a  lued-function..*
21700 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
21710 63 4c 69 73 74 46 75 6e 63 41 72 67 73 28 50 61  cListFuncArgs(Pa
21720 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
21730 4c 69 73 74 20 2a 70 2c 20 45 78 70 72 4c 69 73  List *p, ExprLis
21740 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28  t *pList){.  if(
21750 20 70 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74   p ){.    struct
21760 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
21770 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e  Item = &p->a[p->
21780 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73  nSrc-1];.    ass
21790 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6e  ert( pItem->fg.n
217a0 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a  otIndexed==0 );.
217b0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
217c0 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
217d0 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  y==0 );.    asse
217e0 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  rt( pItem->fg.is
217f0 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20  TabFunc==0 );.  
21800 20 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e    pItem->u1.pFun
21810 63 41 72 67 20 3d 20 70 4c 69 73 74 3b 0a 20 20  cArg = pList;.  
21820 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61    pItem->fg.isTa
21830 62 46 75 6e 63 20 3d 20 31 3b 0a 20 20 7d 65 6c  bFunc = 1;.  }el
21840 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
21850 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
21860 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29  arse->db, pList)
21870 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  ;.  }.}../*.** W
21880 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20  hen building up 
21890 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e  a FROM clause in
218a0 20 74 68 65 20 70 61 72 73 65 72 2c 20 74 68 65   the parser, the
218b0 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a   join operator.*
218c0 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61  * is initially a
218d0 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c  ttached to the l
218e0 65 66 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75  eft operand.  Bu
218f0 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  t the code gener
21900 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20  ator.** expects 
21910 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
21920 72 20 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72  r to be on the r
21930 69 67 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54  ight operand.  T
21940 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53  his routine.** S
21950 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f  hifts all join o
21960 70 65 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65  perators from le
21970 66 74 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20  ft to right for 
21980 61 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a  an entire FROM.*
21990 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  * clause..**.** 
219a0 45 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65  Example: Suppose
219b0 20 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b   the join is lik
219c0 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
219d0 20 20 20 20 20 20 20 20 41 20 6e 61 74 75 72 61          A natura
219e0 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a  l cross join B.*
219f0 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f  *.** The operato
21a00 72 20 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72  r is "natural cr
21a10 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20  oss join".  The 
21a20 41 20 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73  A and B operands
21a30 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69   are stored.** i
21a40 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d  n p->a[0] and p-
21a50 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76  >a[1], respectiv
21a60 65 6c 79 2e 20 20 54 68 65 20 70 61 72 73 65 72  ely.  The parser
21a70 20 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65   initially store
21a80 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f  s the.** operato
21a90 72 20 77 69 74 68 20 41 2e 20 20 54 68 69 73 20  r with A.  This 
21aa0 72 6f 75 74 69 6e 65 20 73 68 69 66 74 73 20 74  routine shifts t
21ab0 68 61 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65  hat operator ove
21ac0 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20  r to B..*/.void 
21ad0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68  sqlite3SrcListSh
21ae0 69 66 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c  iftJoinType(SrcL
21af0 69 73 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ist *p){.  if( p
21b00 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
21b10 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63     for(i=p->nSrc
21b20 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20  -1; i>0; i--){. 
21b30 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 66 67 2e       p->a[i].fg.
21b40 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b  jointype = p->a[
21b50 69 2d 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65  i-1].fg.jointype
21b60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61  ;.    }.    p->a
21b70 5b 30 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  [0].fg.jointype 
21b80 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
21b90 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20  * Generate VDBE 
21ba0 63 6f 64 65 20 66 6f 72 20 61 20 42 45 47 49 4e  code for a BEGIN
21bb0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
21bc0 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
21bd0 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
21be0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74  e *pParse, int t
21bf0 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  ype){.  sqlite3 
21c00 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
21c10 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65    int i;..  asse
21c20 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b  rt( pParse!=0 );
21c30 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
21c40 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  db;.  assert( db
21c50 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  !=0 );.  if( sql
21c60 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
21c70 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
21c80 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e  NSACTION, "BEGIN
21c90 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  ", 0, 0) ){.    
21ca0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20  return;.  }.  v 
21cb0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
21cc0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
21cd0 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  !v ) return;.  i
21ce0 66 28 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45  f( type!=TK_DEFE
21cf0 52 52 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28  RRED ){.    for(
21d00 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
21d10 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
21d20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21d30 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c   OP_Transaction,
21d40 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58   i, (type==TK_EX
21d50 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20  CLUSIVE)+1);.   
21d60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
21d70 65 73 42 74 72 65 65 28 76 2c 20 69 29 3b 0a 20  esBtree(v, i);. 
21d80 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
21d90 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
21da0 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 29 3b 0a  OP_AutoCommit);.
21db0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
21dc0 65 20 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20  e VDBE code for 
21dd0 61 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c  a COMMIT or ROLL
21de0 42 41 43 4b 20 73 74 61 74 65 6d 65 6e 74 2e 0a  BACK statement..
21df0 2a 2a 20 43 6f 64 65 20 66 6f 72 20 52 4f 4c 4c  ** Code for ROLL
21e00 42 41 43 4b 20 69 73 20 67 65 6e 65 72 61 74 65  BACK is generate
21e10 64 20 69 66 20 65 54 79 70 65 3d 3d 54 4b 5f 52  d if eType==TK_R
21e20 4f 4c 4c 42 41 43 4b 2e 20 20 4f 74 68 65 72 77  OLLBACK.  Otherw
21e30 69 73 65 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67  ise.** code is g
21e40 65 6e 65 72 61 74 65 64 20 66 6f 72 20 61 20 43  enerated for a C
21e50 4f 4d 4d 49 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73  OMMIT..*/.void s
21e60 71 6c 69 74 65 33 45 6e 64 54 72 61 6e 73 61 63  qlite3EndTransac
21e70 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
21e80 73 65 2c 20 69 6e 74 20 65 54 79 70 65 29 7b 0a  se, int eType){.
21e90 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
21ea0 20 69 73 52 6f 6c 6c 62 61 63 6b 3b 0a 0a 20 20   isRollback;..  
21eb0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d  assert( pParse!=
21ec0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
21ed0 50 61 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a  Parse->db!=0 );.
21ee0 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
21ef0 3d 54 4b 5f 43 4f 4d 4d 49 54 20 7c 7c 20 65 54  =TK_COMMIT || eT
21f00 79 70 65 3d 3d 54 4b 5f 45 4e 44 20 7c 7c 20 65  ype==TK_END || e
21f10 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43  Type==TK_ROLLBAC
21f20 4b 20 29 3b 0a 20 20 69 73 52 6f 6c 6c 62 61 63  K );.  isRollbac
21f30 6b 20 3d 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f  k = eType==TK_RO
21f40 4c 4c 42 41 43 4b 3b 0a 20 20 69 66 28 20 73 71  LLBACK;.  if( sq
21f50 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
21f60 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
21f70 41 4e 53 41 43 54 49 4f 4e 2c 20 0a 20 20 20 20  ANSACTION, .    
21f80 20 20 20 69 73 52 6f 6c 6c 62 61 63 6b 20 3f 20     isRollback ? 
21f90 22 52 4f 4c 4c 42 41 43 4b 22 20 3a 20 22 43 4f  "ROLLBACK" : "CO
21fa0 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 7b 0a  MMIT", 0, 0) ){.
21fb0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
21fc0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
21fd0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
21fe0 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
21ff0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
22000 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c  , OP_AutoCommit,
22010 20 31 2c 20 69 73 52 6f 6c 6c 62 61 63 6b 29 3b   1, isRollback);
22020 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
22030 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
22040 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
22050 73 65 72 20 77 68 65 6e 20 69 74 20 70 61 72 73  ser when it pars
22060 65 73 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  es a command to 
22070 63 72 65 61 74 65 2c 0a 2a 2a 20 72 65 6c 65 61  create,.** relea
22080 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61  se or rollback a
22090 6e 20 53 51 4c 20 73 61 76 65 70 6f 69 6e 74 2e  n SQL savepoint.
220a0 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
220b0 33 53 61 76 65 70 6f 69 6e 74 28 50 61 72 73 65  3Savepoint(Parse
220c0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 70   *pParse, int op
220d0 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
220e0 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
220f0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
22100 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62  Token(pParse->db
22110 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , pName);.  if( 
22120 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62  zName ){.    Vdb
22130 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
22140 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 23  tVdbe(pParse);.#
22150 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22160 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
22170 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
22180 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61  t char * const a
22190 7a 5b 5d 20 3d 20 7b 20 22 42 45 47 49 4e 22 2c  z[] = { "BEGIN",
221a0 20 22 52 45 4c 45 41 53 45 22 2c 20 22 52 4f 4c   "RELEASE", "ROL
221b0 4c 42 41 43 4b 22 20 7d 3b 0a 20 20 20 20 61 73  LBACK" };.    as
221c0 73 65 72 74 28 20 21 53 41 56 45 50 4f 49 4e 54  sert( !SAVEPOINT
221d0 5f 42 45 47 49 4e 20 26 26 20 53 41 56 45 50 4f  _BEGIN && SAVEPO
221e0 49 4e 54 5f 52 45 4c 45 41 53 45 3d 3d 31 20 26  INT_RELEASE==1 &
221f0 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  & SAVEPOINT_ROLL
22200 42 41 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64 69  BACK==2 );.#endi
22210 66 0a 20 20 20 20 69 66 28 20 21 76 20 7c 7c 20  f.    if( !v || 
22220 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
22230 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
22240 53 41 56 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70  SAVEPOINT, az[op
22250 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a  ], zName, 0) ){.
22260 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
22270 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
22280 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  zName);.      re
22290 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
222a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
222b0 34 28 76 2c 20 4f 50 5f 53 61 76 65 70 6f 69 6e  4(v, OP_Savepoin
222c0 74 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e 61  t, op, 0, 0, zNa
222d0 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  me, P4_DYNAMIC);
222e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
222f0 6b 65 20 73 75 72 65 20 74 68 65 20 54 45 4d 50  ke sure the TEMP
22300 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
22310 6e 20 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20  n and available 
22320 66 6f 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e  for use.  Return
22330 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
22340 66 20 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65  f errors.  Leave
22350 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
22360 67 65 73 20 69 6e 20 74 68 65 20 70 50 61 72 73  ges in the pPars
22370 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
22380 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54  int sqlite3OpenT
22390 65 6d 70 44 61 74 61 62 61 73 65 28 50 61 72 73  empDatabase(Pars
223a0 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
223b0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
223c0 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62  se->db;.  if( db
223d0 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20  ->aDb[1].pBt==0 
223e0 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  && !pParse->expl
223f0 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ain ){.    int r
22400 63 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  c;.    Btree *pB
22410 74 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  t;.    static co
22420 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
22430 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
22440 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
22450 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c   |.          SQL
22460 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
22470 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
22480 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
22490 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  E |.          SQ
224a0 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
224b0 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20  ONCLOSE |.      
224c0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
224d0 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63  TEMP_DB;..    rc
224e0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f   = sqlite3BtreeO
224f0 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c  pen(db->pVfs, 0,
22500 20 64 62 2c 20 26 70 42 74 2c 20 30 2c 20 66 6c   db, &pBt, 0, fl
22510 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ags);.    if( rc
22520 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
22530 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
22540 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
22550 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74  able to open a t
22560 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
22570 65 20 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c  e ".        "fil
22580 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65  e for storing te
22590 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29  mporary tables")
225a0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
225b0 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72  rc = rc;.      r
225c0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
225d0 20 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42     db->aDb[1].pB
225e0 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 61 73 73  t = pBt;.    ass
225f0 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  ert( db->aDb[1].
22600 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69  pSchema );.    i
22610 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d  f( SQLITE_NOMEM=
22620 3d 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74  =sqlite3BtreeSet
22630 50 61 67 65 53 69 7a 65 28 70 42 74 2c 20 64 62  PageSize(pBt, db
22640 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 2c 20  ->nextPagesize, 
22650 2d 31 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  -1, 0) ){.      
22660 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
22670 64 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  db);.      retur
22680 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
22690 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
226a0 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66  .** Record the f
226b0 61 63 74 20 74 68 61 74 20 74 68 65 20 73 63 68  act that the sch
226c0 65 6d 61 20 63 6f 6f 6b 69 65 20 77 69 6c 6c 20  ema cookie will 
226d0 6e 65 65 64 20 74 6f 20 62 65 20 76 65 72 69 66  need to be verif
226e0 69 65 64 0a 2a 2a 20 66 6f 72 20 64 61 74 61 62  ied.** for datab
226f0 61 73 65 20 69 44 62 2e 20 20 54 68 65 20 63 6f  ase iDb.  The co
22700 64 65 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 76  de to actually v
22710 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61  erify the schema
22720 20 63 6f 6f 6b 69 65 0a 2a 2a 20 77 69 6c 6c 20   cookie.** will 
22730 6f 63 63 75 72 20 61 74 20 74 68 65 20 65 6e 64  occur at the end
22740 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65   of the top-leve
22750 6c 20 56 44 42 45 20 61 6e 64 20 77 69 6c 6c 20  l VDBE and will 
22760 62 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  be generated.** 
22770 6c 61 74 65 72 2c 20 62 79 20 73 71 6c 69 74 65  later, by sqlite
22780 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
22790 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
227a0 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
227b0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
227c0 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73  int iDb){.  Pars
227d0 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
227e0 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
227f0 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  vel(pParse);..  
22800 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
22810 26 20 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62  & iDb<pParse->db
22820 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
22830 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  t( pParse->db->a
22840 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c  Db[iDb].pBt!=0 |
22850 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 61 73  | iDb==1 );.  as
22860 73 65 72 74 28 20 69 44 62 3c 53 51 4c 49 54 45  sert( iDb<SQLITE
22870 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2b 32 20  _MAX_ATTACHED+2 
22880 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
22890 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
228a0 65 6c 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  eld(pParse->db, 
228b0 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 69 66 28  iDb, 0) );.  if(
228c0 20 44 62 4d 61 73 6b 54 65 73 74 28 70 54 6f 70   DbMaskTest(pTop
228d0 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73  level->cookieMas
228e0 6b 2c 20 69 44 62 29 3d 3d 30 20 29 7b 0a 20 20  k, iDb)==0 ){.  
228f0 20 20 44 62 4d 61 73 6b 53 65 74 28 70 54 6f 70    DbMaskSet(pTop
22900 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73  level->cookieMas
22910 6b 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 66 28  k, iDb);.    if(
22920 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
22930 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
22940 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70   sqlite3OpenTemp
22950 44 61 74 61 62 61 73 65 28 70 54 6f 70 6c 65 76  Database(pToplev
22960 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  el);.    }.  }.}
22970 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ../*.** If argum
22980 65 6e 74 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c  ent zDb is NULL,
22990 20 74 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74   then call sqlit
229a0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
229b0 6d 61 28 29 20 66 6f 72 20 65 61 63 68 20 0a 2a  ma() for each .*
229c0 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  * attached datab
229d0 61 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ase. Otherwise, 
229e0 69 6e 76 6f 6b 65 20 69 74 20 66 6f 72 20 74 68  invoke it for th
229f0 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64  e database named
22a00 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f   zDb only..*/.vo
22a10 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  id sqlite3CodeVe
22a20 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28  rifyNamedSchema(
22a30 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
22a40 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b  onst char *zDb){
22a50 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
22a60 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
22a70 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
22a80 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
22a90 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20  {.    Db *pDb = 
22aa0 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
22ab0 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 26 26   if( pDb->pBt &&
22ac0 20 28 21 7a 44 62 20 7c 7c 20 30 3d 3d 73 71 6c   (!zDb || 0==sql
22ad0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c  ite3StrICmp(zDb,
22ae0 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 29   pDb->zDbSName))
22af0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
22b00 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
22b10 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20 20  a(pParse, i);.  
22b20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
22b30 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
22b40 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72 65  ode that prepare
22b50 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f  s for doing an o
22b60 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  peration that.**
22b70 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
22b80 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
22b90 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
22ba0 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e  tarts a new tran
22bb0 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72  saction if we ar
22bc0 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69  e not already wi
22bd0 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61  thin.** a transa
22be0 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72  ction.  If we ar
22bf0 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e  e already within
22c00 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
22c10 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e  then a checkpoin
22c20 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74  t.** is set if t
22c30 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20  he setStatement 
22c40 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75  parameter is tru
22c50 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74  e.  A checkpoint
22c60 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65   should.** be se
22c70 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73  t for operations
22c80 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c   that might fail
22c90 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74   (due to a const
22ca0 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a  raint) part of.*
22cb0 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75 67  * the way throug
22cc0 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c  h and which will
22cd0 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f   need to undo so
22ce0 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f 75  me writes withou
22cf0 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72  t having to.** r
22d00 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c  ollback the whol
22d10 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  e transaction.  
22d20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77  For operations w
22d30 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61  here all constra
22d40 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63  ints.** can be c
22d50 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e  hecked before an
22d60 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  y changes are ma
22d70 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  de to the databa
22d80 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a  se, it is never.
22d90 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ** necessary to 
22da0 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64  undo a write and
22db0 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
22dc0 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65  should not be se
22dd0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
22de0 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
22df0 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ation(Parse *pPa
22e00 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74 61 74  rse, int setStat
22e10 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b  ement, int iDb){
22e20 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65  .  Parse *pTople
22e30 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72  vel = sqlite3Par
22e40 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
22e50 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64  e);.  sqlite3Cod
22e60 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
22e70 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 44 62  arse, iDb);.  Db
22e80 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c 65 76 65  MaskSet(pTopleve
22e90 6c 2d 3e 77 72 69 74 65 4d 61 73 6b 2c 20 69 44  l->writeMask, iD
22ea0 62 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d  b);.  pToplevel-
22eb0 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 7c 3d  >isMultiWrite |=
22ec0 20 73 65 74 53 74 61 74 65 6d 65 6e 74 3b 0a 7d   setStatement;.}
22ed0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65  ../*.** Indicate
22ee0 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d   that the statem
22ef0 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ent currently un
22f00 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
22f10 20 6d 69 67 68 74 20 77 72 69 74 65 0a 2a 2a 20   might write.** 
22f20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6e  more than one en
22f30 74 72 79 20 28 65 78 61 6d 70 6c 65 3a 20 64 65  try (example: de
22f40 6c 65 74 69 6e 67 20 6f 6e 65 20 72 6f 77 20 74  leting one row t
22f50 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 61 6e  hen inserting an
22f60 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e 73 65 72 74  other,.** insert
22f70 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77  ing multiple row
22f80 73 20 69 6e 20 61 20 74 61 62 6c 65 2c 20 6f 72  s in a table, or
22f90 20 69 6e 73 65 72 74 69 6e 67 20 61 20 72 6f 77   inserting a row
22fa0 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69   and index entri
22fb0 65 73 2e 29 0a 2a 2a 20 49 66 20 61 6e 20 61 62  es.).** If an ab
22fc0 6f 72 74 20 6f 63 63 75 72 73 20 61 66 74 65 72  ort occurs after
22fd0 20 73 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 77   some of these w
22fe0 72 69 74 65 73 20 68 61 76 65 20 63 6f 6d 70 6c  rites have compl
22ff0 65 74 65 64 2c 20 74 68 65 6e 20 69 74 20 77 69  eted, then it wi
23000 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61  ll.** be necessa
23010 72 79 20 74 6f 20 75 6e 64 6f 20 74 68 65 20 63  ry to undo the c
23020 6f 6d 70 6c 65 74 65 64 20 77 72 69 74 65 73 2e  ompleted writes.
23030 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23040 4d 75 6c 74 69 57 72 69 74 65 28 50 61 72 73 65  MultiWrite(Parse
23050 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72   *pParse){.  Par
23060 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
23070 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
23080 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
23090 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c  pToplevel->isMul
230a0 74 69 57 72 69 74 65 20 3d 20 31 3b 0a 7d 0a 0a  tiWrite = 1;.}..
230b0 2f 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  /* .** The code 
230c0 67 65 6e 65 72 61 74 6f 72 20 63 61 6c 6c 73 20  generator calls 
230d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 66 20  this routine if 
230e0 69 73 20 64 69 73 63 6f 76 65 72 73 20 74 68 61  is discovers tha
230f0 74 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73 73 69  t it is.** possi
23100 62 6c 65 20 74 6f 20 61 62 6f 72 74 20 61 20 73  ble to abort a s
23110 74 61 74 65 6d 65 6e 74 20 70 72 69 6f 72 20 74  tatement prior t
23120 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 49  o completion.  I
23130 6e 20 6f 72 64 65 72 20 74 6f 20 0a 2a 2a 20 70  n order to .** p
23140 65 72 66 6f 72 6d 20 74 68 69 73 20 61 62 6f 72  erform this abor
23150 74 20 77 69 74 68 6f 75 74 20 63 6f 72 72 75 70  t without corrup
23160 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
23170 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61  e, we need to ma
23180 6b 65 0a 2a 2a 20 73 75 72 65 20 74 68 61 74 20  ke.** sure that 
23190 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
231a0 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 61 20   protected by a 
231b0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
231c0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65 63  ction..**.** Tec
231d0 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6f 6e 6c  hnically, we onl
231e0 79 20 6e 65 65 64 20 74 6f 20 73 65 74 20 74 68  y need to set th
231f0 65 20 6d 61 79 41 62 6f 72 74 20 66 6c 61 67 20  e mayAbort flag 
23200 69 66 20 74 68 65 0a 2a 2a 20 69 73 4d 75 6c 74  if the.** isMult
23210 69 57 72 69 74 65 20 66 6c 61 67 20 77 61 73 20  iWrite flag was 
23220 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 2e 20  previously set. 
23230 20 54 68 65 72 65 20 69 73 20 61 20 74 69 6d 65   There is a time
23240 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 73   dependency.** s
23250 75 63 68 20 74 68 61 74 20 74 68 65 20 61 62 6f  uch that the abo
23260 72 74 20 6d 75 73 74 20 6f 63 63 75 72 20 61 66  rt must occur af
23270 74 65 72 20 74 68 65 20 6d 75 6c 74 69 77 72 69  ter the multiwri
23280 74 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 0a  te.  This makes.
23290 2a 2a 20 73 6f 6d 65 20 73 74 61 74 65 6d 65 6e  ** some statemen
232a0 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 74 68 65  ts involving the
232b0 20 52 45 50 4c 41 43 45 20 63 6f 6e 66 6c 69 63   REPLACE conflic
232c0 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
232d0 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f 20 61 20 6c  orithm.** go a l
232e0 69 74 74 6c 65 20 66 61 73 74 65 72 2e 20 20 42  ittle faster.  B
232f0 75 74 20 74 61 6b 69 6e 67 20 61 64 76 61 6e 74  ut taking advant
23300 61 67 65 20 6f 66 20 74 68 69 73 20 74 69 6d 65  age of this time
23310 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 6d   dependency.** m
23320 61 6b 65 73 20 69 74 20 6d 6f 72 65 20 64 69 66  akes it more dif
23330 66 69 63 75 6c 74 20 74 6f 20 70 72 6f 76 65 20  ficult to prove 
23340 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 69 73  that the code is
23350 20 63 6f 72 72 65 63 74 20 28 69 6e 20 0a 2a 2a   correct (in .**
23360 20 70 61 72 74 69 63 75 6c 61 72 2c 20 69 74 20   particular, it 
23370 70 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d  prevents us from
23380 20 77 72 69 74 69 6e 67 20 61 6e 20 65 66 66 65   writing an effe
23390 63 74 69 76 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ctive.** impleme
233a0 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74  ntation of sqlit
233b0 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74  e3AssertMayAbort
233c0 28 29 29 20 61 6e 64 20 73 6f 20 77 65 20 68 61  ()) and so we ha
233d0 76 65 20 63 68 6f 73 65 6e 0a 2a 2a 20 74 6f 20  ve chosen.** to 
233e0 74 61 6b 65 20 74 68 65 20 73 61 66 65 20 72 6f  take the safe ro
233f0 75 74 65 20 61 6e 64 20 73 6b 69 70 20 74 68 65  ute and skip the
23400 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
23410 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 61  /.void sqlite3Ma
23420 79 41 62 6f 72 74 28 50 61 72 73 65 20 2a 70 50  yAbort(Parse *pP
23430 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20 2a  arse){.  Parse *
23440 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
23450 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
23460 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f 70  (pParse);.  pTop
23470 6c 65 76 65 6c 2d 3e 6d 61 79 41 62 6f 72 74 20  level->mayAbort 
23480 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  = 1;.}../*.** Co
23490 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 74 68  de an OP_Halt th
234a0 61 74 20 63 61 75 73 65 73 20 74 68 65 20 76 64  at causes the vd
234b0 62 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  be to return an 
234c0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
234d0 54 0a 2a 2a 20 65 72 72 6f 72 2e 20 54 68 65 20  T.** error. The 
234e0 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d 65 74 65  onError paramete
234f0 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69  r determines whi
23500 63 68 20 28 69 66 20 61 6e 79 29 20 6f 66 20 74  ch (if any) of t
23510 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  he statement.** 
23520 61 6e 64 2f 6f 72 20 63 75 72 72 65 6e 74 20 74  and/or current t
23530 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
23540 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 76 6f  lled back..*/.vo
23550 69 64 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f  id sqlite3HaltCo
23560 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
23570 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
23580 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
23590 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f 64   */.  int errCod
235a0 65 2c 20 20 20 20 20 20 2f 2a 20 65 78 74 65 6e  e,      /* exten
235b0 64 65 64 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  ded error code *
235c0 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
235d0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61        /* Constra
235e0 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20 63 68  int type */.  ch
235f0 61 72 20 2a 70 34 2c 20 20 20 20 20 20 20 20 20  ar *p4,         
23600 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65  /* Error message
23610 20 2a 2f 0a 20 20 69 38 20 70 34 74 79 70 65 2c   */.  i8 p4type,
23620 20 20 20 20 20 20 20 20 2f 2a 20 50 34 5f 53 54          /* P4_ST
23630 41 54 49 43 20 6f 72 20 50 34 5f 54 52 41 4e 53  ATIC or P4_TRANS
23640 49 45 4e 54 20 2a 2f 0a 20 20 75 38 20 70 35 45  IENT */.  u8 p5E
23650 72 72 6d 73 67 20 20 20 20 20 20 20 2f 2a 20 50  rrmsg       /* P
23660 35 5f 45 72 72 4d 73 67 20 74 79 70 65 20 2a 2f  5_ErrMsg type */
23670 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
23680 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
23690 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
236a0 28 20 28 65 72 72 43 6f 64 65 26 30 78 66 66 29  ( (errCode&0xff)
236b0 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ==SQLITE_CONSTRA
236c0 49 4e 54 20 29 3b 0a 20 20 69 66 28 20 6f 6e 45  INT );.  if( onE
236d0 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  rror==OE_Abort )
236e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79  {.    sqlite3May
236f0 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20  Abort(pParse);. 
23700 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
23710 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c  AddOp4(v, OP_Hal
23720 74 2c 20 65 72 72 43 6f 64 65 2c 20 6f 6e 45 72  t, errCode, onEr
23730 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70 34 74 79  ror, 0, p4, p4ty
23740 70 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  pe);.  sqlite3Vd
23750 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35  beChangeP5(v, p5
23760 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Errmsg);.}../*.*
23770 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c  * Code an OP_Hal
23780 74 20 64 75 65 20 74 6f 20 55 4e 49 51 55 45 20  t due to UNIQUE 
23790 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
237a0 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74  onstraint violat
237b0 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
237c0 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74 72  ite3UniqueConstr
237d0 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  aint(.  Parse *p
237e0 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
237f0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
23800 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
23810 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e      /* Constrain
23820 74 20 74 79 70 65 20 2a 2f 0a 20 20 49 6e 64 65  t type */.  Inde
23830 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 2f 2a  x *pIdx       /*
23840 20 54 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   The index that 
23850 74 72 69 67 67 65 72 73 20 74 68 65 20 63 6f 6e  triggers the con
23860 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20  straint */.){.  
23870 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 69 6e  char *zErr;.  in
23880 74 20 6a 3b 0a 20 20 53 74 72 41 63 63 75 6d 20  t j;.  StrAccum 
23890 65 72 72 4d 73 67 3b 0a 20 20 54 61 62 6c 65 20  errMsg;.  Table 
238a0 2a 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54  *pTab = pIdx->pT
238b0 61 62 6c 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33  able;..  sqlite3
238c0 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 65 72  StrAccumInit(&er
238d0 72 4d 73 67 2c 20 70 50 61 72 73 65 2d 3e 64 62  rMsg, pParse->db
238e0 2c 20 30 2c 20 30 2c 20 32 30 30 29 3b 0a 20 20  , 0, 0, 200);.  
238f0 69 66 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78  if( pIdx->aColEx
23900 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  pr ){.    sqlite
23910 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 65  3_str_appendf(&e
23920 72 72 4d 73 67 2c 20 22 69 6e 64 65 78 20 27 25  rrMsg, "index '%
23930 71 27 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  q'", pIdx->zName
23940 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
23950 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d  for(j=0; j<pIdx-
23960 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  >nKeyCol; j++){.
23970 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
23980 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
23990 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
239a0 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 7a 43  ]>=0 );.      zC
239b0 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol = pTab->aCol[
239c0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
239d0 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  ]].zName;.      
239e0 69 66 28 20 6a 20 29 20 73 71 6c 69 74 65 33 5f  if( j ) sqlite3_
239f0 73 74 72 5f 61 70 70 65 6e 64 28 26 65 72 72 4d  str_append(&errM
23a00 73 67 2c 20 22 2c 20 22 2c 20 32 29 3b 0a 20 20  sg, ", ", 2);.  
23a10 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
23a20 61 70 70 65 6e 64 61 6c 6c 28 26 65 72 72 4d 73  appendall(&errMs
23a30 67 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  g, pTab->zName);
23a40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
23a50 74 72 5f 61 70 70 65 6e 64 28 26 65 72 72 4d 73  tr_append(&errMs
23a60 67 2c 20 22 2e 22 2c 20 31 29 3b 0a 20 20 20 20  g, ".", 1);.    
23a70 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
23a80 70 65 6e 64 61 6c 6c 28 26 65 72 72 4d 73 67 2c  pendall(&errMsg,
23a90 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   zCol);.    }.  
23aa0 7d 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74  }.  zErr = sqlit
23ab0 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68  e3StrAccumFinish
23ac0 28 26 65 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c  (&errMsg);.  sql
23ad0 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69  ite3HaltConstrai
23ae0 6e 74 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  nt(pParse, .    
23af0 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
23b00 78 28 70 49 64 78 29 20 3f 20 53 51 4c 49 54 45  x(pIdx) ? SQLITE
23b10 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d  _CONSTRAINT_PRIM
23b20 41 52 59 4b 45 59 20 0a 20 20 20 20 20 20 20 20  ARYKEY .        
23b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b40 20 20 20 20 3a 20 53 51 4c 49 54 45 5f 43 4f 4e      : SQLITE_CON
23b50 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 2c 0a  STRAINT_UNIQUE,.
23b60 20 20 20 20 6f 6e 45 72 72 6f 72 2c 20 7a 45 72      onError, zEr
23b70 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 20 50  r, P4_DYNAMIC, P
23b80 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71  5_ConstraintUniq
23b90 75 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  ue);.}.../*.** C
23ba0 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64  ode an OP_Halt d
23bb0 75 65 20 74 6f 20 6e 6f 6e 2d 75 6e 69 71 75 65  ue to non-unique
23bc0 20 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f 69 64 20   rowid..*/.void 
23bd0 73 71 6c 69 74 65 33 52 6f 77 69 64 43 6f 6e 73  sqlite3RowidCons
23be0 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20  traint(.  Parse 
23bf0 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
23c00 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
23c10 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
23c20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63        /* Conflic
23c30 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
23c40 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 54 61 62 6c  orithm */.  Tabl
23c50 65 20 2a 70 54 61 62 20 20 20 20 20 20 20 2f 2a  e *pTab       /*
23c60 20 54 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   The table with 
23c70 74 68 65 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72  the non-unique r
23c80 6f 77 69 64 20 2a 2f 20 0a 29 7b 0a 20 20 63 68  owid */ .){.  ch
23c90 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 69 6e 74 20  ar *zMsg;.  int 
23ca0 72 63 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  rc;.  if( pTab->
23cb0 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20  iPKey>=0 ){.    
23cc0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
23cd0 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62  rintf(pParse->db
23ce0 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d  , "%s.%s", pTab-
23cf0 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
23d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d10 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61    pTab->aCol[pTa
23d20 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29  b->iPKey].zName)
23d30 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
23d40 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49  E_CONSTRAINT_PRI
23d50 4d 41 52 59 4b 45 59 3b 0a 20 20 7d 65 6c 73 65  MARYKEY;.  }else
23d60 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c  {.    zMsg = sql
23d70 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
23d80 73 65 2d 3e 64 62 2c 20 22 25 73 2e 72 6f 77 69  se->db, "%s.rowi
23d90 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
23da0 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
23db0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57  E_CONSTRAINT_ROW
23dc0 49 44 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ID;.  }.  sqlite
23dd0 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
23de0 70 50 61 72 73 65 2c 20 72 63 2c 20 6f 6e 45 72  pParse, rc, onEr
23df0 72 6f 72 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59  ror, zMsg, P4_DY
23e00 4e 41 4d 49 43 2c 0a 20 20 20 20 20 20 20 20 20  NAMIC,.         
23e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
23e20 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71  5_ConstraintUniq
23e30 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ue);.}../*.** Ch
23e40 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49  eck to see if pI
23e50 6e 64 65 78 20 75 73 65 73 20 74 68 65 20 63 6f  ndex uses the co
23e60 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
23e70 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a   pColl.  Return.
23e80 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20 64 6f  ** true if it do
23e90 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  es and false if 
23ea0 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a  it does not..*/.
23eb0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
23ec0 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
23ed0 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e  ic int collation
23ee0 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72  Match(const char
23ef0 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a   *zColl, Index *
23f00 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 69  pIndex){.  int i
23f10 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c  ;.  assert( zCol
23f20 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  l!=0 );.  for(i=
23f30 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f  0; i<pIndex->nCo
23f40 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
23f50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
23f60 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
23f70 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  ];.    assert( z
23f80 21 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 61  !=0 || pIndex->a
23f90 69 43 6f 6c 75 6d 6e 5b 69 5d 3c 30 20 29 3b 0a  iColumn[i]<0 );.
23fa0 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
23fb0 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 26  aiColumn[i]>=0 &
23fc0 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  & 0==sqlite3StrI
23fd0 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b  Cmp(z, zColl) ){
23fe0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
23ff0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
24000 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
24010 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65  ./*.** Recompute
24020 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
24030 70 54 61 62 20 74 68 61 74 20 75 73 65 20 74 68  pTab that use th
24040 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
24050 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49  ence pColl..** I
24060 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20  f pColl==0 then 
24070 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  recompute all in
24080 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a  dices of pTab..*
24090 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
240a0 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74  _OMIT_REINDEX.st
240b0 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65  atic void reinde
240c0 78 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20  xTable(.  Parse 
240d0 2a 70 50 61 72 73 65 2c 20 0a 20 20 69 6e 74 20  *pParse, .  int 
240e0 69 44 62 2c 20 0a 20 20 54 61 62 6c 65 20 2a 70  iDb, .  Table *p
240f0 54 61 62 2c 20 0a 20 20 63 68 61 72 20 63 6f 6e  Tab, .  char con
24100 73 74 20 2a 7a 43 6f 6c 6c 0a 29 7b 0a 20 20 49  st *zColl.){.  I
24110 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
24120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
24130 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65   index associate
24140 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a  d with pTab */..
24150 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61    for(pIndex=pTa
24160 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  b->pIndex; pInde
24170 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78  x; pIndex=pIndex
24180 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
24190 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f  ( zColl==0 || co
241a0 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f  llationMatch(zCo
241b0 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20  ll, pIndex) ){. 
241c0 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
241d0 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
241e0 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
241f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
24200 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65  fillIndex(pParse
24210 2c 20 69 44 62 2c 20 70 49 6e 64 65 78 2c 20 2d  , iDb, pIndex, -
24220 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  1);.    }.  }.}.
24230 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
24240 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
24250 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ces of all table
24260 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73  s in all databas
24270 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20  es where the.** 
24280 69 6e 64 69 63 65 73 20 75 73 65 20 74 68 65 20  indices use the 
24290 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
242a0 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43  ce pColl.  If pC
242b0 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f  oll==0 then reco
242c0 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64  mpute.** all ind
242d0 69 63 65 73 20 65 76 65 72 79 77 68 65 72 65 2e  ices everywhere.
242e0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
242f0 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
24300 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e  static void rein
24310 64 65 78 44 61 74 61 62 61 73 65 73 28 50 61 72  dexDatabases(Par
24320 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72  se *pParse, char
24330 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a   const *zColl){.
24340 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20    Db *pDb;      
24350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24360 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   A single databa
24370 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  se */.  int iDb;
24380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24390 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
243a0 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ase index number
243b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
243c0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
243d0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
243e0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
243f0 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20    HashElem *k;  
24400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24410 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
24420 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20  r tables in pDb 
24430 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
24440 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24450 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74   /* A table in t
24460 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a  he database */..
24470 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
24480 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
24490 74 65 78 65 73 28 64 62 29 20 29 3b 20 20 2f 2a  texes(db) );  /*
244a0 20 4e 65 65 64 65 64 20 66 6f 72 20 73 63 68 65   Needed for sche
244b0 6d 61 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 66  ma access */.  f
244c0 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62  or(iDb=0, pDb=db
244d0 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e  ->aDb; iDb<db->n
244e0 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b  Db; iDb++, pDb++
244f0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
24500 44 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72  Db!=0 );.    for
24510 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (k=sqliteHashFir
24520 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61  st(&pDb->pSchema
24530 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20  ->tblHash);  k; 
24540 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  k=sqliteHashNext
24550 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62  (k)){.      pTab
24560 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74   = (Table*)sqlit
24570 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20  eHashData(k);.  
24580 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65      reindexTable
24590 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
245a0 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  ab, zColl);.    
245b0 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
245c0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
245d0 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e  ode for the REIN
245e0 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  DEX command..**.
245f0 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
24600 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X               
24610 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
24620 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  1.**        REIN
24630 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e  DEX  <collation>
24640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
24650 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 2.**        RE
24660 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73  INDEX  ?<databas
24670 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20  e>.?<tablename> 
24680 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20   -- 3.**        
24690 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62  REINDEX  ?<datab
246a0 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65  ase>.?<indexname
246b0 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f  >  -- 4.**.** Fo
246c0 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20  rm 1 causes all 
246d0 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61  indices in all a
246e0 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
246f0 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e  s to be rebuilt.
24700 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69  .** Form 2 rebui
24710 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  lds all indices 
24720 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  in all databases
24730 20 74 68 61 74 20 75 73 65 20 74 68 65 20 6e 61   that use the na
24740 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67  med.** collating
24750 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d   function.  Form
24760 73 20 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c  s 3 and 4 rebuil
24770 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  d the named inde
24780 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69  x or all.** indi
24790 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ces associated w
247a0 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61  ith the named ta
247b0 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ble..*/.#ifndef 
247c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
247d0 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  DEX.void sqlite3
247e0 52 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70  Reindex(Parse *p
247f0 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
24800 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  ame1, Token *pNa
24810 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  me2){.  CollSeq 
24820 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *pColl;         
24830 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67      /* Collating
24840 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20   sequence to be 
24850 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55  reindexed, or NU
24860 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b  LL */.  char *z;
24870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24880 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61      /* Name of a
24890 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
248a0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
248b0 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *zDb;           
248c0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
248d0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61  database */.  Ta
248e0 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
248f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74            /* A t
24900 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61  able in the data
24910 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20  base */.  Index 
24920 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20  *pIndex;        
24930 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
24940 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
24950 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20  h pTab */.  int 
24960 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
24970 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
24980 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75  atabase index nu
24990 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  mber */.  sqlite
249a0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
249b0 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74  db;   /* The dat
249c0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
249d0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62   */.  Token *pOb
249e0 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  jName;          
249f0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
24a00 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
24a10 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 20  to be reindexed 
24a20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  */..  /* Read th
24a30 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
24a40 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  a. If an error o
24a50 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20  ccurs, leave an 
24a60 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20  error message.  
24a70 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70  ** and code in p
24a80 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
24a90 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20   NULL. */.  if( 
24aa0 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
24ab0 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
24ac0 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rse) ){.    retu
24ad0 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rn;.  }..  if( p
24ae0 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20  Name1==0 ){.    
24af0 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
24b00 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20  (pParse, 0);.   
24b10 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65   return;.  }else
24b20 20 69 66 28 20 4e 45 56 45 52 28 70 4e 61 6d 65   if( NEVER(pName
24b30 32 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d 65 32 2d  2==0) || pName2-
24b40 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  >z==0 ){.    cha
24b50 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73  r *zColl;.    as
24b60 73 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20  sert( pName1->z 
24b70 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73  );.    zColl = s
24b80 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
24b90 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
24ba0 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28  pName1);.    if(
24bb0 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e   !zColl ) return
24bc0 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ;.    pColl = sq
24bd0 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
24be0 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43  (db, ENC(db), zC
24bf0 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  oll, 0);.    if(
24c00 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
24c10 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
24c20 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b  (pParse, zColl);
24c30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
24c40 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
24c50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
24c60 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
24c70 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c  DbFree(db, zColl
24c80 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73  );.  }.  iDb = s
24c90 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
24ca0 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
24cb0 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e  , pName2, &pObjN
24cc0 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c  ame);.  if( iDb<
24cd0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20  0 ) return;.  z 
24ce0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
24cf0 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e  mToken(db, pObjN
24d00 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  ame);.  if( z==0
24d10 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62   ) return;.  zDb
24d20 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
24d30 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 70 54 61 62  zDbSName;.  pTab
24d40 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
24d50 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b  ble(db, z, zDb);
24d60 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20  .  if( pTab ){. 
24d70 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28     reindexTable(
24d80 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
24d90 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
24da0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
24db0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
24dc0 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
24dd0 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
24de0 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69   z, zDb);.  sqli
24df0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
24e00 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  ;.  if( pIndex )
24e10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
24e20 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
24e30 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
24e40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 66  ;.    sqlite3Ref
24e50 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
24e60 20 69 44 62 2c 20 70 49 6e 64 65 78 2c 20 2d 31   iDb, pIndex, -1
24e70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
24e80 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f   }.  sqlite3Erro
24e90 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
24ea0 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79  able to identify
24eb0 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62   the object to b
24ec0 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d  e reindexed");.}
24ed0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
24ee0 65 74 75 72 6e 20 61 20 4b 65 79 49 6e 66 6f 20  eturn a KeyInfo 
24ef0 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69  structure that i
24f00 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
24f10 72 20 74 68 65 20 67 69 76 65 6e 20 49 6e 64 65  r the given Inde
24f20 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  x..**.** The cal
24f30 6c 65 72 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b  ler should invok
24f40 65 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  e sqlite3KeyInfo
24f50 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 72  Unref() on the r
24f60 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 0a 2a  eturned object.*
24f70 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20 66 69  * when it has fi
24f80 6e 69 73 68 65 64 20 75 73 69 6e 67 20 69 74 2e  nished using it.
24f90 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c  .*/.KeyInfo *sql
24fa0 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64  ite3KeyInfoOfInd
24fb0 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
24fc0 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  , Index *pIdx){.
24fd0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
24fe0 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c  Col = pIdx->nCol
24ff0 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20  umn;.  int nKey 
25000 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  = pIdx->nKeyCol;
25010 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
25020 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
25030 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b  nErr ) return 0;
25040 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 75 6e 69  .  if( pIdx->uni
25050 71 4e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  qNotNull ){.    
25060 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65  pKey = sqlite3Ke
25070 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73  yInfoAlloc(pPars
25080 65 2d 3e 64 62 2c 20 6e 4b 65 79 2c 20 6e 43 6f  e->db, nKey, nCo
25090 6c 2d 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65  l-nKey);.  }else
250a0 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c  {.    pKey = sql
250b0 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
250c0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 43 6f  (pParse->db, nCo
250d0 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  l, 0);.  }.  if(
250e0 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73   pKey ){.    ass
250f0 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
25100 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
25110 4b 65 79 29 20 29 3b 0a 20 20 20 20 66 6f 72 28  Key) );.    for(
25120 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
25130 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
25140 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64  har *zColl = pId
25150 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20  x->azColl[i];.  
25160 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b      pKey->aColl[
25170 69 5d 20 3d 20 7a 43 6f 6c 6c 3d 3d 73 71 6c 69  i] = zColl==sqli
25180 74 65 33 53 74 72 42 49 4e 41 52 59 20 3f 20 30  te3StrBINARY ? 0
25190 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   :.             
251a0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
251b0 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
251c0 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a  pParse, zColl);.
251d0 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72        pKey->aSor
251e0 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 64 78  tOrder[i] = pIdx
251f0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b  ->aSortOrder[i];
25200 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
25210 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
25220 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
25230 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  rse->rc==SQLITE_
25240 45 52 52 4f 52 5f 4d 49 53 53 49 4e 47 5f 43 4f  ERROR_MISSING_CO
25250 4c 4c 53 45 51 20 29 3b 0a 20 20 20 20 20 20 69  LLSEQ );.      i
25260 66 28 20 70 49 64 78 2d 3e 62 4e 6f 51 75 65 72  f( pIdx->bNoQuer
25270 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
25280 2f 2a 20 44 65 61 63 74 69 76 61 74 65 20 74 68  /* Deactivate th
25290 65 20 69 6e 64 65 78 20 62 65 63 61 75 73 65 20  e index because 
252a0 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 75  it contains an u
252b0 6e 6b 6e 6f 77 6e 20 63 6f 6c 6c 61 74 69 6e 67  nknown collating
252c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 71 75  .        ** sequ
252d0 65 6e 63 65 2e 20 20 54 68 65 20 6f 6e 6c 79 20  ence.  The only 
252e0 77 61 79 20 74 6f 20 72 65 61 63 74 69 76 65 20  way to reactive 
252f0 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 6f 20  the index is to 
25300 72 65 6c 6f 61 64 20 74 68 65 0a 20 20 20 20 20  reload the.     
25310 20 20 20 2a 2a 20 73 63 68 65 6d 61 2e 20 20 41     ** schema.  A
25320 64 64 69 6e 67 20 74 68 65 20 6d 69 73 73 69 6e  dding the missin
25330 67 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  g collating sequ
25340 65 6e 63 65 20 6c 61 74 65 72 20 64 6f 65 73 20  ence later does 
25350 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  not.        ** r
25360 65 61 63 74 69 76 65 20 74 68 65 20 69 6e 64 65  eactive the inde
25370 78 2e 20 20 54 68 65 20 61 70 70 6c 69 63 61 74  x.  The applicat
25380 69 6f 6e 20 68 61 64 20 74 68 65 20 63 68 61 6e  ion had the chan
25390 63 65 20 74 6f 20 72 65 67 69 73 74 65 72 0a 20  ce to register. 
253a0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 69         ** the mi
253b0 73 73 69 6e 67 20 69 6e 64 65 78 20 75 73 69 6e  ssing index usin
253c0 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 2d  g the collation-
253d0 6e 65 65 64 65 64 20 63 61 6c 6c 62 61 63 6b 2e  needed callback.
253e0 20 20 46 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a    For.        **
253f0 20 73 69 6d 70 6c 69 63 69 74 79 2c 20 53 51 4c   simplicity, SQL
25400 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 67 69 76  ite will not giv
25410 65 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  e the applicatio
25420 6e 20 61 20 73 65 63 6f 6e 64 20 63 68 61 6e 63  n a second chanc
25430 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
25440 20 20 20 20 20 20 70 49 64 78 2d 3e 62 4e 6f 51        pIdx->bNoQ
25450 75 65 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  uery = 1;.      
25460 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
25470 51 4c 49 54 45 5f 45 52 52 4f 52 5f 52 45 54 52  QLITE_ERROR_RETR
25480 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  Y;.      }.     
25490 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
254a0 6e 72 65 66 28 70 4b 65 79 29 3b 0a 20 20 20 20  nref(pKey);.    
254b0 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20    pKey = 0;.    
254c0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
254d0 4b 65 79 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  Key;.}..#ifndef 
254e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
254f0 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  /* .** This rout
25500 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f  ine is invoked o
25510 6e 63 65 20 70 65 72 20 43 54 45 20 62 79 20 74  nce per CTE by t
25520 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
25530 70 61 72 73 69 6e 67 20 61 20 0a 2a 2a 20 57 49  parsing a .** WI
25540 54 48 20 63 6c 61 75 73 65 2e 20 0a 2a 2f 0a 57  TH clause. .*/.W
25550 69 74 68 20 2a 73 71 6c 69 74 65 33 57 69 74 68  ith *sqlite3With
25560 41 64 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Add(.  Parse *pP
25570 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
25580 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
25590 74 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69  t */.  With *pWi
255a0 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  th,            /
255b0 2a 20 45 78 69 73 74 69 6e 67 20 57 49 54 48 20  * Existing WITH 
255c0 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20  clause, or NULL 
255d0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
255e0 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
255f0 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6d 6d  Name of the comm
25600 6f 6e 2d 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  on-table */.  Ex
25610 70 72 4c 69 73 74 20 2a 70 41 72 67 6c 69 73 74  prList *pArglist
25620 2c 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61  ,     /* Optiona
25630 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6c 69  l column name li
25640 73 74 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  st for the table
25650 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 51   */.  Select *pQ
25660 75 65 72 79 20 20 20 20 20 20 20 20 20 20 2f 2a  uery          /*
25670 20 51 75 65 72 79 20 75 73 65 64 20 74 6f 20 69   Query used to i
25680 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 74 61  nitialize the ta
25690 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ble */.){.  sqli
256a0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
256b0 2d 3e 64 62 3b 0a 20 20 57 69 74 68 20 2a 70 4e  ->db;.  With *pN
256c0 65 77 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  ew;.  char *zNam
256d0 65 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  e;..  /* Check t
256e0 68 61 74 20 74 68 65 20 43 54 45 20 6e 61 6d 65  hat the CTE name
256f0 20 69 73 20 75 6e 69 71 75 65 20 77 69 74 68 69   is unique withi
25700 6e 20 74 68 69 73 20 57 49 54 48 20 63 6c 61 75  n this WITH clau
25710 73 65 2e 20 49 66 0a 20 20 2a 2a 20 6e 6f 74 2c  se. If.  ** not,
25720 20 73 74 6f 72 65 20 61 6e 20 65 72 72 6f 72 20   store an error 
25730 69 6e 20 74 68 65 20 50 61 72 73 65 20 73 74 72  in the Parse str
25740 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 7a 4e 61  ucture. */.  zNa
25750 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
25760 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
25770 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  ->db, pName);.  
25780 69 66 28 20 7a 4e 61 6d 65 20 26 26 20 70 57 69  if( zName && pWi
25790 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  th ){.    int i;
257a0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
257b0 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b  pWith->nCte; i++
257c0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
257d0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d  ite3StrICmp(zNam
257e0 65 2c 20 70 57 69 74 68 2d 3e 61 5b 69 5d 2e 7a  e, pWith->a[i].z
257f0 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
25800 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
25810 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75 70  Msg(pParse, "dup
25820 6c 69 63 61 74 65 20 57 49 54 48 20 74 61 62 6c  licate WITH tabl
25830 65 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 4e 61  e name: %s", zNa
25840 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
25850 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 57   }.  }..  if( pW
25860 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ith ){.    int n
25870 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
25880 57 69 74 68 29 20 2b 20 28 73 69 7a 65 6f 66 28  With) + (sizeof(
25890 70 57 69 74 68 2d 3e 61 5b 31 5d 29 20 2a 20 70  pWith->a[1]) * p
258a0 57 69 74 68 2d 3e 6e 43 74 65 29 3b 0a 20 20 20  With->nCte);.   
258b0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
258c0 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 57 69  bRealloc(db, pWi
258d0 74 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65  th, nByte);.  }e
258e0 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  lse{.    pNew = 
258f0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
25900 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
25910 70 57 69 74 68 29 29 3b 0a 20 20 7d 0a 20 20 61  pWith));.  }.  a
25920 73 73 65 72 74 28 20 28 70 4e 65 77 21 3d 30 20  ssert( (pNew!=0 
25930 26 26 20 7a 4e 61 6d 65 21 3d 30 29 20 7c 7c 20  && zName!=0) || 
25940 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
25950 20 29 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d   );..  if( db->m
25960 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
25970 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
25980 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 41 72  stDelete(db, pAr
25990 67 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  glist);.    sqli
259a0 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
259b0 64 62 2c 20 70 51 75 65 72 79 29 3b 0a 20 20 20  db, pQuery);.   
259c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
259d0 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  b, zName);.    p
259e0 4e 65 77 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d  New = pWith;.  }
259f0 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  else{.    pNew->
25a00 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 53  a[pNew->nCte].pS
25a10 65 6c 65 63 74 20 3d 20 70 51 75 65 72 79 3b 0a  elect = pQuery;.
25a20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
25a30 2d 3e 6e 43 74 65 5d 2e 70 43 6f 6c 73 20 3d 20  ->nCte].pCols = 
25a40 70 41 72 67 6c 69 73 74 3b 0a 20 20 20 20 70 4e  pArglist;.    pN
25a50 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65  ew->a[pNew->nCte
25a60 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ].zName = zName;
25a70 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65  .    pNew->a[pNe
25a80 77 2d 3e 6e 43 74 65 5d 2e 7a 43 74 65 45 72 72  w->nCte].zCteErr
25a90 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
25aa0 6e 43 74 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72  nCte++;.  }..  r
25ab0 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
25ac0 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 63 6f  *.** Free the co
25ad0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 57 69  ntents of the Wi
25ae0 74 68 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  th object passed
25af0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
25b00 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  rgument..*/.void
25b10 20 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c 65   sqlite3WithDele
25b20 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
25b30 57 69 74 68 20 2a 70 57 69 74 68 29 7b 0a 20 20  With *pWith){.  
25b40 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20  if( pWith ){.   
25b50 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
25b60 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43  i=0; i<pWith->nC
25b70 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  te; i++){.      
25b80 73 74 72 75 63 74 20 43 74 65 20 2a 70 43 74 65  struct Cte *pCte
25b90 20 3d 20 26 70 57 69 74 68 2d 3e 61 5b 69 5d 3b   = &pWith->a[i];
25ba0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
25bb0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
25bc0 20 70 43 74 65 2d 3e 70 43 6f 6c 73 29 3b 0a 20   pCte->pCols);. 
25bd0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
25be0 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74  ctDelete(db, pCt
25bf0 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  e->pSelect);.   
25c00 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
25c10 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  (db, pCte->zName
25c20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
25c30 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
25c40 57 69 74 68 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  With);.  }.}.#en
25c50 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
25c60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 29  SQLITE_OMIT_CTE)
25c70 20 2a 2f 0a                                       */.