/ Hex Artifact Content
Login

Artifact ff2ea9709d2cfb83ad8caee97541a89d099f46b46ff4ec278bf5e55824c6f99d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
03a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
03b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
03c0: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
03d0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20  */.  int iTab;  
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03f0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
0400: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0410: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0420: 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20 20 20 20  sWriteLock;     
0430: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 77     /* True for w
0440: 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c 73  rite lock.  Fals
0450: 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f 63  e for a read loc
0460: 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  k */.  const cha
0470: 72 20 2a 7a 4c 6f 63 6b 4e 61 6d 65 3b 20 2f 2a  r *zLockName; /*
0480: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
0490: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
04a0: 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
04b0: 74 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20  that we want to 
04c0: 6c 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20  lock a table at 
04d0: 72 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a  run-time.  .**.*
04e0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
04f0: 65 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f  e locked has roo
0500: 74 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20  t page iTab and 
0510: 69 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61  is found in data
0520: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72  base iDb..** A r
0530: 65 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c  ead or a write l
0540: 6f 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e  ock can be taken
0550: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73   depending on is
0560: 57 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  Writelock..**.**
0570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
0580: 73 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66  st records the f
0590: 61 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63  act that the loc
05a0: 6b 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54  k is desired.  T
05b0: 68 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61  he.** code to ma
05c0: 6b 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75  ke the lock occu
05d0: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  r is generated b
05e0: 79 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74  y a later call t
05f0: 6f 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f  o.** codeTableLo
0600: 63 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75  cks() which occu
0610: 72 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  rs during sqlite
0620: 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
0630: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0640: 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72  TableLock(.  Par
0650: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0660: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0670: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
0680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
0690: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
06a0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
06b0: 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  he table to lock
06c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
06d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
06e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
06f0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0700: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0710: 73 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f  sWriteLock,    /
0720: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69  * True for a wri
0730: 74 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e  te lock */.  con
0740: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
0750: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0760: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0770: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
0780: 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
0790: 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
07a0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  l(pParse);.  int
07b0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   i;.  int nBytes
07c0: 3b 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70  ;.  TableLock *p
07d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
07e0: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62  =0 );..  if( iDb
07f0: 3d 3d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==1 ) return;.  
0800: 69 66 28 20 21 73 71 6c 69 74 65 33 42 74 72 65  if( !sqlite3Btre
0810: 65 53 68 61 72 61 62 6c 65 28 70 50 61 72 73 65  eSharable(pParse
0820: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ->db->aDb[iDb].p
0830: 42 74 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Bt) ) return;.  
0840: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 70 6c  for(i=0; i<pTopl
0850: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0860: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
0870: 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62  &pToplevel->aTab
0880: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0890: 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20 26  f( p->iDb==iDb &
08a0: 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62 20  & p->iTab==iTab 
08b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57 72  ){.      p->isWr
08c0: 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69 73  iteLock = (p->is
08d0: 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73 57  WriteLock || isW
08e0: 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  riteLock);.     
08f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
0900: 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20 73   }..  nBytes = s
0910: 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b 29  izeof(TableLock)
0920: 20 2a 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e   * (pToplevel->n
0930: 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20  TableLock+1);.  
0940: 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c  pToplevel->aTabl
0950: 65 4c 6f 63 6b 20 3d 0a 20 20 20 20 20 20 73 71  eLock =.      sq
0960: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
0970: 46 72 65 65 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  Free(pToplevel->
0980: 64 62 2c 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61  db, pToplevel->a
0990: 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74 65  TableLock, nByte
09a0: 73 29 3b 0a 20 20 69 66 28 20 70 54 6f 70 6c 65  s);.  if( pTople
09b0: 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20  vel->aTableLock 
09c0: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 54 6f 70  ){.    p = &pTop
09d0: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
09e0: 6b 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61  k[pToplevel->nTa
09f0: 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20  bleLock++];.    
0a00: 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  p->iDb = iDb;.  
0a10: 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62    p->iTab = iTab
0a20: 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65  ;.    p->isWrite
0a30: 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f  Lock = isWriteLo
0a40: 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4c 6f 63 6b  ck;.    p->zLock
0a50: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
0a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 70 6c  }else{.    pTopl
0a70: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0a80: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
0a90: 33 4f 6f 6d 46 61 75 6c 74 28 70 54 6f 70 6c 65  3OomFault(pTople
0aa0: 76 65 6c 2d 3e 64 62 29 3b 0a 20 20 7d 0a 7d 0a  vel->db);.  }.}.
0ab0: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
0ac0: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74  P_TableLock inst
0ad0: 72 75 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68  ruction for each
0ae0: 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79   table locked by
0af0: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
0b00: 74 20 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79  t (configured by
0b10: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
0b20: 33 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a  3TableLock())..*
0b30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
0b40: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72  deTableLocks(Par
0b50: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
0b60: 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56  nt i;.  Vdbe *pV
0b70: 64 62 65 3b 20 0a 0a 20 20 70 56 64 62 65 20 3d  dbe; ..  pVdbe =
0b80: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
0b90: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
0ba0: 74 28 20 70 56 64 62 65 21 3d 30 20 29 3b 20 2f  t( pVdbe!=0 ); /
0bb0: 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  * sqlite3GetVdbe
0bc0: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 3a 20 56 44   cannot fail: VD
0bd0: 42 45 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  BE already alloc
0be0: 61 74 65 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  ated */..  for(i
0bf0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54  =0; i<pParse->nT
0c00: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0c10: 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70      TableLock *p
0c20: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62   = &pParse->aTab
0c30: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0c40: 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a  nt p1 = p->iDb;.
0c50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
0c60: 64 64 4f 70 34 28 70 56 64 62 65 2c 20 4f 50 5f  ddOp4(pVdbe, OP_
0c70: 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70  TableLock, p1, p
0c80: 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73 57 72 69  ->iTab, p->isWri
0c90: 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  teLock,.        
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
0cb0: 3e 7a 4c 6f 63 6b 4e 61 6d 65 2c 20 50 34 5f 53  >zLockName, P4_S
0cc0: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  TATIC);.  }.}.#e
0cd0: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f  lse.  #define co
0ce0: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a  deTableLocks(x).
0cf0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0d00: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0d10: 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20 6f   given yDbMask o
0d20: 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20 2d  bject is empty -
0d30: 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 20   if it contains 
0d40: 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20 54  no.** 1 bits.  T
0d50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0d60: 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61 73  sed by the DbMas
0d70: 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20 44  kAllZero() and D
0d80: 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a 2a  bMaskNotZero().*
0d90: 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53 51  * macros when SQ
0da0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0db0: 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  D is greater tha
0dc0: 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  n 30..*/.#if SQL
0dd0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
0de0: 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33 44  >30.int sqlite3D
0df0: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44 62  bMaskAllZero(yDb
0e00: 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20 69  Mask m){.  int i
0e10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
0e20: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b 20  izeof(yDbMask); 
0e30: 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29 20  i++) if( m[i] ) 
0e40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
0e50: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
0e60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0e70: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
0e80: 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  er a single SQL 
0e90: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ea0: 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64  en.** parsed and
0eb0: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20   a VDBE program 
0ec0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20  to execute that 
0ed0: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ee0: 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e 20  en.** prepared. 
0ef0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
0f00: 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e 67  ts the finishing
0f10: 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65 0a   touches on the.
0f20: 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  ** VDBE program 
0f30: 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 70  and resets the p
0f40: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20  Parse structure 
0f50: 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20  for the next.** 
0f60: 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  parse..**.** Not
0f70: 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72 72  e that if an err
0f80: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20  or occurred, it 
0f90: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
0fa0: 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42  e that.** no VDB
0fb0: 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72  E code was gener
0fc0: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
0fd0: 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
0fe0: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
0ff0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1000: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
1010: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
1020: 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a 20  Toplevel==0 );. 
1030: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1040: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1050: 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b  nested ) return;
1060: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1070: 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
1080: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 69  e->nErr ){.    i
1090: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
10a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 72 73  QLITE_OK ) pPars
10b0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
10c0: 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
10d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
10e0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
10f0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
1100: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
1110: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
1120: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
1130: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1140: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
1150: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
1160: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20  isMultiWrite .  
1170: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
1180: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
1190: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  t(v, pParse->may
11a0: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76  Abort));.  if( v
11b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11c0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
11d0: 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53 51 4c 49  Halt);..#if SQLI
11e0: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
11f0: 43 41 54 49 4f 4e 0a 20 20 20 20 69 66 28 20 70  CATION.    if( p
1200: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
1210: 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  k>0 && db->init.
1220: 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  busy==0 ){.     
1230: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
1240: 49 6e 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20  Init(db);.      
1250: 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74  if( db->auth.aut
1260: 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55 73 65  hLevel<UAUTH_Use
1270: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
1280: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1290: 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20 61  rse, "user not a
12a0: 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b 0a  uthenticated");.
12b0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
12c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 48  rc = SQLITE_AUTH
12d0: 5f 55 53 45 52 3b 0a 20 20 20 20 20 20 20 20 72  _USER;.        r
12e0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
12f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1300: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
1310: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
1320: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
1330: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
1340: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
1350: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
1360: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
1370: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
1380: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
1390: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
13a0: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
13b0: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
13c0: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
13d0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
13e0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
13f0: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
1400: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
1410: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
1420: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
1430: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1440: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1450: 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 26 26  iled==0 .     &&
1460: 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72 6f 28   (DbMaskNonZero(
1470: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1480: 73 6b 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70  sk) || pParse->p
1490: 43 6f 6e 73 74 45 78 70 72 29 0a 20 20 20 20 29  ConstExpr).    )
14a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 2c  {.      int iDb,
14b0: 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   i;.      assert
14c0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
14d0: 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f 64 65  Op(v, 0)->opcode
14e0: 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20 20 20  ==OP_Init );.   
14f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1500: 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a 20 20  mpHere(v, 0);.  
1510: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69      for(iDb=0; i
1520: 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
1530: 2b 29 7b 0a 20 20 20 20 20 20 20 20 53 63 68 65  +){.        Sche
1540: 6d 61 20 2a 70 53 63 68 65 6d 61 3b 0a 20 20 20  ma *pSchema;.   
1550: 20 20 20 20 20 69 66 28 20 44 62 4d 61 73 6b 54       if( DbMaskT
1560: 65 73 74 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  est(pParse->cook
1570: 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
1580: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
15a0: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
15b0: 3b 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d  ;.        pSchem
15c0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
15d0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  .pSchema;.      
15e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f0: 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20 20 20  Op4Int(v,.      
1600: 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63 74 69      OP_Transacti
1610: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
1620: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
1630: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 44   */.          iD
1640: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20 20   /* P1 */.      
1670: 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74 28 70      DbMaskTest(p
1680: 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
1690: 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a 2f 0a  ,iDb), /* P2 */.
16a0: 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d            pSchem
16b0: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
16c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
16d0: 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  P3 */.          
16e0: 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
16f0: 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
1700: 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20     /* P4 */.    
1710: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1720: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1730: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
1740: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b  eChangeP5(v, 1);
1750: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
1760: 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20 20 20  ment((v,.       
1770: 20 20 20 20 20 20 20 22 75 73 65 73 53 74 6d 74         "usesStmt
1780: 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70 50 61  Journal=%d", pPa
1790: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20 26 26  rse->mayAbort &&
17a0: 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69   pParse->isMulti
17b0: 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20 20 7d  Write));.      }
17c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
17e0: 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  E.      for(i=0;
17f0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61 62   i<pParse->nVtab
1800: 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Lock; i++){.    
1810: 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20 3d      char *vtab =
1820: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1830: 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 50  GetVTable(db, pP
1840: 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63 6b  arse->apVtabLock
1850: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [i]);.        sq
1860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1870: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c  v, OP_VBegin, 0,
1880: 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f   0, 0, vtab, P4_
1890: 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a 20  VTAB);.      }. 
18a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 74       pParse->nVt
18b0: 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e 64  abLock = 0;.#end
18c0: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 63  if..      /* Onc
18d0: 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69 65  e all the cookie
18e0: 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72 69  s have been veri
18f0: 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61 63  fied and transac
1900: 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a 20  tions opened, . 
1910: 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 74       ** obtain t
1920: 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
1930: 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69 73  e-locks. This is
1940: 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
1950: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 68  the .      ** sh
1960: 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75  ared-cache featu
1970: 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20  re is enabled.. 
1980: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
1990: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50 61  deTableLocks(pPa
19a0: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  rse);..      /* 
19b0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20 41  Initialize any A
19c0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61 74  UTOINCREMENT dat
19d0: 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65 71  a structures req
19e0: 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  uired..      */.
19f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74        sqlite3Aut
1a00: 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e 28  oincrementBegin(
1a10: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1a20: 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e 74  /* Code constant
1a30: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1a40: 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65 64  t where factored
1a50: 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c 6f   out of inner lo
1a60: 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ops */.      if(
1a70: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1a80: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45  xpr ){.        E
1a90: 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20 70  xprList *pEL = p
1aa0: 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
1ab0: 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  r;.        pPars
1ac0: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
1ad0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
1ae0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e 45  r(i=0; i<pEL->nE
1af0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1b00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b10: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
1b20: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  ->a[i].pExpr, pE
1b30: 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73 74  L->a[i].u.iConst
1b40: 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20 20  ExprReg);.      
1b50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
1b60: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a     /* Finally, j
1b70: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1b80: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1b90: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65   executable code
1ba0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1bb0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31 29  e3VdbeGoto(v, 1)
1bc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
1bd0: 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20  /* Get the VDBE 
1be0: 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f  program ready fo
1bf0: 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f  r execution.  */
1c00: 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72  .  if( v && pPar
1c10: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21  se->nErr==0 && !
1c20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c30: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1c40: 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1c50: 76 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 44 69  vel==0 );  /* Di
1c60: 73 61 62 6c 65 73 20 61 6e 64 20 72 65 2d 65 6e  sables and re-en
1c70: 61 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f 0a 20  ables match */. 
1c80: 20 20 20 2f 2a 20 41 20 6d 69 6e 69 6d 75 6d 20     /* A minimum 
1c90: 6f 66 20 6f 6e 65 20 63 75 72 73 6f 72 20 69 73  of one cursor is
1ca0: 20 72 65 71 75 69 72 65 64 20 69 66 20 61 75 74   required if aut
1cb0: 6f 69 6e 63 72 65 6d 65 6e 74 20 69 73 20 75 73  oincrement is us
1cc0: 65 64 0a 20 20 20 20 2a 20 20 53 65 65 20 74 69  ed.    *  See ti
1cd0: 63 6b 65 74 20 5b 61 36 39 36 33 37 39 63 31 66  cket [a696379c1f
1ce0: 30 38 38 36 36 5d 20 2a 2f 0a 20 20 20 20 69 66  08866] */.    if
1cf0: 28 20 70 50 61 72 73 65 2d 3e 70 41 69 6e 63 21  ( pParse->pAinc!
1d00: 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54  =0 && pParse->nT
1d10: 61 62 3d 3d 30 20 29 20 70 50 61 72 73 65 2d 3e  ab==0 ) pParse->
1d20: 6e 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 73 71  nTab = 1;.    sq
1d30: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
1d40: 64 79 28 76 2c 20 70 50 61 72 73 65 29 3b 0a 20  dy(v, pParse);. 
1d50: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
1d60: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
1d70: 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73 65  else{.    pParse
1d80: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
1d90: 52 4f 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ROR;.  }.}../*.*
1da0: 2a 20 52 75 6e 20 74 68 65 20 70 61 72 73 65 72  * Run the parser
1db0: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
1dc0: 74 6f 72 20 72 65 63 75 72 73 69 76 65 6c 79 20  tor recursively 
1dd0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65  in order to gene
1de0: 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72  rate.** code for
1df0: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
1e00: 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68  nt given onto th
1e10: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61  e end of the pPa
1e20: 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63  rse context.** c
1e30: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
1e40: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68  onstruction.  Wh
1e50: 65 6e 20 74 68 65 20 70 61 72 73 65 72 20 69 73  en the parser is
1e60: 20 72 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79   run recursively
1e70: 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68  .** this way, th
1e80: 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20  e final OP_Halt 
1e90: 69 73 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20  is not appended 
1ea0: 61 6e 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61  and other initia
1eb0: 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  lization.** and 
1ec0: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65  finalization ste
1ed0: 70 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62  ps are omitted b
1ee0: 65 63 61 75 73 65 20 74 68 6f 73 65 20 61 72 65  ecause those are
1ef0: 20 68 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65   handling by the
1f00: 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61  .** outermost pa
1f10: 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20  rser..**.** Not 
1f20: 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65  everything is ne
1f30: 73 74 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61  stable.  This fa
1f40: 63 69 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e  cility is design
1f50: 65 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20  ed to permit.** 
1f60: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20  INSERT, UPDATE, 
1f70: 61 6e 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61  and DELETE opera
1f80: 74 69 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51  tions against SQ
1f90: 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73  LITE_MASTER.  Us
1fa0: 65 0a 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75  e.** care if you
1fb0: 20 64 65 63 69 64 65 20 74 6f 20 74 72 79 20 74   decide to try t
1fc0: 6f 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69  o use this routi
1fd0: 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  ne for some othe
1fe0: 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76  r purposes..*/.v
1ff0: 6f 69 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65  oid sqlite3Neste
2000: 64 50 61 72 73 65 28 50 61 72 73 65 20 2a 70 50  dParse(Parse *pP
2010: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
2020: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
2030: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
2040: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63   char *zSql;.  c
2050: 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
2060: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2070: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
2080: 63 68 61 72 20 73 61 76 65 42 75 66 5b 50 41 52  char saveBuf[PAR
2090: 53 45 5f 54 41 49 4c 5f 53 5a 5d 3b 0a 0a 20 20  SE_TAIL_SZ];..  
20a0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
20b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
20c0: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73  ert( pParse->nes
20d0: 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65  ted<10 );  /* Ne
20e0: 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c  sting should onl
20f0: 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20  y be of limited 
2100: 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74  depth */.  va_st
2110: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
2120: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
2130: 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a  e3VMPrintf(db, z
2140: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
2150: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
2160: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
2170: 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d  return;   /* A m
2180: 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
2190: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20  failed */.  }.  
21a0: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b  pParse->nested++
21b0: 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42  ;.  memcpy(saveB
21c0: 75 66 2c 20 50 41 52 53 45 5f 54 41 49 4c 28 70  uf, PARSE_TAIL(p
21d0: 50 61 72 73 65 29 2c 20 50 41 52 53 45 5f 54 41  Parse), PARSE_TA
21e0: 49 4c 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74  IL_SZ);.  memset
21f0: 28 50 41 52 53 45 5f 54 41 49 4c 28 70 50 61 72  (PARSE_TAIL(pPar
2200: 73 65 29 2c 20 30 2c 20 50 41 52 53 45 5f 54 41  se), 0, PARSE_TA
2210: 49 4c 5f 53 5a 29 3b 0a 20 20 73 71 6c 69 74 65  IL_SZ);.  sqlite
2220: 33 52 75 6e 50 61 72 73 65 72 28 70 50 61 72 73  3RunParser(pPars
2230: 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72 4d 73  e, zSql, &zErrMs
2240: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
2250: 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
2260: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
2270: 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 6d  e(db, zSql);.  m
2280: 65 6d 63 70 79 28 50 41 52 53 45 5f 54 41 49 4c  emcpy(PARSE_TAIL
2290: 28 70 50 61 72 73 65 29 2c 20 73 61 76 65 42 75  (pParse), saveBu
22a0: 66 2c 20 50 41 52 53 45 5f 54 41 49 4c 5f 53 5a  f, PARSE_TAIL_SZ
22b0: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73  );.  pParse->nes
22c0: 74 65 64 2d 2d 3b 0a 7d 0a 0a 23 69 66 20 53 51  ted--;.}..#if SQ
22d0: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
22e0: 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 52  TICATION./*.** R
22f0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 7a 54  eturn TRUE if zT
2300: 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65  able is the name
2310: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 74   of the system t
2320: 61 62 6c 65 20 74 68 61 74 20 73 74 6f 72 65 73  able that stores
2330: 20 74 68 65 0a 2a 2a 20 6c 69 73 74 20 6f 66 20   the.** list of 
2340: 75 73 65 72 73 20 61 6e 64 20 74 68 65 69 72 20  users and their 
2350: 61 63 63 65 73 73 20 63 72 65 64 65 6e 74 69 61  access credentia
2360: 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ls..*/.int sqlit
2370: 65 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28  e3UserAuthTable(
2380: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
2390: 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  le){.  return sq
23a0: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54  lite3_stricmp(zT
23b0: 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 75 73  able, "sqlite_us
23c0: 65 72 22 29 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69  er")==0;.}.#endi
23d0: 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  f../*.** Locate 
23e0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
23f0: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
2400: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
2410: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
2420: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
2430: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
2440: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
2450: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
2460: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
2470: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
2480: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
2490: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
24a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
24b0: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
24c0: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
24d0: 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62  ched for the tab
24e0: 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69  le and the.** fi
24f0: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62  rst matching tab
2500: 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  le is returned. 
2510: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f   (No checking fo
2520: 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c  r duplicate tabl
2530: 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f  e.** names is do
2540: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
2550: 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66   order is TEMP f
2560: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
2570: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78   then any.** aux
2580: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
2590: 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65   added using the
25a0: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
25b0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
25c0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
25d0: 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  le()..*/.Table *
25e0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
25f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
2600: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
2610: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
2620: 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  tabase){.  Table
2630: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
2640: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65  ;..  /* All mute
2650: 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  xes are required
2660: 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65   for schema acce
2670: 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77  ss.  Make sure w
2680: 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a  e hold them. */.
2690: 20 20 61 73 73 65 72 74 28 20 7a 44 61 74 61 62    assert( zDatab
26a0: 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase!=0 || sqlite
26b0: 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
26c0: 74 65 78 65 73 28 64 62 29 20 29 3b 0a 23 69 66  texes(db) );.#if
26d0: 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
26e0: 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 2f 2a  HENTICATION.  /*
26f0: 20 4f 6e 6c 79 20 74 68 65 20 61 64 6d 69 6e 20   Only the admin 
2700: 75 73 65 72 20 69 73 20 61 6c 6c 6f 77 65 64 20  user is allowed 
2710: 74 6f 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  to know that the
2720: 20 73 71 6c 69 74 65 5f 75 73 65 72 20 74 61 62   sqlite_user tab
2730: 6c 65 0a 20 20 2a 2a 20 65 78 69 73 74 73 20 2a  le.  ** exists *
2740: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68  /.  if( db->auth
2750: 2e 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48  .authLevel<UAUTH
2760: 5f 41 64 6d 69 6e 20 26 26 20 73 71 6c 69 74 65  _Admin && sqlite
2770: 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 7a  3UserAuthTable(z
2780: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
2790: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
27a0: 6e 64 69 66 0a 20 20 77 68 69 6c 65 28 31 29 7b  ndif.  while(1){
27b0: 0a 20 20 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f  .    for(i=OMIT_
27c0: 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44  TEMPDB; i<db->nD
27d0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
27e0: 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69  nt j = (i<2) ? i
27f0: 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61  ^1 : i;   /* Sea
2800: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
2810: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 20 20 69 66  MAIN */.      if
2820: 28 20 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 7c  ( zDatabase==0 |
2830: 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  | sqlite3StrICmp
2840: 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e  (zDatabase, db->
2850: 61 44 62 5b 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29  aDb[j].zDbSName)
2860: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
2870: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
2880: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
2890: 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 20  , j, 0) );.     
28a0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
28b0: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b  shFind(&db->aDb[
28c0: 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  j].pSchema->tblH
28d0: 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ash, zName);.   
28e0: 20 20 20 20 20 69 66 28 20 70 20 29 20 72 65 74       if( p ) ret
28f0: 75 72 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20  urn p;.      }. 
2900: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4e 6f 74 20     }.    /* Not 
2910: 66 6f 75 6e 64 2e 20 20 49 66 20 74 68 65 20 6e  found.  If the n
2920: 61 6d 65 20 77 65 20 77 65 72 65 20 6c 6f 6f 6b  ame we were look
2930: 69 6e 67 20 66 6f 72 20 77 61 73 20 74 65 6d 70  ing for was temp
2940: 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20  .sqlite_master. 
2950: 20 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67     ** then chang
2960: 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 73 71  e the name to sq
2970: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
2980: 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20   and try again. 
2990: 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
29a0: 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c  e3StrICmp(zName,
29b0: 20 4d 41 53 54 45 52 5f 4e 41 4d 45 29 21 3d 30   MASTER_NAME)!=0
29c0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
29d0: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
29e0: 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d  p(zDatabase, db-
29f0: 3e 61 44 62 5b 31 5d 2e 7a 44 62 53 4e 61 6d 65  >aDb[1].zDbSName
2a00: 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )!=0 ) break;.  
2a10: 20 20 7a 4e 61 6d 65 20 3d 20 54 45 4d 50 5f 4d    zName = TEMP_M
2a20: 41 53 54 45 52 5f 4e 41 4d 45 3b 0a 20 20 7d 0a  ASTER_NAME;.  }.
2a30: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2a40: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
2a50: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
2a60: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
2a70: 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
2a80: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c  database.** tabl
2a90: 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  e given the name
2aa0: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61   of that table a
2ab0: 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
2ac0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
2ad0: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  ** database cont
2ae0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
2af0: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
2b00: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c  f not found.  Al
2b10: 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65  so leave an.** e
2b20: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
2b30: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
2b40: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
2b50: 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
2b60: 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73  is routine and s
2b70: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2b80: 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a  ) is that this.*
2b90: 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73  * routine leaves
2ba0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2bb0: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
2bc0: 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71  rMsg where.** sq
2bd0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29  lite3FindTable()
2be0: 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61   does not..*/.Ta
2bf0: 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61  ble *sqlite3Loca
2c00: 74 65 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  teTable(.  Parse
2c10: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2c20: 20 20 2f 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20    /* context in 
2c30: 77 68 69 63 68 20 74 6f 20 72 65 70 6f 72 74 20  which to report 
2c40: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75 33 32 20  errors */.  u32 
2c50: 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
2c60: 20 20 20 2f 2a 20 4c 4f 43 41 54 45 5f 56 49 45     /* LOCATE_VIE
2c70: 57 20 6f 72 20 4c 4f 43 41 54 45 5f 4e 4f 45 52  W or LOCATE_NOER
2c80: 52 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  R */.  const cha
2c90: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a  r *zName,     /*
2ca0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
2cb0: 6c 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e  le we are lookin
2cc0: 67 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  g for */.  const
2cd0: 20 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20   char *zDbase   
2ce0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2cf0: 20 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68   database.  Migh
2d00: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
2d10: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f    Table *p;..  /
2d20: 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
2d30: 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
2d40: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2d50: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
2d60: 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
2d70: 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
2d80: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
2d90: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
2da0: 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
2db0: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
2dc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2dd0: 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   }..  p = sqlite
2de0: 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  3FindTable(pPars
2df0: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44  e->db, zName, zD
2e00: 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d  base);.  if( p==
2e10: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
2e20: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 66 6c 61 67  har *zMsg = flag
2e30: 73 20 26 20 4c 4f 43 41 54 45 5f 56 49 45 57 20  s & LOCATE_VIEW 
2e40: 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65 77 22  ? "no such view"
2e50: 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c   : "no such tabl
2e60: 65 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e";.#ifndef SQLI
2e70: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2e80: 41 42 4c 45 0a 20 20 20 20 69 66 28 20 73 71 6c  ABLE.    if( sql
2e90: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 70  ite3FindDbName(p
2ea0: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 44 62 61 73  Parse->db, zDbas
2eb0: 65 29 3c 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  e)<1 ){.      /*
2ec0: 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 74 68 65   If zName is the
2ed0: 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   not the name of
2ee0: 20 61 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   a table in the 
2ef0: 73 63 68 65 6d 61 20 63 72 65 61 74 65 64 20 75  schema created u
2f00: 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 43 52  sing.      ** CR
2f10: 45 41 54 45 2c 20 74 68 65 6e 20 63 68 65 63 6b  EATE, then check
2f20: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 69 73   to see if it is
2f30: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20   the name of an 
2f40: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
2f50: 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20  at.      ** can 
2f60: 62 65 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20  be an eponymous 
2f70: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 2a  virtual table. *
2f80: 2f 0a 20 20 20 20 20 20 4d 6f 64 75 6c 65 20 2a  /.      Module *
2f90: 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 2a 29  pMod = (Module*)
2fa0: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
2fb0: 26 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4d 6f  &pParse->db->aMo
2fc0: 64 75 6c 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  dule, zName);.  
2fd0: 20 20 20 20 69 66 28 20 70 4d 6f 64 3d 3d 30 20      if( pMod==0 
2fe0: 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  && sqlite3_strni
2ff0: 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67  cmp(zName, "prag
3000: 6d 61 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20  ma_", 7)==0 ){. 
3010: 20 20 20 20 20 20 20 70 4d 6f 64 20 3d 20 73 71         pMod = sq
3020: 6c 69 74 65 33 50 72 61 67 6d 61 56 74 61 62 52  lite3PragmaVtabR
3030: 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2d 3e  egister(pParse->
3040: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
3050: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4d    }.      if( pM
3060: 6f 64 20 26 26 20 73 71 6c 69 74 65 33 56 74 61  od && sqlite3Vta
3070: 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 49  bEponymousTableI
3080: 6e 69 74 28 70 50 61 72 73 65 2c 20 70 4d 6f 64  nit(pParse, pMod
3090: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
30a0: 75 72 6e 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61  urn pMod->pEpoTa
30b0: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  b;.      }.    }
30c0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
30d0: 28 66 6c 61 67 73 20 26 20 4c 4f 43 41 54 45 5f  (flags & LOCATE_
30e0: 4e 4f 45 52 52 29 3d 3d 30 20 29 7b 0a 20 20 20  NOERR)==0 ){.   
30f0: 20 20 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b     if( zDbase ){
3100: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3110: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3120: 20 22 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a 4d   "%s: %s.%s", zM
3130: 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d  sg, zDbase, zNam
3140: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
3150: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3160: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3170: 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c   "%s: %s", zMsg,
3180: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   zName);.      }
3190: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63  .      pParse->c
31a0: 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
31b0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
31c0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
31d0: 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65  Locate the table
31e0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 2a   identified by *
31f0: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  p..**.** This is
3200: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
3210: 64 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  d sqlite3LocateT
3220: 61 62 6c 65 28 29 2e 20 54 68 65 20 64 69 66 66  able(). The diff
3230: 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 0a 2a  erence between.*
3240: 2a 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  * sqlite3LocateT
3250: 61 62 6c 65 28 29 20 61 6e 64 20 74 68 69 73 20  able() and this 
3260: 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 61 74  function is that
3270: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
3280: 65 73 74 72 69 63 74 73 0a 2a 2a 20 74 68 65 20  estricts.** the 
3290: 73 65 61 72 63 68 20 74 6f 20 73 63 68 65 6d 61  search to schema
32a0: 20 28 70 2d 3e 70 53 63 68 65 6d 61 29 20 69 66   (p->pSchema) if
32b0: 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e   it is not NULL.
32c0: 20 70 2d 3e 70 53 63 68 65 6d 61 20 6d 61 79 20   p->pSchema may 
32d0: 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20 69  be.** non-NULL i
32e0: 66 20 69 74 20 69 73 20 70 61 72 74 20 6f 66 20  f it is part of 
32f0: 61 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65  a view or trigge
3300: 72 20 70 72 6f 67 72 61 6d 20 64 65 66 69 6e 69  r program defini
3310: 74 69 6f 6e 2e 20 53 65 65 0a 2a 2a 20 73 71 6c  tion. See.** sql
3320: 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 29  ite3FixSrcList()
3330: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
3340: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c  .Table *sqlite3L
3350: 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 0a  ocateTableItem(.
3360: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3370: 20 0a 20 20 75 33 32 20 66 6c 61 67 73 2c 0a 20   .  u32 flags,. 
3380: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
3390: 69 74 65 6d 20 2a 70 0a 29 7b 0a 20 20 63 6f 6e  item *p.){.  con
33a0: 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20  st char *zDb;.  
33b0: 61 73 73 65 72 74 28 20 70 2d 3e 70 53 63 68 65  assert( p->pSche
33c0: 6d 61 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 61 74  ma==0 || p->zDat
33d0: 61 62 61 73 65 3d 3d 30 20 29 3b 0a 20 20 69 66  abase==0 );.  if
33e0: 28 20 70 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  ( p->pSchema ){.
33f0: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
3400: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
3410: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
3420: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
3430: 7a 44 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  zDb = pParse->db
3440: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
3450: 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ame;.  }else{.  
3460: 20 20 7a 44 62 20 3d 20 70 2d 3e 7a 44 61 74 61    zDb = p->zData
3470: 62 61 73 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  base;.  }.  retu
3480: 72 6e 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  rn sqlite3Locate
3490: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 66 6c  Table(pParse, fl
34a0: 61 67 73 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a  ags, p->zName, z
34b0: 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  Db);.}../*.** Lo
34c0: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
34d0: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
34e0: 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20  t describes .** 
34f0: 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
3500: 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  ex given the nam
3510: 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a  e of that index.
3520: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20  ** and the name 
3530: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
3540: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
3550: 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75  e index..** Retu
3560: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
3570: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
3580: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
3590: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
35a0: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
35b0: 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74  e.** table and t
35c0: 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  he first matchin
35d0: 67 20 69 6e 64 65 78 20 69 73 20 72 65 74 75 72  g index is retur
35e0: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
35f0: 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63  ng.** for duplic
3600: 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  ate index names 
3610: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
3620: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a  earch order is.*
3630: 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68  * TEMP first, th
3640: 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e  en MAIN, then an
3650: 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  y auxiliary data
3660: 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75  bases added.** u
3670: 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20  sing the ATTACH 
3680: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65  command..*/.Inde
3690: 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  x *sqlite3FindIn
36a0: 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dex(sqlite3 *db,
36b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
36c0: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
36d0: 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  zDb){.  Index *p
36e0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
36f0: 20 2f 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20   /* All mutexes 
3700: 61 72 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  are required for
3710: 20 73 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20   schema access. 
3720: 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f   Make sure we ho
3730: 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73  ld them. */.  as
3740: 73 65 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20  sert( zDb!=0 || 
3750: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
3760: 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20  sAllMutexes(db) 
3770: 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f  );.  for(i=OMIT_
3780: 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44  TEMPDB; i<db->nD
3790: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  b; i++){.    int
37a0: 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31   j = (i<2) ? i^1
37b0: 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68   : i;  /* Search
37c0: 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49   TEMP before MAI
37d0: 4e 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20  N */.    Schema 
37e0: 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  *pSchema = db->a
37f0: 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  Db[j].pSchema;. 
3800: 20 20 20 61 73 73 65 72 74 28 20 70 53 63 68 65     assert( pSche
3810: 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44  ma );.    if( zD
3820: 62 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  b && sqlite3StrI
3830: 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62  Cmp(zDb, db->aDb
3840: 5b 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29 20 29 20  [j].zDbSName) ) 
3850: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
3860: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
3870: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
3880: 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 20   j, 0) );.    p 
3890: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
38a0: 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  d(&pSchema->idxH
38b0: 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ash, zName);.   
38c0: 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a   if( p ) break;.
38d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
38e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d  }../*.** Reclaim
38f0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64   the memory used
3900: 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a   by an index.*/.
3910: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
3920: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64  Index(sqlite3 *d
3930: 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 23 69  b, Index *p){.#i
3940: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3950: 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71 6c 69  T_ANALYZE.  sqli
3960: 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78 53 61  te3DeleteIndexSa
3970: 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a 23 65  mples(db, p);.#e
3980: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 45 78  ndif.  sqlite3Ex
3990: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
39a0: 70 50 61 72 74 49 64 78 57 68 65 72 65 29 3b 0a  pPartIdxWhere);.
39b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
39c0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 61  tDelete(db, p->a
39d0: 43 6f 6c 45 78 70 72 29 3b 0a 20 20 73 71 6c 69  ColExpr);.  sqli
39e0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
39f0: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 69 66 28  >zColAff);.  if(
3a00: 20 70 2d 3e 69 73 52 65 73 69 7a 65 64 20 29 20   p->isResized ) 
3a10: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3a20: 2c 20 28 76 6f 69 64 20 2a 29 70 2d 3e 61 7a 43  , (void *)p->azC
3a30: 6f 6c 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  oll);.#ifdef SQL
3a40: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
3a50: 5f 4f 52 5f 53 54 41 54 34 0a 20 20 73 71 6c 69  _OR_STAT4.  sqli
3a60: 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 69 52 6f  te3_free(p->aiRo
3a70: 77 45 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  wEst);.#endif.  
3a80: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3a90: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  , p);.}../*.** F
3aa0: 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c  or the index cal
3ab0: 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69  led zIdxName whi
3ac0: 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74  ch is found in t
3ad0: 68 65 20 64 61 74 61 62 61 73 65 20 69 44 62 2c  he database iDb,
3ae0: 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20  .** unlike that 
3af0: 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54  index from its T
3b00: 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65  able then remove
3b10: 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a   the index from.
3b20: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61 73  ** the index has
3b30: 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65  h table and free
3b40: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75   all memory stru
3b50: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65  ctures associate
3b60: 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e  d.** with the in
3b70: 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  dex..*/.void sql
3b80: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
3b90: 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33  eteIndex(sqlite3
3ba0: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
3bb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e  onst char *zIdxN
3bc0: 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ame){.  Index *p
3bd0: 49 6e 64 65 78 3b 0a 20 20 48 61 73 68 20 2a 70  Index;.  Hash *p
3be0: 48 61 73 68 3b 0a 0a 20 20 61 73 73 65 72 74 28  Hash;..  assert(
3bf0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
3c00: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
3c10: 20 30 29 20 29 3b 0a 20 20 70 48 61 73 68 20 3d   0) );.  pHash =
3c20: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70   &db->aDb[iDb].p
3c30: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b  Schema->idxHash;
3c40: 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
3c50: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 70 48  te3HashInsert(pH
3c60: 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 30  ash, zIdxName, 0
3c70: 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
3c80: 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69  pIndex) ){.    i
3c90: 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  f( pIndex->pTabl
3ca0: 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65  e->pIndex==pInde
3cb0: 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  x ){.      pInde
3cc0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
3cd0: 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  x = pIndex->pNex
3ce0: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
3cf0: 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
3d00: 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61      /* Justifica
3d10: 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28 29  tion of ALWAYS()
3d20: 3b 20 20 54 68 65 20 69 6e 64 65 78 20 6d 75 73  ;  The index mus
3d30: 74 20 62 65 20 6f 6e 20 74 68 65 20 6c 69 73 74  t be on the list
3d40: 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64   of.      ** ind
3d50: 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70  ices. */.      p
3d60: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
3d70: 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  e->pIndex;.     
3d80: 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70   while( ALWAYS(p
3d90: 29 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70  ) && p->pNext!=p
3da0: 49 6e 64 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e  Index ){ p = p->
3db0: 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 20 20 69  pNext; }.      i
3dc0: 66 28 20 41 4c 57 41 59 53 28 70 20 26 26 20 70  f( ALWAYS(p && p
3dd0: 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29  ->pNext==pIndex)
3de0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70   ){.        p->p
3df0: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70  Next = pIndex->p
3e00: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
3e10: 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65    }.    freeInde
3e20: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
3e30: 20 7d 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67   }.  db->mDbFlag
3e40: 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65  s |= DBFLAG_Sche
3e50: 6d 61 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a  maChange;.}../*.
3e60: 2a 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20  ** Look through 
3e70: 74 68 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e  the list of open
3e80: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
3e90: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e 64  in db->aDb[] and
3ea0: 20 69 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65 20   if.** any have 
3eb0: 62 65 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65 6d  been closed, rem
3ec0: 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68  ove them from th
3ed0: 65 20 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f 63  e list.  Realloc
3ee0: 61 74 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 61  ate the.** db->a
3ef0: 44 62 5b 5d 20 73 74 72 75 63 74 75 72 65 20 74  Db[] structure t
3f00: 6f 20 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65  o a smaller size
3f10: 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a  , if possible..*
3f20: 2a 0a 2a 2a 20 45 6e 74 72 79 20 30 20 28 74 68  *.** Entry 0 (th
3f30: 65 20 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73  e "main" databas
3f40: 65 29 20 61 6e 64 20 65 6e 74 72 79 20 31 20 28  e) and entry 1 (
3f50: 74 68 65 20 22 74 65 6d 70 22 20 64 61 74 61 62  the "temp" datab
3f60: 61 73 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76 65  ase).** are neve
3f70: 72 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72  r candidates for
3f80: 20 62 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65 64   being collapsed
3f90: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3fa0: 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73  3CollapseDatabas
3fb0: 65 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  eArray(sqlite3 *
3fc0: 64 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  db){.  int i, j;
3fd0: 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c  .  for(i=j=2; i<
3fe0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
3ff0: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
4000: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
4010: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
4020: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t==0 ){.      sq
4030: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4040: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 3b 0a  pDb->zDbSName);.
4050: 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e        pDb->zDbSN
4060: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  ame = 0;.      c
4070: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
4080: 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20     if( j<i ){.  
4090: 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d      db->aDb[j] =
40a0: 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20   db->aDb[i];.   
40b0: 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a   }.    j++;.  }.
40c0: 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20    db->nDb = j;. 
40d0: 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20   if( db->nDb<=2 
40e0: 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e  && db->aDb!=db->
40f0: 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20  aDbStatic ){.   
4100: 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53   memcpy(db->aDbS
4110: 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20  tatic, db->aDb, 
4120: 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62  2*sizeof(db->aDb
4130: 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  [0]));.    sqlit
4140: 65 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d  e3DbFree(db, db-
4150: 3e 61 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61  >aDb);.    db->a
4160: 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74  Db = db->aDbStat
4170: 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ic;.  }.}../*.**
4180: 20 52 65 73 65 74 20 74 68 65 20 73 63 68 65 6d   Reset the schem
4190: 61 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  a for the databa
41a0: 73 65 20 61 74 20 69 6e 64 65 78 20 69 44 62 2e  se at index iDb.
41b0: 20 20 41 6c 73 6f 20 72 65 73 65 74 20 74 68 65    Also reset the
41c0: 0a 2a 2a 20 54 45 4d 50 20 73 63 68 65 6d 61 2e  .** TEMP schema.
41d0: 20 20 54 68 65 20 72 65 73 65 74 20 69 73 20 64    The reset is d
41e0: 65 66 65 72 72 65 64 20 69 66 20 64 62 2d 3e 6e  eferred if db->n
41f0: 53 63 68 65 6d 61 4c 6f 63 6b 20 69 73 20 6e 6f  SchemaLock is no
4200: 74 20 7a 65 72 6f 2e 0a 2a 2a 20 44 65 66 65 72  t zero..** Defer
4210: 72 65 64 20 72 65 73 65 74 73 20 6d 61 79 20 62  red resets may b
4220: 65 20 72 75 6e 20 62 79 20 63 61 6c 6c 69 6e 67  e run by calling
4230: 20 77 69 74 68 20 69 44 62 3c 30 2e 0a 2a 2f 0a   with iDb<0..*/.
4240: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65  void sqlite3Rese
4250: 74 4f 6e 65 53 63 68 65 6d 61 28 73 71 6c 69 74  tOneSchema(sqlit
4260: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29  e3 *db, int iDb)
4270: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
4280: 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62  ert( iDb<db->nDb
4290: 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62 3e 3d   );..  if( iDb>=
42a0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
42b0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
42c0: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
42d0: 20 30 29 20 29 3b 0a 20 20 20 20 44 62 53 65 74   0) );.    DbSet
42e0: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62  Property(db, iDb
42f0: 2c 20 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64  , DB_ResetWanted
4300: 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70  );.    DbSetProp
4310: 65 72 74 79 28 64 62 2c 20 31 2c 20 44 42 5f 52  erty(db, 1, DB_R
4320: 65 73 65 74 57 61 6e 74 65 64 29 3b 0a 20 20 7d  esetWanted);.  }
4330: 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 63 68  ..  if( db->nSch
4340: 65 6d 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  emaLock==0 ){.  
4350: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
4360: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
4370: 20 20 69 66 28 20 44 62 48 61 73 50 72 6f 70 65    if( DbHasPrope
4380: 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f 52 65  rty(db, i, DB_Re
4390: 73 65 74 57 61 6e 74 65 64 29 20 29 7b 0a 20 20  setWanted) ){.  
43a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 63 68        sqlite3Sch
43b0: 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61 44 62  emaClear(db->aDb
43c0: 5b 69 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20  [i].pSchema);.  
43d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
43e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61  }../*.** Erase a
43f0: 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d  ll schema inform
4400: 61 74 69 6f 6e 20 66 72 6f 6d 20 61 6c 6c 20 61  ation from all a
4410: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
4420: 73 20 28 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20  s (including.** 
4430: 22 6d 61 69 6e 22 20 61 6e 64 20 22 74 65 6d 70  "main" and "temp
4440: 22 29 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ") for a single 
4450: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
4460: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
4470: 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65  ite3ResetAllSche
4480: 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28  masOfConnection(
4490: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
44a0: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
44b0: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
44c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
44d0: 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 3d 3d 30 20  >nSchemaLock==0 
44e0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
44f0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
4500: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
4510: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
4520: 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 29  ( pDb->pSchema )
4530: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
4540: 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e  chemaClear(pDb->
4550: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
4560: 20 20 7d 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61    }.  db->mDbFla
4570: 67 73 20 26 3d 20 7e 44 42 46 4c 41 47 5f 53 63  gs &= ~DBFLAG_Sc
4580: 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20 73 71  hemaChange;.  sq
4590: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c  lite3VtabUnlockL
45a0: 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ist(db);.  sqlit
45b0: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
45c0: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  db);.  sqlite3Co
45d0: 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65 41 72  llapseDatabaseAr
45e0: 72 61 79 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ray(db);.}../*.*
45f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4600: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
4610: 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a  commit occurs..*
4620: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
4630: 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
4640: 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ges(sqlite3 *db)
4650: 7b 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73  {.  db->mDbFlags
4660: 20 26 3d 20 7e 44 42 46 4c 41 47 5f 53 63 68 65   &= ~DBFLAG_Sche
4670: 6d 61 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a  maChange;.}../*.
4680: 2a 2a 20 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79  ** Delete memory
4690: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
46a0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
46b0: 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69  of a table or vi
46c0: 65 77 20 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65  ew (the.** Table
46d0: 2e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a  .aCol[] array)..
46e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
46f0: 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
4700: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
4710: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
4720: 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20  int i;.  Column 
4730: 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28  *pCol;.  assert(
4740: 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20   pTable!=0 );.  
4750: 69 66 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62  if( (pCol = pTab
4760: 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a  le->aCol)!=0 ){.
4770: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
4780: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  Table->nCol; i++
4790: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
47a0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
47b0: 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  b, pCol->zName);
47c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
47d0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f  prDelete(db, pCo
47e0: 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20  l->pDflt);.     
47f0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4800: 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b  b, pCol->zColl);
4810: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
4820: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
4830: 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a  ble->aCol);.  }.
4840: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
4850: 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20  the memory data 
4860: 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63  structures assoc
4870: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67  iated with the g
4880: 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20  iven.** Table.  
4890: 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
48a0: 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74  ade to disk by t
48b0: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
48c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
48d0: 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65  just deletes the
48e0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e   data structure.
48f0: 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e    It does not un
4900: 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c  link.** the tabl
4910: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
4920: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
4930: 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f  able.  But it do
4940: 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65  es destroy.** me
4950: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
4960: 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61  of the indices a
4970: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  nd foreign keys 
4980: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
4990: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  .** the table..*
49a0: 2a 0a 2a 2a 20 54 68 65 20 64 62 20 70 61 72 61  *.** The db para
49b0: 6d 65 74 65 72 20 69 73 20 6f 70 74 69 6f 6e 61  meter is optiona
49c0: 6c 2e 20 20 49 74 20 69 73 20 6e 65 65 64 65 64  l.  It is needed
49d0: 20 69 66 20 74 68 65 20 54 61 62 6c 65 20 6f 62   if the Table ob
49e0: 6a 65 63 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e  ject .** contain
49f0: 73 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  s lookaside memo
4a00: 72 79 2e 20 20 28 54 61 62 6c 65 20 6f 62 6a 65  ry.  (Table obje
4a10: 63 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d  cts in the schem
4a20: 61 20 64 6f 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  a do not use.** 
4a30: 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  lookaside memory
4a40: 2c 20 62 75 74 20 73 6f 6d 65 20 65 70 68 65 6d  , but some ephem
4a50: 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63  eral Table objec
4a60: 74 73 20 64 6f 2e 29 20 20 4f 72 20 74 68 65 0a  ts do.)  Or the.
4a70: 2a 2a 20 64 62 20 70 61 72 61 6d 65 74 65 72 20  ** db parameter 
4a80: 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68  can be used with
4a90: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
4aa0: 64 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65  d to measure the
4ab0: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 75 73 65 64 20   memory.** used 
4ac0: 62 79 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  by the Table obj
4ad0: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
4ae0: 6f 69 64 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  oid SQLITE_NOINL
4af0: 49 4e 45 20 64 65 6c 65 74 65 54 61 62 6c 65 28  INE deleteTable(
4b00: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62  sqlite3 *db, Tab
4b10: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49  le *pTable){.  I
4b20: 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70  ndex *pIndex, *p
4b30: 4e 65 78 74 3b 0a 0a 23 69 66 64 65 66 20 53 51  Next;..#ifdef SQ
4b40: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
4b50: 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65  Record the numbe
4b60: 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  r of outstanding
4b70: 20 6c 6f 6f 6b 61 73 69 64 65 20 61 6c 6c 6f 63   lookaside alloc
4b80: 61 74 69 6f 6e 73 20 69 6e 20 73 63 68 65 6d 61  ations in schema
4b90: 20 54 61 62 6c 65 73 0a 20 20 2a 2a 20 70 72 69   Tables.  ** pri
4ba0: 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79 20  or to doing any 
4bb0: 66 72 65 65 28 29 20 6f 70 65 72 61 74 69 6f 6e  free() operation
4bc0: 73 2e 20 20 53 69 6e 63 65 20 73 63 68 65 6d 61  s.  Since schema
4bd0: 20 54 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 75   Tables do not u
4be0: 73 65 0a 20 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64  se.  ** lookasid
4bf0: 65 2c 20 74 68 69 73 20 6e 75 6d 62 65 72 20 73  e, this number s
4c00: 68 6f 75 6c 64 20 6e 6f 74 20 63 68 61 6e 67 65  hould not change
4c10: 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b  . */.  int nLook
4c20: 61 73 69 64 65 20 3d 20 30 3b 0a 20 20 69 66 28  aside = 0;.  if(
4c30: 20 64 62 20 26 26 20 28 70 54 61 62 6c 65 2d 3e   db && (pTable->
4c40: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
4c50: 68 65 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a 20  hemeral)==0 ){. 
4c60: 20 20 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20     nLookaside = 
4c70: 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65  sqlite3Lookaside
4c80: 55 73 65 64 28 64 62 2c 20 30 29 3b 0a 20 20 7d  Used(db, 0);.  }
4c90: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 65  .#endif..  /* De
4ca0: 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  lete all indices
4cb0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
4cc0: 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a   this table. */.
4cd0: 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70    for(pIndex = p
4ce0: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70  Table->pIndex; p
4cf0: 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e  Index; pIndex=pN
4d00: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
4d10: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
4d20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
4d30: 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  dex->pSchema==pT
4d40: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 0a 20 20  able->pSchema.  
4d50: 20 20 20 20 20 20 20 7c 7c 20 28 49 73 56 69 72         || (IsVir
4d60: 74 75 61 6c 28 70 54 61 62 6c 65 29 20 26 26 20  tual(pTable) && 
4d70: 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 21  pIndex->idxType!
4d80: 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f  =SQLITE_IDXTYPE_
4d90: 41 50 50 44 45 46 29 20 29 3b 0a 20 20 20 20 69  APPDEF) );.    i
4da0: 66 28 20 28 64 62 3d 3d 30 20 7c 7c 20 64 62 2d  f( (db==0 || db-
4db0: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
4dc0: 29 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28  ) && !IsVirtual(
4dd0: 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20  pTable) ){.     
4de0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
4df0: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20  Index->zName; . 
4e00: 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 20 28 20       TESTONLY ( 
4e10: 49 6e 64 65 78 20 2a 70 4f 6c 64 20 3d 20 29 20  Index *pOld = ) 
4e20: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
4e30: 74 28 0a 20 20 20 20 20 20 20 20 20 26 70 49 6e  t(.         &pIn
4e40: 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64  dex->pSchema->id
4e50: 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a  xHash, zName, 0.
4e60: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
4e70: 73 73 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20  ssert( db==0 || 
4e80: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
4e90: 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49  exHeld(db, 0, pI
4ea0: 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29  ndex->pSchema) )
4eb0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4ec0: 70 4f 6c 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20  pOld==pIndex || 
4ed0: 70 4f 6c 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  pOld==0 );.    }
4ee0: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 64  .    freeIndex(d
4ef0: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
4f00: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79  .  /* Delete any
4f10: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 74   foreign keys at
4f20: 74 61 63 68 65 64 20 74 6f 20 74 68 69 73 20 74  tached to this t
4f30: 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  able. */.  sqlit
4f40: 65 33 46 6b 44 65 6c 65 74 65 28 64 62 2c 20 70  e3FkDelete(db, p
4f50: 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65  Table);..  /* De
4f60: 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73  lete the Table s
4f70: 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e  tructure itself.
4f80: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  .  */.  sqlite3D
4f90: 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
4fa0: 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  (db, pTable);.  
4fb0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4fc0: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
4fd0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
4fe0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43  e(db, pTable->zC
4ff0: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
5000: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
5010: 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  , pTable->pSelec
5020: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
5030: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
5040: 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b  pTable->pCheck);
5050: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5060: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
5070: 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 43  E.  sqlite3VtabC
5080: 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29  lear(db, pTable)
5090: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
50a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
50b0: 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69  ble);..  /* Veri
50c0: 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61  fy that no looka
50d0: 73 69 64 65 20 6d 65 6d 6f 72 79 20 77 61 73 20  side memory was 
50e0: 75 73 65 64 20 62 79 20 73 63 68 65 6d 61 20 74  used by schema t
50f0: 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  ables */.  asser
5100: 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30  t( nLookaside==0
5110: 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d   || nLookaside==
5120: 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65  sqlite3Lookaside
5130: 55 73 65 64 28 64 62 2c 30 29 20 29 3b 0a 7d 0a  Used(db,0) );.}.
5140: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65  void sqlite3Dele
5150: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
5160: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  *db, Table *pTab
5170: 6c 65 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74  le){.  /* Do not
5180: 20 64 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c   delete the tabl
5190: 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65  e until the refe
51a0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63  rence count reac
51b0: 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69  hes zero. */.  i
51c0: 66 28 20 21 70 54 61 62 6c 65 20 29 20 72 65 74  f( !pTable ) ret
51d0: 75 72 6e 3b 0a 20 20 69 66 28 20 28 28 21 64 62  urn;.  if( ((!db
51e0: 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46   || db->pnBytesF
51f0: 72 65 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d 70  reed==0) && (--p
5200: 54 61 62 6c 65 2d 3e 6e 54 61 62 52 65 66 29 3e  Table->nTabRef)>
5210: 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64  0) ) return;.  d
5220: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
5230: 54 61 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  Table);.}.../*.*
5240: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
5250: 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  en table from th
5260: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  e hash tables an
5270: 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65  d the delete the
5280: 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74  .** table struct
5290: 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73  ure with all its
52a0: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
52b0: 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f  eign keys..*/.vo
52c0: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
52d0: 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73  AndDeleteTable(s
52e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
52f0: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
5300: 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61  *zTabName){.  Ta
5310: 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44  ble *p;.  Db *pD
5320: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  b;..  assert( db
5330: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
5340: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
5350: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
5360: 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a  rt( zTabName );.
5370: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5380: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
5390: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
53a0: 20 20 74 65 73 74 63 61 73 65 28 20 7a 54 61 62    testcase( zTab
53b0: 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f  Name[0]==0 );  /
53c0: 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61  * Zero-length ta
53d0: 62 6c 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c  ble names are al
53e0: 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d  lowed */.  pDb =
53f0: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
5400: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
5410: 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53  hInsert(&pDb->pS
5420: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
5430: 7a 54 61 62 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  zTabName, 0);.  
5440: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
5450: 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d  le(db, p);.  db-
5460: 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46  >mDbFlags |= DBF
5470: 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65  LAG_SchemaChange
5480: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
5490: 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e   a token, return
54a0: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63   a string that c
54b0: 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74  onsists of the t
54c0: 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74  ext of that.** t
54d0: 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20  oken.  Space to 
54e0: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
54f0: 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f  d string.** is o
5500: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
5510: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
5520: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
5530: 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
5540: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
5550: 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61  Any quotation ma
5560: 72 6b 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22  rks (ex:  "name"
5570: 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d  , 'name', [name]
5580: 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61  , or `name`) tha
5590: 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68  t.** surround th
55a0: 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f  e body of the to
55b0: 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e  ken are removed.
55c0: 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72  .**.** Tokens ar
55d0: 65 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69  e often just poi
55e0: 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f  nters into the o
55f0: 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74  riginal SQL text
5600: 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e   and so.** are n
5610: 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  ot \000 terminat
5620: 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70  ed and are not p
5630: 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20  ersistent.  The 
5640: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
5650: 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69  ** is \000 termi
5660: 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72  nated and is per
5670: 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72  sistent..*/.char
5680: 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f   *sqlite3NameFro
5690: 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a  mToken(sqlite3 *
56a0: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
56b0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  ){.  char *zName
56c0: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b  ;.  if( pName ){
56d0: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
56e0: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
56f0: 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e  , (char*)pName->
5700: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
5710: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
5720: 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  (zName);.  }else
5730: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  {.    zName = 0;
5740: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
5750: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  ame;.}../*.** Op
5760: 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  en the sqlite_ma
5770: 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65  ster table store
5780: 64 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75  d in database nu
5790: 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20  mber iDb for.** 
57a0: 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62  writing. The tab
57b0: 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  le is opened usi
57c0: 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a  ng cursor 0..*/.
57d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e  void sqlite3Open
57e0: 4d 61 73 74 65 72 54 61 62 6c 65 28 50 61 72 73  MasterTable(Pars
57f0: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a  e *p, int iDb){.
5800: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
5810: 74 65 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20  te3GetVdbe(p);. 
5820: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
5830: 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52  k(p, iDb, MASTER
5840: 5f 52 4f 4f 54 2c 20 31 2c 20 4d 41 53 54 45 52  _ROOT, 1, MASTER
5850: 5f 4e 41 4d 45 29 3b 0a 20 20 73 71 6c 69 74 65  _NAME);.  sqlite
5860: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
5870: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
5880: 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  0, MASTER_ROOT, 
5890: 69 44 62 2c 20 35 29 3b 0a 20 20 69 66 28 20 70  iDb, 5);.  if( p
58a0: 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ->nTab==0 ){.   
58b0: 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20   p->nTab = 1;.  
58c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  }.}../*.** Param
58d0: 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74  eter zName point
58e0: 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69  s to a nul-termi
58f0: 6e 61 74 65 64 20 62 75 66 66 65 72 20 63 6f 6e  nated buffer con
5900: 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65  taining the name
5910: 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61 62 61 73  .** of a databas
5920: 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70  e ("main", "temp
5930: 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  " or the name of
5940: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29   an attached db)
5950: 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
5960: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 69  on returns the i
5970: 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65  ndex of the name
5980: 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62  d database in db
5990: 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d  ->aDb[], or.** -
59a0: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
59b0: 62 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  b cannot be foun
59c0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
59d0: 33 46 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69  3FindDbName(sqli
59e0: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
59f0: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
5a00: 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 20 20  nt i = -1;      
5a10: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
5a20: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a  umber */.  if( z
5a30: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44 62 20 2a  Name ){.    Db *
5a40: 70 44 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28  pDb;.    for(i=(
5a50: 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d  db->nDb-1), pDb=
5a60: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d  &db->aDb[i]; i>=
5a70: 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a  0; i--, pDb--){.
5a80: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
5a90: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 44 62  ite3_stricmp(pDb
5aa0: 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a 4e 61 6d  ->zDbSName, zNam
5ab0: 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  e) ) break;.    
5ac0: 20 20 2f 2a 20 22 6d 61 69 6e 22 20 69 73 20 61    /* "main" is a
5ad0: 6c 77 61 79 73 20 61 6e 20 61 63 63 65 70 74 61  lways an accepta
5ae0: 62 6c 65 20 61 6c 69 61 73 20 66 6f 72 20 74 68  ble alias for th
5af0: 65 20 70 72 69 6d 61 72 79 20 64 61 74 61 62 61  e primary databa
5b00: 73 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e  se.      ** even
5b10: 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20   if it has been 
5b20: 72 65 6e 61 6d 65 64 20 75 73 69 6e 67 20 53 51  renamed using SQ
5b30: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4d 41  LITE_DBCONFIG_MA
5b40: 49 4e 44 42 4e 41 4d 45 2e 20 2a 2f 0a 20 20 20  INDBNAME. */.   
5b50: 20 20 20 69 66 28 20 69 3d 3d 30 20 26 26 20 30     if( i==0 && 0
5b60: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ==sqlite3_stricm
5b70: 70 28 22 6d 61 69 6e 22 2c 20 7a 4e 61 6d 65 29  p("main", zName)
5b80: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
5b90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
5ba0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b  }../*.** The tok
5bb0: 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69  en *pName contai
5bc0: 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ns the name of a
5bd0: 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65   database (eithe
5be0: 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22  r "main" or.** "
5bf0: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
5c00: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
5c10: 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69   db). This routi
5c20: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
5c30: 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  * index of the n
5c40: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
5c50: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d   db->aDb[], or -
5c60: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
5c70: 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  b .** does not e
5c80: 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  xist..*/.int sql
5c90: 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74  ite3FindDb(sqlit
5ca0: 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70  e3 *db, Token *p
5cb0: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Name){.  int i; 
5cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5ce0: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
5cf0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
5d00: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
5d10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
5d20: 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63 68  me we are search
5d30: 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61  ing for */.  zNa
5d40: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
5d50: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
5d60: 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69  ame);.  i = sqli
5d70: 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
5d80: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  , zName);.  sqli
5d90: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
5da0: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  ame);.  return i
5db0: 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c  ;.}../* The tabl
5dc0: 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69  e or view or tri
5dd0: 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73  gger name is pas
5de0: 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74  sed to this rout
5df0: 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a  ine via tokens.*
5e00: 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61  * pName1 and pNa
5e10: 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c  me2. If the tabl
5e20: 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79  e name was fully
5e30: 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20   qualified, for 
5e40: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43  example:.**.** C
5e50: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e  REATE TABLE xxx.
5e60: 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a  yyy (...);.** .*
5e70: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
5e80: 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e   set to "xxx" an
5e90: 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20  d pName2 "yyy". 
5ea0: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
5eb0: 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  d if.** the tabl
5ec0: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75  e name is not fu
5ed0: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69  lly qualified, i
5ee0: 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  .e.:.**.** CREAT
5ef0: 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29  E TABLE yyy(...)
5f00: 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61  ;.**.** Then pNa
5f10: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79  me1 is set to "y
5f20: 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69  yy" and pName2 i
5f30: 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  s ""..**.** This
5f40: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
5f50: 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e  e *ppUnqual poin
5f60: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
5f70: 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65  the token (pName
5f80: 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20  1 or.** pName2) 
5f90: 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20  that stores the 
5fa0: 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c  unqualified tabl
5fb0: 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64  e name.  The ind
5fc0: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ex of the.** dat
5fd0: 61 62 61 73 65 20 22 78 78 78 22 20 69 73 20 72  abase "xxx" is r
5fe0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
5ff0: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
6000: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
6010: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
6020: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
6030: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
6040: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
6050: 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  me1,      /* The
6060: 20 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61   "xxx" in the na
6070: 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20  me "xxx.yyy" or 
6080: 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e  "xxx" */.  Token
6090: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f   *pName2,      /
60a0: 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e 20 74  * The "yyy" in t
60b0: 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79  he name "xxx.yyy
60c0: 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70  " */.  Token **p
60d0: 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72  Unqual     /* Wr
60e0: 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66  ite the unqualif
60f0: 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ied object name 
6100: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
6110: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
6120: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
6130: 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  base holding the
6140: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c   object */.  sql
6150: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
6160: 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74  e->db;..  assert
6170: 28 20 70 4e 61 6d 65 32 21 3d 30 20 29 3b 0a 20  ( pName2!=0 );. 
6180: 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30   if( pName2->n>0
6190: 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
61a0: 69 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a 20 20  init.busy ) {.  
61b0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
61c0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72  Msg(pParse, "cor
61d0: 72 75 70 74 20 64 61 74 61 62 61 73 65 22 29 3b  rupt database");
61e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
61f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 55 6e  ;.    }.    *pUn
6200: 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20  qual = pName2;. 
6210: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
6220: 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65  FindDb(db, pName
6230: 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  1);.    if( iDb<
6240: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
6250: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
6260: 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61  e, "unknown data
6270: 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31  base %T", pName1
6280: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
6290: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  -1;.    }.  }els
62a0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
62b0: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c  b->init.iDb==0 |
62c0: 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 0a  | db->init.busy.
62d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
62e0: 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 20  (db->mDbFlags & 
62f0: 44 42 46 4c 41 47 5f 56 61 63 75 75 6d 29 21 3d  DBFLAG_Vacuum)!=
6300: 30 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62  0);.    iDb = db
6310: 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20  ->init.iDb;.    
6320: 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65  *pUnqual = pName
6330: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
6340: 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  iDb;.}../*.** Th
6350: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
6360: 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74  ed to check if t
6370: 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20  he UTF-8 string 
6380: 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c  zName is a legal
6390: 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20  .** unqualified 
63a0: 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73  name for a new s
63b0: 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61  chema object (ta
63c0: 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77  ble, index, view
63d0: 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e   or.** trigger).
63e0: 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c   All names are l
63f0: 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73  egal except thos
6400: 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  e that begin wit
6410: 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20  h the string.** 
6420: 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70  "sqlite_" (in up
6430: 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69  per, lower or mi
6440: 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20  xed case). This 
6450: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  portion of the n
6460: 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72  amespace.** is r
6470: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
6480: 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74  rnal use..*/.int
6490: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a   sqlite3CheckObj
64a0: 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70  ectName(Parse *p
64b0: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
64c0: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28  r *zName){.  if(
64d0: 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e   !pParse->db->in
64e0: 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73  it.busy && pPars
64f0: 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20  e->nested==0 .  
6500: 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61 72          && (pPar
6510: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
6520: 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65  SQLITE_WriteSche
6530: 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ma)==0.         
6540: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
6550: 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  rNICmp(zName, "s
6560: 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20  qlite_", 7) ){. 
6570: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
6580: 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a 65  sg(pParse, "obje
6590: 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65 64  ct name reserved
65a0: 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73   for internal us
65b0: 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  e: %s", zName);.
65c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
65d0: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
65e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
65f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
6600: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
6610: 20 69 6e 64 65 78 20 6f 66 20 61 20 74 61 62 6c   index of a tabl
6620: 65 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69  e.*/.Index *sqli
6630: 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
6640: 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  ex(Table *pTab){
6650: 0a 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 66  .  Index *p;.  f
6660: 6f 72 28 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65  or(p=pTab->pInde
6670: 78 3b 20 70 20 26 26 20 21 49 73 50 72 69 6d 61  x; p && !IsPrima
6680: 72 79 4b 65 79 49 6e 64 65 78 28 70 29 3b 20 70  ryKeyIndex(p); p
6690: 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 72  =p->pNext){}.  r
66a0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
66b0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f 6c  * Return the col
66c0: 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64  umn of index pId
66d0: 78 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  x that correspon
66e0: 64 73 20 74 6f 20 74 61 62 6c 65 0a 2a 2a 20 63  ds to table.** c
66f0: 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 20 20 52 65 74  olumn iCol.  Ret
6700: 75 72 6e 20 2d 31 20 69 66 20 6e 6f 74 20 66 6f  urn -1 if not fo
6710: 75 6e 64 2e 0a 2a 2f 0a 69 31 36 20 73 71 6c 69  und..*/.i16 sqli
6720: 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
6730: 28 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 31  (Index *pIdx, i1
6740: 36 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69  6 iCol){.  int i
6750: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
6760: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Idx->nColumn; i+
6770: 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  +){.    if( iCol
6780: 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ==pIdx->aiColumn
6790: 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  [i] ) return i;.
67a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
67b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
67c0: 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e  constructing a n
67d0: 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73 65  ew table represe
67e0: 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72  ntation in memor
67f0: 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74  y.  This is.** t
6800: 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76 65  he first of seve
6810: 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69  ral action routi
6820: 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61 6c  nes that get cal
6830: 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a  led in response.
6840: 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20 54  ** to a CREATE T
6850: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
6860: 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20   In particular, 
6870: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
6880: 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20  called.** after 
6890: 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43  seeing tokens "C
68a0: 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c  REATE" and "TABL
68b0: 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  E" and the table
68c0: 20 6e 61 6d 65 2e 20 54 68 65 20 69 73 54 65 6d   name. The isTem
68d0: 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75  p.** flag is tru
68e0: 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73  e if the table s
68f0: 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20  hould be stored 
6900: 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  in the auxiliary
6910: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
6920: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20  e instead of in 
6930: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
6940: 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  e file.  This is
6950: 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61   normally the ca
6960: 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22  se.** when the "
6970: 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52  TEMP" or "TEMPOR
6980: 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63  ARY" keyword occ
6990: 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a  urs in between.*
69a0: 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41 42  * CREATE and TAB
69b0: 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  LE..**.** The ne
69c0: 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  w table record i
69d0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e  s initialized an
69e0: 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d  d put in pParse-
69f0: 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41  >pNewTable..** A
6a00: 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52  s more of the CR
6a10: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
6a20: 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20  ment is parsed, 
6a30: 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f  additional actio
6a40: 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69  n.** routines wi
6a50: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20  ll be called to 
6a60: 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  add more informa
6a70: 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63  tion to this rec
6a80: 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ord..** At the e
6a90: 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
6aa0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
6ab0: 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64  , the sqlite3End
6ac0: 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a  Table() routine.
6ad0: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ** is called to 
6ae0: 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e  complete the con
6af0: 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65  struction of the
6b00: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
6b10: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
6b20: 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20  e3StartTable(.  
6b30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
6b40: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
6b50: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
6b60: 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73  Name1,   /* Firs
6b70: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61  t part of the na
6b80: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
6b90: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b  or view */.  Tok
6ba0: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a  en *pName2,   /*
6bb0: 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20   Second part of 
6bc0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
6bd0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f  table or view */
6be0: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20  .  int isTemp,  
6bf0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
6c00: 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74 61  his is a TEMP ta
6c10: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  ble */.  int isV
6c20: 69 65 77 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  iew,      /* Tru
6c30: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
6c40: 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  IEW */.  int isV
6c50: 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72 75  irtual,   /* Tru
6c60: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
6c70: 49 52 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f 0a  IRTUAL table */.
6c80: 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20    int noErr     
6c90: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
6ca0: 20 69 66 20 74 61 62 6c 65 20 61 6c 72 65 61 64   if table alread
6cb0: 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20  y exists */.){. 
6cc0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a   Table *pTable;.
6cd0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
6ce0: 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f  0; /* The name o
6cf0: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
6d00: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
6d10: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
6d20: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
6d30: 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  iDb;         /* 
6d40: 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  Database number 
6d50: 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61  to create the ta
6d60: 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ble in */.  Toke
6d70: 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  n *pName;    /* 
6d80: 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  Unqualified name
6d90: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
6da0: 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 69 66   create */..  if
6db0: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
6dc0: 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  && db->init.newT
6dd0: 6e 75 6d 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  num==1 ){.    /*
6de0: 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20   Special case:  
6df0: 50 61 72 73 69 6e 67 20 74 68 65 20 73 71 6c 69  Parsing the sqli
6e00: 74 65 5f 6d 61 73 74 65 72 20 6f 72 20 73 71 6c  te_master or sql
6e10: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20  ite_temp_master 
6e20: 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 69 44  schema */.    iD
6e30: 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  b = db->init.iDb
6e40: 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  ;.    zName = sq
6e50: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
6e60: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
6e70: 44 62 29 29 3b 0a 20 20 20 20 70 4e 61 6d 65 20  Db));.    pName 
6e80: 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 65 6c 73  = pName1;.  }els
6e90: 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  e{.    /* The co
6ea0: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20  mmon case */.   
6eb0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
6ec0: 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
6ed0: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
6ee0: 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  , &pName);.    i
6ef0: 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72  f( iDb<0 ) retur
6f00: 6e 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54  n;.    if( !OMIT
6f10: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
6f20: 70 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30  p && pName2->n>0
6f30: 20 26 26 20 69 44 62 21 3d 31 20 29 7b 0a 20 20   && iDb!=1 ){.  
6f40: 20 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69      /* If creati
6f50: 6e 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c  ng a temp table,
6f60: 20 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f   the name may no
6f70: 74 20 62 65 20 71 75 61 6c 69 66 69 65 64 2e 20  t be qualified. 
6f80: 55 6e 6c 65 73 73 20 0a 20 20 20 20 20 20 2a 2a  Unless .      **
6f90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
6fa0: 6d 65 20 69 73 20 22 74 65 6d 70 22 20 61 6e 79  me is "temp" any
6fb0: 77 61 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 73  way.  */.      s
6fc0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
6fd0: 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72  Parse, "temporar
6fe0: 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73  y table name mus
6ff0: 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64  t be unqualified
7000: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
7010: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7020: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
7030: 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31  isTemp ) iDb = 1
7040: 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  ;.    zName = sq
7050: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
7060: 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  en(db, pName);. 
7070: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61   }.  pParse->sNa
7080: 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65  meToken = *pName
7090: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
70a0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
70b0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
70c0: 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
70d0: 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  me(pParse, zName
70e0: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65  ) ){.    goto be
70f0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
7100: 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69  .  }.  if( db->i
7110: 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54  nit.iDb==1 ) isT
7120: 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  emp = 1;.#ifndef
7130: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
7140: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73  HORIZATION.  ass
7150: 65 72 74 28 20 69 73 54 65 6d 70 3d 3d 30 20 7c  ert( isTemp==0 |
7160: 7c 20 69 73 54 65 6d 70 3d 3d 31 20 29 3b 0a 20  | isTemp==1 );. 
7170: 20 61 73 73 65 72 74 28 20 69 73 56 69 65 77 3d   assert( isView=
7180: 3d 30 20 7c 7c 20 69 73 56 69 65 77 3d 3d 31 20  =0 || isView==1 
7190: 29 3b 0a 20 20 7b 0a 20 20 20 20 73 74 61 74 69  );.  {.    stati
71a0: 63 20 63 6f 6e 73 74 20 75 38 20 61 43 6f 64 65  c const u8 aCode
71b0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 53 51  [] = {.       SQ
71c0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c  LITE_CREATE_TABL
71d0: 45 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45  E,.       SQLITE
71e0: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42  _CREATE_TEMP_TAB
71f0: 4c 45 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54  LE,.       SQLIT
7200: 45 5f 43 52 45 41 54 45 5f 56 49 45 57 2c 0a 20  E_CREATE_VIEW,. 
7210: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45        SQLITE_CRE
7220: 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 0a 20 20  ATE_TEMP_VIEW.  
7230: 20 20 7d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a    };.    char *z
7240: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
7250: 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20  ].zDbSName;.    
7260: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
7270: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
7280: 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45  ITE_INSERT, SCHE
7290: 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29  MA_TABLE(isTemp)
72a0: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
72b0: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
72c0: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
72d0: 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 72 74  .    if( !isVirt
72e0: 75 61 6c 20 26 26 20 73 71 6c 69 74 65 33 41 75  ual && sqlite3Au
72f0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
7300: 28 69 6e 74 29 61 43 6f 64 65 5b 69 73 54 65 6d  (int)aCode[isTem
7310: 70 2b 32 2a 69 73 56 69 65 77 5d 2c 0a 20 20 20  p+2*isView],.   
7320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7340: 20 20 20 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44      zName, 0, zD
7350: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
7360: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
7370: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  or;.    }.  }.#e
7380: 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ndif..  /* Make 
7390: 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61 62  sure the new tab
73a0: 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74  le name does not
73b0: 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e   collide with an
73c0: 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69   existing.  ** i
73d0: 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61  ndex or table na
73e0: 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  me in the same d
73f0: 61 74 61 62 61 73 65 2e 20 20 49 73 73 75 65 20  atabase.  Issue 
7400: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
7410: 20 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73   if.  ** it does
7420: 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20  . The exception 
7430: 69 73 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  is if the statem
7440: 65 6e 74 20 62 65 69 6e 67 20 70 61 72 73 65 64  ent being parsed
7450: 20 77 61 73 20 70 61 73 73 65 64 0a 20 20 2a 2a   was passed.  **
7460: 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 64   to an sqlite3_d
7470: 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20 63 61  eclare_vtab() ca
7480: 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ll. In that case
7490: 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e   only the column
74a0: 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64 20   names.  ** and 
74b0: 74 79 70 65 73 20 77 69 6c 6c 20 62 65 20 75 73  types will be us
74c0: 65 64 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20  ed, so there is 
74d0: 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65 73 74 20  no need to test 
74e0: 66 6f 72 20 6e 61 6d 65 73 70 61 63 65 0a 20 20  for namespace.  
74f0: 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20  ** collisions.. 
7500: 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e 5f 44 45   */.  if( !IN_DE
7510: 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20  CLARE_VTAB ){.  
7520: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62    char *zDb = db
7530: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
7540: 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  ame;.    if( SQL
7550: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
7560: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
7570: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
7580: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
7590: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  r;.    }.    pTa
75a0: 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ble = sqlite3Fin
75b0: 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
75c0: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , zDb);.    if( 
75d0: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  pTable ){.      
75e0: 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20  if( !noErr ){.  
75f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
7600: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
7610: 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20  able %T already 
7620: 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b  exists", pName);
7630: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7640: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64        assert( !d
7650: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20  b->init.busy || 
7660: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
7670: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
7680: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
7690: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
76a0: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 62    }.      goto b
76b0: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
76c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
76d0: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
76e0: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29  (db, zName, zDb)
76f0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
7700: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7710: 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61  rse, "there is a
7720: 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20  lready an index 
7730: 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65  named %s", zName
7740: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  );.      goto be
7750: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
7760: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54  .    }.  }..  pT
7770: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62  able = sqlite3Db
7780: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
7790: 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
77a0: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
77b0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
77c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
77d0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  ;.    pParse->rc
77e0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
77f0: 42 4b 50 54 3b 0a 20 20 20 20 70 50 61 72 73 65  BKPT;.    pParse
7800: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
7810: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7820: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rror;.  }.  pTab
7830: 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  le->zName = zNam
7840: 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b  e;.  pTable->iPK
7850: 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c  ey = -1;.  pTabl
7860: 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  e->pSchema = db-
7870: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
7880: 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 54 61  a;.  pTable->nTa
7890: 62 52 65 66 20 3d 20 31 3b 0a 23 69 66 64 65 66  bRef = 1;.#ifdef
78a0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
78b0: 52 4f 57 45 53 54 0a 20 20 70 54 61 62 6c 65 2d  ROWEST.  pTable-
78c0: 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73 71  >nRowLogEst = sq
78d0: 6c 69 74 65 33 4c 6f 67 45 73 74 28 53 51 4c 49  lite3LogEst(SQLI
78e0: 54 45 5f 44 45 46 41 55 4c 54 5f 52 4f 57 45 53  TE_DEFAULT_ROWES
78f0: 54 29 3b 0a 23 65 6c 73 65 0a 20 20 70 54 61 62  T);.#else.  pTab
7900: 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  le->nRowLogEst =
7910: 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30   200; assert( 20
7920: 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
7930: 28 31 30 34 38 35 37 36 29 20 29 3b 0a 23 65 6e  (1048576) );.#en
7940: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 50  dif.  assert( pP
7950: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d  arse->pNewTable=
7960: 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  =0 );.  pParse->
7970: 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62  pNewTable = pTab
7980: 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  le;..  /* If thi
7990: 73 20 69 73 20 74 68 65 20 6d 61 67 69 63 20 73  s is the magic s
79a0: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
79b0: 61 62 6c 65 20 75 73 65 64 20 62 79 20 61 75 74  able used by aut
79c0: 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a  oincrement,.  **
79d0: 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70   then record a p
79e0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74  ointer to this t
79f0: 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e  able in the main
7a00: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
7a10: 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  ure.  ** so that
7a20: 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64   INSERT can find
7a30: 20 74 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c   the table easil
7a40: 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  y..  */.#ifndef 
7a50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
7a60: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20  INCREMENT.  if( 
7a70: 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20  !pParse->nested 
7a80: 26 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  && strcmp(zName,
7a90: 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63   "sqlite_sequenc
7aa0: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  e")==0 ){.    as
7ab0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
7ac0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
7ad0: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
7ae0: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d  pTable->pSchema-
7af0: 3e 70 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c  >pSeqTab = pTabl
7b00: 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  e;.  }.#endif.. 
7b10: 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61   /* Begin genera
7b20: 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68  ting the code th
7b30: 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74  at will insert t
7b40: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
7b50: 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51  into.  ** the SQ
7b60: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
7b70: 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74  e.  Note in part
7b80: 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d  icular that we m
7b90: 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a  ust go ahead.  *
7ba0: 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74  * and allocate t
7bb0: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
7bc0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65   for the table e
7bd0: 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72  ntry now.  Befor
7be0: 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41  e any.  ** PRIMA
7bf0: 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
7c00: 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61   keywords are pa
7c10: 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79  rsed.  Those key
7c20: 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65  words will cause
7c30: 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f  .  ** indices to
7c40: 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20   be created and 
7c50: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
7c60: 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72   must come befor
7c70: 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69  e the .  ** indi
7c80: 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ces.  Hence, the
7c90: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
7ca0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73  or the table mus
7cb0: 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20  t be allocated. 
7cc0: 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   ** now..  */.  
7cd0: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
7ce0: 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74  sy && (v = sqlit
7cf0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
7d00: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ))!=0 ){.    int
7d10: 20 61 64 64 72 31 3b 0a 20 20 20 20 69 6e 74 20   addr1;.    int 
7d20: 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20  fileFormat;.    
7d30: 69 6e 74 20 72 65 67 31 2c 20 72 65 67 32 2c 20  int reg1, reg2, 
7d40: 72 65 67 33 3b 0a 20 20 20 20 2f 2a 20 6e 75 6c  reg3;.    /* nul
7d50: 6c 52 6f 77 5b 5d 20 69 73 20 61 6e 20 4f 50 5f  lRow[] is an OP_
7d60: 52 65 63 6f 72 64 20 65 6e 63 6f 64 69 6e 67 20  Record encoding 
7d70: 6f 66 20 61 20 72 6f 77 20 63 6f 6e 74 61 69 6e  of a row contain
7d80: 69 6e 67 20 35 20 4e 55 4c 4c 73 20 2a 2f 0a 20  ing 5 NULLs */. 
7d90: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
7da0: 63 68 61 72 20 6e 75 6c 6c 52 6f 77 5b 5d 20 3d  char nullRow[] =
7db0: 20 7b 20 36 2c 20 30 2c 20 30 2c 20 30 2c 20 30   { 6, 0, 0, 0, 0
7dc0: 2c 20 30 20 7d 3b 0a 20 20 20 20 73 71 6c 69 74  , 0 };.    sqlit
7dd0: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
7de0: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
7df0: 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
7e00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
7e10: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
7e20: 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20   isVirtual ){.  
7e30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7e40: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67  ddOp0(v, OP_VBeg
7e50: 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  in);.    }.#endi
7e60: 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  f..    /* If the
7e70: 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64   file format and
7e80: 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68 65   encoding in the
7e90: 20 64 61 74 61 62 61 73 65 20 68 61 76 65 20 6e   database have n
7ea0: 6f 74 20 62 65 65 6e 20 73 65 74 2c 20 0a 20 20  ot been set, .  
7eb0: 20 20 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f    ** set them no
7ec0: 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  w..    */.    re
7ed0: 67 31 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67  g1 = pParse->reg
7ee0: 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65  Rowid = ++pParse
7ef0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 32  ->nMem;.    reg2
7f00: 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f   = pParse->regRo
7f10: 6f 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ot = ++pParse->n
7f20: 4d 65 6d 3b 0a 20 20 20 20 72 65 67 33 20 3d 20  Mem;.    reg3 = 
7f30: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
7f40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7f50: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 64  ddOp3(v, OP_Read
7f60: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 72 65 67  Cookie, iDb, reg
7f70: 33 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f  3, BTREE_FILE_FO
7f80: 52 4d 41 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  RMAT);.    sqlit
7f90: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
7fa0: 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 61 64 64  v, iDb);.    add
7fb0: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
7fc0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c  AddOp1(v, OP_If,
7fd0: 20 72 65 67 33 29 3b 20 56 64 62 65 43 6f 76 65   reg3); VdbeCove
7fe0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 66 69 6c  rage(v);.    fil
7ff0: 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66  eFormat = (db->f
8000: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 65  lags & SQLITE_Le
8010: 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30 20  gacyFileFmt)!=0 
8020: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
8030: 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d      1 : SQLITE_M
8040: 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a  AX_FILE_FORMAT;.
8050: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8060: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43  ddOp3(v, OP_SetC
8070: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45  ookie, iDb, BTRE
8080: 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 2c 20 66  E_FILE_FORMAT, f
8090: 69 6c 65 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  ileFormat);.    
80a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
80b0: 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  3(v, OP_SetCooki
80c0: 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 54 45  e, iDb, BTREE_TE
80d0: 58 54 5f 45 4e 43 4f 44 49 4e 47 2c 20 45 4e 43  XT_ENCODING, ENC
80e0: 28 64 62 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  (db));.    sqlit
80f0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
8100: 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 20 20 2f  , addr1);..    /
8110: 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72 65 61  * This just crea
8120: 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64  tes a place-hold
8130: 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  er record in the
8140: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
8150: 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65  able..    ** The
8160: 20 72 65 63 6f 72 64 20 63 72 65 61 74 65 64 20   record created 
8170: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
8180: 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20 20   anything yet.  
8190: 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61  It will be repla
81a0: 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ced.    ** by th
81b0: 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e 20  e real entry in 
81c0: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 61  code generated a
81d0: 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  t sqlite3EndTabl
81e0: 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
81f0: 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72  ** The rowid for
8200: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69   the new entry i
8210: 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74  s left in regist
8220: 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f  er pParse->regRo
8230: 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  wid..    ** The 
8240: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
8250: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
8260: 65 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  e is left in reg
8270: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
8280: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77  ..    ** The row
8290: 69 64 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65  id and root page
82a0: 20 6e 75 6d 62 65 72 20 76 61 6c 75 65 73 20 61   number values a
82b0: 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65  re needed by the
82c0: 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20 2a   code that.    *
82d0: 2a 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  * sqlite3EndTabl
82e0: 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e  e will generate.
82f0: 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  .    */.#if !def
8300: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
8310: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
8320: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
8330: 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20  IRTUALTABLE).   
8340: 20 69 66 28 20 69 73 56 69 65 77 20 7c 7c 20 69   if( isView || i
8350: 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20  sVirtual ){.    
8360: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8370: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
8380: 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20 20 20  r, 0, reg2);.   
8390: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
83a0: 20 20 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65    {.      pParse
83b0: 2d 3e 61 64 64 72 43 72 54 61 62 20 3d 0a 20 20  ->addrCrTab =.  
83c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
83d0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
83e0: 72 65 61 74 65 42 74 72 65 65 2c 20 69 44 62 2c  reateBtree, iDb,
83f0: 20 72 65 67 32 2c 20 42 54 52 45 45 5f 49 4e 54   reg2, BTREE_INT
8400: 4b 45 59 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  KEY);.    }.    
8410: 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65  sqlite3OpenMaste
8420: 72 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  rTable(pParse, i
8430: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
8440: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8450: 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20 72 65  _NewRowid, 0, re
8460: 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g1);.    sqlite3
8470: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
8480: 5f 42 6c 6f 62 2c 20 36 2c 20 72 65 67 33 2c 20  _Blob, 6, reg3, 
8490: 30 2c 20 6e 75 6c 6c 52 6f 77 2c 20 50 34 5f 53  0, nullRow, P4_S
84a0: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
84b0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
84c0: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20 72   OP_Insert, 0, r
84d0: 65 67 33 2c 20 72 65 67 31 29 3b 0a 20 20 20 20  eg3, reg1);.    
84e0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
84f0: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
8500: 50 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69 74  PEND);.    sqlit
8510: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
8520: 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a  OP_Close);.  }..
8530: 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e    /* Normal (non
8540: 2d 65 72 72 6f 72 29 20 72 65 74 75 72 6e 2e 20  -error) return. 
8550: 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  */.  return;..  
8560: 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
8570: 63 63 75 72 73 2c 20 77 65 20 6a 75 6d 70 20 68  ccurs, we jump h
8580: 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62  ere */.begin_tab
8590: 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69  le_error:.  sqli
85a0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
85b0: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ame);.  return;.
85c0: 7d 0a 0a 2f 2a 20 53 65 74 20 70 72 6f 70 65 72  }../* Set proper
85d0: 74 69 65 73 20 6f 66 20 61 20 74 61 62 6c 65 20  ties of a table 
85e0: 63 6f 6c 75 6d 6e 20 62 61 73 65 64 20 6f 6e 20  column based on 
85f0: 74 68 65 20 28 6d 61 67 69 63 61 6c 29 0a 2a 2a  the (magical).**
8600: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   name of the col
8610: 75 6d 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  umn..*/.#if SQLI
8620: 54 45 5f 45 4e 41 42 4c 45 5f 48 49 44 44 45 4e  TE_ENABLE_HIDDEN
8630: 5f 43 4f 4c 55 4d 4e 53 0a 76 6f 69 64 20 73 71  _COLUMNS.void sq
8640: 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65  lite3ColumnPrope
8650: 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28 54 61  rtiesFromName(Ta
8660: 62 6c 65 20 2a 70 54 61 62 2c 20 43 6f 6c 75 6d  ble *pTab, Colum
8670: 6e 20 2a 70 43 6f 6c 29 7b 0a 20 20 69 66 28 20  n *pCol){.  if( 
8680: 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
8690: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 22 5f  (pCol->zName, "_
86a0: 5f 68 69 64 64 65 6e 5f 5f 22 2c 20 31 30 29 3d  _hidden__", 10)=
86b0: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e  =0 ){.    pCol->
86c0: 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46  colFlags |= COLF
86d0: 4c 41 47 5f 48 49 44 44 45 4e 3b 0a 20 20 7d 65  LAG_HIDDEN;.  }e
86e0: 6c 73 65 20 69 66 28 20 70 54 61 62 20 26 26 20  lse if( pTab && 
86f0: 70 43 6f 6c 21 3d 70 54 61 62 2d 3e 61 43 6f 6c  pCol!=pTab->aCol
8700: 20 26 26 20 28 70 43 6f 6c 5b 2d 31 5d 2e 63 6f   && (pCol[-1].co
8710: 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47  lFlags & COLFLAG
8720: 5f 48 49 44 44 45 4e 29 20 29 7b 0a 20 20 20 20  _HIDDEN) ){.    
8730: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
8740: 3d 20 54 46 5f 4f 4f 4f 48 69 64 64 65 6e 3b 0a  = TF_OOOHidden;.
8750: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
8760: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63  *.** Add a new c
8770: 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62  olumn to the tab
8780: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  le currently bei
8790: 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a  ng constructed..
87a0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  **.** The parser
87b0: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
87c0: 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ine once for eac
87d0: 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61  h column declara
87e0: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45  tion.** in a CRE
87f0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
8800: 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61  ent.  sqlite3Sta
8810: 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20 63  rtTable() gets c
8820: 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74  alled.** first t
8830: 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69  o get things goi
8840: 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72  ng.  Then this r
8850: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8860: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c   for each.** col
8870: 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  umn..*/.void sql
8880: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61  ite3AddColumn(Pa
8890: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
88a0: 65 6e 20 2a 70 4e 61 6d 65 2c 20 54 6f 6b 65 6e  en *pName, Token
88b0: 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c   *pType){.  Tabl
88c0: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
88d0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72   char *z;.  char
88e0: 20 2a 7a 54 79 70 65 3b 0a 20 20 43 6f 6c 75 6d   *zType;.  Colum
88f0: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74  n *pCol;.  sqlit
8900: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
8910: 3e 64 62 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  >db;.  if( (p = 
8920: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
8930: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
8940: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  #if SQLITE_MAX_C
8950: 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 6e  OLUMN.  if( p->n
8960: 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69 74  Col+1>db->aLimit
8970: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
8980: 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c  LUMN] ){.    sql
8990: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
89a0: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63  rse, "too many c
89b0: 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70  olumns on %s", p
89c0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
89d0: 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
89e0: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 44 62  .  z = sqlite3Db
89f0: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70 4e  MallocRaw(db, pN
8a00: 61 6d 65 2d 3e 6e 20 2b 20 70 54 79 70 65 2d 3e  ame->n + pType->
8a10: 6e 20 2b 20 32 29 3b 0a 20 20 69 66 28 20 7a 3d  n + 2);.  if( z=
8a20: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d  =0 ) return;.  m
8a30: 65 6d 63 70 79 28 7a 2c 20 70 4e 61 6d 65 2d 3e  emcpy(z, pName->
8a40: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
8a50: 7a 5b 70 4e 61 6d 65 2d 3e 6e 5d 20 3d 20 30 3b  z[pName->n] = 0;
8a60: 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74  .  sqlite3Dequot
8a70: 65 28 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  e(z);.  for(i=0;
8a80: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29   i<p->nCol; i++)
8a90: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
8aa0: 33 5f 73 74 72 69 63 6d 70 28 7a 2c 20 70 2d 3e  3_stricmp(z, p->
8ab0: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  aCol[i].zName)==
8ac0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
8ad0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
8ae0: 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f  e, "duplicate co
8af0: 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20  lumn name: %s", 
8b00: 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  z);.      sqlite
8b10: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a  3DbFree(db, z);.
8b20: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
8b30: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70    }.  }.  if( (p
8b40: 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30  ->nCol & 0x7)==0
8b50: 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a   ){.    Column *
8b60: 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d  aNew;.    aNew =
8b70: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
8b80: 63 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d  c(db,p->aCol,(p-
8b90: 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28  >nCol+8)*sizeof(
8ba0: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  p->aCol[0]));.  
8bb0: 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b    if( aNew==0 ){
8bc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
8bd0: 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20  Free(db, z);.   
8be0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
8bf0: 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61  .    p->aCol = a
8c00: 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20  New;.  }.  pCol 
8c10: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43  = &p->aCol[p->nC
8c20: 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43  ol];.  memset(pC
8c30: 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d  ol, 0, sizeof(p-
8c40: 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43  >aCol[0]));.  pC
8c50: 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20  ol->zName = z;. 
8c60: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72   sqlite3ColumnPr
8c70: 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65  opertiesFromName
8c80: 28 70 2c 20 70 43 6f 6c 29 3b 0a 20 0a 20 20 69  (p, pCol);. .  i
8c90: 66 28 20 70 54 79 70 65 2d 3e 6e 3d 3d 30 20 29  f( pType->n==0 )
8ca0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
8cb0: 65 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65  e is no type spe
8cc0: 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20  cified, columns 
8cd0: 68 61 76 65 20 74 68 65 20 64 65 66 61 75 6c 74  have the default
8ce0: 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20 2a 2a   affinity.    **
8cf0: 20 27 42 4c 4f 42 27 2e 20 2a 2f 0a 20 20 20 20   'BLOB'. */.    
8d00: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
8d10: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
8d20: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a 45 73  ;.    pCol->szEs
8d30: 74 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 1;.  }else{.
8d40: 20 20 20 20 7a 54 79 70 65 20 3d 20 7a 20 2b 20      zType = z + 
8d50: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
8d60: 7a 29 20 2b 20 31 3b 0a 20 20 20 20 6d 65 6d 63  z) + 1;.    memc
8d70: 70 79 28 7a 54 79 70 65 2c 20 70 54 79 70 65 2d  py(zType, pType-
8d80: 3e 7a 2c 20 70 54 79 70 65 2d 3e 6e 29 3b 0a 20  >z, pType->n);. 
8d90: 20 20 20 7a 54 79 70 65 5b 70 54 79 70 65 2d 3e     zType[pType->
8da0: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  n] = 0;.    sqli
8db0: 74 65 33 44 65 71 75 6f 74 65 28 7a 54 79 70 65  te3Dequote(zType
8dc0: 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66  );.    pCol->aff
8dd0: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41  inity = sqlite3A
8de0: 66 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70  ffinityType(zTyp
8df0: 65 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45 73 74 29  e, &pCol->szEst)
8e00: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46  ;.    pCol->colF
8e10: 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
8e20: 48 41 53 54 59 50 45 3b 0a 20 20 7d 0a 20 20 70  HASTYPE;.  }.  p
8e30: 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 20 20 70 50 61 72  ->nCol++;.  pPar
8e40: 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61  se->constraintNa
8e50: 6d 65 2e 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  me.n = 0;.}../*.
8e60: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8e70: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
8e80: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
8e90: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
8ea0: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
8eb0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
8ec0: 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c  nt.  A "NOT NULL
8ed0: 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73  " constraint has
8ee0: 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e  .** been seen on
8ef0: 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73   a column.  This
8f00: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
8f10: 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f  e notNull flag o
8f20: 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20  n.** the column 
8f30: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
8f40: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f  construction..*/
8f50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
8f60: 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70  NotNull(Parse *p
8f70: 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72  Parse, int onErr
8f80: 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  or){.  Table *p;
8f90: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
8fa0: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
8fb0: 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d  p==0 || NEVER(p-
8fc0: 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 65 74 75 72  >nCol<1) ) retur
8fd0: 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  n;.  p->aCol[p->
8fe0: 6e 43 6f 6c 2d 31 5d 2e 6e 6f 74 4e 75 6c 6c 20  nCol-1].notNull 
8ff0: 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20  = (u8)onError;. 
9000: 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20   p->tabFlags |= 
9010: 54 46 5f 48 61 73 4e 6f 74 4e 75 6c 6c 3b 0a 7d  TF_HasNotNull;.}
9020: 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65  ../*.** Scan the
9030: 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d   column type nam
9040: 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20  e zType (length 
9050: 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74 75 72  nType) and retur
9060: 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61  n the.** associa
9070: 74 65 64 20 61 66 66 69 6e 69 74 79 20 74 79 70  ted affinity typ
9080: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
9090: 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73  utine does a cas
90a0: 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65  e-independent se
90b0: 61 72 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f  arch of zType fo
90c0: 72 20 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72  r the .** substr
90d0: 69 6e 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ings in the foll
90e0: 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20  owing table. If 
90f0: 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74  one of the subst
9100: 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e  rings is.** foun
9110: 64 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  d, the correspon
9120: 64 69 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73  ding affinity is
9130: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54   returned. If zT
9140: 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ype contains.** 
9150: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66  more than one of
9160: 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c   the substrings,
9170: 20 65 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20   entries toward 
9180: 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74  the top of .** t
9190: 68 65 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72  he table take pr
91a0: 69 6f 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d  iority. For exam
91b0: 70 6c 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73  ple, if zType is
91c0: 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20   'BLOBINT', .** 
91d0: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
91e0: 45 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ER is returned..
91f0: 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20  **.** Substring 
9200: 20 20 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a      | Affinity.*
9210: 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
9220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9230: 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20  --.** 'INT'     
9240: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
9250: 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41  _INTEGER.** 'CHA
9260: 52 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  R'        | SQLI
9270: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
9280: 43 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53  CLOB'        | S
9290: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a  QLITE_AFF_TEXT.*
92a0: 2a 20 27 54 45 58 54 27 20 20 20 20 20 20 20 20  * 'TEXT'        
92b0: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  | SQLITE_AFF_TEX
92c0: 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20  T.** 'BLOB'     
92d0: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
92e0: 42 4c 4f 42 0a 2a 2a 20 27 52 45 41 4c 27 20 20  BLOB.** 'REAL'  
92f0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
9300: 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41  FF_REAL.** 'FLOA
9310: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
9320: 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44  E_AFF_REAL.** 'D
9330: 4f 55 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  OUB'        | SQ
9340: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a  LITE_AFF_REAL.**
9350: 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74  .** If none of t
9360: 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e  he substrings in
9370: 20 74 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65   the above table
9380: 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53   are found,.** S
9390: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
93a0: 43 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  C is returned..*
93b0: 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41 66  /.char sqlite3Af
93c0: 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74  finityType(const
93d0: 20 63 68 61 72 20 2a 7a 49 6e 2c 20 75 38 20 2a   char *zIn, u8 *
93e0: 70 73 7a 45 73 74 29 7b 0a 20 20 75 33 32 20 68  pszEst){.  u32 h
93f0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66   = 0;.  char aff
9400: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55   = SQLITE_AFF_NU
9410: 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 63  MERIC;.  const c
9420: 68 61 72 20 2a 7a 43 68 61 72 20 3d 20 30 3b 0a  har *zChar = 0;.
9430: 0a 20 20 61 73 73 65 72 74 28 20 7a 49 6e 21 3d  .  assert( zIn!=
9440: 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 7a 49  0 );.  while( zI
9450: 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20  n[0] ){.    h = 
9460: 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33  (h<<8) + sqlite3
9470: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a  UpperToLower[(*z
9480: 49 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a  In)&0xff];.    z
9490: 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d  In++;.    if( h=
94a0: 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27  =(('c'<<24)+('h'
94b0: 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27  <<16)+('a'<<8)+'
94c0: 72 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20  r') ){          
94d0: 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20     /* CHAR */.  
94e0: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
94f0: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 20  _AFF_TEXT;.     
9500: 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 20 20   zChar = zIn;.  
9510: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
9520: 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c  ('c'<<24)+('l'<<
9530: 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27  16)+('o'<<8)+'b'
9540: 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c  ) ){       /* CL
9550: 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  OB */.      aff 
9560: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
9570: 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
9580: 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28   h==(('t'<<24)+(
9590: 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38  'e'<<16)+('x'<<8
95a0: 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20 20  )+'t') ){       
95b0: 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20  /* TEXT */.     
95c0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
95d0: 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73  F_TEXT;.    }els
95e0: 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c  e if( h==(('b'<<
95f0: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
9600: 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20  o'<<8)+'b')     
9610: 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a       /* BLOB */.
9620: 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d          && (aff=
9630: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
9640: 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  RIC || aff==SQLI
9650: 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a  TE_AFF_REAL) ){.
9660: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
9670: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20  TE_AFF_BLOB;.   
9680: 20 20 20 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27     if( zIn[0]=='
9690: 28 27 20 29 20 7a 43 68 61 72 20 3d 20 7a 49 6e  (' ) zChar = zIn
96a0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
96b0: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
96c0: 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20 69  OINT.    }else i
96d0: 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29  f( h==(('r'<<24)
96e0: 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c  +('e'<<16)+('a'<
96f0: 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20 20  <8)+'l')        
9700: 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20    /* REAL */.   
9710: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
9720: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
9730: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
9740: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
9750: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
9760: 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('f'<<24)+('l'
9770: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
9780: 61 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a')          /* 
9790: 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20 20  FLOA */.        
97a0: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
97b0: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
97c0: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
97d0: 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d  _AFF_REAL;.    }
97e0: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 64  else if( h==(('d
97f0: 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29  '<<24)+('o'<<16)
9800: 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20 20  +('u'<<8)+'b')  
9810: 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42 20          /* DOUB 
9820: 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66  */.        && af
9830: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
9840: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61  MERIC ){.      a
9850: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
9860: 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  REAL;.#endif.   
9870: 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30 78   }else if( (h&0x
9880: 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69 27  00FFFFFF)==(('i'
9890: 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27  <<16)+('n'<<8)+'
98a0: 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54  t') ){    /* INT
98b0: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
98c0: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
98d0: 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ER;.      break;
98e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
98f0: 20 49 66 20 70 73 7a 45 73 74 20 69 73 20 6e 6f   If pszEst is no
9900: 74 20 4e 55 4c 4c 2c 20 73 74 6f 72 65 20 61 6e  t NULL, store an
9910: 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
9920: 20 66 69 65 6c 64 20 73 69 7a 65 2e 20 20 54 68   field size.  Th
9930: 65 0a 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 20  e.  ** estimate 
9940: 69 73 20 73 63 61 6c 65 64 20 73 6f 20 74 68 61  is scaled so tha
9950: 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e  t the size of an
9960: 20 69 6e 74 65 67 65 72 20 69 73 20 31 2e 20 20   integer is 1.  
9970: 2a 2f 0a 20 20 69 66 28 20 70 73 7a 45 73 74 20  */.  if( pszEst 
9980: 29 7b 0a 20 20 20 20 2a 70 73 7a 45 73 74 20 3d  ){.    *pszEst =
9990: 20 31 3b 20 20 20 2f 2a 20 64 65 66 61 75 6c 74   1;   /* default
99a0: 20 73 69 7a 65 20 69 73 20 61 70 70 72 6f 78 20   size is approx 
99b0: 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69  4 bytes */.    i
99c0: 66 28 20 61 66 66 3c 53 51 4c 49 54 45 5f 41 46  f( aff<SQLITE_AF
99d0: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
99e0: 20 20 20 69 66 28 20 7a 43 68 61 72 20 29 7b 0a     if( zChar ){.
99f0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a          while( z
9a00: 43 68 61 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20  Char[0] ){.     
9a10: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
9a20: 49 73 64 69 67 69 74 28 7a 43 68 61 72 5b 30 5d  Isdigit(zChar[0]
9a30: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
9a40: 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 20 20   int v = 0;.    
9a50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
9a60: 65 74 49 6e 74 33 32 28 7a 43 68 61 72 2c 20 26  etInt32(zChar, &
9a70: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v);.            
9a80: 76 20 3d 20 76 2f 34 20 2b 20 31 3b 0a 20 20 20  v = v/4 + 1;.   
9a90: 20 20 20 20 20 20 20 20 20 69 66 28 20 76 3e 32           if( v>2
9aa0: 35 35 20 29 20 76 20 3d 20 32 35 35 3b 0a 20 20  55 ) v = 255;.  
9ab0: 20 20 20 20 20 20 20 20 20 20 2a 70 73 7a 45 73            *pszEs
9ac0: 74 20 3d 20 76 3b 20 2f 2a 20 42 4c 4f 42 28 6b  t = v; /* BLOB(k
9ad0: 29 2c 20 56 41 52 43 48 41 52 28 6b 29 2c 20 43  ), VARCHAR(k), C
9ae0: 48 41 52 28 6b 29 20 2d 3e 20 72 3d 28 6b 2f 34  HAR(k) -> r=(k/4
9af0: 2b 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  +1) */.         
9b00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9b10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
9b20: 7a 43 68 61 72 2b 2b 3b 0a 20 20 20 20 20 20 20  zChar++;.       
9b30: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
9b40: 20 20 20 20 20 20 20 20 2a 70 73 7a 45 73 74 20          *pszEst 
9b50: 3d 20 35 3b 20 20 20 2f 2a 20 42 4c 4f 42 2c 20  = 5;   /* BLOB, 
9b60: 54 45 58 54 2c 20 43 4c 4f 42 20 2d 3e 20 72 3d  TEXT, CLOB -> r=
9b70: 35 20 20 28 61 70 70 72 6f 78 20 32 30 20 62 79  5  (approx 20 by
9b80: 74 65 73 29 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  tes)*/.      }. 
9b90: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
9ba0: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
9bb0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
9bc0: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61  s the default va
9bd0: 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 73 74  lue for the most
9be0: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
9bf0: 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65  column.** of the
9c00: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
9c10: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
9c20: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75  ion..**.** Defau
9c30: 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65 73 73  lt value express
9c40: 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63 6f 6e  ions must be con
9c50: 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20 61 6e  stant.  Raise an
9c60: 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68   exception if th
9c70: 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65  is.** is not the
9c80: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   case..**.** Thi
9c90: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
9ca0: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
9cb0: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
9cc0: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
9cd0: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
9ce0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  LE statement..*/
9cf0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
9d00: 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72  DefaultValue(Par
9d10: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
9d20: 53 70 61 6e 20 2a 70 53 70 61 6e 29 7b 0a 20 20  Span *pSpan){.  
9d30: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75  Table *p;.  Colu
9d40: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69  mn *pCol;.  sqli
9d50: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
9d60: 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 70 50 61 72  ->db;.  p = pPar
9d70: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
9d80: 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20 20   if( p!=0 ){.   
9d90: 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f   pCol = &(p->aCo
9da0: 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20  l[p->nCol-1]);. 
9db0: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45     if( !sqlite3E
9dc0: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
9dd0: 75 6e 63 74 69 6f 6e 28 70 53 70 61 6e 2d 3e 70  unction(pSpan->p
9de0: 45 78 70 72 2c 20 64 62 2d 3e 69 6e 69 74 2e 62  Expr, db->init.b
9df0: 75 73 79 29 20 29 7b 0a 20 20 20 20 20 20 73 71  usy) ){.      sq
9e00: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
9e10: 61 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76  arse, "default v
9e20: 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b  alue of column [
9e30: 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  %s] is not const
9e40: 61 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ant",.          
9e50: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
9e60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
9e70: 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 45 78 70  * A copy of pExp
9e80: 72 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61  r is used instea
9e90: 64 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  d of the origina
9ea0: 6c 2c 20 61 73 20 70 45 78 70 72 20 63 6f 6e 74  l, as pExpr cont
9eb0: 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ains.      ** to
9ec0: 6b 65 6e 73 20 74 68 61 74 20 70 6f 69 6e 74 20  kens that point 
9ed0: 74 6f 20 76 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f  to volatile memo
9ee0: 72 79 2e 20 54 68 65 20 27 73 70 61 6e 27 20 6f  ry. The 'span' o
9ef0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
9f00: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71  .      ** is req
9f10: 75 69 72 65 64 20 62 79 20 70 72 61 67 6d 61 20  uired by pragma 
9f20: 74 61 62 6c 65 5f 69 6e 66 6f 2e 0a 20 20 20 20  table_info..    
9f30: 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20    */.      Expr 
9f40: 78 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  x;.      sqlite3
9f50: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
9f60: 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20  Col->pDflt);.   
9f70: 20 20 20 6d 65 6d 73 65 74 28 26 78 2c 20 30 2c     memset(&x, 0,
9f80: 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20   sizeof(x));.   
9f90: 20 20 20 78 2e 6f 70 20 3d 20 54 4b 5f 53 50 41     x.op = TK_SPA
9fa0: 4e 3b 0a 20 20 20 20 20 20 78 2e 75 2e 7a 54 6f  N;.      x.u.zTo
9fb0: 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ken = sqlite3DbS
9fc0: 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72  trNDup(db, (char
9fd0: 2a 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c  *)pSpan->zStart,
9fe0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a000: 20 20 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e       (int)(pSpan
a010: 2d 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e  ->zEnd - pSpan->
a020: 7a 53 74 61 72 74 29 29 3b 0a 20 20 20 20 20 20  zStart));.      
a030: 78 2e 70 4c 65 66 74 20 3d 20 70 53 70 61 6e 2d  x.pLeft = pSpan-
a040: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 78 2e  >pExpr;.      x.
a050: 66 6c 61 67 73 20 3d 20 45 50 5f 53 6b 69 70 3b  flags = EP_Skip;
a060: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66  .      pCol->pDf
a070: 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  lt = sqlite3Expr
a080: 44 75 70 28 64 62 2c 20 26 78 2c 20 45 58 50 52  Dup(db, &x, EXPR
a090: 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20  DUP_REDUCE);.   
a0a0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
a0b0: 28 64 62 2c 20 78 2e 75 2e 7a 54 6f 6b 65 6e 29  (db, x.u.zToken)
a0c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
a0d0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
a0e0: 64 62 2c 20 70 53 70 61 6e 2d 3e 70 45 78 70 72  db, pSpan->pExpr
a0f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 61 63 6b  );.}../*.** Back
a100: 77 61 72 64 73 20 43 6f 6d 70 61 74 69 62 69 6c  wards Compatibil
a110: 69 74 79 20 48 61 63 6b 3a 0a 2a 2a 20 0a 2a 2a  ity Hack:.** .**
a120: 20 48 69 73 74 6f 72 69 63 61 6c 20 76 65 72 73   Historical vers
a130: 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61  ions of SQLite a
a140: 63 63 65 70 74 65 64 20 73 74 72 69 6e 67 73 20  ccepted strings 
a150: 61 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  as column names 
a160: 69 6e 0a 2a 2a 20 69 6e 64 65 78 65 73 20 61 6e  in.** indexes an
a170: 64 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  d PRIMARY KEY co
a180: 6e 73 74 72 61 69 6e 74 73 20 61 6e 64 20 69 6e  nstraints and in
a190: 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
a1a0: 6e 74 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a  nts.  Example:.*
a1b0: 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20  *.**     CREATE 
a1c0: 54 41 42 4c 45 20 78 79 7a 28 61 2c 62 2c 63 2c  TABLE xyz(a,b,c,
a1d0: 64 2c 65 2c 50 52 49 4d 41 52 59 20 4b 45 59 28  d,e,PRIMARY KEY(
a1e0: 27 61 27 29 2c 55 4e 49 51 55 45 28 27 62 27 2c  'a'),UNIQUE('b',
a1f0: 27 63 27 20 43 4f 4c 4c 41 54 45 20 74 72 69 6d  'c' COLLATE trim
a200: 29 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20  ).**     CREATE 
a210: 49 4e 44 45 58 20 61 62 63 20 4f 4e 20 78 79 7a  INDEX abc ON xyz
a220: 28 27 63 27 2c 27 64 27 20 44 45 53 43 2c 27 65  ('c','d' DESC,'e
a230: 27 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  ' COLLATE nocase
a240: 20 44 45 53 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68   DESC);.**.** Th
a250: 69 73 20 69 73 20 67 6f 6f 66 79 2e 20 20 42 75  is is goofy.  Bu
a260: 74 20 74 6f 20 70 72 65 73 65 72 76 65 20 62 61  t to preserve ba
a270: 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
a280: 69 6c 69 74 79 20 77 65 20 63 6f 6e 74 69 6e 75  ility we continu
a290: 65 20 74 6f 0a 2a 2a 20 61 63 63 65 70 74 20 69  e to.** accept i
a2a0: 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
a2b0: 20 64 6f 65 73 20 74 68 65 20 6e 65 63 65 73 73   does the necess
a2c0: 61 72 79 20 63 6f 6e 76 65 72 73 69 6f 6e 2e 20  ary conversion. 
a2d0: 20 49 74 20 63 6f 6e 76 65 72 74 73 0a 2a 2a 20   It converts.** 
a2e0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 67  the expression g
a2f0: 69 76 65 6e 20 69 6e 20 69 74 73 20 61 72 67 75  iven in its argu
a300: 6d 65 6e 74 20 66 72 6f 6d 20 61 20 54 4b 5f 53  ment from a TK_S
a310: 54 52 49 4e 47 20 69 6e 74 6f 20 61 20 54 4b 5f  TRING into a TK_
a320: 49 44 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 70  ID.** if the exp
a330: 72 65 73 73 69 6f 6e 20 69 73 20 6a 75 73 74 20  ression is just 
a340: 61 20 54 4b 5f 53 54 52 49 4e 47 20 77 69 74 68  a TK_STRING with
a350: 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 43 4f 4c   an optional COL
a360: 4c 41 54 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20  LATE clause..** 
a370: 49 66 20 74 68 65 20 65 70 78 72 65 73 73 69 6f  If the epxressio
a380: 6e 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6f 74  n is anything ot
a390: 68 65 72 20 74 68 61 6e 20 54 4b 5f 53 54 52 49  her than TK_STRI
a3a0: 4e 47 2c 20 74 68 65 20 65 78 70 72 65 73 73 69  NG, the expressi
a3b0: 6f 6e 20 69 73 0a 2a 2a 20 75 6e 63 68 61 6e 67  on is.** unchang
a3c0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
a3d0: 69 64 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67  id sqlite3String
a3e0: 54 6f 49 64 28 45 78 70 72 20 2a 70 29 7b 0a 20  ToId(Expr *p){. 
a3f0: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53   if( p->op==TK_S
a400: 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e  TRING ){.    p->
a410: 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 65  op = TK_ID;.  }e
a420: 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  lse if( p->op==T
a430: 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 70 2d 3e  K_COLLATE && p->
a440: 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 54  pLeft->op==TK_ST
a450: 52 49 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e 70  RING ){.    p->p
a460: 4c 65 66 74 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44  Left->op = TK_ID
a470: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
a480: 65 73 69 67 6e 61 74 65 20 74 68 65 20 50 52 49  esignate the PRI
a490: 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65  MARY KEY for the
a4a0: 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69   table.  pList i
a4b0: 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65  s a list of name
a4c0: 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73  s .** of columns
a4d0: 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70   that form the p
a4e0: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
a4f0: 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74  pList is NULL, t
a500: 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20  hen the.** most 
a510: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63  recently added c
a520: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62  olumn of the tab
a530: 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72  le is the primar
a540: 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  y key..**.** A t
a550: 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74  able can have at
a560: 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72   most one primar
a570: 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74  y key.  If the t
a580: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73  able already has
a590: 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65  .** a primary ke
a5a0: 79 20 28 61 6e 64 20 74 68 69 73 20 69 73 20 74  y (and this is t
a5b0: 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72  he second primar
a5c0: 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61  y key) then crea
a5d0: 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a  te an.** error..
a5e0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49  **.** If the PRI
a5f0: 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61  MARY KEY is on a
a600: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77   single column w
a610: 68 6f 73 65 20 64 61 74 61 74 79 70 65 20 69 73  hose datatype is
a620: 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65   INTEGER,.** the
a630: 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f  n we will try to
a640: 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e   use that column
a650: 20 61 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20   as the rowid.  
a660: 53 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50  Set the Table.iP
a670: 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20  Key.** field of 
a680: 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20  the table under 
a690: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20  construction to 
a6a0: 62 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  be the index of 
a6b0: 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50  the.** INTEGER P
a6c0: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
a6d0: 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20  n.  Table.iPKey 
a6e0: 69 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20  is set to -1 if 
a6f0: 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49  there is.** no I
a700: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
a710: 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  EY..**.** If the
a720: 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49   key is not an I
a730: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
a740: 45 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  EY, then create 
a750: 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65  a unique.** inde
a760: 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20  x for the key.  
a770: 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65 61  No index is crea
a780: 74 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20  ted for INTEGER 
a790: 50 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f  PRIMARY KEYs..*/
a7a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
a7b0: 50 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61  PrimaryKey(.  Pa
a7c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
a7d0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
a7e0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
a7f0: 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73   *pList,  /* Lis
a800: 74 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73  t of field names
a810: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
a820: 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
a830: 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
a840: 20 64 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75   do with a uniqu
a850: 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a  eness conflict *
a860: 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c  /.  int autoInc,
a870: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
a880: 20 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45   the AUTOINCREME
a890: 4e 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  NT keyword is pr
a8a0: 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73  esent */.  int s
a8b0: 6f 72 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20  ortOrder     /* 
a8c0: 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72  SQLITE_SO_ASC or
a8d0: 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20   SQLITE_SO_DESC 
a8e0: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
a8f0: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
a900: 65 77 54 61 62 6c 65 3b 0a 20 20 43 6f 6c 75 6d  ewTable;.  Colum
a910: 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69  n *pCol = 0;.  i
a920: 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b  nt iCol = -1, i;
a930: 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20  .  int nTerm;.  
a940: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f  if( pTab==0 ) go
a950: 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  to primary_key_e
a960: 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d  xit;.  if( pTab-
a970: 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48  >tabFlags & TF_H
a980: 61 73 50 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a  asPrimaryKey ){.
a990: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
a9a0: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
a9b0: 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22     "table \"%s\"
a9c0: 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
a9d0: 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c  ne primary key",
a9e0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
a9f0: 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f     goto primary_
aa00: 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20  key_exit;.  }.  
aa10: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
aa20: 3d 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b  = TF_HasPrimaryK
aa30: 65 79 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  ey;.  if( pList=
aa40: 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  =0 ){.    iCol =
aa50: 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b   pTab->nCol - 1;
aa60: 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61  .    pCol = &pTa
aa70: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20  b->aCol[iCol];. 
aa80: 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67     pCol->colFlag
aa90: 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49  s |= COLFLAG_PRI
aaa0: 4d 4b 45 59 3b 0a 20 20 20 20 6e 54 65 72 6d 20  MKEY;.    nTerm 
aab0: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
aac0: 20 20 6e 54 65 72 6d 20 3d 20 70 4c 69 73 74 2d    nTerm = pList-
aad0: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28  >nExpr;.    for(
aae0: 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b  i=0; i<nTerm; i+
aaf0: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
ab00: 70 43 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  pCExpr = sqlite3
ab10: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
ab20: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
ab30: 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
ab40: 28 20 70 43 45 78 70 72 21 3d 30 20 29 3b 0a 20  ( pCExpr!=0 );. 
ab50: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 69       sqlite3Stri
ab60: 6e 67 54 6f 49 64 28 70 43 45 78 70 72 29 3b 0a  ngToId(pCExpr);.
ab70: 20 20 20 20 20 20 69 66 28 20 70 43 45 78 70 72        if( pCExpr
ab80: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20  ->op==TK_ID ){. 
ab90: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
aba0: 72 20 2a 7a 43 4e 61 6d 65 20 3d 20 70 43 45 78  r *zCName = pCEx
abb0: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
abc0: 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30        for(iCol=0
abd0: 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  ; iCol<pTab->nCo
abe0: 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  l; iCol++){.    
abf0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
ac00: 33 53 74 72 49 43 6d 70 28 7a 43 4e 61 6d 65 2c  3StrICmp(zCName,
ac10: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
ac20: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
ac30: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
ac40: 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  = &pTab->aCol[iC
ac50: 6f 6c 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ol];.           
ac60: 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
ac70: 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b  |= COLFLAG_PRIMK
ac80: 45 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EY;.            
ac90: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
aca0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
acb0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
acc0: 20 69 66 28 20 6e 54 65 72 6d 3d 3d 31 0a 20 20   if( nTerm==1.  
acd0: 20 26 26 20 70 43 6f 6c 0a 20 20 20 26 26 20 73   && pCol.   && s
ace0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 73 71  qlite3StrICmp(sq
acf0: 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28  lite3ColumnType(
ad00: 70 43 6f 6c 2c 22 22 29 2c 20 22 49 4e 54 45 47  pCol,""), "INTEG
ad10: 45 52 22 29 3d 3d 30 0a 20 20 20 26 26 20 73 6f  ER")==0.   && so
ad20: 72 74 4f 72 64 65 72 21 3d 53 51 4c 49 54 45 5f  rtOrder!=SQLITE_
ad30: 53 4f 5f 44 45 53 43 0a 20 20 29 7b 0a 20 20 20  SO_DESC.  ){.   
ad40: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69   pTab->iPKey = i
ad50: 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b  Col;.    pTab->k
ad60: 65 79 43 6f 6e 66 20 3d 20 28 75 38 29 6f 6e 45  eyConf = (u8)onE
ad70: 72 72 6f 72 3b 0a 20 20 20 20 61 73 73 65 72 74  rror;.    assert
ad80: 28 20 61 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20  ( autoInc==0 || 
ad90: 61 75 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20 20  autoInc==1 );.  
ada0: 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73    pTab->tabFlags
adb0: 20 7c 3d 20 61 75 74 6f 49 6e 63 2a 54 46 5f 41   |= autoInc*TF_A
adc0: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 20 20  utoincrement;.  
add0: 20 20 69 66 28 20 70 4c 69 73 74 20 29 20 70 50    if( pList ) pP
ade0: 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64  arse->iPkSortOrd
adf0: 65 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  er = pList->a[0]
ae00: 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 65  .sortOrder;.  }e
ae10: 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20  lse if( autoInc 
ae20: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
ae30: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
ae40: 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33  MENT.    sqlite3
ae50: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
ae60: 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20   "AUTOINCREMENT 
ae70: 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20  is only allowed 
ae80: 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22  on an ".       "
ae90: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
aea0: 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20  KEY");.#endif.  
aeb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
aec0: 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50  e3CreateIndex(pP
aed0: 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70  arse, 0, 0, 0, p
aee0: 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30  List, onError, 0
aef0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
af10: 73 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20 53 51  sortOrder, 0, SQ
af20: 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49  LITE_IDXTYPE_PRI
af30: 4d 41 52 59 4b 45 59 29 3b 0a 20 20 20 20 70 4c  MARYKEY);.    pL
af40: 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72  ist = 0;.  }..pr
af50: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a  imary_key_exit:.
af60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
af70: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
af80: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65  db, pList);.  re
af90: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  turn;.}../*.** A
afa0: 64 64 20 61 20 6e 65 77 20 43 48 45 43 4b 20 63  dd a new CHECK c
afb0: 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 74 68 65  onstraint to the
afc0: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
afd0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
afe0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
aff0: 69 74 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73  ite3AddCheckCons
b000: 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20  traint(.  Parse 
b010: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
b020: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
b030: 2f 0a 20 20 45 78 70 72 20 2a 70 43 68 65 63 6b  /.  Expr *pCheck
b040: 45 78 70 72 20 20 2f 2a 20 54 68 65 20 63 68 65  Expr  /* The che
b050: 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  ck expression */
b060: 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
b070: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20  TE_OMIT_CHECK.  
b080: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50  Table *pTab = pP
b090: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
b0a0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
b0b0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
b0c0: 66 28 20 70 54 61 62 20 26 26 20 21 49 4e 5f 44  f( pTab && !IN_D
b0d0: 45 43 4c 41 52 45 5f 56 54 41 42 0a 20 20 20 26  ECLARE_VTAB.   &
b0e0: 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 49  & !sqlite3BtreeI
b0f0: 73 52 65 61 64 6f 6e 6c 79 28 64 62 2d 3e 61 44  sReadonly(db->aD
b100: 62 5b 64 62 2d 3e 69 6e 69 74 2e 69 44 62 5d 2e  b[db->init.iDb].
b110: 70 42 74 29 0a 20 20 29 7b 0a 20 20 20 20 70 54  pBt).  ){.    pT
b120: 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c  ab->pCheck = sql
b130: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
b140: 6e 64 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d  nd(pParse, pTab-
b150: 3e 70 43 68 65 63 6b 2c 20 70 43 68 65 63 6b 45  >pCheck, pCheckE
b160: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50  xpr);.    if( pP
b170: 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74  arse->constraint
b180: 4e 61 6d 65 2e 6e 20 29 7b 0a 20 20 20 20 20 20  Name.n ){.      
b190: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
b1a0: 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  etName(pParse, p
b1b0: 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 26 70 50  Tab->pCheck, &pP
b1c0: 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74  arse->constraint
b1d0: 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  Name, 1);.    }.
b1e0: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
b1f0: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   {.    sqlite3Ex
b200: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
b210: 3e 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29  >db, pCheckExpr)
b220: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
b230: 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  et the collation
b240: 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65   function of the
b250: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70   most recently p
b260: 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75  arsed table colu
b270: 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c  mn.** to the Col
b280: 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76  lSeq given..*/.v
b290: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
b2a0: 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73 65 20  llateType(Parse 
b2b0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
b2c0: 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65  pToken){.  Table
b2d0: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
b2e0: 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20  char *zColl;    
b2f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 71            /* Deq
b300: 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f  uoted name of co
b310: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
b320: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
b330: 62 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70  b;..  if( (p = p
b340: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
b350: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
b360: 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a   i = p->nCol-1;.
b370: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
b380: 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c  b;.  zColl = sql
b390: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
b3a0: 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20  n(db, pToken);. 
b3b0: 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65   if( !zColl ) re
b3c0: 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c  turn;..  if( sql
b3d0: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
b3e0: 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29  q(pParse, zColl)
b3f0: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
b400: 49 64 78 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Idx;.    sqlite3
b410: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
b420: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a 20 20  ol[i].zColl);.  
b430: 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f    p->aCol[i].zCo
b440: 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20  ll = zColl;.  . 
b450: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
b460: 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20  umn is declared 
b470: 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41  as "<name> PRIMA
b480: 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c  RY KEY COLLATE <
b490: 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74  type>",.    ** t
b4a0: 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79  hen an index may
b4b0: 20 68 61 76 65 20 62 65 65 6e 20 63 72 65 61 74   have been creat
b4c0: 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d  ed on this colum
b4d0: 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20  n before the.   
b4e0: 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79   ** collation ty
b4f0: 70 65 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f  pe was added. Co
b500: 72 72 65 63 74 20 74 68 69 73 20 69 66 20 69 74  rrect this if it
b510: 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20   is the case..  
b520: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 49 64    */.    for(pId
b530: 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  x=p->pIndex; pId
b540: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
b550: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
b560: 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  rt( pIdx->nKeyCo
b570: 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  l==1 );.      if
b580: 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
b590: 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20  [0]==i ){.      
b5a0: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30    pIdx->azColl[0
b5b0: 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  ] = p->aCol[i].z
b5c0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
b5d0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
b5e0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
b5f0: 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d  b, zColl);.  }.}
b600: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
b610: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
b620: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
b630: 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62 61 73  ence for databas
b640: 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a  e native text.**
b650: 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69   encoding identi
b660: 66 69 65 64 20 62 79 20 74 68 65 20 73 74 72 69  fied by the stri
b670: 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68  ng zName, length
b680: 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   nName..**.** If
b690: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
b6a0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
b6b0: 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  e is not availab
b6c0: 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c  le, or not avail
b6d0: 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64  able.** in the d
b6e0: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 65  atabase native e
b6f0: 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c  ncoding, the col
b700: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69  lation factory i
b710: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20  s invoked to.** 
b720: 72 65 71 75 65 73 74 20 69 74 2e 20 49 66 20 74  request it. If t
b730: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
b740: 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75  tory does not su
b750: 70 70 6c 79 20 73 75 63 68 20 61 20 73 65 71 75  pply such a sequ
b760: 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65  ence,.** and the
b770: 20 73 65 71 75 65 6e 63 65 20 69 73 20 61 76 61   sequence is ava
b780: 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65  ilable in anothe
b790: 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c  r text encoding,
b7a0: 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a   then that is.**
b7b0: 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61   returned instea
b7c0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76  d..**.** If no v
b7d0: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72  ersions of the r
b7e0: 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69  equested collati
b7f0: 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61 72 65  ons sequence are
b800: 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a   available, or.*
b810: 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20  * another error 
b820: 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20  occurs, NULL is 
b830: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20  returned and an 
b840: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72  error message wr
b850: 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50  itten into.** pP
b860: 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  arse..**.** This
b870: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 77 72   routine is a wr
b880: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c  apper around sql
b890: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
b8a0: 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ).  This routine
b8b0: 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  .** invokes the 
b8c0: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
b8d0: 79 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 63  y if the named c
b8e0: 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  ollation cannot 
b8f0: 62 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20  be found.** and 
b900: 67 65 6e 65 72 61 74 65 73 20 61 6e 20 65 72 72  generates an err
b910: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a  or message..**.*
b920: 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69  * See also: sqli
b930: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29  te3FindCollSeq()
b940: 2c 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c  , sqlite3GetColl
b950: 53 65 71 28 29 0a 2a 2f 0a 43 6f 6c 6c 53 65 71  Seq().*/.CollSeq
b960: 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43   *sqlite3LocateC
b970: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
b980: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
b990: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69   *zName){.  sqli
b9a0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
b9b0: 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d  ->db;.  u8 enc =
b9c0: 20 45 4e 43 28 64 62 29 3b 0a 20 20 75 38 20 69   ENC(db);.  u8 i
b9d0: 6e 69 74 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e  nitbusy = db->in
b9e0: 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53  it.busy;.  CollS
b9f0: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43  eq *pColl;..  pC
ba00: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
ba10: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63  dCollSeq(db, enc
ba20: 2c 20 7a 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73  , zName, initbus
ba30: 79 29 3b 0a 20 20 69 66 28 20 21 69 6e 69 74 62  y);.  if( !initb
ba40: 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c  usy && (!pColl |
ba50: 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20  | !pColl->xCmp) 
ba60: 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  ){.    pColl = s
ba70: 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71  qlite3GetCollSeq
ba80: 28 70 50 61 72 73 65 2c 20 65 6e 63 2c 20 70 43  (pParse, enc, pC
ba90: 6f 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d  oll, zName);.  }
baa0: 0a 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c  ..  return pColl
bab0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ;.}.../*.** Gene
bac0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
bad0: 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  ill increment th
bae0: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
baf0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d  .**.** The schem
bb00: 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64  a cookie is used
bb10: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
bb20: 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f  en the schema fo
bb30: 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  r the.** databas
bb40: 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65  e changes.  Afte
bb50: 72 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68  r each schema ch
bb60: 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65  ange, the cookie
bb70: 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65   value.** change
bb80: 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65  s.  When a proce
bb90: 73 73 20 66 69 72 73 74 20 72 65 61 64 73 20 74  ss first reads t
bba0: 68 65 20 73 63 68 65 6d 61 20 69 74 20 72 65 63  he schema it rec
bbb0: 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b  ords the.** cook
bbc0: 69 65 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c  ie.  Thereafter,
bbd0: 20 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65   whenever it goe
bbe0: 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  s to access the 
bbf0: 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20  database,.** it 
bc00: 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69  checks the cooki
bc10: 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
bc20: 68 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f  he schema has no
bc30: 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e  t changed.** sin
bc40: 63 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 72  ce it was last r
bc50: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ead..**.** This 
bc60: 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70  plan is not comp
bc70: 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72  letely bullet-pr
bc80: 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73  oof.  It is poss
bc90: 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  ible for.** the 
bca0: 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65  schema to change
bcb0: 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20   multiple times 
bcc0: 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b  and for the cook
bcd0: 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20  ie to be.** set 
bce0: 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61  back to prior va
bcf0: 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61  lue.  But schema
bd00: 20 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66   changes are inf
bd10: 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74  requent.** and t
bd20: 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  he probability o
bd30: 66 20 68 69 74 74 69 6e 67 20 74 68 65 20 73 61  f hitting the sa
bd40: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  me cookie value 
bd50: 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61  is only.** 1 cha
bd60: 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f  nce in 2^32.  So
bd70: 20 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75   we're safe enou
bd80: 67 68 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d  gh..**.** IMPLEM
bd90: 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 33  ENTATION-OF: R-3
bda0: 34 32 33 30 2d 35 36 30 34 39 20 53 51 4c 69 74  4230-56049 SQLit
bdb0: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
bdc0: 69 6e 63 72 65 6d 65 6e 74 73 0a 2a 2a 20 74 68  increments.** th
bdd0: 65 20 73 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e  e schema-version
bde0: 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 73 63   whenever the sc
bdf0: 68 65 6d 61 20 63 68 61 6e 67 65 73 2e 0a 2a 2f  hema changes..*/
be00: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68 61  .void sqlite3Cha
be10: 6e 67 65 43 6f 6f 6b 69 65 28 50 61 72 73 65 20  ngeCookie(Parse 
be20: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62  *pParse, int iDb
be30: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
be40: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
be50: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
be60: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
be70: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
be80: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
be90: 44 62 2c 20 30 29 20 29 3b 0a 20 20 73 71 6c 69  Db, 0) );.  sqli
bea0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
beb0: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
bec0: 44 62 2c 20 42 54 52 45 45 5f 53 43 48 45 4d 41  Db, BTREE_SCHEMA
bed0: 5f 56 45 52 53 49 4f 4e 2c 20 0a 20 20 20 20 20  _VERSION, .     
bee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
bef0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
bf00: 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b  ema->schema_cook
bf10: 69 65 2b 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ie+1);.}../*.** 
bf20: 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62  Measure the numb
bf30: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
bf40: 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75   needed to outpu
bf50: 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69  t the given.** i
bf60: 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20  dentifier.  The 
bf70: 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20  number returned 
bf80: 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f  includes any quo
bf90: 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20  tes used.** but 
bfa0: 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65  does not include
bfb0: 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e   the null termin
bfc0: 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
bfd0: 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e 73  estimate is cons
bfe0: 65 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d 69  ervative.  It mi
bff0: 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68  ght be larger th
c000: 61 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72 65  at what is.** re
c010: 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  ally needed..*/.
c020: 73 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74  static int ident
c030: 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61  Length(const cha
c040: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  r *z){.  int n;.
c050: 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e    for(n=0; *z; n
c060: 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, z++){.    if
c070: 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b  ( *z=='"' ){ n++
c080: 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ; }.  }.  return
c090: 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   n + 2;.}../*.**
c0a0: 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d   The first param
c0b0: 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65  eter is a pointe
c0c0: 72 20 74 6f 20 61 6e 20 6f 75 74 70 75 74 20 62  r to an output b
c0d0: 75 66 66 65 72 2e 20 54 68 65 20 73 65 63 6f 6e  uffer. The secon
c0e0: 64 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  d .** parameter 
c0f0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
c100: 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74 20  an integer that 
c110: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6f 66 66  contains the off
c120: 73 65 74 20 61 74 0a 2a 2a 20 77 68 69 63 68 20  set at.** which 
c130: 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68  to write into th
c140: 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e  e output buffer.
c150: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
c160: 6f 70 69 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6c  opies the.** nul
c170: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
c180: 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ng pointed to by
c190: 20 74 68 65 20 74 68 69 72 64 20 70 61 72 61 6d   the third param
c1a0: 65 74 65 72 2c 20 7a 53 69 67 6e 65 64 49 64 65  eter, zSignedIde
c1b0: 6e 74 2c 0a 2a 2a 20 74 6f 20 74 68 65 20 73 70  nt,.** to the sp
c1c0: 65 63 69 66 69 65 64 20 6f 66 66 73 65 74 20 69  ecified offset i
c1d0: 6e 20 74 68 65 20 62 75 66 66 65 72 20 61 6e 64  n the buffer and
c1e0: 20 75 70 64 61 74 65 73 20 2a 70 49 64 78 20 74   updates *pIdx t
c1f0: 6f 20 72 65 66 65 72 0a 2a 2a 20 74 6f 20 74 68  o refer.** to th
c200: 65 20 66 69 72 73 74 20 62 79 74 65 20 61 66 74  e first byte aft
c210: 65 72 20 74 68 65 20 6c 61 73 74 20 62 79 74 65  er the last byte
c220: 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20   written before 
c230: 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a  returning..** .*
c240: 2a 20 49 66 20 74 68 65 20 73 74 72 69 6e 67 20  * If the string 
c250: 7a 53 69 67 6e 65 64 49 64 65 6e 74 20 63 6f 6e  zSignedIdent con
c260: 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f  sists entirely o
c270: 66 20 61 6c 70 68 61 2d 6e 75 6d 65 72 69 63 0a  f alpha-numeric.
c280: 2a 2a 20 63 68 61 72 61 63 74 65 72 73 2c 20 64  ** characters, d
c290: 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69  oes not begin wi
c2a0: 74 68 20 61 20 64 69 67 69 74 20 61 6e 64 20 69  th a digit and i
c2b0: 73 20 6e 6f 74 20 61 6e 20 53 51 4c 20 6b 65 79  s not an SQL key
c2c0: 77 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74  word,.** then it
c2d0: 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68   is copied to th
c2e0: 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
c2f0: 65 78 61 63 74 6c 79 20 61 73 20 69 74 20 69 73  exactly as it is
c300: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20  . Otherwise,.** 
c310: 69 74 20 69 73 20 71 75 6f 74 65 64 20 75 73 69  it is quoted usi
c320: 6e 67 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73  ng double-quotes
c330: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c340: 20 69 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a   identPut(char *
c350: 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68  z, int *pIdx, ch
c360: 61 72 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74  ar *zSignedIdent
c370: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
c380: 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e  ar *zIdent = (un
c390: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 69  signed char*)zSi
c3a0: 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74  gnedIdent;.  int
c3b0: 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65   i, j, needQuote
c3c0: 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 0a  ;.  i = *pIdx;..
c3d0: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
c3e0: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
c3f0: 69 66 28 20 21 73 71 6c 69 74 65 33 49 73 61 6c  if( !sqlite3Isal
c400: 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26  num(zIdent[j]) &
c410: 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27  & zIdent[j]!='_'
c420: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
c430: 6e 65 65 64 51 75 6f 74 65 20 3d 20 73 71 6c 69  needQuote = sqli
c440: 74 65 33 49 73 64 69 67 69 74 28 7a 49 64 65 6e  te3Isdigit(zIden
c450: 74 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20  t[0]).          
c460: 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77    || sqlite3Keyw
c470: 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20  ordCode(zIdent, 
c480: 6a 29 21 3d 54 4b 5f 49 44 0a 20 20 20 20 20 20  j)!=TK_ID.      
c490: 20 20 20 20 20 20 7c 7c 20 7a 49 64 65 6e 74 5b        || zIdent[
c4a0: 6a 5d 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  j]!=0.          
c4b0: 20 20 7c 7c 20 6a 3d 3d 30 3b 0a 0a 20 20 69 66    || j==0;..  if
c4c0: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
c4d0: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f  i++] = '"';.  fo
c4e0: 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d  r(j=0; zIdent[j]
c4f0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b  ; j++){.    z[i+
c500: 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a  +] = zIdent[j];.
c510: 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a      if( zIdent[j
c520: 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20  ]=='"' ) z[i++] 
c530: 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28  = '"';.  }.  if(
c540: 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69   needQuote ) z[i
c550: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69  ++] = '"';.  z[i
c560: 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d  ] = 0;.  *pIdx =
c570: 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   i;.}../*.** Gen
c580: 65 72 61 74 65 20 61 20 43 52 45 41 54 45 20 54  erate a CREATE T
c590: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61  ABLE statement a
c5a0: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
c5b0: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c  he given.** tabl
c5c0: 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f  e.  Memory to ho
c5d0: 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66 20 74  ld the text of t
c5e0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
c5f0: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d  obtained.** from
c600: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
c610: 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
c620: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
c630: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
c640: 61 74 69 63 20 63 68 61 72 20 2a 63 72 65 61 74  atic char *creat
c650: 65 54 61 62 6c 65 53 74 6d 74 28 73 71 6c 69 74  eTableStmt(sqlit
c660: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
c670: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e  ){.  int i, k, n
c680: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b  ;.  char *zStmt;
c690: 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a  .  char *zSep, *
c6a0: 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20  zSep2, *zEnd;.  
c6b0: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
c6c0: 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f  n = 0;.  for(pCo
c6d0: 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30  l = p->aCol, i=0
c6e0: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
c6f0: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e  , pCol++){.    n
c700: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
c710: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b 20 35  pCol->zName) + 5
c720: 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65  ;.  }.  n += ide
c730: 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d  ntLength(p->zNam
c740: 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20 29  e);.  if( n<50 )
c750: 7b 20 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22  { .    zSep = ""
c760: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
c770: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29  ";.    zEnd = ")
c780: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
c790: 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20  zSep = "\n  ";. 
c7a0: 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20     zSep2 = ",\n 
c7b0: 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22   ";.    zEnd = "
c7c0: 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d  \n)";.  }.  n +=
c7d0: 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b   35 + 6*p->nCol;
c7e0: 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74  .  zStmt = sqlit
c7f0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c  e3DbMallocRaw(0,
c800: 20 6e 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74   n);.  if( zStmt
c810: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
c820: 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
c830: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
c840: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  }.  sqlite3_snpr
c850: 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74 2c 20 22  intf(n, zStmt, "
c860: 43 52 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b  CREATE TABLE ");
c870: 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65 33 53 74  .  k = sqlite3St
c880: 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29 3b 0a 20  rlen30(zStmt);. 
c890: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
c8a0: 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a   &k, p->zName);.
c8b0: 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27    zStmt[k++] = '
c8c0: 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70  (';.  for(pCol=p
c8d0: 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70  ->aCol, i=0; i<p
c8e0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
c8f0: 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 61 74 69 63  l++){.    static
c900: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f   const char * co
c910: 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20 3d 20 7b  nst azType[] = {
c920: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49  .        /* SQLI
c930: 54 45 5f 41 46 46 5f 42 4c 4f 42 20 20 20 20 2a  TE_AFF_BLOB    *
c940: 2f 20 22 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a  / "",.        /*
c950: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
c960: 20 20 20 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a      */ " TEXT",.
c970: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
c980: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 2a 2f  E_AFF_NUMERIC */
c990: 20 22 20 4e 55 4d 22 2c 0a 20 20 20 20 20 20 20   " NUM",.       
c9a0: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49   /* SQLITE_AFF_I
c9b0: 4e 54 45 47 45 52 20 2a 2f 20 22 20 49 4e 54 22  NTEGER */ " INT"
c9c0: 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  ,.        /* SQL
c9d0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20  ITE_AFF_REAL    
c9e0: 2a 2f 20 22 20 52 45 41 4c 22 0a 20 20 20 20 7d  */ " REAL".    }
c9f0: 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  ;.    int len;. 
ca00: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
ca10: 54 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74  Type;..    sqlit
ca20: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c  e3_snprintf(n-k,
ca30: 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70   &zStmt[k], zSep
ca40: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69  );.    k += sqli
ca50: 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 53 74  te3Strlen30(&zSt
ca60: 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70  mt[k]);.    zSep
ca70: 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64   = zSep2;.    id
ca80: 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b  entPut(zStmt, &k
ca90: 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCol->zName);.
caa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
cab0: 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54  ->affinity-SQLIT
cac0: 45 5f 41 46 46 5f 42 4c 4f 42 20 3e 3d 20 30 20  E_AFF_BLOB >= 0 
cad0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
cae0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51  Col->affinity-SQ
caf0: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 3c 20  LITE_AFF_BLOB < 
cb00: 41 72 72 61 79 53 69 7a 65 28 61 7a 54 79 70 65  ArraySize(azType
cb10: 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ) );.    testcas
cb20: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
cb30: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  y==SQLITE_AFF_BL
cb40: 4f 42 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  OB );.    testca
cb50: 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  se( pCol->affini
cb60: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ty==SQLITE_AFF_T
cb70: 45 58 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63  EXT );.    testc
cb80: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
cb90: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
cba0: 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 74  NUMERIC );.    t
cbb0: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
cbc0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
cbd0: 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20  AFF_INTEGER );. 
cbe0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f     testcase( pCo
cbf0: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
cc00: 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29 3b 0a  ITE_AFF_REAL );.
cc10: 20 20 20 20 0a 20 20 20 20 7a 54 79 70 65 20 3d      .    zType =
cc20: 20 61 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e 61 66   azType[pCol->af
cc30: 66 69 6e 69 74 79 20 2d 20 53 51 4c 49 54 45 5f  finity - SQLITE_
cc40: 41 46 46 5f 42 4c 4f 42 5d 3b 0a 20 20 20 20 6c  AFF_BLOB];.    l
cc50: 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  en = sqlite3Strl
cc60: 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20 20 20  en30(zType);.   
cc70: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61   assert( pCol->a
cc80: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
cc90: 41 46 46 5f 42 4c 4f 42 20 0a 20 20 20 20 20 20  AFF_BLOB .      
cca0: 20 20 20 20 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61        || pCol->a
ccb0: 66 66 69 6e 69 74 79 3d 3d 73 71 6c 69 74 65 33  ffinity==sqlite3
ccc0: 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79  AffinityType(zTy
ccd0: 70 65 2c 20 30 29 20 29 3b 0a 20 20 20 20 6d 65  pe, 0) );.    me
cce0: 6d 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20  mcpy(&zStmt[k], 
ccf0: 7a 54 79 70 65 2c 20 6c 65 6e 29 3b 0a 20 20 20  zType, len);.   
cd00: 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 61   k += len;.    a
cd10: 73 73 65 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20  ssert( k<=n );. 
cd20: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70   }.  sqlite3_snp
cd30: 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d  rintf(n-k, &zStm
cd40: 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64  t[k], "%s", zEnd
cd50: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d  );.  return zStm
cd60: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69  t;.}../*.** Resi
cd70: 7a 65 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65  ze an Index obje
cd80: 63 74 20 74 6f 20 68 6f 6c 64 20 4e 20 63 6f 6c  ct to hold N col
cd90: 75 6d 6e 73 20 74 6f 74 61 6c 2e 20 20 52 65 74  umns total.  Ret
cda0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
cdb0: 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20   on success and 
cdc0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 6e 20  SQLITE_NOMEM on 
cdd0: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 0a 2a 2f  an OOM error..*/
cde0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 69  .static int resi
cdf0: 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 73 71  zeIndexObject(sq
ce00: 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78  lite3 *db, Index
ce10: 20 2a 70 49 64 78 2c 20 69 6e 74 20 4e 29 7b 0a   *pIdx, int N){.
ce20: 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a    char *zExtra;.
ce30: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69    int nByte;.  i
ce40: 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  f( pIdx->nColumn
ce50: 3e 3d 4e 20 29 20 72 65 74 75 72 6e 20 53 51 4c  >=N ) return SQL
ce60: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
ce70: 28 20 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65  ( pIdx->isResize
ce80: 64 3d 3d 30 20 29 3b 0a 20 20 6e 42 79 74 65 20  d==0 );.  nByte 
ce90: 3d 20 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  = (sizeof(char*)
cea0: 20 2b 20 73 69 7a 65 6f 66 28 69 31 36 29 20 2b   + sizeof(i16) +
ceb0: 20 31 29 2a 4e 3b 0a 20 20 7a 45 78 74 72 61 20   1)*N;.  zExtra 
cec0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
ced0: 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29  cZero(db, nByte)
cee0: 3b 0a 20 20 69 66 28 20 7a 45 78 74 72 61 3d 3d  ;.  if( zExtra==
cef0: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
cf00: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
cf10: 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70  memcpy(zExtra, p
cf20: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 2c 20 73 69 7a  Idx->azColl, siz
cf30: 65 6f 66 28 63 68 61 72 2a 29 2a 70 49 64 78 2d  eof(char*)*pIdx-
cf40: 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64  >nColumn);.  pId
cf50: 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e  x->azColl = (con
cf60: 73 74 20 63 68 61 72 2a 2a 29 7a 45 78 74 72 61  st char**)zExtra
cf70: 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69  ;.  zExtra += si
cf80: 7a 65 6f 66 28 63 68 61 72 2a 29 2a 4e 3b 0a 20  zeof(char*)*N;. 
cf90: 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20   memcpy(zExtra, 
cfa0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20  pIdx->aiColumn, 
cfb0: 73 69 7a 65 6f 66 28 69 31 36 29 2a 70 49 64 78  sizeof(i16)*pIdx
cfc0: 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49  ->nColumn);.  pI
cfd0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28  dx->aiColumn = (
cfe0: 69 31 36 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a  i16*)zExtra;.  z
cff0: 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28  Extra += sizeof(
d000: 69 31 36 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79  i16)*N;.  memcpy
d010: 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61  (zExtra, pIdx->a
d020: 53 6f 72 74 4f 72 64 65 72 2c 20 70 49 64 78 2d  SortOrder, pIdx-
d030: 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64  >nColumn);.  pId
d040: 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  x->aSortOrder = 
d050: 28 75 38 2a 29 7a 45 78 74 72 61 3b 0a 20 20 70  (u8*)zExtra;.  p
d060: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 4e  Idx->nColumn = N
d070: 3b 0a 20 20 70 49 64 78 2d 3e 69 73 52 65 73 69  ;.  pIdx->isResi
d080: 7a 65 64 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  zed = 1;.  retur
d090: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d0a0: 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
d0b0: 68 65 20 74 6f 74 61 6c 20 72 6f 77 20 77 69 64  he total row wid
d0c0: 74 68 20 66 6f 72 20 61 20 74 61 62 6c 65 2e 0a  th for a table..
d0d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
d0e0: 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74  stimateTableWidt
d0f0: 68 28 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a  h(Table *pTab){.
d100: 20 20 75 6e 73 69 67 6e 65 64 20 77 54 61 62 6c    unsigned wTabl
d110: 65 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 43  e = 0;.  const C
d120: 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a  olumn *pTabCol;.
d130: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
d140: 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61  =pTab->nCol, pTa
d150: 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  bCol=pTab->aCol;
d160: 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 61 62 43   i>0; i--, pTabC
d170: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 77 54 61 62 6c  ol++){.    wTabl
d180: 65 20 2b 3d 20 70 54 61 62 43 6f 6c 2d 3e 73 7a  e += pTabCol->sz
d190: 45 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  Est;.  }.  if( p
d1a0: 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 29 20 77  Tab->iPKey<0 ) w
d1b0: 54 61 62 6c 65 2b 2b 3b 0a 20 20 70 54 61 62 2d  Table++;.  pTab-
d1c0: 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c 69  >szTabRow = sqli
d1d0: 74 65 33 4c 6f 67 45 73 74 28 77 54 61 62 6c 65  te3LogEst(wTable
d1e0: 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73  *4);.}../*.** Es
d1f0: 74 69 6d 61 74 65 20 74 68 65 20 61 76 65 72 61  timate the avera
d200: 67 65 20 73 69 7a 65 20 6f 66 20 61 20 72 6f 77  ge size of a row
d210: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 2e 0a 2a   for an index..*
d220: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 73  /.static void es
d230: 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68  timateIndexWidth
d240: 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20  (Index *pIdx){. 
d250: 20 75 6e 73 69 67 6e 65 64 20 77 49 6e 64 65 78   unsigned wIndex
d260: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
d270: 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 61   const Column *a
d280: 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  Col = pIdx->pTab
d290: 6c 65 2d 3e 61 43 6f 6c 3b 0a 20 20 66 6f 72 28  le->aCol;.  for(
d2a0: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f  i=0; i<pIdx->nCo
d2b0: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
d2c0: 69 31 36 20 78 20 3d 20 70 49 64 78 2d 3e 61 69  i16 x = pIdx->ai
d2d0: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61  Column[i];.    a
d2e0: 73 73 65 72 74 28 20 78 3c 70 49 64 78 2d 3e 70  ssert( x<pIdx->p
d2f0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  Table->nCol );. 
d300: 20 20 20 77 49 6e 64 65 78 20 2b 3d 20 78 3c 30     wIndex += x<0
d310: 20 3f 20 31 20 3a 20 61 43 6f 6c 5b 70 49 64 78   ? 1 : aCol[pIdx
d320: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73  ->aiColumn[i]].s
d330: 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 70 49 64 78  zEst;.  }.  pIdx
d340: 2d 3e 73 7a 49 64 78 52 6f 77 20 3d 20 73 71 6c  ->szIdxRow = sql
d350: 69 74 65 33 4c 6f 67 45 73 74 28 77 49 6e 64 65  ite3LogEst(wInde
d360: 78 2a 34 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  x*4);.}../* Retu
d370: 72 6e 20 74 72 75 65 20 69 66 20 76 61 6c 75 65  rn true if value
d380: 20 78 20 69 73 20 66 6f 75 6e 64 20 61 6e 79 20   x is found any 
d390: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6e 43 6f  of the first nCo
d3a0: 6c 20 65 6e 74 72 69 65 73 20 6f 66 20 61 69 43  l entries of aiC
d3b0: 6f 6c 5b 5d 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ol[].*/.static i
d3c0: 6e 74 20 68 61 73 43 6f 6c 75 6d 6e 28 63 6f 6e  nt hasColumn(con
d3d0: 73 74 20 69 31 36 20 2a 61 69 43 6f 6c 2c 20 69  st i16 *aiCol, i
d3e0: 6e 74 20 6e 43 6f 6c 2c 20 69 6e 74 20 78 29 7b  nt nCol, int x){
d3f0: 0a 20 20 77 68 69 6c 65 28 20 6e 43 6f 6c 2d 2d  .  while( nCol--
d400: 20 3e 20 30 20 29 20 69 66 28 20 78 3d 3d 2a 28   > 0 ) if( x==*(
d410: 61 69 43 6f 6c 2b 2b 29 20 29 20 72 65 74 75 72  aiCol++) ) retur
d420: 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
d430: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
d440: 6f 75 74 69 6e 65 20 72 75 6e 73 20 61 74 20 74  outine runs at t
d450: 68 65 20 65 6e 64 20 6f 66 20 70 61 72 73 69 6e  he end of parsin
d460: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
d470: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 0a   statement that.
d480: 2a 2a 20 68 61 73 20 61 20 57 49 54 48 4f 55 54  ** has a WITHOUT
d490: 20 52 4f 57 49 44 20 63 6c 61 75 73 65 2e 20 20   ROWID clause.  
d4a0: 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
d4b0: 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 63 6f  routine is to co
d4c0: 6e 76 65 72 74 20 62 6f 74 68 0a 2a 2a 20 69 6e  nvert both.** in
d4d0: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 61  ternal schema da
d4e0: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61 6e  ta structures an
d4f0: 64 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  d the generated 
d500: 56 44 42 45 20 63 6f 64 65 20 73 6f 20 74 68 61  VDBE code so tha
d510: 74 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 61 70  t they.** are ap
d520: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 61 20  propriate for a 
d530: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
d540: 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ble instead of a
d550: 20 72 6f 77 69 64 20 74 61 62 6c 65 2e 0a 2a 2a   rowid table..**
d560: 20 43 68 61 6e 67 65 73 20 69 6e 63 6c 75 64 65   Changes include
d570: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
d580: 20 53 65 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73   Set all columns
d590: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
d5a0: 4b 45 59 20 73 63 68 65 6d 61 20 6f 62 6a 65 63  KEY schema objec
d5b0: 74 20 74 6f 20 62 65 20 4e 4f 54 20 4e 55 4c 4c  t to be NOT NULL
d5c0: 2e 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 43 6f  ..**     (2)  Co
d5d0: 6e 76 65 72 74 20 50 33 20 70 61 72 61 6d 65 74  nvert P3 paramet
d5e0: 65 72 20 6f 66 20 74 68 65 20 4f 50 5f 43 72 65  er of the OP_Cre
d5f0: 61 74 65 42 74 72 65 65 20 66 72 6f 6d 20 42 54  ateBtree from BT
d600: 52 45 45 5f 49 4e 54 4b 45 59 20 0a 2a 2a 20 20  REE_INTKEY .**  
d610: 20 20 20 20 20 20 20 20 69 6e 74 6f 20 42 54 52          into BTR
d620: 45 45 5f 42 4c 4f 42 4b 45 59 2e 0a 2a 2a 20 20  EE_BLOBKEY..**  
d630: 20 20 20 28 33 29 20 20 42 79 70 61 73 73 20 74     (3)  Bypass t
d640: 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74  he creation of t
d650: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
d660: 20 74 61 62 6c 65 20 65 6e 74 72 79 0a 2a 2a 20   table entry.** 
d670: 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 68 65           for the
d680: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 73 20   PRIMARY KEY as 
d690: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
d6a0: 69 6e 64 65 78 20 69 73 20 6e 6f 77 0a 2a 2a 20  index is now.** 
d6b0: 20 20 20 20 20 20 20 20 20 69 64 65 6e 74 69 66           identif
d6c0: 69 65 64 20 62 79 20 74 68 65 20 73 71 6c 69 74  ied by the sqlit
d6d0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65  e_master table e
d6e0: 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c  ntry of the tabl
d6f0: 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 20 20 20  e itself..**    
d700: 20 28 34 29 20 20 53 65 74 20 74 68 65 20 49 6e   (4)  Set the In
d710: 64 65 78 2e 74 6e 75 6d 20 6f 66 20 74 68 65 20  dex.tnum of the 
d720: 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64 65  PRIMARY KEY Inde
d730: 78 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a  x object in the.
d740: 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 68 65  **          sche
d750: 6d 61 20 74 6f 20 74 68 65 20 72 6f 6f 74 70 61  ma to the rootpa
d760: 67 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ge from the main
d770: 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 28   table..**     (
d780: 35 29 20 20 41 64 64 20 61 6c 6c 20 74 61 62 6c  5)  Add all tabl
d790: 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65  e columns to the
d7a0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64   PRIMARY KEY Ind
d7b0: 65 78 20 6f 62 6a 65 63 74 0a 2a 2a 20 20 20 20  ex object.**    
d7c0: 20 20 20 20 20 20 73 6f 20 74 68 61 74 20 74 68        so that th
d7d0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
d7e0: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
d7f0: 78 2e 20 20 54 68 65 20 73 75 72 70 6c 75 73 0a  x.  The surplus.
d800: 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75  **          colu
d810: 6d 6e 73 20 61 72 65 20 70 61 72 74 20 6f 66 20  mns are part of 
d820: 4b 65 79 49 6e 66 6f 2e 6e 41 6c 6c 46 69 65 6c  KeyInfo.nAllFiel
d830: 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 75 73  d and are not us
d840: 65 64 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ed for.**       
d850: 20 20 20 73 6f 72 74 69 6e 67 20 6f 72 20 6c 6f     sorting or lo
d860: 6f 6b 75 70 20 6f 72 20 75 6e 69 71 75 65 6e 65  okup or uniquene
d870: 73 73 20 63 68 65 63 6b 73 2e 0a 2a 2a 20 20 20  ss checks..**   
d880: 20 20 28 36 29 20 20 52 65 70 6c 61 63 65 20 74    (6)  Replace t
d890: 68 65 20 72 6f 77 69 64 20 74 61 69 6c 20 6f 6e  he rowid tail on
d8a0: 20 61 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c   all automatical
d8b0: 6c 79 20 67 65 6e 65 72 61 74 65 64 20 55 4e 49  ly generated UNI
d8c0: 51 55 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  QUE.**          
d8d0: 69 6e 64 69 63 65 73 20 77 69 74 68 20 74 68 65  indices with the
d8e0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
d8f0: 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  umns..**.** For 
d900: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2c 20  virtual tables, 
d910: 6f 6e 6c 79 20 28 31 29 20 69 73 20 70 65 72 66  only (1) is perf
d920: 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ormed..*/.static
d930: 20 76 6f 69 64 20 63 6f 6e 76 65 72 74 54 6f 57   void convertToW
d940: 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65  ithoutRowidTable
d950: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
d960: 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20  Table *pTab){.  
d970: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 49  Index *pIdx;.  I
d980: 6e 64 65 78 20 2a 70 50 6b 3b 0a 20 20 69 6e 74  ndex *pPk;.  int
d990: 20 6e 50 6b 3b 0a 20 20 69 6e 74 20 69 2c 20 6a   nPk;.  int i, j
d9a0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
d9b0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
d9c0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
d9d0: 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 2f 2a 20 4d  ->pVdbe;..  /* M
d9e0: 61 72 6b 20 65 76 65 72 79 20 50 52 49 4d 41 52  ark every PRIMAR
d9f0: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 61 73 20  Y KEY column as 
da00: 4e 4f 54 20 4e 55 4c 4c 20 28 65 78 63 65 70 74  NOT NULL (except
da10: 20 66 6f 72 20 69 6d 70 6f 73 74 65 72 20 74 61   for imposter ta
da20: 62 6c 65 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28  bles).  */.  if(
da30: 20 21 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73   !db->init.impos
da40: 74 65 72 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  terTable ){.    
da50: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d  for(i=0; i<pTab-
da60: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
da70: 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 61 43     if( (pTab->aC
da80: 6f 6c 5b 69 5d 2e 63 6f 6c 46 6c 61 67 73 20 26  ol[i].colFlags &
da90: 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59   COLFLAG_PRIMKEY
daa0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
dab0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f  pTab->aCol[i].no
dac0: 74 4e 75 6c 6c 20 3d 20 4f 45 5f 41 62 6f 72 74  tNull = OE_Abort
dad0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dae0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65    }..  /* The re
daf0: 6d 61 69 6e 69 6e 67 20 74 72 61 6e 73 66 6f 72  maining transfor
db00: 6d 61 74 69 6f 6e 73 20 6f 6e 6c 79 20 61 70 70  mations only app
db10: 6c 79 20 74 6f 20 62 2d 74 72 65 65 20 74 61 62  ly to b-tree tab
db20: 6c 65 73 2c 20 6e 6f 74 20 74 6f 0a 20 20 2a 2a  les, not to.  **
db30: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
db40: 2a 2f 0a 20 20 69 66 28 20 49 4e 5f 44 45 43 4c  */.  if( IN_DECL
db50: 41 52 45 5f 56 54 41 42 20 29 20 72 65 74 75 72  ARE_VTAB ) retur
db60: 6e 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74  n;..  /* Convert
db70: 20 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   the P3 operand 
db80: 6f 66 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65  of the OP_Create
db90: 42 74 72 65 65 20 6f 70 63 6f 64 65 20 66 72 6f  Btree opcode fro
dba0: 6d 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 0a 20  m BTREE_INTKEY. 
dbb0: 20 2a 2a 20 69 6e 74 6f 20 42 54 52 45 45 5f 42   ** into BTREE_B
dbc0: 4c 4f 42 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 69  LOBKEY..  */.  i
dbd0: 66 28 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43  f( pParse->addrC
dbe0: 72 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65  rTab ){.    asse
dbf0: 72 74 28 20 76 20 29 3b 0a 20 20 20 20 73 71 6c  rt( v );.    sql
dc00: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
dc10: 28 76 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72  (v, pParse->addr
dc20: 43 72 54 61 62 2c 20 42 54 52 45 45 5f 42 4c 4f  CrTab, BTREE_BLO
dc30: 42 4b 45 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  BKEY);.  }..  /*
dc40: 20 4c 6f 63 61 74 65 20 74 68 65 20 50 52 49 4d   Locate the PRIM
dc50: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 20  ARY KEY index.  
dc60: 4f 72 2c 20 69 66 20 74 68 69 73 20 74 61 62 6c  Or, if this tabl
dc70: 65 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79  e was originally
dc80: 0a 20 20 2a 2a 20 61 6e 20 49 4e 54 45 47 45 52  .  ** an INTEGER
dc90: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 74 61 62   PRIMARY KEY tab
dca0: 6c 65 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77  le, create a new
dcb0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
dcc0: 65 78 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ex. .  */.  if( 
dcd0: 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29  pTab->iPKey>=0 )
dce0: 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
dcf0: 70 4c 69 73 74 3b 0a 20 20 20 20 54 6f 6b 65 6e  pList;.    Token
dd00: 20 69 70 6b 54 6f 6b 65 6e 3b 0a 20 20 20 20 73   ipkToken;.    s
dd10: 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28  qlite3TokenInit(
dd20: 26 69 70 6b 54 6f 6b 65 6e 2c 20 70 54 61 62 2d  &ipkToken, pTab-
dd30: 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65  >aCol[pTab->iPKe
dd40: 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  y].zName);.    p
dd50: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
dd60: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
dd70: 72 73 65 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  rse, 0, .       
dd80: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
dd90: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
dda0: 54 4b 5f 49 44 2c 20 26 69 70 6b 54 6f 6b 65 6e  TK_ID, &ipkToken
ddb0: 2c 20 30 29 29 3b 0a 20 20 20 20 69 66 28 20 70  , 0));.    if( p
ddc0: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
ddd0: 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30  ;.    pList->a[0
dde0: 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 50  ].sortOrder = pP
ddf0: 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64  arse->iPkSortOrd
de00: 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  er;.    assert( 
de10: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
de20: 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 73  e==pTab );.    s
de30: 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65  qlite3CreateInde
de40: 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20  x(pParse, 0, 0, 
de50: 30 2c 20 70 4c 69 73 74 2c 20 70 54 61 62 2d 3e  0, pList, pTab->
de60: 6b 65 79 43 6f 6e 66 2c 20 30 2c 20 30 2c 20 30  keyConf, 0, 0, 0
de70: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
de80: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
de90: 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41  TE_IDXTYPE_PRIMA
dea0: 52 59 4b 45 59 29 3b 0a 20 20 20 20 69 66 28 20  RYKEY);.    if( 
deb0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
dec0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
ded0: 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
dee0: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
def0: 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b  );.    pTab->iPK
df00: 65 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65  ey = -1;.  }else
df10: 7b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69  {.    pPk = sqli
df20: 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
df30: 65 78 28 70 54 61 62 29 3b 0a 0a 20 20 20 20 2f  ex(pTab);..    /
df40: 2a 0a 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20  *.    ** Remove 
df50: 61 6c 6c 20 72 65 64 75 6e 64 61 6e 74 20 63 6f  all redundant co
df60: 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 50  lumns from the P
df70: 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f 72  RIMARY KEY.  For
df80: 20 65 78 61 6d 70 6c 65 2c 20 63 68 61 6e 67 65   example, change
df90: 0a 20 20 20 20 2a 2a 20 22 50 52 49 4d 41 52 59  .    ** "PRIMARY
dfa0: 20 4b 45 59 28 61 2c 62 2c 61 2c 62 2c 63 2c 62   KEY(a,b,a,b,c,b
dfb0: 2c 63 2c 64 29 22 20 69 6e 74 6f 20 6a 75 73 74  ,c,d)" into just
dfc0: 20 22 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c   "PRIMARY KEY(a,
dfd0: 62 2c 63 2c 64 29 22 2e 20 20 4c 61 74 65 72 0a  b,c,d)".  Later.
dfe0: 20 20 20 20 2a 2a 20 63 6f 64 65 20 61 73 73 75      ** code assu
dff0: 6d 65 73 20 74 68 65 20 50 52 49 4d 41 52 59 20  mes the PRIMARY 
e000: 4b 45 59 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  KEY contains no 
e010: 72 65 70 65 61 74 65 64 20 63 6f 6c 75 6d 6e 73  repeated columns
e020: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
e030: 28 69 3d 6a 3d 31 3b 20 69 3c 70 50 6b 2d 3e 6e  (i=j=1; i<pPk->n
e040: 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  KeyCol; i++){.  
e050: 20 20 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d      if( hasColum
e060: 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c  n(pPk->aiColumn,
e070: 20 6a 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d   j, pPk->aiColum
e080: 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  n[i]) ){.       
e090: 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b   pPk->nColumn--;
e0a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e0b0: 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c        pPk->aiCol
e0c0: 75 6d 6e 5b 6a 2b 2b 5d 20 3d 20 70 50 6b 2d 3e  umn[j++] = pPk->
e0d0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
e0e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
e0f0: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6a 3b  Pk->nKeyCol = j;
e100: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
e110: 50 6b 21 3d 30 20 29 3b 0a 20 20 70 50 6b 2d 3e  Pk!=0 );.  pPk->
e120: 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b 0a  isCovering = 1;.
e130: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
e140: 69 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 29 20  imposterTable ) 
e150: 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  pPk->uniqNotNull
e160: 20 3d 20 31 3b 0a 20 20 6e 50 6b 20 3d 20 70 50   = 1;.  nPk = pP
e170: 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 0a 20 20 2f  k->nKeyCol;..  /
e180: 2a 20 42 79 70 61 73 73 20 74 68 65 20 63 72 65  * Bypass the cre
e190: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 50 52 49  ation of the PRI
e1a0: 4d 41 52 59 20 4b 45 59 20 62 74 72 65 65 20 61  MARY KEY btree a
e1b0: 6e 64 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  nd the sqlite_ma
e1c0: 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20  ster.  ** table 
e1d0: 65 6e 74 72 79 2e 20 54 68 69 73 20 69 73 20 6f  entry. This is o
e1e0: 6e 6c 79 20 72 65 71 75 69 72 65 64 20 69 66 20  nly required if 
e1f0: 63 75 72 72 65 6e 74 6c 79 20 67 65 6e 65 72 61  currently genera
e200: 74 69 6e 67 20 56 44 42 45 0a 20 20 2a 2a 20 63  ting VDBE.  ** c
e210: 6f 64 65 20 66 6f 72 20 61 20 43 52 45 41 54 45  ode for a CREATE
e220: 20 54 41 42 4c 45 20 28 6e 6f 74 20 77 68 65 6e   TABLE (not when
e230: 20 70 61 72 73 69 6e 67 20 6f 6e 65 20 61 73 20   parsing one as 
e240: 70 61 72 74 20 6f 66 20 72 65 61 64 69 6e 67 0a  part of reading.
e250: 20 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20    ** a database 
e260: 73 63 68 65 6d 61 29 2e 20 20 2a 2f 0a 20 20 69  schema).  */.  i
e270: 66 28 20 76 20 26 26 20 70 50 6b 2d 3e 74 6e 75  f( v && pPk->tnu
e280: 6d 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  m>0 ){.    asser
e290: 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  t( db->init.busy
e2a0: 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ==0 );.    sqlit
e2b0: 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f  e3VdbeChangeOpco
e2c0: 64 65 28 76 2c 20 70 50 6b 2d 3e 74 6e 75 6d 2c  de(v, pPk->tnum,
e2d0: 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 7d 0a 0a   OP_Goto);.  }..
e2e0: 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61    /* The root pa
e2f0: 67 65 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52  ge of the PRIMAR
e300: 59 20 4b 45 59 20 69 73 20 74 68 65 20 74 61 62  Y KEY is the tab
e310: 6c 65 20 72 6f 6f 74 20 70 61 67 65 20 2a 2f 0a  le root page */.
e320: 20 20 70 50 6b 2d 3e 74 6e 75 6d 20 3d 20 70 54    pPk->tnum = pT
e330: 61 62 2d 3e 74 6e 75 6d 3b 0a 0a 20 20 2f 2a 20  ab->tnum;..  /* 
e340: 55 70 64 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Update the in-me
e350: 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
e360: 69 6f 6e 20 6f 66 20 61 6c 6c 20 55 4e 49 51 55  ion of all UNIQU
e370: 45 20 69 6e 64 69 63 65 73 20 62 79 20 63 6f 6e  E indices by con
e380: 76 65 72 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  verting.  ** the
e390: 20 66 69 6e 61 6c 20 72 6f 77 69 64 20 63 6f 6c   final rowid col
e3a0: 75 6d 6e 20 69 6e 74 6f 20 6f 6e 65 20 6f 72 20  umn into one or 
e3b0: 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  more columns of 
e3c0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  the PRIMARY KEY.
e3d0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78  .  */.  for(pIdx
e3e0: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
e3f0: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
e400: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20  pNext){.    int 
e410: 6e 3b 0a 20 20 20 20 69 66 28 20 49 73 50 72 69  n;.    if( IsPri
e420: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64  maryKeyIndex(pId
e430: 78 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  x) ) continue;. 
e440: 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c     for(i=n=0; i<
e450: 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nPk; i++){.     
e460: 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28   if( !hasColumn(
e470: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20  pIdx->aiColumn, 
e480: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70  pIdx->nKeyCol, p
e490: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29  Pk->aiColumn[i])
e4a0: 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   ) n++;.    }.  
e4b0: 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
e4c0: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65      /* This inde
e4d0: 78 20 69 73 20 61 20 73 75 70 65 72 73 65 74 20  x is a superset 
e4e0: 6f 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  of the primary k
e4f0: 65 79 20 2a 2f 0a 20 20 20 20 20 20 70 49 64 78  ey */.      pIdx
e500: 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78  ->nColumn = pIdx
e510: 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20  ->nKeyCol;.     
e520: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
e530: 0a 20 20 20 20 69 66 28 20 72 65 73 69 7a 65 49  .    if( resizeI
e540: 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70  ndexObject(db, p
e550: 49 64 78 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43  Idx, pIdx->nKeyC
e560: 6f 6c 2b 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a  ol+n) ) return;.
e570: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70      for(i=0, j=p
e580: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 3c  Idx->nKeyCol; i<
e590: 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nPk; i++){.     
e5a0: 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28   if( !hasColumn(
e5b0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20  pIdx->aiColumn, 
e5c0: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70  pIdx->nKeyCol, p
e5d0: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29  Pk->aiColumn[i])
e5e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78   ){.        pIdx
e5f0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20  ->aiColumn[j] = 
e600: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  pPk->aiColumn[i]
e610: 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  ;.        pIdx->
e620: 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 70 50 6b 2d  azColl[j] = pPk-
e630: 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20  >azColl[i];.    
e640: 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d      j++;.      }
e650: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
e660: 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  t( pIdx->nColumn
e670: 3e 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b  >=pIdx->nKeyCol+
e680: 6e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  n );.    assert(
e690: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
e6a0: 6a 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  j );.  }..  /* A
e6b0: 64 64 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c  dd all table col
e6c0: 75 6d 6e 73 20 74 6f 20 74 68 65 20 50 52 49 4d  umns to the PRIM
e6d0: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20 20  ARY KEY index.  
e6e0: 2a 2f 0a 20 20 69 66 28 20 6e 50 6b 3c 70 54 61  */.  if( nPk<pTa
e6f0: 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 69  b->nCol ){.    i
e700: 66 28 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62  f( resizeIndexOb
e710: 6a 65 63 74 28 64 62 2c 20 70 50 6b 2c 20 70 54  ject(db, pPk, pT
e720: 61 62 2d 3e 6e 43 6f 6c 29 20 29 20 72 65 74 75  ab->nCol) ) retu
e730: 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  rn;.    for(i=0,
e740: 20 6a 3d 6e 50 6b 3b 20 69 3c 70 54 61 62 2d 3e   j=nPk; i<pTab->
e750: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
e760: 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e    if( !hasColumn
e770: 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20  (pPk->aiColumn, 
e780: 6a 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20 20  j, i) ){.       
e790: 20 61 73 73 65 72 74 28 20 6a 3c 70 50 6b 2d 3e   assert( j<pPk->
e7a0: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20  nColumn );.     
e7b0: 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e     pPk->aiColumn
e7c0: 5b 6a 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  [j] = i;.       
e7d0: 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20   pPk->azColl[j] 
e7e0: 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41  = sqlite3StrBINA
e7f0: 52 59 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b  RY;.        j++;
e800: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e810: 20 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e     assert( pPk->
e820: 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a 20 20  nColumn==j );.  
e830: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
e840: 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a 20 20 7d 65 6c  nCol==j );.  }el
e850: 73 65 7b 0a 20 20 20 20 70 50 6b 2d 3e 6e 43 6f  se{.    pPk->nCo
e860: 6c 75 6d 6e 20 3d 20 70 54 61 62 2d 3e 6e 43 6f  lumn = pTab->nCo
e870: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
e880: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
e890: 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74  called to report
e8a0: 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74   the final ")" t
e8b0: 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a  hat terminates.*
e8c0: 2a 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  * a CREATE TABLE
e8d0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
e8e0: 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75  * The table stru
e8f0: 63 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72  cture that other
e900: 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73   action routines
e910: 20 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64   have been build
e920: 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  ing.** is added 
e930: 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  to the internal 
e940: 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73  hash tables, ass
e950: 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20  uming no errors 
e960: 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64  have.** occurred
e970: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79  ..**.** An entry
e980: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69   for the table i
e990: 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61  s made in the ma
e9a0: 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69  ster table on di
e9b0: 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68  sk, unless.** th
e9c0: 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  is is a temporar
e9d0: 79 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69  y table or db->i
e9e0: 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68  nit.busy==1.  Wh
e9f0: 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  en db->init.busy
ea00: 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20  ==1.** it means 
ea10: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
ea20: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
ea30: 20 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77   table because w
ea40: 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63  e just.** connec
ea50: 74 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62  ted to the datab
ea60: 61 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74  ase or because t
ea70: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
ea80: 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65   table has.** re
ea90: 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20  cently changed, 
eaa0: 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  so the entry for
eab0: 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65   this table alre
eac0: 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a  ady exists in.**
ead0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
eae0: 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f  er table.  We do
eaf0: 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65   not want to cre
eb00: 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a  ate it again..**
eb10: 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65  .** If the pSele
eb20: 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ct argument is n
eb30: 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e  ot NULL, it mean
eb40: 73 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74  s that this rout
eb50: 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65  ine.** was calle
eb60: 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61  d to create a ta
eb70: 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72  ble generated fr
eb80: 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45  om a .** "CREATE
eb90: 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45   TABLE ... AS SE
eba0: 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d  LECT ..." statem
ebb0: 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e  ent.  The column
ebc0: 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65   names of.** the
ebd0: 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20   new table will 
ebe0: 6d 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74  match the result
ebf0: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
ec00: 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  CT..*/.void sqli
ec10: 74 65 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50  te3EndTable(.  P
ec20: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
ec30: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
ec40: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
ec50: 65 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20  en *pCons,      
ec60: 20 20 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20       /* The ',' 
ec70: 74 6f 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20  token after the 
ec80: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e  last column defn
ec90: 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45  . */.  Token *pE
eca0: 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  nd,            /
ecb0: 2a 20 54 68 65 20 27 29 27 20 62 65 66 6f 72 65  * The ')' before
ecc0: 20 6f 70 74 69 6f 6e 73 20 69 6e 20 74 68 65 20   options in the 
ecd0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a  CREATE TABLE */.
ece0: 20 20 75 38 20 74 61 62 4f 70 74 73 2c 20 20 20    u8 tabOpts,   
ecf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
ed00: 72 61 20 74 61 62 6c 65 20 6f 70 74 69 6f 6e 73  ra table options
ed10: 2e 20 55 73 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a  . Usually 0. */.
ed20: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
ed30: 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c  t         /* Sel
ed40: 65 63 74 20 66 72 6f 6d 20 61 20 22 43 52 45 41  ect from a "CREA
ed50: 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54  TE ... AS SELECT
ed60: 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  " */.){.  Table 
ed70: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
ed80: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 74      /* The new t
ed90: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
eda0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
edb0: 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62  db; /* The datab
edc0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
edd0: 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
ede0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
edf0: 20 44 61 74 61 62 61 73 65 20 69 6e 20 77 68 69   Database in whi
ee00: 63 68 20 74 68 65 20 74 61 62 6c 65 20 6c 69 76  ch the table liv
ee10: 65 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  es */.  Index *p
ee20: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
ee30: 20 20 2f 2a 20 41 6e 20 69 6d 70 6c 69 65 64 20    /* An implied 
ee40: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62  index of the tab
ee50: 6c 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 6e  le */..  if( pEn
ee60: 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d  d==0 && pSelect=
ee70: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
ee80: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
ee90: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
eea0: 64 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  d );.  p = pPars
eeb0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
eec0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
eed0: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64  n;..  assert( !d
eee0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20  b->init.busy || 
eef0: 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 2f  !pSelect );..  /
ef00: 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69  * If the db->ini
ef10: 74 2e 62 75 73 79 20 69 73 20 31 20 69 74 20 6d  t.busy is 1 it m
ef20: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
ef30: 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20  ing the SQL off 
ef40: 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65  the.  ** "sqlite
ef50: 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c  _master" or "sql
ef60: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22  ite_temp_master"
ef70: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69   table on the di
ef80: 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e  sk..  ** So do n
ef90: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
efa0: 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74  disk again.  Ext
efb0: 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61  ract the root pa
efc0: 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66  ge number.  ** f
efd0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  or the table fro
efe0: 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e  m the db->init.n
eff0: 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28  ewTnum field.  (
f000: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  The page number.
f010: 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65    ** should have
f020: 20 62 65 65 6e 20 70 75 74 20 74 68 65 72 65 20   been put there 
f030: 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65  by the sqliteOpe
f040: 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20  nCb routine.).  
f050: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72  **.  ** If the r
f060: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
f070: 69 73 20 31 2c 20 74 68 61 74 20 6d 65 61 6e 73  is 1, that means
f080: 20 74 68 69 73 20 69 73 20 74 68 65 20 73 71 6c   this is the sql
f090: 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20  ite_master.  ** 
f0a0: 74 61 62 6c 65 20 69 74 73 65 6c 66 2e 20 20 53  table itself.  S
f0b0: 6f 20 6d 61 72 6b 20 69 74 20 72 65 61 64 2d 6f  o mark it read-o
f0c0: 6e 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nly..  */.  if( 
f0d0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
f0e0: 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64  .    p->tnum = d
f0f0: 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
f100: 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 6e 75 6d  .    if( p->tnum
f110: 3d 3d 31 20 29 20 70 2d 3e 74 61 62 46 6c 61 67  ==1 ) p->tabFlag
f120: 73 20 7c 3d 20 54 46 5f 52 65 61 64 6f 6e 6c 79  s |= TF_Readonly
f130: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63  ;.  }..  /* Spec
f140: 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 66  ial processing f
f150: 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  or WITHOUT ROWID
f160: 20 54 61 62 6c 65 73 20 2a 2f 0a 20 20 69 66 28   Tables */.  if(
f170: 20 74 61 62 4f 70 74 73 20 26 20 54 46 5f 57 69   tabOpts & TF_Wi
f180: 74 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20 20  thoutRowid ){.  
f190: 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61    if( (p->tabFla
f1a0: 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72  gs & TF_Autoincr
f1b0: 65 6d 65 6e 74 29 20 29 7b 0a 20 20 20 20 20 20  ement) ){.      
f1c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
f1d0: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
f1e0: 20 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54    "AUTOINCREMENT
f1f0: 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20   not allowed on 
f200: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
f210: 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 72 65  bles");.      re
f220: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
f230: 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73  if( (p->tabFlags
f240: 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79   & TF_HasPrimary
f250: 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Key)==0 ){.     
f260: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
f270: 28 70 50 61 72 73 65 2c 20 22 50 52 49 4d 41 52  (pParse, "PRIMAR
f280: 59 20 4b 45 59 20 6d 69 73 73 69 6e 67 20 6f 6e  Y KEY missing on
f290: 20 74 61 62 6c 65 20 25 73 22 2c 20 70 2d 3e 7a   table %s", p->z
f2a0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
f2b0: 7b 0a 20 20 20 20 20 20 70 2d 3e 74 61 62 46 6c  {.      p->tabFl
f2c0: 61 67 73 20 7c 3d 20 54 46 5f 57 69 74 68 6f 75  ags |= TF_Withou
f2d0: 74 52 6f 77 69 64 20 7c 20 54 46 5f 4e 6f 56 69  tRowid | TF_NoVi
f2e0: 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20  sibleRowid;.    
f2f0: 20 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f    convertToWitho
f300: 75 74 52 6f 77 69 64 54 61 62 6c 65 28 70 50 61  utRowidTable(pPa
f310: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20  rse, p);.    }. 
f320: 20 7d 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69   }..  iDb = sqli
f330: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
f340: 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  (db, p->pSchema)
f350: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
f360: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f  E_OMIT_CHECK.  /
f370: 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20  * Resolve names 
f380: 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e  in all CHECK con
f390: 73 74 72 61 69 6e 74 20 65 78 70 72 65 73 73 69  straint expressi
f3a0: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
f3b0: 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20  p->pCheck ){.   
f3c0: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53   sqlite3ResolveS
f3d0: 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61  elfReference(pPa
f3e0: 72 73 65 2c 20 70 2c 20 4e 43 5f 49 73 43 68 65  rse, p, NC_IsChe
f3f0: 63 6b 2c 20 30 2c 20 70 2d 3e 70 43 68 65 63 6b  ck, 0, p->pCheck
f400: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
f410: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
f420: 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a  _OMIT_CHECK) */.
f430: 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74  .  /* Estimate t
f440: 68 65 20 61 76 65 72 61 67 65 20 72 6f 77 20 73  he average row s
f450: 69 7a 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ize for the tabl
f460: 65 20 61 6e 64 20 66 6f 72 20 61 6c 6c 20 69 6d  e and for all im
f470: 70 6c 69 65 64 20 69 6e 64 69 63 65 73 20 2a 2f  plied indices */
f480: 0a 20 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65  .  estimateTable
f490: 57 69 64 74 68 28 70 29 3b 0a 20 20 66 6f 72 28  Width(p);.  for(
f4a0: 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20  pIdx=p->pIndex; 
f4b0: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
f4c0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 65 73 74  >pNext){.    est
f4d0: 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68 28  imateIndexWidth(
f4e0: 70 49 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pIdx);.  }..  /*
f4f0: 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69   If not initiali
f500: 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74  zing, then creat
f510: 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74  e a record for t
f520: 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a  he new table.  *
f530: 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  * in the SQLITE_
f540: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20  MASTER table of 
f550: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
f560: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  **.  ** If this 
f570: 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74  is a TEMPORARY t
f580: 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20  able, write the 
f590: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61  entry into the a
f5a0: 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69  uxiliary.  ** fi
f5b0: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e  le instead of in
f5c0: 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
f5d0: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
f5e0: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
f5f0: 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  busy ){.    int 
f600: 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  n;.    Vdbe *v;.
f610: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b      char *zType;
f620: 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72      /* "view" or
f630: 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20   "table" */.    
f640: 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20  char *zType2;   
f650: 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22 54 41  /* "VIEW" or "TA
f660: 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72  BLE" */.    char
f670: 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54   *zStmt;    /* T
f680: 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
f690: 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54  E TABLE or CREAT
f6a0: 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74  E VIEW statement
f6b0: 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c   */..    v = sql
f6c0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
f6d0: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  se);.    if( NEV
f6e0: 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
f6f0: 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56  n;..    sqlite3V
f700: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
f710: 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20 20 20 20  Close, 0);..    
f720: 2f 2a 20 0a 20 20 20 20 2a 2a 20 49 6e 69 74 69  /* .    ** Initi
f730: 61 6c 69 7a 65 20 7a 54 79 70 65 20 66 6f 72 20  alize zType for 
f740: 74 68 65 20 6e 65 77 20 76 69 65 77 20 6f 72 20  the new view or 
f750: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
f760: 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74    if( p->pSelect
f770: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
f780: 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20  A regular table 
f790: 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  */.      zType =
f7a0: 20 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20   "table";.      
f7b0: 7a 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22  zType2 = "TABLE"
f7c0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
f7d0: 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d  _OMIT_VIEW.    }
f7e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
f7f0: 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a   view */.      z
f800: 54 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20  Type = "view";. 
f810: 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56       zType2 = "V
f820: 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20  IEW";.#endif.   
f830: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
f840: 69 73 20 69 73 20 61 20 43 52 45 41 54 45 20 54  is is a CREATE T
f850: 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43  ABLE xx AS SELEC
f860: 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74  T ..., execute t
f870: 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a  he SELECT.    **
f880: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f   statement to po
f890: 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74  pulate the new t
f8a0: 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70  able. The root-p
f8b0: 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
f8c0: 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61  he.    ** new ta
f8d0: 62 6c 65 20 69 73 20 69 6e 20 72 65 67 69 73 74  ble is in regist
f8e0: 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f  er pParse->regRo
f8f0: 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ot..    **.    *
f900: 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43  * Once the SELEC
f910: 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64  T has been coded
f920: 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63   by sqlite3Selec
f930: 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a  t(), it is in a.
f940: 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20      ** suitable 
f950: 73 74 61 74 65 20 74 6f 20 71 75 65 72 79 20 66  state to query f
f960: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  or the column na
f970: 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f  mes and types to
f980: 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20   be used.    ** 
f990: 62 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  by the new table
f9a0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
f9b0: 41 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 77  A shared-cache w
f9c0: 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74  rite-lock is not
f9d0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 77 72 69   required to wri
f9e0: 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61  te to the new ta
f9f0: 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61  ble,.    ** as a
fa00: 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73   schema-lock mus
fa10: 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
fa20: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20  een obtained to 
fa30: 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65  create it. Since
fa40: 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61  .    ** a schema
fa50: 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61  -lock excludes a
fa60: 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  ll other databas
fa70: 65 20 75 73 65 72 73 2c 20 74 68 65 20 77 72 69  e users, the wri
fa80: 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20  te-lock would.  
fa90: 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e    ** be redundan
faa0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
fab0: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
fac0: 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
fad0: 73 74 3b 20 20 20 20 2f 2a 20 57 68 65 72 65 20  st;    /* Where 
fae0: 74 68 65 20 53 45 4c 45 43 54 20 73 68 6f 75 6c  the SELECT shoul
faf0: 64 20 73 74 6f 72 65 20 72 65 73 75 6c 74 73 20  d store results 
fb00: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  */.      int reg
fb10: 59 69 65 6c 64 3b 20 20 20 20 20 20 20 2f 2a 20  Yield;       /* 
fb20: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
fb30: 20 63 6f 2d 72 6f 75 74 69 6e 65 20 65 6e 74 72   co-routine entr
fb40: 79 2d 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20  y-point */.     
fb50: 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20   int addrTop;   
fb60: 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
fb70: 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f  he co-routine */
fb80: 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65  .      int regRe
fb90: 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  c;         /* A 
fba0: 72 65 63 6f 72 64 20 74 6f 20 62 65 20 69 6e 73  record to be ins
fbb0: 65 72 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77  ert into the new
fbc0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
fbd0: 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 20 20 20  int regRowid;   
fbe0: 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 6f 66 20      /* Rowid of 
fbf0: 74 68 65 20 6e 65 78 74 20 72 6f 77 20 74 6f 20  the next row to 
fc00: 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20 20 20  insert */.      
fc10: 69 6e 74 20 61 64 64 72 49 6e 73 4c 6f 6f 70 3b  int addrInsLoop;
fc20: 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
fc30: 65 20 6c 6f 6f 70 20 66 6f 72 20 69 6e 73 65 72  e loop for inser
fc40: 74 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 20  ting rows */.   
fc50: 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61     Table *pSelTa
fc60: 62 3b 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c  b;     /* A tabl
fc70: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
fc80: 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 73 75   the SELECT resu
fc90: 6c 74 73 20 2a 2f 0a 0a 20 20 20 20 20 20 72 65  lts */..      re
fca0: 67 59 69 65 6c 64 20 3d 20 2b 2b 70 50 61 72 73  gYield = ++pPars
fcb0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72  e->nMem;.      r
fcc0: 65 67 52 65 63 20 3d 20 2b 2b 70 50 61 72 73 65  egRec = ++pParse
fcd0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65  ->nMem;.      re
fce0: 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73  gRowid = ++pPars
fcf0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61  e->nMem;.      a
fd00: 73 73 65 72 74 28 70 50 61 72 73 65 2d 3e 6e 54  ssert(pParse->nT
fd10: 61 62 3d 3d 31 29 3b 0a 20 20 20 20 20 20 73 71  ab==1);.      sq
fd20: 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50  lite3MayAbort(pP
fd30: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
fd40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
fd50: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
fd60: 31 2c 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f  1, pParse->regRo
fd70: 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  ot, iDb);.      
fd80: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
fd90: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 32  eP5(v, OPFLAG_P2
fda0: 49 53 52 45 47 29 3b 0a 20 20 20 20 20 20 70 50  ISREG);.      pP
fdb0: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a  arse->nTab = 2;.
fdc0: 20 20 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20        addrTop = 
fdd0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
fde0: 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20  ntAddr(v) + 1;. 
fdf0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fe00: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69  AddOp3(v, OP_Ini
fe10: 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59  tCoroutine, regY
fe20: 69 65 6c 64 2c 20 30 2c 20 61 64 64 72 54 6f 70  ield, 0, addrTop
fe30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fe40: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
fe50: 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74  dest, SRT_Corout
fe60: 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a  ine, regYield);.
fe70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
fe80: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
fe90: 65 63 74 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  ect, &dest);.   
fea0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e     sqlite3VdbeEn
feb0: 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65  dCoroutine(v, re
fec0: 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 73  gYield);.      s
fed0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
fee0: 72 65 28 76 2c 20 61 64 64 72 54 6f 70 20 2d 20  re(v, addrTop - 
fef0: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  1);.      if( pP
ff00: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
ff10: 75 72 6e 3b 0a 20 20 20 20 20 20 70 53 65 6c 54  urn;.      pSelT
ff20: 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
ff30: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
ff40: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a  arse, pSelect);.
ff50: 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 54 61        if( pSelTa
ff60: 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  b==0 ) return;. 
ff70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
ff80: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
ff90: 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54   p->nCol = pSelT
ffa0: 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->nCol;.      
ffb0: 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->aCol = pSelTa
ffc0: 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70  b->aCol;.      p
ffd0: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30  SelTab->nCol = 0
ffe0: 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d  ;.      pSelTab-
fff0: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >aCol = 0;.     
10000 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
10010 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29  ble(db, pSelTab)
10020 3b 0a 20 20 20 20 20 20 61 64 64 72 49 6e 73 4c  ;.      addrInsL
10030 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oop = sqlite3Vdb
10040 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
10050 65 6c 64 2c 20 64 65 73 74 2e 69 53 44 50 61 72  eld, dest.iSDPar
10060 6d 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  m);.      VdbeCo
10070 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
10080 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10090 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
100a0 6f 72 64 2c 20 64 65 73 74 2e 69 53 64 73 74 2c  ord, dest.iSdst,
100b0 20 64 65 73 74 2e 6e 53 64 73 74 2c 20 72 65 67   dest.nSdst, reg
100c0 52 65 63 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Rec);.      sqli
100d0 74 65 33 54 61 62 6c 65 41 66 66 69 6e 69 74 79  te3TableAffinity
100e0 28 76 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20  (v, p, 0);.     
100f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10100 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
10110 64 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 29 3b  d, 1, regRowid);
10120 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10130 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
10140 6e 73 65 72 74 2c 20 31 2c 20 72 65 67 52 65 63  nsert, 1, regRec
10150 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
10160 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
10170 74 6f 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f 6f  to(v, addrInsLoo
10180 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
10190 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
101a0 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20   addrInsLoop);. 
101b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
101c0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
101d0 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 0a 20  se, 1);.    }.. 
101e0 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
101f0 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
10200 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 73 74  of the CREATE st
10210 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
10220 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
10230 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61      zStmt = crea
10240 74 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c 20  teTableStmt(db, 
10250 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  p);.    }else{. 
10260 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64       Token *pEnd
10270 32 20 3d 20 74 61 62 4f 70 74 73 20 3f 20 26 70  2 = tabOpts ? &p
10280 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
10290 6e 20 3a 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  n : pEnd;.      
102a0 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 32 2d  n = (int)(pEnd2-
102b0 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61  >z - pParse->sNa
102c0 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20  meToken.z);.    
102d0 20 20 69 66 28 20 70 45 6e 64 32 2d 3e 7a 5b 30    if( pEnd2->z[0
102e0 5d 21 3d 27 3b 27 20 29 20 6e 20 2b 3d 20 70 45  ]!=';' ) n += pE
102f0 6e 64 32 2d 3e 6e 3b 0a 20 20 20 20 20 20 7a 53  nd2->n;.      zS
10300 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
10310 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20  intf(db, .      
10320 20 20 20 20 22 43 52 45 41 54 45 20 25 73 20 25      "CREATE %s %
10330 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c  .*s", zType2, n,
10340 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
10350 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a 20  ken.z.      );. 
10360 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73     }..    /* A s
10370 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f  lot for the reco
10380 72 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  rd has already b
10390 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  een allocated in
103a0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c   the .    ** SQL
103b0 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
103c0 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20  .  We just need 
103d0 74 6f 20 75 70 64 61 74 65 20 74 68 61 74 20 73  to update that s
103e0 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20  lot with all.   
103f0 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74   ** the informat
10400 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63  ion we've collec
10410 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
10420 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
10430 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
10440 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 22   "UPDATE %Q.%s "
10450 0a 20 20 20 20 20 20 20 20 20 22 53 45 54 20 74  .         "SET t
10460 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25  ype='%s', name=%
10470 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20  Q, tbl_name=%Q, 
10480 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20 73 71  rootpage=#%d, sq
10490 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22 57  l=%Q ".       "W
104a0 48 45 52 45 20 72 6f 77 69 64 3d 23 25 64 22 2c  HERE rowid=#%d",
104b0 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  .      db->aDb[i
104c0 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41  Db].zDbSName, MA
104d0 53 54 45 52 5f 4e 41 4d 45 2c 0a 20 20 20 20 20  STER_NAME,.     
104e0 20 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d   zType,.      p-
104f0 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d  >zName,.      p-
10500 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 50  >zName,.      pP
10510 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20  arse->regRoot,. 
10520 20 20 20 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20       zStmt,.    
10530 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77    pParse->regRow
10540 69 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  id.    );.    sq
10550 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
10560 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69  zStmt);.    sqli
10570 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
10580 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23  pParse, iDb);..#
10590 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
105a0 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
105b0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
105c0 20 73 65 65 20 69 66 20 77 65 20 6e 65 65 64 20   see if we need 
105d0 74 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c  to create an sql
105e0 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
105f0 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65  le for.    ** ke
10600 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61  eping track of a
10610 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79  utoincrement key
10620 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
10630 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26  ( (p->tabFlags &
10640 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e   TF_Autoincremen
10650 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 44  t)!=0 ){.      D
10660 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
10670 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20 61 73  b[iDb];.      as
10680 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
10690 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
106a0 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
106b0 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
106c0 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29  ma->pSeqTab==0 )
106d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
106e0 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
106f0 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22  rse,.          "
10700 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e  CREATE TABLE %Q.
10710 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28  sqlite_sequence(
10720 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20  name,seq)",.    
10730 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e        pDb->zDbSN
10740 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ame.        );. 
10750 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
10760 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61  dif..    /* Repa
10770 72 73 65 20 65 76 65 72 79 74 68 69 6e 67 20 74  rse everything t
10780 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74  o update our int
10790 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63  ernal data struc
107a0 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c  tures */.    sql
107b0 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65  ite3VdbeAddParse
107c0 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c  SchemaOp(v, iDb,
107d0 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  .           sqli
107e0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
107f0 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 20 41 4e  tbl_name='%q' AN
10800 44 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72  D type!='trigger
10810 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  '", p->zName));.
10820 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74    }...  /* Add t
10830 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20  he table to the 
10840 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
10850 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
10860 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
10870 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
10880 73 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  sy ){.    Table 
10890 2a 70 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65 6d  *pOld;.    Schem
108a0 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d 3e  a *pSchema = p->
108b0 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73  pSchema;.    ass
108c0 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
108d0 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
108e0 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 70  iDb, 0) );.    p
108f0 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Old = sqlite3Has
10900 68 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61  hInsert(&pSchema
10910 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e  ->tblHash, p->zN
10920 61 6d 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  ame, p);.    if(
10930 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61   pOld ){.      a
10940 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29  ssert( p==pOld )
10950 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73  ;  /* Malloc mus
10960 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e  t have failed in
10970 73 69 64 65 20 48 61 73 68 49 6e 73 65 72 74 28  side HashInsert(
10980 29 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  ) */.      sqlit
10990 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
109a0 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
109b0 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
109c0 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20  pNewTable = 0;. 
109d0 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20     db->mDbFlags 
109e0 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61  |= DBFLAG_Schema
109f0 43 68 61 6e 67 65 3b 0a 0a 23 69 66 6e 64 65 66  Change;..#ifndef
10a00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54   SQLITE_OMIT_ALT
10a10 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ERTABLE.    if( 
10a20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  !p->pSelect ){. 
10a30 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
10a40 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  *zName = (const 
10a50 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e 73  char *)pParse->s
10a60 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20  NameToken.z;.   
10a70 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20     int nName;.  
10a80 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53 65      assert( !pSe
10a90 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26 26  lect && pCons &&
10aa0 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 69   pEnd );.      i
10ab0 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29  f( pCons->z==0 )
10ac0 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 73 20  {.        pCons 
10ad0 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  = pEnd;.      }.
10ae0 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28 69        nName = (i
10af0 6e 74 29 28 28 63 6f 6e 73 74 20 63 68 61 72 20  nt)((const char 
10b00 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61  *)pCons->z - zNa
10b10 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  me);.      p->ad
10b20 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33 20  dColOffset = 13 
10b30 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43 68 61  + sqlite3Utf8Cha
10b40 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  rLen(zName, nNam
10b50 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
10b60 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
10b70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
10b80 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  ./*.** The parse
10b90 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
10ba0 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  tine in order to
10bb0 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49   create a new VI
10bc0 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  EW.*/.void sqlit
10bd0 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20 20  e3CreateView(.  
10be0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
10bf0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
10c00 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
10c10 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20  oken *pBegin,   
10c20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
10c30 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
10c40 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  s the statement 
10c50 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
10c60 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e1,     /* The t
10c70 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
10c80 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
10c90 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  view */.  Token 
10ca0 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20  *pName2,     /* 
10cb0 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  The token that h
10cc0 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  olds the name of
10cd0 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 45   the view */.  E
10ce0 78 70 72 4c 69 73 74 20 2a 70 43 4e 61 6d 65 73  xprList *pCNames
10cf0 2c 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 6c 69  , /* Optional li
10d00 73 74 20 6f 66 20 76 69 65 77 20 63 6f 6c 75 6d  st of view colum
10d10 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 53 65 6c  n names */.  Sel
10d20 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
10d30 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74  /* A SELECT stat
10d40 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20  ement that will 
10d50 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76  become the new v
10d60 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  iew */.  int isT
10d70 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  emp,        /* T
10d80 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52  RUE for a TEMPOR
10d90 41 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  ARY view */.  in
10da0 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 20  t noErr         
10db0 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72 72   /* Suppress err
10dc0 6f 72 20 6d 65 73 73 61 67 65 73 20 69 66 20 56  or messages if V
10dd0 49 45 57 20 61 6c 72 65 61 64 79 20 65 78 69 73  IEW already exis
10de0 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ts */.){.  Table
10df0 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20   *p;.  int n;.  
10e00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
10e10 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44   Token sEnd;.  D
10e20 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54  bFixer sFix;.  T
10e30 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b  oken *pName = 0;
10e40 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71  .  int iDb;.  sq
10e50 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
10e60 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70  se->db;..  if( p
10e70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b  Parse->nVar>0 ){
10e80 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
10e90 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70 61  rMsg(pParse, "pa
10ea0 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f 74  rameters are not
10eb0 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65 77   allowed in view
10ec0 73 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72  s");.    goto cr
10ed0 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a  eate_view_fail;.
10ee0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 61    }.  sqlite3Sta
10ef0 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  rtTable(pParse, 
10f00 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
10f10 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f  isTemp, 1, 0, no
10f20 45 72 72 29 3b 0a 20 20 70 20 3d 20 70 50 61 72  Err);.  p = pPar
10f30 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
10f40 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61   if( p==0 || pPa
10f50 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f  rse->nErr ) goto
10f60 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69   create_view_fai
10f70 6c 3b 0a 20 20 73 71 6c 69 74 65 33 54 77 6f 50  l;.  sqlite3TwoP
10f80 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
10f90 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
10fa0 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62 20 3d  &pName);.  iDb =
10fb0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
10fc0 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63  Index(db, p->pSc
10fd0 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  hema);.  sqlite3
10fe0 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70  FixInit(&sFix, p
10ff0 50 61 72 73 65 2c 20 69 44 62 2c 20 22 76 69 65  Parse, iDb, "vie
11000 77 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  w", pName);.  if
11010 28 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65  ( sqlite3FixSele
11020 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63  ct(&sFix, pSelec
11030 74 29 20 29 20 67 6f 74 6f 20 63 72 65 61 74 65  t) ) goto create
11040 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f  _view_fail;..  /
11050 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  * Make a copy of
11060 20 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45   the entire SELE
11070 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
11080 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69  t defines the vi
11090 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69  ew..  ** This wi
110a0 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65  ll force all the
110b0 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61   Expr.token.z va
110c0 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d  lues to be dynam
110d0 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f  ically.  ** allo
110e0 63 61 74 65 64 20 72 61 74 68 65 72 20 74 68 61  cated rather tha
110f0 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69  n point to the i
11100 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68  nput string - wh
11110 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20  ich means that. 
11120 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65   ** they will pe
11130 72 73 69 73 74 20 61 66 74 65 72 20 74 68 65 20  rsist after the 
11140 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f  current sqlite3_
11150 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75  exec() call retu
11160 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  rns..  */.  p->p
11170 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
11180 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 53  SelectDup(db, pS
11190 65 6c 65 63 74 2c 20 45 58 50 52 44 55 50 5f 52  elect, EXPRDUP_R
111a0 45 44 55 43 45 29 3b 0a 20 20 70 2d 3e 70 43 68  EDUCE);.  p->pCh
111b0 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eck = sqlite3Exp
111c0 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 43 4e  rListDup(db, pCN
111d0 61 6d 65 73 2c 20 45 58 50 52 44 55 50 5f 52 45  ames, EXPRDUP_RE
111e0 44 55 43 45 29 3b 0a 20 20 69 66 28 20 64 62 2d  DUCE);.  if( db-
111f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
11200 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77  goto create_view
11210 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  _fail;..  /* Loc
11220 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ate the end of t
11230 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73  he CREATE VIEW s
11240 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20  tatement.  Make 
11250 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20  sEnd point to.  
11260 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f  ** the end..  */
11270 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65  .  sEnd = pParse
11280 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20  ->sLastToken;.  
11290 61 73 73 65 72 74 28 20 73 45 6e 64 2e 7a 5b 30  assert( sEnd.z[0
112a0 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 45  ]!=0 );.  if( sE
112b0 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a  nd.z[0]!=';' ){.
112c0 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45      sEnd.z += sE
112d0 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64  nd.n;.  }.  sEnd
112e0 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 69  .n = 0;.  n = (i
112f0 6e 74 29 28 73 45 6e 64 2e 7a 20 2d 20 70 42 65  nt)(sEnd.z - pBe
11300 67 69 6e 2d 3e 7a 29 3b 0a 20 20 61 73 73 65 72  gin->z);.  asser
11310 74 28 20 6e 3e 30 20 29 3b 0a 20 20 7a 20 3d 20  t( n>0 );.  z = 
11320 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69  pBegin->z;.  whi
11330 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 70 61  le( sqlite3Isspa
11340 63 65 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d  ce(z[n-1]) ){ n-
11350 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20  -; }.  sEnd.z = 
11360 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e  &z[n-1];.  sEnd.
11370 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65  n = 1;..  /* Use
11380 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
11390 28 29 20 74 6f 20 61 64 64 20 74 68 65 20 76 69  () to add the vi
113a0 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45  ew to the SQLITE
113b0 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f  _MASTER table */
113c0 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  .  sqlite3EndTab
113d0 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 26 73  le(pParse, 0, &s
113e0 45 6e 64 2c 20 30 2c 20 30 29 3b 0a 0a 63 72 65  End, 0, 0);..cre
113f0 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3a 0a 20  ate_view_fail:. 
11400 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
11410 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74  lete(db, pSelect
11420 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
11430 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
11440 43 4e 61 6d 65 73 29 3b 0a 20 20 72 65 74 75 72  CNames);.  retur
11450 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  n;.}.#endif /* S
11460 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20  QLITE_OMIT_VIEW 
11470 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
11480 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
11490 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
114a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
114b0 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54  ALTABLE)./*.** T
114c0 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
114d0 72 65 20 70 54 61 62 6c 65 20 69 73 20 72 65 61  re pTable is rea
114e0 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c  lly a VIEW.  Fil
114f0 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f  l in the names o
11500 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73  f.** the columns
11510 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e 20   of the view in 
11520 74 68 65 20 70 54 61 62 6c 65 20 73 74 72 75 63  the pTable struc
11530 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68  ture.  Return th
11540 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65  e number.** of e
11550 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72  rrors.  If an er
11560 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76  ror is seen leav
11570 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
11580 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
11590 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
115a0 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
115b0 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70  mnNames(Parse *p
115c0 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
115d0 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  able){.  Table *
115e0 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20  pSelTab;   /* A 
115f0 66 61 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d 20  fake table from 
11600 77 68 69 63 68 20 77 65 20 67 65 74 20 74 68 65  which we get the
11610 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
11620 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20   Select *pSel;  
11630 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68     /* Copy of th
11640 65 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 6d  e SELECT that im
11650 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65  plements the vie
11660 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20  w */.  int nErr 
11670 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  = 0;     /* Numb
11680 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63  er of errors enc
11690 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e  ountered */.  in
116a0 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
116b0 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 68  /* Temporarily h
116c0 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 72 20  olds the number 
116d0 6f 66 20 63 75 72 73 6f 72 73 20 61 73 73 69 67  of cursors assig
116e0 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ned */.  sqlite3
116f0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
11700 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  b;  /* Database 
11710 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 6d  connection for m
11720 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a 2f 0a  alloc errors */.
11730 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11740 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
11750 09 0a 20 20 69 6e 74 20 72 63 3b 0a 23 65 6e 64  ..  int rc;.#end
11760 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
11770 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
11780 54 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33 5f 78  TION.  sqlite3_x
11790 61 75 74 68 20 78 41 75 74 68 3b 20 20 20 20 20  auth xAuth;     
117a0 20 20 2f 2a 20 53 61 76 65 64 20 78 41 75 74 68    /* Saved xAuth
117b0 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 23 65 6e 64   pointer */.#end
117c0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  if..  assert( pT
117d0 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66  able );..#ifndef
117e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
117f0 54 55 41 4c 54 41 42 4c 45 0a 20 20 64 62 2d 3e  TUALTABLE.  db->
11800 6e 53 63 68 65 6d 61 4c 6f 63 6b 2b 2b 3b 0a 20  nSchemaLock++;. 
11810 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
11820 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 61  bCallConnect(pPa
11830 72 73 65 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  rse, pTable);.  
11840 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 2d  db->nSchemaLock-
11850 2d 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  -;.  if( rc ){. 
11860 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
11870 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
11880 28 70 54 61 62 6c 65 29 20 29 20 72 65 74 75 72  (pTable) ) retur
11890 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  n 0;.#endif..#if
118a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
118b0 5f 56 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73  _VIEW.  /* A pos
118c0 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73  itive nCol means
118d0 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d   the columns nam
118e0 65 73 20 66 6f 72 20 74 68 69 73 20 76 69 65 77  es for this view
118f0 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64   are.  ** alread
11900 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20  y known..  */.  
11910 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
11920 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  >0 ) return 0;..
11930 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20    /* A negative 
11940 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61  nCol is a specia
11950 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67  l marker meaning
11960 20 74 68 61 74 20 77 65 20 61 72 65 20 63 75 72   that we are cur
11970 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69  rently.  ** tryi
11980 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ng to compute th
11990 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20  e column names. 
119a0 20 49 66 20 77 65 20 65 6e 74 65 72 20 74 68 69   If we enter thi
119b0 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20  s routine with. 
119c0 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e   ** a negative n
119d0 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77  Col, it means tw
119e0 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20  o or more views 
119f0 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b  form a loop, lik
11a00 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a  e this:.  **.  *
11a10 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45  *     CREATE VIE
11a20 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20  W one AS SELECT 
11a30 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a  * FROM two;.  **
11a40 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
11a50 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a   two AS SELECT *
11a60 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a   FROM one;.  **.
11a70 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74    ** Actually, t
11a80 68 65 20 65 72 72 6f 72 20 61 62 6f 76 65 20 69  he error above i
11a90 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72 69  s now caught pri
11aa0 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20 74  or to reaching t
11ab0 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20  his point..  ** 
11ac0 42 75 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  But the followin
11ad0 67 20 74 65 73 74 20 69 73 20 73 74 69 6c 6c 20  g test is still 
11ae0 69 6d 70 6f 72 74 61 6e 74 20 61 73 20 69 74 20  important as it 
11af0 64 6f 65 73 20 63 6f 6d 65 20 75 70 0a 20 20 2a  does come up.  *
11b00 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * in the followi
11b10 6e 67 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20  ng:.  ** .  **  
11b20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
11b30 6d 61 69 6e 2e 65 78 31 28 61 29 3b 0a 20 20 2a  main.ex1(a);.  *
11b40 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 45 4d  *     CREATE TEM
11b50 50 20 56 49 45 57 20 65 78 31 20 41 53 20 53 45  P VIEW ex1 AS SE
11b60 4c 45 43 54 20 61 20 46 52 4f 4d 20 65 78 31 3b  LECT a FROM ex1;
11b70 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
11b80 20 2a 20 46 52 4f 4d 20 74 65 6d 70 2e 65 78 31   * FROM temp.ex1
11b90 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ;.  */.  if( pTa
11ba0 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20  ble->nCol<0 ){. 
11bb0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
11bc0 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77  sg(pParse, "view
11bd0 20 25 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c   %s is circularl
11be0 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62  y defined", pTab
11bf0 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  le->zName);.    
11c00 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
11c10 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
11c20 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a  nCol>=0 );..  /*
11c30 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20   If we get this 
11c40 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65  far, it means we
11c50 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   need to compute
11c60 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73   the table names
11c70 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74  ..  ** Note that
11c80 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
11c90 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
11ca0 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70  elect() will exp
11cb0 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22  and any.  ** "*"
11cc0 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
11cd0 20 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66 20   results set of 
11ce0 74 68 65 20 76 69 65 77 20 61 6e 64 20 77 69 6c  the view and wil
11cf0 6c 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72 73  l assign cursors
11d00 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65  .  ** to the ele
11d10 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52 4f  ments of the FRO
11d20 4d 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 77  M clause.  But w
11d30 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68  e do not want th
11d40 65 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a  ese changes.  **
11d50 20 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e 74   to be permanent
11d60 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75 74  .  So the comput
11d70 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e  ation is done on
11d80 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53   a copy of the S
11d90 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74 65  ELECT.  ** state
11da0 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
11db0 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f  s the view..  */
11dc0 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
11dd0 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 20  e->pSelect );.  
11de0 70 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 65  pSel = sqlite3Se
11df0 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62  lectDup(db, pTab
11e00 6c 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b  le->pSelect, 0);
11e10 0a 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20  .  if( pSel ){. 
11e20 20 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e     n = pParse->n
11e30 54 61 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Tab;.    sqlite3
11e40 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
11e50 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53 65  sors(pParse, pSe
11e60 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 70 54  l->pSrc);.    pT
11e70 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b  able->nCol = -1;
11e80 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
11e90 64 65 2e 62 44 69 73 61 62 6c 65 2b 2b 3b 0a 23  de.bDisable++;.#
11ea0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11eb0 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
11ec0 0a 20 20 20 20 78 41 75 74 68 20 3d 20 64 62 2d  .    xAuth = db-
11ed0 3e 78 41 75 74 68 3b 0a 20 20 20 20 64 62 2d 3e  >xAuth;.    db->
11ee0 78 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 70  xAuth = 0;.    p
11ef0 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
11f00 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
11f10 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b  t(pParse, pSel);
11f20 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d  .    db->xAuth =
11f30 20 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20   xAuth;.#else.  
11f40 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69    pSelTab = sqli
11f50 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
11f60 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
11f70 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70  l);.#endif.    p
11f80 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b  Parse->nTab = n;
11f90 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 2d  .    if( pTable-
11fa0 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20  >pCheck ){.     
11fb0 20 2f 2a 20 43 52 45 41 54 45 20 56 49 45 57 20   /* CREATE VIEW 
11fc0 6e 61 6d 65 28 61 72 67 6c 69 73 74 29 20 41 53  name(arglist) AS
11fd0 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68   ....      ** Th
11fe0 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63  e names of the c
11ff0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61  olumns in the ta
12000 62 6c 65 20 61 72 65 20 74 61 6b 65 6e 20 66 72  ble are taken fr
12010 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 6c  om.      ** argl
12020 69 73 74 20 77 68 69 63 68 20 69 73 20 73 74 6f  ist which is sto
12030 72 65 64 20 69 6e 20 70 54 61 62 6c 65 2d 3e 70  red in pTable->p
12040 43 68 65 63 6b 2e 20 20 54 68 65 20 70 43 68 65  Check.  The pChe
12050 63 6b 20 66 69 65 6c 64 0a 20 20 20 20 20 20 2a  ck field.      *
12060 2a 20 6e 6f 72 6d 61 6c 6c 79 20 68 6f 6c 64 73  * normally holds
12070 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
12080 74 73 20 6f 6e 20 61 6e 20 6f 72 64 69 6e 61 72  ts on an ordinar
12090 79 20 74 61 62 6c 65 2c 20 62 75 74 20 66 6f 72  y table, but for
120a0 0a 20 20 20 20 20 20 2a 2a 20 61 20 56 49 45 57  .      ** a VIEW
120b0 20 69 74 20 68 6f 6c 64 73 20 74 68 65 20 6c 69   it holds the li
120c0 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d  st of column nam
120d0 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  es..      */.   
120e0 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
120f0 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  sFromExprList(pP
12100 61 72 73 65 2c 20 70 54 61 62 6c 65 2d 3e 70 43  arse, pTable->pC
12110 68 65 63 6b 2c 20 0a 20 20 20 20 20 20 20 20 20  heck, .         
12120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12130 20 20 20 20 20 20 20 20 26 70 54 61 62 6c 65 2d          &pTable-
12140 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 6c 65 2d 3e  >nCol, &pTable->
12150 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  aCol);.      if(
12160 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
12170 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20  d==0 .       && 
12180 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 0a  pParse->nErr==0.
12190 20 20 20 20 20 20 20 26 26 20 70 54 61 62 6c 65         && pTable
121a0 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 2d 3e 70 45  ->nCol==pSel->pE
121b0 4c 69 73 74 2d 3e 6e 45 78 70 72 0a 20 20 20 20  List->nExpr.    
121c0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c    ){.        sql
121d0 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c  ite3SelectAddCol
121e0 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
121f0 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
12200 6c 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20  le, pSel);.     
12210 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
12220 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20   pSelTab ){.    
12230 20 20 2f 2a 20 43 52 45 41 54 45 20 56 49 45 57    /* CREATE VIEW
12240 20 6e 61 6d 65 20 41 53 2e 2e 2e 20 20 77 69 74   name AS...  wit
12250 68 6f 75 74 20 61 6e 20 61 72 67 75 6d 65 6e 74  hout an argument
12260 20 6c 69 73 74 2e 20 20 43 6f 6e 73 74 72 75 63   list.  Construc
12270 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  t.      ** the c
12280 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d  olumn names from
12290 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
122a0 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e  ement that defin
122b0 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 20  es the view..   
122c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
122d0 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  rt( pTable->aCol
122e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61  ==0 );.      pTa
122f0 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c  ble->nCol = pSel
12300 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  Tab->nCol;.     
12310 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
12320 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
12330 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43       pSelTab->nC
12340 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53  ol = 0;.      pS
12350 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
12360 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
12370 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
12380 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 54 61  xHeld(db, 0, pTa
12390 62 6c 65 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b  ble->pSchema) );
123a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
123b0 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
123c0 20 30 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b   0;.      nErr++
123d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
123e0 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
123f0 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20  b, pSelTab);.   
12400 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
12410 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a  lete(db, pSel);.
12420 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
12430 65 2e 62 44 69 73 61 62 6c 65 2d 2d 3b 0a 20 20  e.bDisable--;.  
12440 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72  } else {.    nEr
12450 72 2b 2b 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  r++;.  }.  pTabl
12460 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  e->pSchema->sche
12470 6d 61 46 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e  maFlags |= DB_Un
12480 72 65 73 65 74 56 69 65 77 73 3b 0a 23 65 6e 64  resetViews;.#end
12490 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
124a0 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65 74 75  T_VIEW */.  retu
124b0 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e  rn nErr;  .}.#en
124c0 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
124d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
124e0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
124f0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
12500 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e  LTABLE) */..#ifn
12510 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12520 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  VIEW./*.** Clear
12530 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
12540 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45  s from every VIE
12550 57 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 64  W in database id
12560 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
12570 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  d sqliteViewRese
12580 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62  tAll(sqlite3 *db
12590 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61  , int idx){.  Ha
125a0 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 61 73 73  shElem *i;.  ass
125b0 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
125c0 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
125d0 69 64 78 2c 20 30 29 20 29 3b 0a 20 20 69 66 28  idx, 0) );.  if(
125e0 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28   !DbHasProperty(
125f0 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65  db, idx, DB_Unre
12600 73 65 74 56 69 65 77 73 29 20 29 20 72 65 74 75  setViews) ) retu
12610 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69  rn;.  for(i=sqli
12620 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
12630 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d  >aDb[idx].pSchem
12640 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 69  a->tblHash); i;i
12650 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
12660 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  i)){.    Table *
12670 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
12680 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
12690 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
126a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
126b0 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  DeleteColumnName
126c0 73 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  s(db, pTab);.   
126d0 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20     pTab->aCol = 
126e0 30 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  0;.      pTab->n
126f0 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Col = 0;.    }. 
12700 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70   }.  DbClearProp
12710 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42  erty(db, idx, DB
12720 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a  _UnresetViews);.
12730 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
12740 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
12750 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20  All(A,B).#endif 
12760 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
12770 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  IEW */../*.** Th
12780 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
12790 61 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44 42  alled by the VDB
127a0 45 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  E to adjust the 
127b0 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a  internal schema.
127c0 2a 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69 74  ** used by SQLit
127d0 65 20 77 68 65 6e 20 74 68 65 20 62 74 72 65 65  e when the btree
127e0 20 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74   layer moves a t
127f0 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20  able root page. 
12800 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65  The.** root-page
12810 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69   of a table or i
12820 6e 64 65 78 20 69 6e 20 64 61 74 61 62 61 73 65  ndex in database
12830 20 69 44 62 20 68 61 73 20 63 68 61 6e 67 65 64   iDb has changed
12840 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74   from iFrom.** t
12850 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63  o iTo..**.** Tic
12860 6b 65 74 20 23 31 37 32 38 3a 20 20 54 68 65 20  ket #1728:  The 
12870 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67  symbol table mig
12880 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e  ht still contain
12890 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
128a0 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72  on tables and/or
128b0 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 61 72   indices that ar
128c0 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66  e the process of
128d0 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a   being deleted..
128e0 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 6e  ** If you are un
128f0 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68  lucky, one of th
12900 6f 73 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69  ose deleted indi
12910 63 65 73 20 6f 72 20 74 61 62 6c 65 73 20 6d 69  ces or tables mi
12920 67 68 74 0a 2a 2a 20 68 61 76 65 20 74 68 65 20  ght.** have the 
12930 73 61 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e 75  same rootpage nu
12940 6d 62 65 72 20 61 73 20 74 68 65 20 72 65 61 6c  mber as the real
12950 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
12960 74 68 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67  that is.** being
12970 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65 20 63   moved.  So we c
12980 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61 72 63  annot stop searc
12990 68 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 66  hing after the f
129a0 69 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62  irst match .** b
129b0 65 63 61 75 73 65 20 74 68 65 20 66 69 72 73 74  ecause the first
129c0 20 6d 61 74 63 68 20 6d 69 67 68 74 20 62 65 20   match might be 
129d0 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 64  for one of the d
129e0 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 0a 2a  eleted indices.*
129f0 2a 20 6f 72 20 74 61 62 6c 65 73 20 61 6e 64 20  * or tables and 
12a00 6e 6f 74 20 74 68 65 20 74 61 62 6c 65 2f 69 6e  not the table/in
12a10 64 65 78 20 74 68 61 74 20 69 73 20 61 63 74 75  dex that is actu
12a20 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65 64  ally being moved
12a30 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e  ..** We must con
12a40 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e  tinue looping un
12a50 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20 61  til all tables a
12a60 6e 64 20 69 6e 64 69 63 65 73 20 77 69 74 68 0a  nd indices with.
12a70 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72  ** rootpage==iFr
12a80 6f 6d 20 68 61 76 65 20 62 65 65 6e 20 63 6f 6e  om have been con
12a90 76 65 72 74 65 64 20 74 6f 20 68 61 76 65 20 61  verted to have a
12aa0 20 72 6f 6f 74 70 61 67 65 20 6f 66 20 69 54 6f   rootpage of iTo
12ab0 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
12ac0 62 65 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  be certain that 
12ad0 77 65 20 67 6f 74 20 74 68 65 20 72 69 67 68 74  we got the right
12ae0 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   one..*/.#ifndef
12af0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
12b00 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c  OVACUUM.void sql
12b10 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65  ite3RootPageMove
12b20 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  d(sqlite3 *db, i
12b30 6e 74 20 69 44 62 2c 20 69 6e 74 20 69 46 72 6f  nt iDb, int iFro
12b40 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48  m, int iTo){.  H
12b50 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a  ashElem *pElem;.
12b60 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 20    Hash *pHash;. 
12b70 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73   Db *pDb;..  ass
12b80 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
12b90 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
12ba0 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 44 62  iDb, 0) );.  pDb
12bb0 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
12bc0 3b 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62  ;.  pHash = &pDb
12bd0 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ->pSchema->tblHa
12be0 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d  sh;.  for(pElem=
12bf0 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
12c00 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  pHash); pElem; p
12c10 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
12c20 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
12c30 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
12c40 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
12c50 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54  lem);.    if( pT
12c60 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20  ab->tnum==iFrom 
12c70 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74  ){.      pTab->t
12c80 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d  num = iTo;.    }
12c90 0a 20 20 7d 0a 20 20 70 48 61 73 68 20 3d 20 26  .  }.  pHash = &
12ca0 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64  pDb->pSchema->id
12cb0 78 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c  xHash;.  for(pEl
12cc0 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
12cd0 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d  st(pHash); pElem
12ce0 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
12cf0 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
12d00 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
12d10 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
12d20 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28  (pElem);.    if(
12d30 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72   pIdx->tnum==iFr
12d40 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  om ){.      pIdx
12d50 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20  ->tnum = iTo;.  
12d60 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
12d70 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f  ../*.** Write co
12d80 64 65 20 74 6f 20 65 72 61 73 65 20 74 68 65 20  de to erase the 
12d90 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
12da0 70 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d  page iTable from
12db0 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a   database iDb..*
12dc0 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64  * Also write cod
12dd0 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
12de0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
12df0 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c  ble and internal
12e00 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20   schema.** if a 
12e10 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f  root-page of ano
12e20 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f  ther table is mo
12e30 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  ved by the btree
12e40 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a  -layer whilst.**
12e50 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20   erasing iTable 
12e60 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e  (this can happen
12e70 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61   with an auto-va
12e80 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a  cuum database)..
12e90 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
12ea0 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
12eb0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
12ec0 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69  nt iTable, int i
12ed0 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Db){.  Vdbe *v =
12ee0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
12ef0 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72  pParse);.  int r
12f00 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
12f10 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
12f20 20 61 73 73 65 72 74 28 20 69 54 61 62 6c 65 3e   assert( iTable>
12f30 31 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  1 );.  sqlite3Vd
12f40 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44  beAddOp3(v, OP_D
12f50 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20  estroy, iTable, 
12f60 72 31 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69  r1, iDb);.  sqli
12f70 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
12f80 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  se);.#ifndef SQL
12f90 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
12fa0 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74  UUM.  /* OP_Dest
12fb0 72 6f 79 20 73 74 6f 72 65 73 20 61 6e 20 69 6e  roy stores an in
12fc0 20 69 6e 74 65 67 65 72 20 72 31 2e 20 49 66 20   integer r1. If 
12fd0 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a  this integer.  *
12fe0 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  * is non-zero, t
12ff0 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f  hen it is the ro
13000 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
13010 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20  f a table moved 
13020 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e  to.  ** location
13030 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c   iTable. The fol
13040 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69  lowing code modi
13050 66 69 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f  fies the sqlite_
13060 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a  master table to.
13070 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69    ** reflect thi
13080 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
13090 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20 53   "#NNN" in the S
130a0 51 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  QL is a special 
130b0 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65  constant that me
130c0 61 6e 73 20 77 68 61 74 65 76 65 72 20 76 61 6c  ans whatever val
130d0 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72 65  ue.  ** is in re
130e0 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65 65  gister NNN.  See
130f0 20 67 72 61 6d 6d 61 72 20 72 75 6c 65 73 20 61   grammar rules a
13100 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
13110 68 65 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 20  he TK_REGISTER. 
13120 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61 64   ** token for ad
13130 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
13140 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  tion..  */.  sql
13150 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
13160 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22 55  pParse, .     "U
13170 50 44 41 54 45 20 25 51 2e 25 73 20 53 45 54 20  PDATE %Q.%s SET 
13180 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45 52  rootpage=%d WHER
13190 45 20 23 25 64 20 41 4e 44 20 72 6f 6f 74 70 61  E #%d AND rootpa
131a0 67 65 3d 23 25 64 22 2c 0a 20 20 20 20 20 70 50  ge=#%d",.     pP
131b0 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
131c0 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53  b].zDbSName, MAS
131d0 54 45 52 5f 4e 41 4d 45 2c 20 69 54 61 62 6c 65  TER_NAME, iTable
131e0 2c 20 72 31 2c 20 72 31 29 3b 0a 23 65 6e 64 69  , r1, r1);.#endi
131f0 66 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  f.  sqlite3Relea
13200 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
13210 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , r1);.}../*.** 
13220 57 72 69 74 65 20 56 44 42 45 20 63 6f 64 65 20  Write VDBE code 
13230 74 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20 70  to erase table p
13240 54 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f  Tab and all asso
13250 63 69 61 74 65 64 20 69 6e 64 69 63 65 73 20 6f  ciated indices o
13260 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20  n disk..** Code 
13270 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 73 71  to update the sq
13280 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
13290 65 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20  es and internal 
132a0 73 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69 6f  schema definitio
132b0 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61 20  ns.** in case a 
132c0 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67  root-page belong
132d0 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20 74  ing to another t
132e0 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79  able is moved by
132f0 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
13300 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64 65  .** is also adde
13310 64 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70  d (this can happ
13320 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d  en with an auto-
13330 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29  vacuum database)
13340 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
13350 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50 61   destroyTable(Pa
13360 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
13370 6c 65 20 2a 70 54 61 62 29 7b 0a 23 69 66 64 65  le *pTab){.#ifde
13380 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
13390 54 4f 56 41 43 55 55 4d 0a 20 20 49 6e 64 65 78  TOVACUUM.  Index
133a0 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 44   *pIdx;.  int iD
133b0 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
133c0 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
133d0 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
133e0 6d 61 29 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f  ma);.  destroyRo
133f0 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70  otPage(pParse, p
13400 54 61 62 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  Tab->tnum, iDb);
13410 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
13420 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
13430 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
13440 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f  ){.    destroyRo
13450 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70  otPage(pParse, p
13460 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  Idx->tnum, iDb);
13470 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20  .  }.#else.  /* 
13480 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
13490 6d 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63 75  may be auto-vacu
134a0 75 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20 53  um capable (if S
134b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
134c0 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f  ACUUM.  ** is no
134d0 74 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65 6e  t defined), then
134e0 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
134f0 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74   to call OP_Dest
13500 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  roy on the.  ** 
13510 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
13520 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f 72  root-pages in or
13530 64 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77 69  der, starting wi
13540 74 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c  th the numerical
13550 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74  ly .  ** largest
13560 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
13570 72 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65  r. This guarante
13580 65 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20  es that none of 
13590 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20  the root-pages. 
135a0 20 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72 6f   ** to be destro
135b0 79 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65 64  yed is relocated
135c0 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 4f   by an earlier O
135d0 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20  P_Destroy. i.e. 
135e0 69 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c  if the.  ** foll
135f0 6f 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65 64  owing were coded
13600 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44  :.  **.  ** OP_D
13610 65 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20  estroy 4 0.  ** 
13620 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74  ....  ** OP_Dest
13630 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a  roy 5 0.  **.  *
13640 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20  * and root page 
13650 35 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62 65  5 happened to be
13660 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f   the largest roo
13670 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e  t-page number in
13680 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
13690 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70 61  se, then root pa
136a0 67 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f  ge 5 would be mo
136b0 76 65 64 20 74 6f 20 70 61 67 65 20 34 20 62 79  ved to page 4 by
136c0 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44   the .  ** "OP_D
136d0 65 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63 6f  estroy 4 0" opco
136e0 64 65 2e 20 54 68 65 20 73 75 62 73 65 71 75 65  de. The subseque
136f0 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 35  nt "OP_Destroy 5
13700 20 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20 20   0" would hit.  
13710 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20 70  ** a free-list p
13720 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  age..  */.  int 
13730 69 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75  iTab = pTab->tnu
13740 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72 6f  m;.  int iDestro
13750 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c  yed = 0;..  whil
13760 65 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64 65  e( 1 ){.    Inde
13770 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e 74  x *pIdx;.    int
13780 20 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a   iLargest = 0;..
13790 20 20 20 20 69 66 28 20 69 44 65 73 74 72 6f 79      if( iDestroy
137a0 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44  ed==0 || iTab<iD
137b0 65 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20 20  estroyed ){.    
137c0 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54 61    iLargest = iTa
137d0 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  b;.    }.    for
137e0 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
137f0 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
13800 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
13810 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 49     int iIdx = pI
13820 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20  dx->tnum;.      
13830 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 53  assert( pIdx->pS
13840 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
13850 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 69 66  hema );.      if
13860 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d 30  ( (iDestroyed==0
13870 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74 72   || (iIdx<iDestr
13880 6f 79 65 64 29 29 20 26 26 20 69 49 64 78 3e 69  oyed)) && iIdx>i
13890 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20 20  Largest ){.     
138a0 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 49     iLargest = iI
138b0 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dx;.      }.    
138c0 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67 65  }.    if( iLarge
138d0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  st==0 ){.      r
138e0 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65  eturn;.    }else
138f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20  {.      int iDb 
13900 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
13910 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
13920 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
13930 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
13940 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 70   iDb>=0 && iDb<p
13950 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29  Parse->db->nDb )
13960 3b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79 52  ;.      destroyR
13970 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
13980 69 4c 61 72 67 65 73 74 2c 20 69 44 62 29 3b 0a  iLargest, iDb);.
13990 20 20 20 20 20 20 69 44 65 73 74 72 6f 79 65 64        iDestroyed
139a0 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20 20 20   = iLargest;.   
139b0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a   }.  }.#endif.}.
139c0 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 65 6e  ./*.** Remove en
139d0 74 72 69 65 73 20 66 72 6f 6d 20 74 68 65 20 73  tries from the s
139e0 71 6c 69 74 65 5f 73 74 61 74 4e 20 74 61 62 6c  qlite_statN tabl
139f0 65 73 20 28 66 6f 72 20 4e 20 69 6e 20 28 31 2c  es (for N in (1,
13a00 32 2c 33 29 29 0a 2a 2a 20 61 66 74 65 72 20 61  2,3)).** after a
13a10 20 44 52 4f 50 20 49 4e 44 45 58 20 6f 72 20 44   DROP INDEX or D
13a20 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e  ROP TABLE comman
13a30 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
13a40 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74  d sqlite3ClearSt
13a50 61 74 54 61 62 6c 65 73 28 0a 20 20 50 61 72 73  atTables(.  Pars
13a60 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
13a70 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
13a80 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
13a90 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20 20 20  nt iDb,         
13aa0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
13ab0 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  abase number */.
13ac0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
13ad0 79 70 65 2c 20 20 20 20 20 2f 2a 20 22 69 64 78  ype,     /* "idx
13ae0 22 20 6f 72 20 22 74 62 6c 22 20 2a 2f 0a 20 20  " or "tbl" */.  
13af0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
13b00 65 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  e      /* Name o
13b10 66 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  f index or table
13b20 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
13b30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
13b40 62 4e 61 6d 65 20 3d 20 70 50 61 72 73 65 2d 3e  bName = pParse->
13b50 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
13b60 53 4e 61 6d 65 3b 0a 20 20 66 6f 72 28 69 3d 31  SName;.  for(i=1
13b70 3b 20 69 3c 3d 34 3b 20 69 2b 2b 29 7b 0a 20 20  ; i<=4; i++){.  
13b80 20 20 63 68 61 72 20 7a 54 61 62 5b 32 34 5d 3b    char zTab[24];
13b90 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
13ba0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 61  rintf(sizeof(zTa
13bb0 62 29 2c 7a 54 61 62 2c 22 73 71 6c 69 74 65 5f  b),zTab,"sqlite_
13bc0 73 74 61 74 25 64 22 2c 69 29 3b 0a 20 20 20 20  stat%d",i);.    
13bd0 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
13be0 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
13bf0 20 7a 54 61 62 2c 20 7a 44 62 4e 61 6d 65 29 20   zTab, zDbName) 
13c00 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13c10 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
13c20 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c  se,.        "DEL
13c30 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57  ETE FROM %Q.%s W
13c40 48 45 52 45 20 25 73 3d 25 51 22 2c 0a 20 20 20  HERE %s=%Q",.   
13c50 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54       zDbName, zT
13c60 61 62 2c 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65  ab, zType, zName
13c70 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
13c80 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
13c90 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64 72  erate code to dr
13ca0 6f 70 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76  op a table..*/.v
13cb0 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 44  oid sqlite3CodeD
13cc0 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a  ropTable(Parse *
13cd0 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
13ce0 54 61 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e  Tab, int iDb, in
13cf0 74 20 69 73 56 69 65 77 29 7b 0a 20 20 56 64 62  t isView){.  Vdb
13d00 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *v;.  sqlite3 
13d10 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
13d20 3b 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72  ;.  Trigger *pTr
13d30 69 67 67 65 72 3b 0a 20 20 44 62 20 2a 70 44 62  igger;.  Db *pDb
13d40 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
13d50 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
13d60 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
13d70 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
13d80 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
13d90 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
13da0 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
13db0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
13dc0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
13dd0 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  LE.  if( IsVirtu
13de0 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
13df0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13e00 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b  0(v, OP_VBegin);
13e10 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
13e20 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67  * Drop all trigg
13e30 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ers associated w
13e40 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 62 65  ith the table be
13e50 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64  ing dropped. Cod
13e60 65 0a 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61  e.  ** is genera
13e70 74 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e  ted to remove en
13e80 74 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74  tries from sqlit
13e90 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a  e_master and/or.
13ea0 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70    ** sqlite_temp
13eb0 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71 75 69  _master if requi
13ec0 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 72 69  red..  */.  pTri
13ed0 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54 72  gger = sqlite3Tr
13ee0 69 67 67 65 72 4c 69 73 74 28 70 50 61 72 73 65  iggerList(pParse
13ef0 2c 20 70 54 61 62 29 3b 0a 20 20 77 68 69 6c 65  , pTab);.  while
13f00 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20  ( pTrigger ){.  
13f10 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67    assert( pTrigg
13f20 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  er->pSchema==pTa
13f30 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20  b->pSchema || . 
13f40 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72 2d         pTrigger-
13f50 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44  >pSchema==db->aD
13f60 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a  b[1].pSchema );.
13f70 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54      sqlite3DropT
13f80 72 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65  riggerPtr(pParse
13f90 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20  , pTrigger);.   
13fa0 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69   pTrigger = pTri
13fb0 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  gger->pNext;.  }
13fc0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
13fd0 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
13fe0 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ENT.  /* Remove 
13ff0 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74  any entries of t
14000 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  he sqlite_sequen
14010 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61  ce table associa
14020 74 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68  ted with.  ** th
14030 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
14040 6f 70 70 65 64 2e 20 54 68 69 73 20 69 73 20 64  opped. This is d
14050 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20 74  one before the t
14060 61 62 6c 65 20 69 73 20 64 72 6f 70 70 65 64 0a  able is dropped.
14070 20 20 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65    ** at the btre
14080 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65  e level, in case
14090 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75   the sqlite_sequ
140a0 65 6e 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73  ence table needs
140b0 20 74 6f 0a 20 20 2a 2a 20 6d 6f 76 65 20 61 73   to.  ** move as
140c0 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
140d0 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65   drop (can happe
140e0 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  n in auto-vacuum
140f0 20 6d 6f 64 65 29 2e 0a 20 20 2a 2f 0a 20 20 69   mode)..  */.  i
14100 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  f( pTab->tabFlag
14110 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65  s & TF_Autoincre
14120 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  ment ){.    sqli
14130 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
14140 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 44 45  Parse,.      "DE
14150 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c  LETE FROM %Q.sql
14160 69 74 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45  ite_sequence WHE
14170 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20  RE name=%Q",.   
14180 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65     pDb->zDbSName
14190 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20  , pTab->zName.  
141a0 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a    );.  }.#endif.
141b0 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53  .  /* Drop all S
141c0 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
141d0 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74  le and index ent
141e0 72 69 65 73 20 74 68 61 74 20 72 65 66 65 72 20  ries that refer 
141f0 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c  to the.  ** tabl
14200 65 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e  e. The program n
14210 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67  ame loops throug
14220 68 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  h the master tab
14230 6c 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20  le and deletes. 
14240 20 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68   ** every row th
14250 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  at refers to a t
14260 61 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65  able of the same
14270 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65   name as the one
14280 20 62 65 69 6e 67 0a 20 20 2a 2a 20 64 72 6f 70   being.  ** drop
14290 70 65 64 2e 20 54 72 69 67 67 65 72 73 20 61 72  ped. Triggers ar
142a0 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61  e handled separa
142b0 74 65 6c 79 20 62 65 63 61 75 73 65 20 61 20 74  tely because a t
142c0 72 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20  rigger can be.  
142d0 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  ** created in th
142e0 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  e temp database 
142f0 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61  that refers to a
14300 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65   table in anothe
14310 72 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  r.  ** database.
14320 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e  .  */.  sqlite3N
14330 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
14340 65 2c 20 0a 20 20 20 20 20 20 22 44 45 4c 45 54  e, .      "DELET
14350 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45  E FROM %Q.%s WHE
14360 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61  RE tbl_name=%Q a
14370 6e 64 20 74 79 70 65 21 3d 27 74 72 69 67 67 65  nd type!='trigge
14380 72 27 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e  r'",.      pDb->
14390 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52  zDbSName, MASTER
143a0 5f 4e 41 4d 45 2c 20 70 54 61 62 2d 3e 7a 4e 61  _NAME, pTab->zNa
143b0 6d 65 29 3b 0a 20 20 69 66 28 20 21 69 73 56 69  me);.  if( !isVi
143c0 65 77 20 26 26 20 21 49 73 56 69 72 74 75 61 6c  ew && !IsVirtual
143d0 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 64 65  (pTab) ){.    de
143e0 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73  stroyTable(pPars
143f0 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a 0a 20  e, pTab);.  }.. 
14400 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74   /* Remove the t
14410 61 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20  able entry from 
14420 53 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61  SQLite's interna
14430 6c 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64  l schema and mod
14440 69 66 79 0a 20 20 2a 2a 20 74 68 65 20 73 63 68  ify.  ** the sch
14450 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a 2f  ema cookie..  */
14460 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
14470 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71  (pTab) ){.    sq
14480 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
14490 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20  v, OP_VDestroy, 
144a0 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d  iDb, 0, 0, pTab-
144b0 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a  >zName, 0);.  }.
144c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
144d0 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61  Op4(v, OP_DropTa
144e0 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  ble, iDb, 0, 0, 
144f0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pTab->zName, 0);
14500 0a 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65  .  sqlite3Change
14510 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
14520 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 56 69 65  Db);.  sqliteVie
14530 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44  wResetAll(db, iD
14540 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  b);.}../*.** Thi
14550 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
14560 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  led to do the wo
14570 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42  rk of a DROP TAB
14580 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
14590 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61   pName is the na
145a0 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
145b0 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a  to be dropped..*
145c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72  /.void sqlite3Dr
145d0 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  opTable(Parse *p
145e0 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
145f0 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65  pName, int isVie
14600 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20  w, int noErr){. 
14610 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
14620 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
14630 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
14640 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
14650 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
14660 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
14670 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
14680 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ble;.  }.  asser
14690 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  t( pParse->nErr=
146a0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
146b0 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29  pName->nSrc==1 )
146c0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 52  ;.  if( sqlite3R
146d0 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
146e0 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 64 72  ) ) goto exit_dr
146f0 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 69 66 28 20  op_table;.  if( 
14700 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70  noErr ) db->supp
14710 72 65 73 73 45 72 72 2b 2b 3b 0a 20 20 61 73 73  ressErr++;.  ass
14720 65 72 74 28 20 69 73 56 69 65 77 3d 3d 30 20 7c  ert( isView==0 |
14730 7c 20 69 73 56 69 65 77 3d 3d 4c 4f 43 41 54 45  | isView==LOCATE
14740 5f 56 49 45 57 20 29 3b 0a 20 20 70 54 61 62 20  _VIEW );.  pTab 
14750 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
14760 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c  ableItem(pParse,
14770 20 69 73 56 69 65 77 2c 20 26 70 4e 61 6d 65 2d   isView, &pName-
14780 3e 61 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 6f  >a[0]);.  if( no
14790 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65  Err ) db->suppre
147a0 73 73 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20  ssErr--;..  if( 
147b0 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69  pTab==0 ){.    i
147c0 66 28 20 6e 6f 45 72 72 20 29 20 73 71 6c 69 74  f( noErr ) sqlit
147d0 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65  e3CodeVerifyName
147e0 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  dSchema(pParse, 
147f0 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
14800 61 62 61 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f  abase);.    goto
14810 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
14820 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  ;.  }.  iDb = sq
14830 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
14840 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
14850 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28  hema);.  assert(
14860 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
14870 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20  b->nDb );..  /* 
14880 49 66 20 70 54 61 62 20 69 73 20 61 20 76 69 72  If pTab is a vir
14890 74 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c  tual table, call
148a0 20 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61   ViewGetColumnNa
148b0 6d 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a  mes() to ensure.
148c0 20 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69    ** it is initi
148d0 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  alized..  */.  i
148e0 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
148f0 62 29 20 26 26 20 73 71 6c 69 74 65 33 56 69 65  b) && sqlite3Vie
14900 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
14910 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b  pParse, pTab) ){
14920 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
14930 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23  rop_table;.  }.#
14940 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14950 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
14960 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
14970 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
14980 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
14990 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20  _TABLE(iDb);.   
149a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
149b0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
149c0 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63 6f  zDbSName;.    co
149d0 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 20  nst char *zArg2 
149e0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  = 0;.    if( sql
149f0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
14a00 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
14a10 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44  ETE, zTab, 0, zD
14a20 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  b)){.      goto 
14a30 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
14a40 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
14a50 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
14a60 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
14a70 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
14a80 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
14a90 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45  TE_DROP_TEMP_VIE
14aa0 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  W;.      }else{.
14ab0 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
14ac0 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b  QLITE_DROP_VIEW;
14ad0 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
14ae0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
14af0 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65  TUALTABLE.    }e
14b00 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61  lse if( IsVirtua
14b10 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
14b20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
14b30 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20  ROP_VTABLE;.    
14b40 20 20 7a 41 72 67 32 20 3d 20 73 71 6c 69 74 65    zArg2 = sqlite
14b50 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70  3GetVTable(db, p
14b60 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d  Tab)->pMod->zNam
14b70 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  e;.#endif.    }e
14b80 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
14b90 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
14ba0 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
14bb0 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
14bc0 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a  ROP_TEMP_TABLE;.
14bd0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14be0 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
14bf0 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20  TE_DROP_TABLE;. 
14c00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
14c10 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
14c20 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
14c30 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  de, pTab->zName,
14c40 20 7a 41 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a   zArg2, zDb) ){.
14c50 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
14c60 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
14c70 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
14c80 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
14c90 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
14ca0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
14cb0 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
14cc0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
14cd0 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  able;.    }.  }.
14ce0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c  #endif.  if( sql
14cf0 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61  ite3StrNICmp(pTa
14d00 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  b->zName, "sqlit
14d10 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20  e_", 7)==0 .    
14d20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
14d30 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  mp(pTab->zName, 
14d40 22 73 71 6c 69 74 65 5f 73 74 61 74 22 2c 20 31  "sqlite_stat", 1
14d50 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  1)!=0 ){.    sql
14d60 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
14d70 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d  rse, "table %s m
14d80 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  ay not be droppe
14d90 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
14da0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
14db0 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
14dc0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14dd0 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45  OMIT_VIEW.  /* E
14de0 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45  nsure DROP TABLE
14df0 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20   is not used on 
14e00 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50  a view, and DROP
14e10 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65   VIEW is not use
14e20 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c  d.  ** on a tabl
14e30 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  e..  */.  if( is
14e40 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53  View && pTab->pS
14e50 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
14e60 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
14e70 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f  pParse, "use DRO
14e80 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74  P TABLE to delet
14e90 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61  e table %s", pTa
14ea0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
14eb0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
14ec0 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  ble;.  }.  if( !
14ed0 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e  isView && pTab->
14ee0 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
14ef0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
14f00 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50  Parse, "use DROP
14f10 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20   VIEW to delete 
14f20 76 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e  view %s", pTab->
14f30 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
14f40 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
14f50 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
14f60 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
14f70 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74   to remove the t
14f80 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61  able from the ma
14f90 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20  ster table.  ** 
14fa0 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
14fb0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
14fc0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
14fd0 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
14fe0 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
14ff0 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
15000 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
15010 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65  e3ClearStatTable
15020 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  s(pParse, iDb, "
15030 74 62 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  tbl", pTab->zNam
15040 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  e);.    sqlite3F
15050 6b 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73  kDropTable(pPars
15060 65 2c 20 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b  e, pName, pTab);
15070 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
15080 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65  DropTable(pParse
15090 2c 20 70 54 61 62 2c 20 69 44 62 2c 20 69 73 56  , pTab, iDb, isV
150a0 69 65 77 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f  iew);.  }..exit_
150b0 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71  drop_table:.  sq
150c0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
150d0 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d  te(db, pName);.}
150e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
150f0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
15100 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66  o create a new f
15110 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68  oreign key on th
15120 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65  e table.** curre
15130 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
15140 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43  ruction.  pFromC
15150 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  ol determines wh
15160 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69  ich columns.** i
15170 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  n the current ta
15180 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ble point to the
15190 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49   foreign key.  I
151a0 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68  f pFromCol==0 th
151b0 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68  en.** connect th
151c0 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73  e key to the las
151d0 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65  t column inserte
151e0 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e  d.  pTo is the n
151f0 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61  ame of.** the ta
15200 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 20  ble referred to 
15210 28 61 2e 6b 2e 61 20 74 68 65 20 22 70 61 72 65  (a.k.a the "pare
15220 6e 74 22 20 74 61 62 6c 65 29 2e 20 20 70 54 6f  nt" table).  pTo
15230 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 0a 2a 2a  Col is a list.**
15240 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
15250 65 20 70 61 72 65 6e 74 20 70 54 6f 20 74 61 62  e parent pTo tab
15260 6c 65 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61  le.  flags conta
15270 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72  ins all.** infor
15280 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
15290 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   conflict resolu
152a0 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20  tion algorithms 
152b0 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20  specified.** in 
152c0 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f  the ON DELETE, O
152d0 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20  N UPDATE and ON 
152e0 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a  INSERT clauses..
152f0 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74  **.** An FKey st
15300 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74  ructure is creat
15310 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20  ed and added to 
15320 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
15330 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e  tly.** under con
15340 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65  struction in the
15350 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
15360 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20  le field..**.** 
15370 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  The foreign key 
15380 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44  is set for IMMED
15390 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e  IATE processing.
153a0 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63    A subsequent c
153b0 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  all.** to sqlite
153c0 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  3DeferForeignKey
153d0 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  () might change 
153e0 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45 44  this to DEFERRED
153f0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15400 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65  3CreateForeignKe
15410 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
15420 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
15430 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
15440 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f    ExprList *pFro
15450 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e  mCol,  /* Column
15460 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20  s in this table 
15470 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74  that point to ot
15480 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54  her table */.  T
15490 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20  oken *pTo,      
154a0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
154b0 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  he other table *
154c0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54  /.  ExprList *pT
154d0 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75  oCol,    /* Colu
154e0 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  mns in the other
154f0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
15500 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
15510 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73   /* Conflict res
15520 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
15530 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ms. */.){.  sqli
15540 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
15550 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51  ->db;.#ifndef SQ
15560 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
15570 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46  N_KEY.  FKey *pF
15580 4b 65 79 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20  Key = 0;.  FKey 
15590 2a 70 4e 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c  *pNextTo;.  Tabl
155a0 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *p = pParse->p
155b0 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20  NewTable;.  int 
155c0 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  nByte;.  int i;.
155d0 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68    int nCol;.  ch
155e0 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74  ar *z;..  assert
155f0 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66  ( pTo!=0 );.  if
15600 28 20 70 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43  ( p==0 || IN_DEC
15610 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f  LARE_VTAB ) goto
15620 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70   fk_end;.  if( p
15630 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  FromCol==0 ){.  
15640 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
15650 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20  nCol-1;.    if( 
15660 4e 45 56 45 52 28 69 43 6f 6c 3c 30 29 20 29 20  NEVER(iCol<0) ) 
15670 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
15680 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70   if( pToCol && p
15690 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20  ToCol->nExpr!=1 
156a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
156b0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
156c0 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e   "foreign key on
156d0 20 25 73 22 0a 20 20 20 20 20 20 20 20 20 22 20   %s".         " 
156e0 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65  should reference
156f0 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e   only one column
15700 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20   of table %T",. 
15710 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b          p->aCol[
15720 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f  iCol].zName, pTo
15730 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b  );.      goto fk
15740 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
15750 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  nCol = 1;.  }els
15760 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20  e if( pToCol && 
15770 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70  pToCol->nExpr!=p
15780 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29  FromCol->nExpr )
15790 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
157a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
157b0 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66        "number of
157c0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65   columns in fore
157d0 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74  ign key does not
157e0 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65   match the numbe
157f0 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22  r of ".        "
15800 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
15810 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22  eferenced table"
15820 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  );.    goto fk_e
15830 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  nd;.  }else{.   
15840 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c   nCol = pFromCol
15850 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e  ->nExpr;.  }.  n
15860 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
15870 46 4b 65 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29  FKey) + (nCol-1)
15880 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61  *sizeof(pFKey->a
15890 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e  Col[0]) + pTo->n
158a0 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43   + 1;.  if( pToC
158b0 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
158c0 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78  0; i<pToCol->nEx
158d0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
158e0 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33  nByte += sqlite3
158f0 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d  Strlen30(pToCol-
15900 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31  >a[i].zName) + 1
15910 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46  ;.    }.  }.  pF
15920 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Key = sqlite3DbM
15930 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
15940 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b  yte );.  if( pFK
15950 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74  ey==0 ){.    got
15960 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  o fk_end;.  }.  
15970 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70  pFKey->pFrom = p
15980 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  ;.  pFKey->pNext
15990 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b  From = p->pFKey;
159a0 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70  .  z = (char*)&p
159b0 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d  FKey->aCol[nCol]
159c0 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d  ;.  pFKey->zTo =
159d0 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20   z;.  memcpy(z, 
159e0 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b  pTo->z, pTo->n);
159f0 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30  .  z[pTo->n] = 0
15a00 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f  ;.  sqlite3Dequo
15a10 74 65 28 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54  te(z);.  z += pT
15a20 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d  o->n+1;.  pFKey-
15a30 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20  >nCol = nCol;.  
15a40 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20  if( pFromCol==0 
15a50 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43  ){.    pFKey->aC
15a60 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d  ol[0].iFrom = p-
15a70 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65  >nCol-1;.  }else
15a80 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
15a90 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
15aa0 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
15ab0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43  for(j=0; j<p->nC
15ac0 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
15ad0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
15ae0 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ICmp(p->aCol[j].
15af0 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d  zName, pFromCol-
15b00 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  >a[i].zName)==0 
15b10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b  ){.          pFK
15b20 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f  ey->aCol[i].iFro
15b30 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  m = j;.         
15b40 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
15b50 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
15b60 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29  if( j>=p->nCol )
15b70 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
15b80 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15b90 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e  , .          "un
15ba0 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25  known column \"%
15bb0 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b  s\" in foreign k
15bc0 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20  ey definition", 
15bd0 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d  .          pFrom
15be0 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
15bf0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
15c00 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  k_end;.      }. 
15c10 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
15c20 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72  ToCol ){.    for
15c30 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
15c40 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  +){.      int n 
15c50 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
15c60 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  0(pToCol->a[i].z
15c70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b  Name);.      pFK
15c80 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c  ey->aCol[i].zCol
15c90 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63   = z;.      memc
15ca0 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b  py(z, pToCol->a[
15cb0 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20  i].zName, n);.  
15cc0 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20      z[n] = 0;.  
15cd0 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20      z += n+1;.  
15ce0 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d    }.  }.  pFKey-
15cf0 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b  >isDeferred = 0;
15d00 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f  .  pFKey->aActio
15d10 6e 5b 30 5d 20 3d 20 28 75 38 29 28 66 6c 61 67  n[0] = (u8)(flag
15d20 73 20 26 20 30 78 66 66 29 3b 20 20 20 20 20 20  s & 0xff);      
15d30 20 20 20 20 20 20 2f 2a 20 4f 4e 20 44 45 4c 45        /* ON DELE
15d40 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70  TE action */.  p
15d50 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d  FKey->aAction[1]
15d60 20 3d 20 28 75 38 29 28 28 66 6c 61 67 73 20 3e   = (u8)((flags >
15d70 3e 20 38 20 29 20 26 20 30 78 66 66 29 3b 20 20  > 8 ) & 0xff);  
15d80 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54 45 20 61    /* ON UPDATE a
15d90 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65  ction */..  asse
15da0 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
15db0 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30  aMutexHeld(db, 0
15dc0 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b  , p->pSchema) );
15dd0 0a 20 20 70 4e 65 78 74 54 6f 20 3d 20 28 46 4b  .  pNextTo = (FK
15de0 65 79 20 2a 29 73 71 6c 69 74 65 33 48 61 73 68  ey *)sqlite3Hash
15df0 49 6e 73 65 72 74 28 26 70 2d 3e 70 53 63 68 65  Insert(&p->pSche
15e00 6d 61 2d 3e 66 6b 65 79 48 61 73 68 2c 20 0a 20  ma->fkeyHash, . 
15e10 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c       pFKey->zTo,
15e20 20 28 76 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20   (void *)pFKey. 
15e30 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 78 74 54   );.  if( pNextT
15e40 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a 20 20 20 20  o==pFKey ){.    
15e50 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
15e60 64 62 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b  db);.    goto fk
15e70 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _end;.  }.  if( 
15e80 70 4e 65 78 74 54 6f 20 29 7b 0a 20 20 20 20 61  pNextTo ){.    a
15e90 73 73 65 72 74 28 20 70 4e 65 78 74 54 6f 2d 3e  ssert( pNextTo->
15ea0 70 50 72 65 76 54 6f 3d 3d 30 20 29 3b 0a 20 20  pPrevTo==0 );.  
15eb0 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f    pFKey->pNextTo
15ec0 20 3d 20 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20   = pNextTo;.    
15ed0 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f  pNextTo->pPrevTo
15ee0 20 3d 20 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20   = pFKey;.  }.. 
15ef0 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72   /* Link the for
15f00 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20  eign key to the 
15f10 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73  table as the las
15f20 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70  t step..  */.  p
15f30 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b  ->pFKey = pFKey;
15f40 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66  .  pFKey = 0;..f
15f50 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33  k_end:.  sqlite3
15f60 44 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65 79  DbFree(db, pFKey
15f70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  );.#endif /* !de
15f80 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
15f90 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a  T_FOREIGN_KEY) *
15fa0 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  /.  sqlite3ExprL
15fb0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 46  istDelete(db, pF
15fc0 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  romCol);.  sqlit
15fd0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
15fe0 28 64 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a  (db, pToCol);.}.
15ff0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
16000 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
16010 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20  en an INITIALLY 
16020 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49  IMMEDIATE or INI
16030 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a  TIALLY DEFERRED.
16040 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65  ** clause is see
16050 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66  n as part of a f
16060 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
16070 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65  ition.  The isDe
16080 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65  ferred.** parame
16090 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49  ter is 1 for INI
160a0 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20  TIALLY DEFERRED 
160b0 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41  and 0 for INITIA
160c0 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a  LLY IMMEDIATE..*
160d0 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f  * The behavior o
160e0 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
160f0 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65  tly created fore
16100 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73  ign key is adjus
16110 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67  ted.** according
16120 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
16130 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b  te3DeferForeignK
16140 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ey(Parse *pParse
16150 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64  , int isDeferred
16160 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
16170 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
16180 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  EY.  Table *pTab
16190 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b  ;.  FKey *pFKey;
161a0 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70  .  if( (pTab = p
161b0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
161c0 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d  )==0 || (pFKey =
161d0 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30   pTab->pFKey)==0
161e0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
161f0 65 72 74 28 20 69 73 44 65 66 65 72 72 65 64 3d  ert( isDeferred=
16200 3d 30 20 7c 7c 20 69 73 44 65 66 65 72 72 65 64  =0 || isDeferred
16210 3d 3d 31 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d  ==1 ); /* EV: R-
16220 33 30 33 32 33 2d 32 31 39 31 37 20 2a 2f 0a 20  30323-21917 */. 
16230 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72   pFKey->isDeferr
16240 65 64 20 3d 20 28 75 38 29 69 73 44 65 66 65 72  ed = (u8)isDefer
16250 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  red;.#endif.}../
16260 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
16270 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72 61  de that will era
16280 73 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e  se and refill in
16290 64 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69 73  dex *pIdx.  This
162a0 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69   is.** used to i
162b0 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c  nitialize a newl
162c0 79 20 63 72 65 61 74 65 64 20 69 6e 64 65 78 20  y created index 
162d0 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20  or to recompute 
162e0 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  the.** content o
162f0 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72 65  f an index in re
16300 73 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49 4e  sponse to a REIN
16310 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  DEX command..**.
16320 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67  ** if memRootPag
16330 65 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69 76  e is not negativ
16340 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
16350 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e 65   the index is ne
16360 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20  wly.** created. 
16370 20 54 68 65 20 72 65 67 69 73 74 65 72 20 73 70   The register sp
16380 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52 6f  ecified by memRo
16390 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  otPage contains 
163a0 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
163b0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69   number of the i
163c0 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f  ndex.  If memRoo
163d0 74 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  tPage is negativ
163e0 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69  e, then.** the i
163f0 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
16400 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20  sts and must be 
16410 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 62  cleared before b
16420 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61 6e  eing refilled an
16430 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61  d.** the root pa
16440 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
16450 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e 20   index is taken 
16460 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75  from pIndex->tnu
16470 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  m..*/.static voi
16480 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49  d sqlite3RefillI
16490 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
164a0 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  se, Index *pInde
164b0 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61  x, int memRootPa
164c0 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ge){.  Table *pT
164d0 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61  ab = pIndex->pTa
164e0 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61 62  ble;  /* The tab
164f0 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64 65 78  le that is index
16500 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ed */.  int iTab
16510 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
16520 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20  +;     /* Btree 
16530 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20  cursor used for 
16540 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49  pTab */.  int iI
16550 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
16560 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65  b++;     /* Btre
16570 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f  e cursor used fo
16580 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  r pIndex */.  in
16590 74 20 69 53 6f 72 74 65 72 3b 20 20 20 20 20 20  t iSorter;      
165a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
165b0 43 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 62 79  Cursor opened by
165c0 20 4f 70 65 6e 53 6f 72 74 65 72 20 28 69 66 20   OpenSorter (if 
165d0 69 6e 20 75 73 65 29 20 2a 2f 0a 20 20 69 6e 74  in use) */.  int
165e0 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20   addr1;         
165f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
16600 64 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66  ddress of top of
16610 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61   loop */.  int a
16620 64 64 72 32 3b 20 20 20 20 20 20 20 20 20 20 20  ddr2;           
16630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
16640 72 65 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20  ress to jump to 
16650 66 6f 72 20 6e 65 78 74 20 69 74 65 72 61 74 69  for next iterati
16660 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d  on */.  int tnum
16670 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16680 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
16690 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a  age of index */.
166a0 20 20 69 6e 74 20 69 50 61 72 74 49 64 78 4c 61    int iPartIdxLa
166b0 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  bel;            
166c0 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 69 73   /* Jump to this
166d0 20 6c 61 62 65 6c 20 74 6f 20 73 6b 69 70 20 61   label to skip a
166e0 20 72 6f 77 20 2a 2f 0a 20 20 56 64 62 65 20 2a   row */.  Vdbe *
166f0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
16700 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
16710 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
16720 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68  his virtual mach
16730 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  ine */.  KeyInfo
16740 20 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20   *pKey;         
16750 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e          /* KeyIn
16760 66 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a  fo for index */.
16770 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
16780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16790 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
167a0 64 69 6e 67 20 61 73 73 65 6d 62 6c 65 64 20 69  ding assembled i
167b0 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20  ndex record */. 
167c0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
167d0 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
167e0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
167f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
16800 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
16810 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
16820 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  b, pIndex->pSche
16830 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ma);..#ifndef SQ
16840 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
16850 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71  IZATION.  if( sq
16860 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
16870 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45  Parse, SQLITE_RE
16880 49 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a  INDEX, pIndex->z
16890 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 64  Name, 0,.      d
168a0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
168b0 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72 65  Name ) ){.    re
168c0 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
168d0 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72 65 20 61  ..  /* Require a
168e0 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
168f0 68 65 20 74 61 62 6c 65 20 74 6f 20 70 65 72 66  he table to perf
16900 6f 72 6d 20 74 68 69 73 20 6f 70 65 72 61 74 69  orm this operati
16910 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54  on */.  sqlite3T
16920 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
16930 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
16940 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 1, pTab->zName
16950 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  );..  v = sqlite
16960 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
16970 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
16980 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d  eturn;.  if( mem
16990 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20  RootPage>=0 ){. 
169a0 20 20 20 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f     tnum = memRoo
169b0 74 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tPage;.  }else{.
169c0 20 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65      tnum = pInde
169d0 78 2d 3e 74 6e 75 6d 3b 0a 20 20 7d 0a 20 20 70  x->tnum;.  }.  p
169e0 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  Key = sqlite3Key
169f0 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72  InfoOfIndex(pPar
16a00 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 61  se, pIndex);.  a
16a10 73 73 65 72 74 28 20 70 4b 65 79 21 3d 30 20 7c  ssert( pKey!=0 |
16a20 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
16a30 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ed || pParse->nE
16a40 72 72 20 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  rr );..  /* Open
16a50 20 74 68 65 20 73 6f 72 74 65 72 20 63 75 72 73   the sorter curs
16a60 6f 72 20 69 66 20 77 65 20 61 72 65 20 74 6f 20  or if we are to 
16a70 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 53  use one. */.  iS
16a80 6f 72 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e  orter = pParse->
16a90 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  nTab++;.  sqlite
16aa0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
16ab0 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 69 53  P_SorterOpen, iS
16ac0 6f 72 74 65 72 2c 20 30 2c 20 70 49 6e 64 65 78  orter, 0, pIndex
16ad0 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 28 63 68 61 72  ->nKeyCol, (char
16ae0 2a 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  *).             
16af0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65         sqlite3Ke
16b00 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 29 2c 20  yInfoRef(pKey), 
16b10 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20  P4_KEYINFO);..  
16b20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 74 61 62 6c  /* Open the tabl
16b30 65 2e 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  e. Loop through 
16b40 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20  all rows of the 
16b50 74 61 62 6c 65 2c 20 69 6e 73 65 72 74 69 6e 67  table, inserting
16b60 20 69 6e 64 65 78 0a 20 20 2a 2a 20 72 65 63 6f   index.  ** reco
16b70 72 64 73 20 69 6e 74 6f 20 74 68 65 20 73 6f 72  rds into the sor
16b80 74 65 72 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ter. */.  sqlite
16b90 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
16ba0 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54  e, iTab, iDb, pT
16bb0 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
16bc0 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ;.  addr1 = sqli
16bd0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16be0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62   OP_Rewind, iTab
16bf0 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 0); VdbeCovera
16c00 67 65 28 76 29 3b 0a 20 20 72 65 67 52 65 63 6f  ge(v);.  regReco
16c10 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
16c20 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
16c30 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61  .  sqlite3Genera
16c40 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73  teIndexKey(pPars
16c50 65 2c 70 49 6e 64 65 78 2c 69 54 61 62 2c 72 65  e,pIndex,iTab,re
16c60 67 52 65 63 6f 72 64 2c 30 2c 26 69 50 61 72 74  gRecord,0,&iPart
16c70 49 64 78 4c 61 62 65 6c 2c 30 2c 30 29 3b 0a 20  IdxLabel,0,0);. 
16c80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16c90 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49  p2(v, OP_SorterI
16ca0 6e 73 65 72 74 2c 20 69 53 6f 72 74 65 72 2c 20  nsert, iSorter, 
16cb0 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
16cc0 6c 69 74 65 33 52 65 73 6f 6c 76 65 50 61 72 74  lite3ResolvePart
16cd0 49 64 78 4c 61 62 65 6c 28 70 50 61 72 73 65 2c  IdxLabel(pParse,
16ce0 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c 29 3b   iPartIdxLabel);
16cf0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
16d00 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
16d10 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31 29 3b   iTab, addr1+1);
16d20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
16d30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
16d40 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
16d50 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74  );.  if( memRoot
16d60 50 61 67 65 3c 30 20 29 20 73 71 6c 69 74 65 33  Page<0 ) sqlite3
16d70 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16d80 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44  _Clear, tnum, iD
16d90 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  b);.  sqlite3Vdb
16da0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
16db0 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74  enWrite, iIdx, t
16dc0 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20 20 20  num, iDb, .     
16dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
16de0 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f  char *)pKey, P4_
16df0 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69  KEYINFO);.  sqli
16e00 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
16e10 76 2c 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53  v, OPFLAG_BULKCS
16e20 52 7c 28 28 6d 65 6d 52 6f 6f 74 50 61 67 65 3e  R|((memRootPage>
16e30 3d 30 29 3f 4f 50 46 4c 41 47 5f 50 32 49 53 52  =0)?OPFLAG_P2ISR
16e40 45 47 3a 30 29 29 3b 0a 0a 20 20 61 64 64 72 31  EG:0));..  addr1
16e50 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
16e60 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
16e70 72 53 6f 72 74 2c 20 69 53 6f 72 74 65 72 2c 20  rSort, iSorter, 
16e80 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  0); VdbeCoverage
16e90 28 76 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69  (v);.  if( IsUni
16ea0 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29  queIndex(pIndex)
16eb0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 32 20 3d   ){.    int j2 =
16ec0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
16ed0 65 6e 74 41 64 64 72 28 76 29 20 2b 20 33 3b 0a  entAddr(v) + 3;.
16ee0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
16ef0 6f 74 6f 28 76 2c 20 6a 32 29 3b 0a 20 20 20 20  oto(v, j2);.    
16f00 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
16f10 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
16f20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16f30 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
16f40 50 5f 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 2c  P_SorterCompare,
16f50 20 69 53 6f 72 74 65 72 2c 20 6a 32 2c 20 72 65   iSorter, j2, re
16f60 67 52 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 20  gRecord,.       
16f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f80 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f    pIndex->nKeyCo
16f90 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  l); VdbeCoverage
16fa0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
16fb0 55 6e 69 71 75 65 43 6f 6e 73 74 72 61 69 6e 74  UniqueConstraint
16fc0 28 70 50 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72  (pParse, OE_Abor
16fd0 74 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 65  t, pIndex);.  }e
16fe0 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 32 20 3d  lse{.    addr2 =
16ff0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
17000 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 7d 0a  entAddr(v);.  }.
17010 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17020 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op3(v, OP_Sorter
17030 44 61 74 61 2c 20 69 53 6f 72 74 65 72 2c 20 72  Data, iSorter, r
17040 65 67 52 65 63 6f 72 64 2c 20 69 49 64 78 29 3b  egRecord, iIdx);
17050 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
17060 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65 65 6b 45  dOp1(v, OP_SeekE
17070 6e 64 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c  nd, iIdx);.  sql
17080 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17090 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
170a0 69 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29  iIdx, regRecord)
170b0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
170c0 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
170d0 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
170e0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
170f0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
17100 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
17110 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17120 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65  2(v, OP_SorterNe
17130 78 74 2c 20 69 53 6f 72 74 65 72 2c 20 61 64 64  xt, iSorter, add
17140 72 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  r2); VdbeCoverag
17150 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
17160 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
17170 64 64 72 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65  ddr1);..  sqlite
17180 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
17190 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a  P_Close, iTab);.
171a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
171b0 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
171c0 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65   iIdx);.  sqlite
171d0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
171e0 50 5f 43 6c 6f 73 65 2c 20 69 53 6f 72 74 65 72  P_Close, iSorter
171f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  );.}../*.** Allo
17200 63 61 74 65 20 68 65 61 70 20 73 70 61 63 65 20  cate heap space 
17210 74 6f 20 68 6f 6c 64 20 61 6e 20 49 6e 64 65 78  to hold an Index
17220 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 43 6f   object with nCo
17230 6c 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a  l columns..**.**
17240 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c   Increase the al
17250 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 74 6f  location size to
17260 20 70 72 6f 76 69 64 65 20 61 6e 20 65 78 74 72   provide an extr
17270 61 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a  a nExtra bytes.*
17280 2a 20 6f 66 20 38 2d 62 79 74 65 20 61 6c 69 67  * of 8-byte alig
17290 6e 65 64 20 73 70 61 63 65 20 61 66 74 65 72 20  ned space after 
172a0 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
172b0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 0a 2a 2a   and return a.**
172c0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
172d0 20 65 78 74 72 61 20 73 70 61 63 65 20 69 6e 20   extra space in 
172e0 2a 70 70 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e 64  *ppExtra..*/.Ind
172f0 65 78 20 2a 73 71 6c 69 74 65 33 41 6c 6c 6f 63  ex *sqlite3Alloc
17300 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 0a  ateIndexObject(.
17310 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
17320 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
17330 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
17340 0a 20 20 69 31 36 20 6e 43 6f 6c 2c 20 20 20 20  .  i16 nCol,    
17350 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
17360 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
17370 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  ns in the index 
17380 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
17390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
173a0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
173b0 65 78 74 72 61 20 73 70 61 63 65 20 74 6f 20 61  extra space to a
173c0 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lloc */.  char *
173d0 2a 70 70 45 78 74 72 61 20 20 20 20 20 20 20 2f  *ppExtra       /
173e0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
173f0 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20 2a   "extra" space *
17400 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b  /.){.  Index *p;
17410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
17420 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78 20 6f  llocated index o
17430 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  bject */.  int n
17440 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
17450 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63  /* Bytes of spac
17460 65 20 66 6f 72 20 49 6e 64 65 78 20 6f 62 6a 65  e for Index obje
17470 63 74 20 2b 20 61 72 72 61 79 73 20 2a 2f 0a 0a  ct + arrays */..
17480 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
17490 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 20  (sizeof(Index)) 
174a0 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  +              /
174b0 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  * Index structur
174c0 65 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e  */.          
174d0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68  ROUND8(sizeof(ch
174e0 61 72 2a 29 2a 6e 43 6f 6c 29 20 2b 20 20 20 20  ar*)*nCol) +    
174f0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a       /* Index.az
17500 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20  Coll     */.    
17510 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a        ROUND8(siz
17520 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f  eof(LogEst)*(nCo
17530 6c 2b 31 29 20 2b 20 20 20 20 20 2f 2a 20 49 6e  l+1) +     /* In
17540 64 65 78 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20  dex.aiRowLogEst 
17550 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
17560 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 31 36        sizeof(i16
17570 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20  )*nCol +        
17580 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43      /* Index.aiC
17590 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20  olumn   */.     
175a0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
175b0 6f 66 28 75 38 29 2a 6e 43 6f 6c 29 3b 20 20 20  of(u8)*nCol);   
175c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
175d0 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f  ex.aSortOrder */
175e0 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62  .  p = sqlite3Db
175f0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
17600 42 79 74 65 20 2b 20 6e 45 78 74 72 61 29 3b 0a  Byte + nExtra);.
17610 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63    if( p ){.    c
17620 68 61 72 20 2a 70 45 78 74 72 61 20 3d 20 28 28  har *pExtra = ((
17630 63 68 61 72 2a 29 70 29 2b 52 4f 55 4e 44 38 28  char*)p)+ROUND8(
17640 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a  sizeof(Index));.
17650 20 20 20 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d 20      p->azColl = 
17660 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 70 45  (const char**)pE
17670 78 74 72 61 3b 20 70 45 78 74 72 61 20 2b 3d 20  xtra; pExtra += 
17680 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68  ROUND8(sizeof(ch
17690 61 72 2a 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20  ar*)*nCol);.    
176a0 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d  p->aiRowLogEst =
176b0 20 28 4c 6f 67 45 73 74 2a 29 70 45 78 74 72 61   (LogEst*)pExtra
176c0 3b 20 70 45 78 74 72 61 20 2b 3d 20 73 69 7a 65  ; pExtra += size
176d0 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c  of(LogEst)*(nCol
176e0 2b 31 29 3b 0a 20 20 20 20 70 2d 3e 61 69 43 6f  +1);.    p->aiCo
176f0 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29 70 45 78  lumn = (i16*)pEx
17700 74 72 61 3b 20 20 20 20 20 20 20 70 45 78 74 72  tra;       pExtr
17710 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36 29  a += sizeof(i16)
17720 2a 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61 53  *nCol;.    p->aS
17730 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
17740 70 45 78 74 72 61 3b 0a 20 20 20 20 70 2d 3e 6e  pExtra;.    p->n
17750 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a 20  Column = nCol;. 
17760 20 20 20 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20     p->nKeyCol = 
17770 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 2a 70  nCol - 1;.    *p
17780 70 45 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a  pExtra = ((char*
17790 29 70 29 20 2b 20 6e 42 79 74 65 3b 0a 20 20 7d  )p) + nByte;.  }
177a0 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
177b0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
177c0 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20  ew index for an 
177d0 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d  SQL table.  pNam
177e0 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68 65  e1.pName2 is the
177f0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
17800 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c  ex .** and pTblL
17810 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ist is the name 
17820 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  of the table tha
17830 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
17840 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a  ed.  Both will .
17850 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61  ** be NULL for a
17860 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
17870 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  an index that is
17880 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69   created to sati
17890 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20  sfy a.** UNIQUE 
178a0 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20  constraint.  If 
178b0 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65  pTable and pInde
178c0 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20  x are NULL, use 
178d0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
178e0 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c  e.** as the tabl
178f0 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  e to be indexed.
17900 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
17910 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74  ble is a table t
17920 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e  hat is.** curren
17930 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
17940 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54  ucted by a CREAT
17950 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
17960 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69  t..**.** pList i
17970 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  s a list of colu
17980 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
17990 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62  d.  pList will b
179a0 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a  e NULL if this.*
179b0 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b  * is a primary k
179c0 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e  ey or unique-con
179d0 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d  straint on the m
179e0 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d  ost recent colum
179f0 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68  n added.** to th
17a00 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
17a10 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
17a20 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20  tion.  .*/.void 
17a30 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
17a40 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
17a50 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20  rse,     /* All 
17a60 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
17a70 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a  t this parse */.
17a80 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
17a90 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
17aa0 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65  rt of index name
17ab0 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
17ac0 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
17ad0 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  ,     /* Second 
17ae0 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61  part of index na
17af0 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  me. May be NULL 
17b00 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
17b10 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65  blName, /* Table
17b20 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70   to index. Use p
17b30 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
17b40 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c   if 0 */.  ExprL
17b50 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
17b60 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   A list of colum
17b70 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
17b80 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
17b90 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41  r,       /* OE_A
17ba0 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  bort, OE_Ignore,
17bb0 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20   OE_Replace, or 
17bc0 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b  OE_None */.  Tok
17bd0 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20  en *pStart,     
17be0 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
17bf0 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
17c00 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a  this statement *
17c10 2f 0a 20 20 45 78 70 72 20 2a 70 50 49 57 68 65  /.  Expr *pPIWhe
17c20 72 65 2c 20 20 20 20 2f 2a 20 57 48 45 52 45 20  re,    /* WHERE 
17c30 63 6c 61 75 73 65 20 66 6f 72 20 70 61 72 74 69  clause for parti
17c40 61 6c 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  al indices */.  
17c50 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20 20  int sortOrder,  
17c60 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72     /* Sort order
17c70 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20   of primary key 
17c80 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c  when pList==NULL
17c90 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45   */.  int ifNotE
17ca0 78 69 73 74 2c 20 20 20 20 2f 2a 20 4f 6d 69 74  xist,    /* Omit
17cb0 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78 20   error if index 
17cc0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
17cd0 2f 0a 20 20 75 38 20 69 64 78 54 79 70 65 20 20  /.  u8 idxType  
17ce0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
17cf0 64 65 78 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  dex type */.){. 
17d00 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30   Table *pTab = 0
17d10 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74  ;     /* Table t
17d20 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
17d30 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20    Index *pIndex 
17d40 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e  = 0;   /* The in
17d50 64 65 78 20 74 6f 20 62 65 20 63 72 65 61 74 65  dex to be create
17d60 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  d */.  char *zNa
17d70 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e  me = 0;     /* N
17d80 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
17d90 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
17da0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
17db0 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
17dc0 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20  rs in zName */. 
17dd0 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 44 62 46   int i, j;.  DbF
17de0 69 78 65 72 20 73 46 69 78 3b 20 20 20 20 20 20  ixer sFix;      
17df0 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69    /* For assigni
17e00 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ng database name
17e10 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20  s to pTable */. 
17e20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d 61   int sortOrderMa
17e30 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f  sk;   /* 1 to ho
17e40 6e 6f 72 20 44 45 53 43 20 69 6e 20 69 6e 64 65  nor DESC in inde
17e50 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e  x.  0 to ignore.
17e60 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
17e70 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
17e80 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20    Db *pDb;      
17e90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70         /* The sp
17ea0 65 63 69 66 69 63 20 74 61 62 6c 65 20 63 6f 6e  ecific table con
17eb0 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65  taining the inde
17ec0 78 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  xed database */.
17ed0 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
17ee0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
17ef0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
17f00 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 77 72  that is being wr
17f10 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  itten */.  Token
17f20 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20   *pName = 0;    
17f30 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e  /* Unqualified n
17f40 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
17f50 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20 20   to create */.  
17f60 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
17f70 69 74 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b  item *pListItem;
17f80 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
17f90 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20  over pList */.  
17fa0 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 20  int nExtra = 0; 
17fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fc0 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61   /* Space alloca
17fd0 74 65 64 20 66 6f 72 20 7a 45 78 74 72 61 5b 5d  ted for zExtra[]
17fe0 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
17ff0 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
18000 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
18010 20 6f 66 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e   of extra column
18020 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 63 68  s needed */.  ch
18030 61 72 20 2a 7a 45 78 74 72 61 20 3d 20 30 3b 20  ar *zExtra = 0; 
18040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18050 2a 20 45 78 74 72 61 20 73 70 61 63 65 20 61 66  * Extra space af
18060 74 65 72 20 74 68 65 20 49 6e 64 65 78 20 6f 62  ter the Index ob
18070 6a 65 63 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ject */.  Index 
18080 2a 70 50 6b 20 3d 20 30 3b 20 20 20 20 20 20 2f  *pPk = 0;      /
18090 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  * PRIMARY KEY in
180a0 64 65 78 20 66 6f 72 20 57 49 54 48 4f 55 54 20  dex for WITHOUT 
180b0 52 4f 57 49 44 20 74 61 62 6c 65 73 20 2a 2f 0a  ROWID tables */.
180c0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
180d0 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
180e0 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20  e->nErr>0 ){.   
180f0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
18100 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  e_index;.  }.  i
18110 66 28 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  f( IN_DECLARE_VT
18120 41 42 20 26 26 20 69 64 78 54 79 70 65 21 3d 53  AB && idxType!=S
18130 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52  QLITE_IDXTYPE_PR
18140 49 4d 41 52 59 4b 45 59 20 29 7b 0a 20 20 20 20  IMARYKEY ){.    
18150 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
18160 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66  _index;.  }.  if
18170 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
18180 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
18190 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f  Parse) ){.    go
181a0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
181b0 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  ndex;.  }..  /*.
181c0 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61    ** Find the ta
181d0 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62  ble that is to b
181e0 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75  e indexed.  Retu
181f0 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20  rn early if not 
18200 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  found..  */.  if
18210 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  ( pTblName!=0 ){
18220 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65  ..    /* Use the
18230 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20   two-part index 
18240 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  name to determin
18250 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  e the database .
18260 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68      ** to search
18270 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20   for the table. 
18280 27 46 69 78 27 20 74 68 65 20 74 61 62 6c 65 20  'Fix' the table 
18290 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a  name to this db.
182a0 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f      ** before lo
182b0 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61 62  oking up the tab
182c0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  le..    */.    a
182d0 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26  ssert( pName1 &&
182e0 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69   pName2 );.    i
182f0 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
18300 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
18310 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
18320 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  &pName);.    if(
18330 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78   iDb<0 ) goto ex
18340 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
18350 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
18360 6d 65 20 26 26 20 70 4e 61 6d 65 2d 3e 7a 20 29  me && pName->z )
18370 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
18380 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20  E_OMIT_TEMPDB.  
18390 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65    /* If the inde
183a0 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61  x name was unqua
183b0 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66  lified, check if
183c0 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a   the table.    *
183d0 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c  * is a temp tabl
183e0 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68  e. If so, set th
183f0 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e  e database to 1.
18400 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a   Do not do this.
18410 20 20 20 20 2a 2a 20 69 66 20 69 6e 69 74 69 61      ** if initia
18420 6c 69 73 69 6e 67 20 61 20 64 61 74 61 62 61 73  lising a databas
18430 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f  e schema..    */
18440 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
18450 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20  it.busy ){.     
18460 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53   pTab = sqlite3S
18470 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61  rcListLookup(pPa
18480 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a  rse, pTblName);.
18490 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32        if( pName2
184a0 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26  ->n==0 && pTab &
184b0 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d  & pTab->pSchema=
184c0 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68  =db->aDb[1].pSch
184d0 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ema ){.        i
184e0 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  Db = 1;.      }.
184f0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
18500 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74    sqlite3FixInit
18510 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20  (&sFix, pParse, 
18520 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e  iDb, "index", pN
18530 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 73 71  ame);.    if( sq
18540 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28  lite3FixSrcList(
18550 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29  &sFix, pTblName)
18560 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63   ){.      /* Bec
18570 61 75 73 65 20 74 68 65 20 70 61 72 73 65 72 20  ause the parser 
18580 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e  constructs pTblN
18590 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c  ame from a singl
185a0 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20  e identifier,.  
185b0 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69      ** sqlite3Fi
185c0 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76  xSrcList can nev
185d0 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20  er fail. */.    
185e0 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20    assert(0);.   
185f0 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71   }.    pTab = sq
18600 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
18610 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20  Item(pParse, 0, 
18620 26 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 29  &pTblName->a[0])
18630 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
18640 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
18650 30 20 7c 7c 20 70 54 61 62 3d 3d 30 20 29 3b 0a  0 || pTab==0 );.
18660 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
18670 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
18680 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66  te_index;.    if
18690 28 20 69 44 62 3d 3d 31 20 26 26 20 64 62 2d 3e  ( iDb==1 && db->
186a0 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
186b0 21 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  !=pTab->pSchema 
186c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
186d0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
186e0 20 0a 20 20 20 20 20 20 20 20 20 20 20 22 63 61   .           "ca
186f0 6e 6e 6f 74 20 63 72 65 61 74 65 20 61 20 54 45  nnot create a TE
18700 4d 50 20 69 6e 64 65 78 20 6f 6e 20 6e 6f 6e 2d  MP index on non-
18710 54 45 4d 50 20 74 61 62 6c 65 20 5c 22 25 73 5c  TEMP table \"%s\
18720 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  "",.           p
18730 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
18740 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
18750 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
18760 0a 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77  .    if( !HasRow
18770 69 64 28 70 54 61 62 29 20 29 20 70 50 6b 20 3d  id(pTab) ) pPk =
18780 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
18790 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
187a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
187b0 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a  rt( pName==0 );.
187c0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61      assert( pSta
187d0 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61  rt==0 );.    pTa
187e0 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
187f0 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 21  Table;.    if( !
18800 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74  pTab ) goto exit
18810 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
18820 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
18830 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
18840 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
18850 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26 64  ;.  }.  pDb = &d
18860 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20  b->aDb[iDb];..  
18870 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
18880 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
18890 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a  rse->nErr==0 );.
188a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
188b0 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d  NICmp(pTab->zNam
188c0 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29  e, "sqlite_", 7)
188d0 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 64  ==0 .       && d
188e0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 0a  b->init.busy==0.
188f0 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  #if SQLITE_USER_
18900 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20  AUTHENTICATION. 
18910 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
18920 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 70 54  UserAuthTable(pT
18930 61 62 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 0a 23 65  ab->zName)==0.#e
18940 6e 64 69 66 0a 20 20 20 20 20 20 20 26 26 20 73  ndif.       && s
18950 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 26  qlite3StrNICmp(&
18960 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22  pTab->zName[7],"
18970 61 6c 74 65 72 74 61 62 5f 22 2c 39 29 21 3d 30  altertab_",9)!=0
18980 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
18990 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
189a0 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f  "table %s may no
189b0 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70  t be indexed", p
189c0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
189d0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
189e0 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66  e_index;.  }.#if
189f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18a00 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54 61 62  _VIEW.  if( pTab
18a10 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
18a20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
18a30 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 73 20  (pParse, "views 
18a40 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
18a50 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ed");.    goto e
18a60 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18a70 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  ;.  }.#endif.#if
18a80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18a90 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
18aa0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
18ab0 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ab) ){.    sqlit
18ac0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
18ad0 65 2c 20 22 76 69 72 74 75 61 6c 20 74 61 62 6c  e, "virtual tabl
18ae0 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  es may not be in
18af0 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74  dexed");.    got
18b00 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
18b10 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  dex;.  }.#endif.
18b20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
18b30 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
18b40 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72  index.  Make sur
18b50 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61  e there is not a
18b60 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20  lready another. 
18b70 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
18b80 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  le with the same
18b90 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20   name.  .  **.  
18ba0 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49  ** Exception:  I
18bb0 66 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  f we are reading
18bc0 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65   the names of pe
18bd0 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20  rmanent indices 
18be0 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71  from the.  ** sq
18bf0 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
18c00 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20  e (because some 
18c10 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 68  other process ch
18c20 61 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61  anged the schema
18c30 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f  ) and.  ** one o
18c40 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  f the index name
18c50 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20  s collides with 
18c60 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65  the name of a te
18c70 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
18c80 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65  .  ** index, the
18c90 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e  n we will contin
18ca0 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ue to process th
18cb0 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20  is index..  **. 
18cc0 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20   ** If pName==0 
18cd0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
18ce0 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e   are.  ** dealin
18cf0 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72 79  g with a primary
18d00 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63   key or UNIQUE c
18d10 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68  onstraint.  We h
18d20 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75  ave to invent ou
18d30 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e  r.  ** own name.
18d40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d  .  */.  if( pNam
18d50 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  e ){.    zName =
18d60 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
18d70 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29  Token(db, pName)
18d80 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ;.    if( zName=
18d90 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
18da0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
18db0 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e   assert( pName->
18dc0 7a 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  z!=0 );.    if( 
18dd0 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
18de0 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
18df0 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29  e(pParse, zName)
18e00 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
18e10 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18e20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18e30 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
18e40 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
18e50 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
18e60 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b   zName, 0)!=0 ){
18e70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18e80 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
18e90 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61   "there is alrea
18ea0 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64  dy a table named
18eb0 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
18ec0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
18ed0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
18ee0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
18ef0 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49  if( sqlite3FindI
18f00 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
18f10 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 21 3d  pDb->zDbSName)!=
18f20 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  0 ){.      if( !
18f30 69 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20 20  ifNotExist ){.  
18f40 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
18f50 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69  orMsg(pParse, "i
18f60 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64 79 20  ndex %s already 
18f70 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b  exists", zName);
18f80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
18f90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64        assert( !d
18fa0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a  b->init.busy );.
18fb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
18fc0 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
18fd0 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
18fe0 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
18ff0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
19000 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ex;.    }.  }els
19010 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  e{.    int n;.  
19020 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a    Index *pLoop;.
19030 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54      for(pLoop=pT
19040 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b  ab->pIndex, n=1;
19050 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
19060 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29  oop->pNext, n++)
19070 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  {}.    zName = s
19080 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
19090 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e  , "sqlite_autoin
190a0 64 65 78 5f 25 73 5f 25 64 22 2c 20 70 54 61 62  dex_%s_%d", pTab
190b0 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ->zName, n);.   
190c0 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
190d0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
190e0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
190f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 75 74     }..    /* Aut
19100 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6e 61 6d  omatic index nam
19110 65 73 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  es generated fro
19120 6d 20 77 69 74 68 69 6e 20 73 71 6c 69 74 65 33  m within sqlite3
19130 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 0a  _declare_vtab().
19140 20 20 20 20 2a 2a 20 6d 75 73 74 20 68 61 76 65      ** must have
19150 20 6e 61 6d 65 73 20 74 68 61 74 20 61 72 65 20   names that are 
19160 64 69 73 74 69 6e 63 74 20 66 72 6f 6d 20 6e 6f  distinct from no
19170 72 6d 61 6c 20 61 75 74 6f 6d 61 74 69 63 20 69  rmal automatic i
19180 6e 64 65 78 20 6e 61 6d 65 73 2e 0a 20 20 20 20  ndex names..    
19190 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
191a0 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e 76 65   statement conve
191b0 72 74 73 20 22 73 71 6c 69 74 65 33 5f 61 75 74  rts "sqlite3_aut
191c0 6f 69 6e 64 65 78 2e 2e 2e 22 20 69 6e 74 6f 0a  oindex..." into.
191d0 20 20 20 20 2a 2a 20 22 73 71 6c 69 74 65 33 5f      ** "sqlite3_
191e0 62 75 74 6f 69 6e 64 65 78 2e 2e 2e 22 20 69 6e  butoindex..." in
191f0 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 74   order to make t
19200 68 65 20 6e 61 6d 65 73 20 64 69 73 74 69 6e 63  he names distinc
19210 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 76  t..    ** The "v
19220 74 61 62 5f 65 72 72 2e 74 65 73 74 22 20 74 65  tab_err.test" te
19230 73 74 20 64 65 6d 6f 6e 73 74 72 61 74 65 73 20  st demonstrates 
19240 74 68 65 20 6e 65 65 64 20 6f 66 20 74 68 69 73  the need of this
19250 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20   statement. */. 
19260 20 20 20 69 66 28 20 49 4e 5f 44 45 43 4c 41 52     if( IN_DECLAR
19270 45 5f 56 54 41 42 20 29 20 7a 4e 61 6d 65 5b 37  E_VTAB ) zName[7
19280 5d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  ]++;.  }..  /* C
19290 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69  heck for authori
192a0 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65  zation to create
192b0 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a   an index..  */.
192c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
192d0 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
192e0 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  N.  {.    const 
192f0 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d  char *zDb = pDb-
19300 3e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69  >zDbSName;.    i
19310 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
19320 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
19330 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d  TE_INSERT, SCHEM
19340 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 30 2c  A_TABLE(iDb), 0,
19350 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
19360 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
19370 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
19380 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
19390 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  TE_INDEX;.    if
193a0 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
193b0 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d 20 53  & iDb==1 ) i = S
193c0 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
193d0 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
193e0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
193f0 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61  k(pParse, i, zNa
19400 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  me, pTab->zName,
19410 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
19420 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
19430 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
19440 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
19450 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65   pList==0, it me
19460 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ans this routine
19470 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d   was called to m
19480 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20  ake a primary.  
19490 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68  ** key out of th
194a0 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64  e last column ad
194b0 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ded to the table
194c0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
194d0 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65  ion..  ** So cre
194e0 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20  ate a fake list 
194f0 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73  to simulate this
19500 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69  ..  */.  if( pLi
19510 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 54 6f 6b  st==0 ){.    Tok
19520 65 6e 20 70 72 65 76 43 6f 6c 3b 0a 20 20 20 20  en prevCol;.    
19530 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74  sqlite3TokenInit
19540 28 26 70 72 65 76 43 6f 6c 2c 20 70 54 61 62 2d  (&prevCol, pTab-
19550 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c  >aCol[pTab->nCol
19560 2d 31 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  -1].zName);.    
19570 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
19580 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
19590 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20 20 20  arse, 0,.       
195a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
195b0 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49  prAlloc(db, TK_I
195c0 44 2c 20 26 70 72 65 76 43 6f 6c 2c 20 30 29 29  D, &prevCol, 0))
195d0 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
195e0 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
195f0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
19600 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
19610 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20  nExpr==1 );.    
19620 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
19630 65 74 53 6f 72 74 4f 72 64 65 72 28 70 4c 69 73  etSortOrder(pLis
19640 74 2c 20 73 6f 72 74 4f 72 64 65 72 29 3b 0a 20  t, sortOrder);. 
19650 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
19660 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b  te3ExprListCheck
19670 4c 65 6e 67 74 68 28 70 50 61 72 73 65 2c 20 70  Length(pParse, p
19680 4c 69 73 74 2c 20 22 69 6e 64 65 78 22 29 3b 0a  List, "index");.
19690 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65    }..  /* Figure
196a0 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79   out how many by
196b0 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 72 65  tes of space are
196c0 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
196d0 72 65 20 65 78 70 6c 69 63 69 74 6c 79 0a 20 20  re explicitly.  
196e0 2a 2a 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c  ** specified col
196f0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
19700 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  names..  */.  fo
19710 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
19720 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
19730 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
19740 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
19750 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
19760 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  xpr!=0 );.    if
19770 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
19780 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20  COLLATE ){.     
19790 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20 2b 20   nExtra += (1 + 
197a0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
197b0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
197c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
197d0 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74  /* .  ** Allocat
197e0 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75  e the index stru
197f0 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e  cture. .  */.  n
19800 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
19810 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
19820 20 6e 45 78 74 72 61 43 6f 6c 20 3d 20 70 50 6b   nExtraCol = pPk
19830 20 3f 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20   ? pPk->nKeyCol 
19840 3a 20 31 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20  : 1;.  pIndex = 
19850 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49  sqlite3AllocateI
19860 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70  ndexObject(db, p
19870 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 6e 45  List->nExpr + nE
19880 78 74 72 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20  xtraCol,.       
19890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
198b0 4e 61 6d 65 20 2b 20 6e 45 78 74 72 61 20 2b 20  Name + nExtra + 
198c0 31 2c 20 26 7a 45 78 74 72 61 29 3b 0a 20 20 69  1, &zExtra);.  i
198d0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
198e0 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
198f0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
19900 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  x;.  }.  assert(
19910 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
19920 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 69  NMENT(pIndex->ai
19930 52 6f 77 4c 6f 67 45 73 74 29 20 29 3b 0a 20 20  RowLogEst) );.  
19940 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
19950 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e  TE_ALIGNMENT(pIn
19960 64 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20 29 3b 0a  dex->azColl) );.
19970 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20    pIndex->zName 
19980 3d 20 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74  = zExtra;.  zExt
19990 72 61 20 2b 3d 20 6e 4e 61 6d 65 20 2b 20 31 3b  ra += nName + 1;
199a0 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e 64 65 78  .  memcpy(pIndex
199b0 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  ->zName, zName, 
199c0 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64  nName+1);.  pInd
199d0 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61  ex->pTable = pTa
199e0 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  b;.  pIndex->onE
199f0 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72 72  rror = (u8)onErr
19a00 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 75 6e  or;.  pIndex->un
19a10 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72  iqNotNull = onEr
19a20 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20  ror!=OE_None;.  
19a30 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 20  pIndex->idxType 
19a40 3d 20 69 64 78 54 79 70 65 3b 0a 20 20 70 49 6e  = idxType;.  pIn
19a50 64 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64  dex->pSchema = d
19a60 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
19a70 65 6d 61 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e  ema;.  pIndex->n
19a80 4b 65 79 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e  KeyCol = pList->
19a90 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 70 50 49  nExpr;.  if( pPI
19aa0 57 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c  Where ){.    sql
19ab0 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52  ite3ResolveSelfR
19ac0 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c  eference(pParse,
19ad0 20 70 54 61 62 2c 20 4e 43 5f 50 61 72 74 49 64   pTab, NC_PartId
19ae0 78 2c 20 70 50 49 57 68 65 72 65 2c 20 30 29 3b  x, pPIWhere, 0);
19af0 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 50 61  .    pIndex->pPa
19b00 72 74 49 64 78 57 68 65 72 65 20 3d 20 70 50 49  rtIdxWhere = pPI
19b10 57 68 65 72 65 3b 0a 20 20 20 20 70 50 49 57 68  Where;.    pPIWh
19b20 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  ere = 0;.  }.  a
19b30 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
19b40 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
19b50 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 0a 20 20  , iDb, 0) );..  
19b60 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
19b70 69 66 20 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e  if we should hon
19b80 6f 72 20 44 45 53 43 20 72 65 71 75 65 73 74 73  or DESC requests
19b90 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   on index column
19ba0 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 62  s.  */.  if( pDb
19bb0 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f  ->pSchema->file_
19bc0 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20  format>=4 ){.   
19bd0 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d   sortOrderMask =
19be0 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20   -1;   /* Honor 
19bf0 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  DESC */.  }else{
19c00 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61  .    sortOrderMa
19c10 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67  sk = 0;    /* Ig
19c20 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d  nore DESC */.  }
19c30 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 74  ..  /* Analyze t
19c40 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65  he list of expre
19c50 73 73 69 6f 6e 73 20 74 68 61 74 20 66 6f 72 6d  ssions that form
19c60 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68   the terms of th
19c70 65 20 69 6e 64 65 78 20 61 6e 64 0a 20 20 2a 2a  e index and.  **
19c80 20 72 65 70 6f 72 74 20 61 6e 79 20 65 72 72 6f   report any erro
19c90 72 73 2e 20 20 49 6e 20 74 68 65 20 63 6f 6d 6d  rs.  In the comm
19ca0 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
19cb0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
19cc0 65 78 61 63 74 6c 79 0a 20 20 2a 2a 20 61 20 74  exactly.  ** a t
19cd0 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 73 74 6f  able column, sto
19ce0 72 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69  re that column i
19cf0 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 20 20 46  n aiColumn[].  F
19d00 6f 72 20 67 65 6e 65 72 61 6c 20 65 78 70 72 65  or general expre
19d10 73 73 69 6f 6e 73 2c 0a 20 20 2a 2a 20 70 6f 70  ssions,.  ** pop
19d20 75 6c 61 74 65 20 70 49 6e 64 65 78 2d 3e 61 43  ulate pIndex->aC
19d30 6f 6c 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65  olExpr and store
19d40 20 58 4e 5f 45 58 50 52 20 28 2d 32 29 20 69 6e   XN_EXPR (-2) in
19d50 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 0a 20 20 2a   aiColumn[]..  *
19d60 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73  *.  ** TODO: Iss
19d70 75 65 20 61 20 77 61 72 6e 69 6e 67 20 69 66 20  ue a warning if 
19d80 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75  two or more colu
19d90 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
19da0 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 0a   are identical..
19db0 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75 65    ** TODO: Issue
19dc0 20 61 20 77 61 72 6e 69 6e 67 20 69 66 20 74 68   a warning if th
19dd0 65 20 74 61 62 6c 65 20 70 72 69 6d 61 72 79 20  e table primary 
19de0 6b 65 79 20 69 73 20 75 73 65 64 20 61 73 20 70  key is used as p
19df0 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  art of the.  ** 
19e00 69 6e 64 65 78 20 6b 65 79 2e 0a 20 20 2a 2f 0a  index key..  */.
19e10 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74    for(i=0, pList
19e20 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
19e30 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
19e40 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29  ++, pListItem++)
19e50 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 43 45 78  {.    Expr *pCEx
19e60 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
19e70 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68       /* The i-th
19e80 20 69 6e 64 65 78 20 65 78 70 72 65 73 73 69 6f   index expressio
19e90 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 71  n */.    int req
19ea0 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b  uestedSortOrder;
19eb0 20 20 20 20 20 20 20 20 2f 2a 20 41 53 43 20 6f          /* ASC o
19ec0 72 20 44 45 53 43 20 6f 6e 20 74 68 65 20 69 2d  r DESC on the i-
19ed0 74 68 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  th expression */
19ee0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
19ef0 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *zColl;         
19f00 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e      /* Collation
19f10 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a   sequence name *
19f20 2f 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74  /..    sqlite3St
19f30 72 69 6e 67 54 6f 49 64 28 70 4c 69 73 74 49 74  ringToId(pListIt
19f40 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
19f50 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65  sqlite3ResolveSe
19f60 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61 72  lfReference(pPar
19f70 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f 49 64 78  se, pTab, NC_Idx
19f80 45 78 70 72 2c 20 70 4c 69 73 74 49 74 65 6d 2d  Expr, pListItem-
19f90 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  >pExpr, 0);.    
19fa0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
19fb0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
19fc0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 70  ate_index;.    p
19fd0 43 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  CExpr = sqlite3E
19fe0 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
19ff0 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 29  ListItem->pExpr)
1a000 3b 0a 20 20 20 20 69 66 28 20 70 43 45 78 70 72  ;.    if( pCExpr
1a010 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
1a020 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  ){.      if( pTa
1a030 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  b==pParse->pNewT
1a040 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
1a050 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1a060 70 50 61 72 73 65 2c 20 22 65 78 70 72 65 73 73  pParse, "express
1a070 69 6f 6e 73 20 70 72 6f 68 69 62 69 74 65 64 20  ions prohibited 
1a080 69 6e 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61  in PRIMARY KEY a
1a090 6e 64 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  nd ".           
1a0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0b0 20 20 20 20 20 22 55 4e 49 51 55 45 20 63 6f 6e       "UNIQUE con
1a0c0 73 74 72 61 69 6e 74 73 22 29 3b 0a 20 20 20 20  straints");.    
1a0d0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1a0e0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1a0f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
1a100 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 3d 3d  ndex->aColExpr==
1a110 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  0 ){.        Exp
1a120 72 4c 69 73 74 20 2a 70 43 6f 70 79 20 3d 20 73  rList *pCopy = s
1a130 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
1a140 70 28 64 62 2c 20 70 4c 69 73 74 2c 20 30 29 3b  p(db, pList, 0);
1a150 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
1a160 3e 61 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f 70  >aColExpr = pCop
1a170 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  y;.        if( !
1a180 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1a190 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
1a1a0 73 65 72 74 28 20 70 43 6f 70 79 21 3d 30 20 29  sert( pCopy!=0 )
1a1b0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 69 73  ;.          pLis
1a1c0 74 49 74 65 6d 20 3d 20 26 70 43 6f 70 79 2d 3e  tItem = &pCopy->
1a1d0 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  a[i];.        }.
1a1e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 20        }.      j 
1a1f0 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20  = XN_EXPR;.     
1a200 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
1a210 6e 5b 69 5d 20 3d 20 58 4e 5f 45 58 50 52 3b 0a  n[i] = XN_EXPR;.
1a220 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e        pIndex->un
1a230 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20  iqNotNull = 0;. 
1a240 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a250 6a 20 3d 20 70 43 45 78 70 72 2d 3e 69 43 6f 6c  j = pCExpr->iCol
1a260 75 6d 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72  umn;.      asser
1a270 74 28 20 6a 3c 3d 30 78 37 66 66 66 20 29 3b 0a  t( j<=0x7fff );.
1a280 20 20 20 20 20 20 69 66 28 20 6a 3c 30 20 29 7b        if( j<0 ){
1a290 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 54 61  .        j = pTa
1a2a0 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
1a2b0 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e  }else if( pTab->
1a2c0 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d  aCol[j].notNull=
1a2d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  =0 ){.        pI
1a2e0 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  ndex->uniqNotNul
1a2f0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  l = 0;.      }. 
1a300 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43       pIndex->aiC
1a310 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 28 69 31 36 29  olumn[i] = (i16)
1a320 6a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f  j;.    }.    zCo
1a330 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ll = 0;.    if( 
1a340 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
1a350 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
1a360 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43   ){.      int nC
1a370 6f 6c 6c 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  oll;.      zColl
1a380 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45   = pListItem->pE
1a390 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
1a3a0 20 20 20 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c       nColl = sql
1a3b0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f  ite3Strlen30(zCo
1a3c0 6c 6c 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 61  ll) + 1;.      a
1a3d0 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e  ssert( nExtra>=n
1a3e0 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65  Coll );.      me
1a3f0 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f  mcpy(zExtra, zCo
1a400 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20  ll, nColl);.    
1a410 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61    zColl = zExtra
1a420 3b 0a 20 20 20 20 20 20 7a 45 78 74 72 61 20 2b  ;.      zExtra +
1a430 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e  = nColl;.      n
1a440 45 78 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a  Extra -= nColl;.
1a450 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 3e      }else if( j>
1a460 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6c  =0 ){.      zCol
1a470 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  l = pTab->aCol[j
1a480 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20  ].zColl;.    }. 
1a490 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20     if( !zColl ) 
1a4a0 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53  zColl = sqlite3S
1a4b0 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 69 66  trBINARY;.    if
1a4c0 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
1a4d0 20 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63 61   && !sqlite3Loca
1a4e0 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
1a4f0 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  , zColl) ){.    
1a500 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
1a510 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
1a520 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f      pIndex->azCo
1a530 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20  ll[i] = zColl;. 
1a540 20 20 20 72 65 71 75 65 73 74 65 64 53 6f 72 74     requestedSort
1a550 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49 74 65  Order = pListIte
1a560 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20 73  m->sortOrder & s
1a570 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20  ortOrderMask;.  
1a580 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f    pIndex->aSortO
1a590 72 64 65 72 5b 69 5d 20 3d 20 28 75 38 29 72 65  rder[i] = (u8)re
1a5a0 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
1a5b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65  ;.  }..  /* Appe
1a5c0 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6b 65 79  nd the table key
1a5d0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
1a5e0 68 65 20 69 6e 64 65 78 2e 20 20 46 6f 72 20 57  he index.  For W
1a5f0 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20 2a  ITHOUT ROWID.  *
1a600 2a 20 74 61 62 6c 65 73 20 28 77 68 65 6e 20 70  * tables (when p
1a610 50 6b 21 3d 30 29 20 74 68 69 73 20 77 69 6c 6c  Pk!=0) this will
1a620 20 62 65 20 74 68 65 20 64 65 63 6c 61 72 65 64   be the declared
1a630 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 46   PRIMARY KEY.  F
1a640 6f 72 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 74  or.  ** normal t
1a650 61 62 6c 65 73 20 28 77 68 65 6e 20 70 50 6b 3d  ables (when pPk=
1a660 3d 30 29 20 74 68 69 73 20 77 69 6c 6c 20 62 65  =0) this will be
1a670 20 74 68 65 20 72 6f 77 69 64 2e 0a 20 20 2a 2f   the rowid..  */
1a680 0a 20 20 69 66 28 20 70 50 6b 20 29 7b 0a 20 20  .  if( pPk ){.  
1a690 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b    for(j=0; j<pPk
1a6a0 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b  ->nKeyCol; j++){
1a6b0 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70  .      int x = p
1a6c0 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  Pk->aiColumn[j];
1a6d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 78  .      assert( x
1a6e0 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=0 );.      if(
1a6f0 20 68 61 73 43 6f 6c 75 6d 6e 28 70 49 6e 64 65   hasColumn(pInde
1a700 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 6e  x->aiColumn, pIn
1a710 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 78 29  dex->nKeyCol, x)
1a720 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64   ){.        pInd
1a730 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a  ex->nColumn--; .
1a740 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a750 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43       pIndex->aiC
1a760 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 78 3b 0a 20 20  olumn[i] = x;.  
1a770 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a        pIndex->az
1a780 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61  Coll[i] = pPk->a
1a790 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  zColl[j];.      
1a7a0 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f    pIndex->aSortO
1a7b0 72 64 65 72 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61  rder[i] = pPk->a
1a7c0 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20  SortOrder[j];.  
1a7d0 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
1a7e0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
1a7f0 65 72 74 28 20 69 3d 3d 70 49 6e 64 65 78 2d 3e  ert( i==pIndex->
1a800 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 7d 65 6c  nColumn );.  }el
1a810 73 65 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  se{.    pIndex->
1a820 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e  aiColumn[i] = XN
1a830 5f 52 4f 57 49 44 3b 0a 20 20 20 20 70 49 6e 64  _ROWID;.    pInd
1a840 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20  ex->azColl[i] = 
1a850 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
1a860 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
1a870 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e  efaultRowEst(pIn
1a880 64 65 78 29 3b 0a 20 20 69 66 28 20 70 50 61 72  dex);.  if( pPar
1a890 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30  se->pNewTable==0
1a8a0 20 29 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78   ) estimateIndex
1a8b0 57 69 64 74 68 28 70 49 6e 64 65 78 29 3b 0a 0a  Width(pIndex);..
1a8c0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 64    /* If this ind
1a8d0 65 78 20 63 6f 6e 74 61 69 6e 73 20 65 76 65 72  ex contains ever
1a8e0 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 74 73 20  y column of its 
1a8f0 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 72 6b  table, then mark
1a900 0a 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 6f  .  ** it as a co
1a910 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a  vering index */.
1a920 20 20 61 73 73 65 72 74 28 20 48 61 73 52 6f 77    assert( HasRow
1a930 69 64 28 70 54 61 62 29 20 0a 20 20 20 20 20 20  id(pTab) .      
1a940 7c 7c 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30  || pTab->iPKey<0
1a950 20 7c 7c 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d   || sqlite3Colum
1a960 6e 4f 66 49 6e 64 65 78 28 70 49 6e 64 65 78 2c  nOfIndex(pIndex,
1a970 20 70 54 61 62 2d 3e 69 50 4b 65 79 29 3e 3d 30   pTab->iPKey)>=0
1a980 20 29 3b 0a 20 20 69 66 28 20 70 54 62 6c 4e 61   );.  if( pTblNa
1a990 6d 65 21 3d 30 20 26 26 20 70 49 6e 64 65 78 2d  me!=0 && pIndex-
1a9a0 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 54 61 62 2d 3e  >nColumn>=pTab->
1a9b0 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 70 49 6e 64  nCol ){.    pInd
1a9c0 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d  ex->isCovering =
1a9d0 20 31 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   1;.    for(j=0;
1a9e0 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
1a9f0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6a  ++){.      if( j
1aa00 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 20  ==pTab->iPKey ) 
1aa10 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1aa20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  if( sqlite3Colum
1aa30 6e 4f 66 49 6e 64 65 78 28 70 49 6e 64 65 78 2c  nOfIndex(pIndex,
1aa40 6a 29 3e 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  j)>=0 ) continue
1aa50 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  ;.      pIndex->
1aa60 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 30 3b 0a  isCovering = 0;.
1aa70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1aa80 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 54   }.  }..  if( pT
1aa90 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77  ab==pParse->pNew
1aaa0 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20  Table ){.    /* 
1aab0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
1aac0 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20   been called to 
1aad0 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61  create an automa
1aae0 74 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20  tic index as a. 
1aaf0 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20     ** result of 
1ab00 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
1ab10 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f   UNIQUE clause o
1ab20 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e  n a column defin
1ab30 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a  ition, or.    **
1ab40 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
1ab50 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20  r UNIQUE clause 
1ab60 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f  following the co
1ab70 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73  lumn definitions
1ab80 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e  ..    ** i.e. on
1ab90 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  e of:.    **.   
1aba0 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
1abb0 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59   t(x PRIMARY KEY
1abc0 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45  , y);.    ** CRE
1abd0 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79  ATE TABLE t(x, y
1abe0 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b  , UNIQUE(x, y));
1abf0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
1ac00 69 74 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b  ither way, check
1ac10 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 74   to see if the t
1ac20 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73  able already has
1ac30 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20   such an index. 
1ac40 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f  If.    ** so, do
1ac50 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65 61 74  n't bother creat
1ac60 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68  ing this one. Th
1ac70 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20  is only applies 
1ac80 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61  to.    ** automa
1ac90 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20  tically created 
1aca0 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20 63  indices. Users c
1acb0 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77 69  an do as they wi
1acc0 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65  sh with.    ** e
1acd0 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e  xplicit indices.
1ace0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1acf0 77 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49  wo UNIQUE or PRI
1ad00 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61  MARY KEY constra
1ad10 69 6e 74 73 20 61 72 65 20 63 6f 6e 73 69 64 65  ints are conside
1ad20 72 65 64 20 65 71 75 69 76 61 6c 65 6e 74 0a 20  red equivalent. 
1ad30 20 20 20 2a 2a 20 28 61 6e 64 20 74 68 75 73 20     ** (and thus 
1ad40 73 75 70 70 72 65 73 73 69 6e 67 20 74 68 65 20  suppressing the 
1ad50 73 65 63 6f 6e 64 20 6f 6e 65 29 20 65 76 65 6e  second one) even
1ad60 20 69 66 20 74 68 65 79 20 68 61 76 65 20 64 69   if they have di
1ad70 66 66 65 72 65 6e 74 0a 20 20 20 20 2a 2a 20 73  fferent.    ** s
1ad80 6f 72 74 20 6f 72 64 65 72 73 2e 0a 20 20 20 20  ort orders..    
1ad90 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
1ada0 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  re are different
1adb0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1adc0 6e 63 65 73 20 6f 72 20 69 66 20 74 68 65 20 63  nces or if the c
1add0 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20 2a 2a  olumns of.    **
1ade0 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
1adf0 6f 63 63 75 72 20 69 6e 20 64 69 66 66 65 72 65  occur in differe
1ae00 6e 74 20 6f 72 64 65 72 73 2c 20 74 68 65 6e 20  nt orders, then 
1ae10 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  the constraints 
1ae20 61 72 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69  are.    ** consi
1ae30 64 65 72 65 64 20 64 69 73 74 69 6e 63 74 20 61  dered distinct a
1ae40 6e 64 20 62 6f 74 68 20 72 65 73 75 6c 74 20 69  nd both result i
1ae50 6e 20 73 65 70 61 72 61 74 65 20 69 6e 64 69 63  n separate indic
1ae60 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49  es..    */.    I
1ae70 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
1ae80 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
1ae90 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
1aea0 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
1aeb0 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
1aec0 20 20 20 61 73 73 65 72 74 28 20 49 73 55 6e 69     assert( IsUni
1aed0 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29  queIndex(pIdx) )
1aee0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1aef0 70 49 64 78 2d 3e 69 64 78 54 79 70 65 21 3d 53  pIdx->idxType!=S
1af00 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50  QLITE_IDXTYPE_AP
1af10 50 44 45 46 20 29 3b 0a 20 20 20 20 20 20 61 73  PDEF );.      as
1af20 73 65 72 74 28 20 49 73 55 6e 69 71 75 65 49 6e  sert( IsUniqueIn
1af30 64 65 78 28 70 49 6e 64 65 78 29 20 29 3b 0a 0a  dex(pIndex) );..
1af40 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
1af50 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e 64 65 78 2d  nKeyCol!=pIndex-
1af60 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69  >nKeyCol ) conti
1af70 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  nue;.      for(k
1af80 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79  =0; k<pIdx->nKey
1af90 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  Col; k++){.     
1afa0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1afb0 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  1;.        const
1afc0 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20 20   char *z2;.     
1afd0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
1afe0 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 3e 3d 30 20  >aiColumn[k]>=0 
1aff0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1b000 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d  Idx->aiColumn[k]
1b010 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  !=pIndex->aiColu
1b020 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20  mn[k] ) break;. 
1b030 20 20 20 20 20 20 20 7a 31 20 3d 20 70 49 64 78         z1 = pIdx
1b040 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20  ->azColl[k];.   
1b050 20 20 20 20 20 7a 32 20 3d 20 70 49 6e 64 65 78       z2 = pIndex
1b060 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20  ->azColl[k];.   
1b070 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1b080 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20  StrICmp(z1, z2) 
1b090 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
1b0a0 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49  .      if( k==pI
1b0b0 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20  dx->nKeyCol ){. 
1b0c0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
1b0d0 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78  >onError!=pIndex
1b0e0 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20  ->onError ){.   
1b0f0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
1b100 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74 65  onstraint create
1b110 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78  s the same index
1b120 20 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20   as a previous. 
1b130 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
1b140 74 72 61 69 6e 74 20 73 70 65 63 69 66 69 65 64  traint specified
1b150 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68   somewhere in th
1b160 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
1b170 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
1b180 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74      ** However t
1b190 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  he ON CONFLICT c
1b1a0 6c 61 75 73 65 73 20 61 72 65 20 64 69 66 66 65  lauses are diffe
1b1b0 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68  rent. If both th
1b1c0 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  is .          **
1b1d0 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20   constraint and 
1b1e0 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 71 75  the previous equ
1b1f0 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69  ivalent constrai
1b200 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63 69 74  nt have explicit
1b210 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e  .          ** ON
1b220 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
1b230 73 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72  s this is an err
1b240 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75  or. Otherwise, u
1b250 73 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  se the.         
1b260 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73   ** explicitly s
1b270 70 65 63 69 66 69 65 64 20 62 65 68 61 76 69 6f  pecified behavio
1b280 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e  r for the index.
1b290 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
1b2a0 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70 49          if( !(pI
1b2b0 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
1b2c0 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65  Default || pInde
1b2d0 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
1b2e0 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20  efault) ){.     
1b2f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1b300 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
1b310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b320 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20  "conflicting ON 
1b330 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
1b340 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b   specified", 0);
1b350 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1b360 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
1b370 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
1b380 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ault ){.        
1b390 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f      pIdx->onErro
1b3a0 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  r = pIndex->onEr
1b3b0 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ror;.          }
1b3c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b3d0 20 20 20 69 66 28 20 69 64 78 54 79 70 65 3d 3d     if( idxType==
1b3e0 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50  SQLITE_IDXTYPE_P
1b3f0 52 49 4d 41 52 59 4b 45 59 20 29 20 70 49 64 78  RIMARYKEY ) pIdx
1b400 2d 3e 69 64 78 54 79 70 65 20 3d 20 69 64 78 54  ->idxType = idxT
1b410 79 70 65 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ype;.        got
1b420 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1b430 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
1b440 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e   }.  }..  /* Lin
1b450 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20  k the new Index 
1b460 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73  structure to its
1b470 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68   table and to th
1b480 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d  e other.  ** in-
1b490 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
1b4a0 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a  structures. .  *
1b4b0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  /.  assert( pPar
1b4c0 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20  se->nErr==0 );. 
1b4d0 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
1b4e0 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  sy ){.    Index 
1b4f0 2a 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  *p;.    assert( 
1b500 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42  !IN_DECLARE_VTAB
1b510 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1b520 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
1b530 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49  exHeld(db, 0, pI
1b540 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29  ndex->pSchema) )
1b550 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
1b560 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 49 6e  3HashInsert(&pIn
1b570 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64  dex->pSchema->id
1b580 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20  xHash, .        
1b590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5a0 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c    pIndex->zName,
1b5b0 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66   pIndex);.    if
1b5c0 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ( p ){.      ass
1b5d0 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29  ert( p==pIndex )
1b5e0 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73  ;  /* Malloc mus
1b5f0 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f  t have failed */
1b600 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  .      sqlite3Oo
1b610 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
1b620 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
1b630 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
1b640 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73      db->mDbFlags
1b650 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d   |= DBFLAG_Schem
1b660 61 43 68 61 6e 67 65 3b 0a 20 20 20 20 69 66 28  aChange;.    if(
1b670 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
1b680 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e        pIndex->tn
1b690 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
1b6a0 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d  wTnum;.    }.  }
1b6b0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1b6c0 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 43 52  s the initial CR
1b6d0 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
1b6e0 6d 65 6e 74 20 28 6f 72 20 43 52 45 41 54 45 20  ment (or CREATE 
1b6f0 54 41 42 4c 45 20 69 66 20 74 68 65 0a 20 20 2a  TABLE if the.  *
1b700 2a 20 69 6e 64 65 78 20 69 73 20 61 6e 20 69 6d  * index is an im
1b710 70 6c 69 65 64 20 69 6e 64 65 78 20 66 6f 72 20  plied index for 
1b720 61 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d  a UNIQUE or PRIM
1b730 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
1b740 6e 74 29 20 74 68 65 6e 0a 20 20 2a 2a 20 65 6d  nt) then.  ** em
1b750 69 74 20 63 6f 64 65 20 74 6f 20 61 6c 6c 6f 63  it code to alloc
1b760 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 72 6f  ate the index ro
1b770 6f 74 70 61 67 65 20 6f 6e 20 64 69 73 6b 20 61  otpage on disk a
1b780 6e 64 20 6d 61 6b 65 20 61 6e 20 65 6e 74 72 79  nd make an entry
1b790 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 69 6e   for.  ** the in
1b7a0 64 65 78 20 69 6e 20 74 68 65 20 73 71 6c 69 74  dex in the sqlit
1b7b0 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e_master table a
1b7c0 6e 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  nd populate the 
1b7d0 69 6e 64 65 78 20 77 69 74 68 0a 20 20 2a 2a 20  index with.  ** 
1b7e0 63 6f 6e 74 65 6e 74 2e 20 20 42 75 74 2c 20 64  content.  But, d
1b7f0 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 69 66  o not do this if
1b800 20 77 65 20 61 72 65 20 73 69 6d 70 6c 79 20 72   we are simply r
1b810 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74  eading the sqlit
1b820 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61  e_master.  ** ta
1b830 62 6c 65 20 74 6f 20 70 61 72 73 65 20 74 68 65  ble to parse the
1b840 20 73 63 68 65 6d 61 2c 20 6f 72 20 69 66 20 74   schema, or if t
1b850 68 69 73 20 69 6e 64 65 78 20 69 73 20 74 68 65  his index is the
1b860 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
1b870 65 78 0a 20 20 2a 2a 20 6f 66 20 61 20 57 49 54  ex.  ** of a WIT
1b880 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
1b890 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
1b8a0 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65  TblName==0 it me
1b8b0 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20 69  ans this index i
1b8c0 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20 61  s generated as a
1b8d0 6e 20 69 6d 70 6c 69 65 64 20 50 52 49 4d 41 52  n implied PRIMAR
1b8e0 59 20 4b 45 59 0a 20 20 2a 2a 20 6f 72 20 55 4e  Y KEY.  ** or UN
1b8f0 49 51 55 45 20 69 6e 64 65 78 20 69 6e 20 61 20  IQUE index in a 
1b900 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
1b910 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74  tement.  Since t
1b920 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61  he table.  ** ha
1b930 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61  s just been crea
1b940 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ted, it contains
1b950 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65   no data and the
1b960 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a   index initializ
1b970 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20  ation.  ** step 
1b980 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a  can be skipped..
1b990 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20    */.  else if( 
1b9a0 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c  HasRowid(pTab) |
1b9b0 7c 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  | pTblName!=0 ){
1b9c0 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
1b9d0 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20    char *zStmt;. 
1b9e0 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b     int iMem = ++
1b9f0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20  pParse->nMem;.. 
1ba00 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
1ba10 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1ba20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f     if( v==0 ) go
1ba30 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1ba40 6e 64 65 78 3b 0a 0a 20 20 20 20 73 71 6c 69 74  ndex;..    sqlit
1ba50 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
1ba60 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
1ba70 20 69 44 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 43   iDb);..    /* C
1ba80 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61  reate the rootpa
1ba90 67 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ge for the index
1baa0 20 75 73 69 6e 67 20 43 72 65 61 74 65 49 6e 64   using CreateInd
1bab0 65 78 2e 20 42 75 74 20 62 65 66 6f 72 65 0a 20  ex. But before. 
1bac0 20 20 20 2a 2a 20 64 6f 69 6e 67 20 73 6f 2c 20     ** doing so, 
1bad0 63 6f 64 65 20 61 20 4e 6f 6f 70 20 69 6e 73 74  code a Noop inst
1bae0 72 75 63 74 69 6f 6e 20 61 6e 64 20 73 74 6f 72  ruction and stor
1baf0 65 20 69 74 73 20 61 64 64 72 65 73 73 20 69 6e  e its address in
1bb00 20 0a 20 20 20 20 2a 2a 20 49 6e 64 65 78 2e 74   .    ** Index.t
1bb10 6e 75 6d 2e 20 54 68 69 73 20 69 73 20 72 65 71  num. This is req
1bb20 75 69 72 65 64 20 69 6e 20 63 61 73 65 20 74 68  uired in case th
1bb30 69 73 20 69 6e 64 65 78 20 69 73 20 61 63 74 75  is index is actu
1bb40 61 6c 6c 79 20 61 20 0a 20 20 20 20 2a 2a 20 50  ally a .    ** P
1bb50 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64 20 74  RIMARY KEY and t
1bb60 68 65 20 74 61 62 6c 65 20 69 73 20 61 63 74 75  he table is actu
1bb70 61 6c 6c 79 20 61 20 57 49 54 48 4f 55 54 20 52  ally a WITHOUT R
1bb80 4f 57 49 44 20 74 61 62 6c 65 2e 20 49 6e 20 0a  OWID table. In .
1bb90 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65      ** that case
1bba0 20 74 68 65 20 63 6f 6e 76 65 72 74 54 6f 57 69   the convertToWi
1bbb0 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28  thoutRowidTable(
1bbc0 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  ) routine will r
1bbd0 65 70 6c 61 63 65 0a 20 20 20 20 2a 2a 20 74 68  eplace.    ** th
1bbe0 65 20 4e 6f 6f 70 20 77 69 74 68 20 61 20 47 6f  e Noop with a Go
1bbf0 74 6f 20 74 6f 20 6a 75 6d 70 20 6f 76 65 72 20  to to jump over 
1bc00 74 68 65 20 56 44 42 45 20 63 6f 64 65 20 67 65  the VDBE code ge
1bc10 6e 65 72 61 74 65 64 20 62 65 6c 6f 77 2e 20 2a  nerated below. *
1bc20 2f 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e  /.    pIndex->tn
1bc30 75 6d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  um = sqlite3Vdbe
1bc40 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4e 6f 6f  AddOp0(v, OP_Noo
1bc50 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  p);.    sqlite3V
1bc60 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1bc70 43 72 65 61 74 65 42 74 72 65 65 2c 20 69 44 62  CreateBtree, iDb
1bc80 2c 20 69 4d 65 6d 2c 20 42 54 52 45 45 5f 42 4c  , iMem, BTREE_BL
1bc90 4f 42 4b 45 59 29 3b 0a 0a 20 20 20 20 2f 2a 20  OBKEY);..    /* 
1bca0 47 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c  Gather the compl
1bcb0 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
1bcc0 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
1bcd0 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20  tement into.    
1bce0 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72  ** the zStmt var
1bcf0 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20  iable.    */.   
1bd00 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
1bd10 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e       int n = (in
1bd20 74 29 28 70 50 61 72 73 65 2d 3e 73 4c 61 73 74  t)(pParse->sLast
1bd30 54 6f 6b 65 6e 2e 7a 20 2d 20 70 4e 61 6d 65 2d  Token.z - pName-
1bd40 3e 7a 29 20 2b 20 70 50 61 72 73 65 2d 3e 73 4c  >z) + pParse->sL
1bd50 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20  astToken.n;.    
1bd60 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e 7a 5b 6e    if( pName->z[n
1bd70 2d 31 5d 3d 3d 27 3b 27 20 29 20 6e 2d 2d 3b 0a  -1]==';' ) n--;.
1bd80 20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64        /* A named
1bd90 20 69 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65   index with an e
1bda0 78 70 6c 69 63 69 74 20 43 52 45 41 54 45 20 49  xplicit CREATE I
1bdb0 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a  NDEX statement *
1bdc0 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  /.      zStmt = 
1bdd0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
1bde0 62 2c 20 22 43 52 45 41 54 45 25 73 20 49 4e 44  b, "CREATE%s IND
1bdf0 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20  EX %.*s",.      
1be00 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f    onError==OE_No
1be10 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51  ne ? "" : " UNIQ
1be20 55 45 22 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a  UE", n, pName->z
1be30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1be40 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61      /* An automa
1be50 74 69 63 20 69 6e 64 65 78 20 63 72 65 61 74 65  tic index create
1be60 64 20 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b  d by a PRIMARY K
1be70 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  EY or UNIQUE con
1be80 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20  straint */.     
1be90 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69   /* zStmt = sqli
1bea0 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20  te3MPrintf(""); 
1beb0 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  */.      zStmt =
1bec0 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
1bed0 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69  * Add an entry i
1bee0 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  n sqlite_master 
1bef0 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20  for this index. 
1bf00 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
1bf10 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
1bf20 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 49  rse, .        "I
1bf30 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73  NSERT INTO %Q.%s
1bf40 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c   VALUES('index',
1bf50 25 51 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c  %Q,%Q,#%d,%Q);",
1bf60 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62  .        db->aDb
1bf70 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20  [iDb].zDbSName, 
1bf80 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a 20 20 20  MASTER_NAME,.   
1bf90 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
1bfa0 6d 65 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62  me,.        pTab
1bfb0 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
1bfc0 20 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 7a   iMem,.        z
1bfd0 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  Stmt.    );.    
1bfe0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1bff0 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f  , zStmt);..    /
1c000 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78  * Fill the index
1c010 20 77 69 74 68 20 64 61 74 61 20 61 6e 64 20 72   with data and r
1c020 65 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d  eparse the schem
1c030 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78  a. Code an OP_Ex
1c040 70 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69  pire.    ** to i
1c050 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72  nvalidate all pr
1c060 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  e-compiled state
1c070 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ments..    */.  
1c080 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29    if( pTblName )
1c090 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
1c0a0 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
1c0b0 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29  e, pIndex, iMem)
1c0c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
1c0d0 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
1c0e0 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
1c0f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61  sqlite3VdbeAddPa
1c100 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69  rseSchemaOp(v, i
1c110 44 62 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c  Db,.         sql
1c120 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
1c130 22 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74  "name='%q' AND t
1c140 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 20 70 49  ype='index'", pI
1c150 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  ndex->zName));. 
1c160 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1c170 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 45 78 70  AddOp0(v, OP_Exp
1c180 69 72 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ire);.    }..   
1c190 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1c1a0 48 65 72 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e  Here(v, pIndex->
1c1b0 74 6e 75 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  tnum);.  }..  /*
1c1c0 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20   When adding an 
1c1d0 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73  index to the lis
1c1e0 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72  t of indices for
1c1f0 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20   a table, make. 
1c200 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64   ** sure all ind
1c210 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f  ices labeled OE_
1c220 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74  Replace come aft
1c230 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62  er all those lab
1c240 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e  eled.  ** OE_Ign
1c250 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ore.  This is ne
1c260 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65 20  cessary for the 
1c270 63 6f 72 72 65 63 74 20 63 6f 6e 73 74 72 61 69  correct constrai
1c280 6e 74 20 63 68 65 63 6b 0a 20 20 2a 2a 20 70 72  nt check.  ** pr
1c290 6f 63 65 73 73 69 6e 67 20 28 69 6e 20 73 71 6c  ocessing (in sql
1c2a0 69 74 65 33 47 65 6e 65 72 61 74 65 43 6f 6e 73  ite3GenerateCons
1c2b0 74 72 61 69 6e 74 43 68 65 63 6b 73 28 29 29 20  traintChecks()) 
1c2c0 61 73 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20  as part of.  ** 
1c2d0 55 50 44 41 54 45 20 61 6e 64 20 49 4e 53 45 52  UPDATE and INSER
1c2e0 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 0a  T statements.  .
1c2f0 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
1c300 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c  nit.busy || pTbl
1c310 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Name==0 ){.    i
1c320 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52  f( onError!=OE_R
1c330 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e  eplace || pTab->
1c340 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20  pIndex==0.      
1c350 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64     || pTab->pInd
1c360 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
1c370 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20  Replace){.      
1c380 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20  pIndex->pNext = 
1c390 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
1c3a0 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78      pTab->pIndex
1c3b0 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d   = pIndex;.    }
1c3c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
1c3d0 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62  x *pOther = pTab
1c3e0 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
1c3f0 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70  while( pOther->p
1c400 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e  Next && pOther->
1c410 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d  pNext->onError!=
1c420 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20  OE_Replace ){.  
1c430 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70        pOther = p
1c440 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
1c450 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64      }.      pInd
1c460 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68  ex->pNext = pOth
1c470 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  er->pNext;.     
1c480 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d   pOther->pNext =
1c490 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20   pIndex;.    }. 
1c4a0 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20     pIndex = 0;. 
1c4b0 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75   }..  /* Clean u
1c4c0 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67  p before exiting
1c4d0 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f   */.exit_create_
1c4e0 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e  index:.  if( pIn
1c4f0 64 65 78 20 29 20 66 72 65 65 49 6e 64 65 78 28  dex ) freeIndex(
1c500 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 73  db, pIndex);.  s
1c510 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
1c520 28 64 62 2c 20 70 50 49 57 68 65 72 65 29 3b 0a  (db, pPIWhere);.
1c530 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
1c540 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
1c550 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63  t);.  sqlite3Src
1c560 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1c570 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  TblName);.  sqli
1c580 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
1c590 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ame);.}../*.** F
1c5a0 69 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e 61 69  ill the Index.ai
1c5b0 52 6f 77 45 73 74 5b 5d 20 61 72 72 61 79 20 77  RowEst[] array w
1c5c0 69 74 68 20 64 65 66 61 75 6c 74 20 69 6e 66 6f  ith default info
1c5d0 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d  rmation - inform
1c5e0 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75  ation.** to be u
1c5f0 73 65 64 20 77 68 65 6e 20 77 65 20 68 61 76 65  sed when we have
1c600 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 41 4e 41   not run the ANA
1c610 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  LYZE command..**
1c620 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d 20  .** aiRowEst[0] 
1c630 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f 20 63  is supposed to c
1c640 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65  ontain the numbe
1c650 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
1c660 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53   the index..** S
1c670 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b  ince we do not k
1c680 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d 69 6c  now, guess 1 mil
1c690 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b  lion.  aiRowEst[
1c6a0 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74  1] is an estimat
1c6b0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  e of the.** numb
1c6c0 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
1c6d0 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74  e table that mat
1c6e0 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61  ch any particula
1c6f0 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a  r value of the.*
1c700 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f  * first column o
1c710 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 61 69  f the index.  ai
1c720 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61 6e 20  RowEst[2] is an 
1c730 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
1c740 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77  number.** of row
1c750 73 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79  s that match any
1c760 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6d 62   particular comb
1c770 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  ination of the f
1c780 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a  irst 2 columns.*
1c790 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  * of the index. 
1c7a0 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20   And so forth.  
1c7b0 49 74 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62  It must always b
1c7c0 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
1c7d0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  *.**           a
1c7e0 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f  iRowEst[N]<=aiRo
1c7f0 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20  wEst[N-1].**    
1c800 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b         aiRowEst[
1c810 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72  N]>=1.**.** Apar
1c820 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 77 65 20  t from that, we 
1c830 68 61 76 65 20 6c 69 74 74 6c 65 20 74 6f 20 67  have little to g
1c840 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 69 6e 74  o on besides int
1c850 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20  uition as to.** 
1c860 68 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d 20 73  how aiRowEst[] s
1c870 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c  hould be initial
1c880 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65  ized.  The numbe
1c890 72 73 20 67 65 6e 65 72 61 74 65 64 20 68 65 72  rs generated her
1c8a0 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 64 20 6f  e.** are based o
1c8b0 6e 20 74 79 70 69 63 61 6c 20 76 61 6c 75 65 73  n typical values
1c8c0 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 75 61 6c   found in actual
1c8d0 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69   indices..*/.voi
1c8e0 64 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74  d sqlite3Default
1c8f0 52 6f 77 45 73 74 28 49 6e 64 65 78 20 2a 70 49  RowEst(Index *pI
1c900 64 78 29 7b 0a 20 20 2f 2a 20 20 20 20 20 20 20  dx){.  /*       
1c910 20 20 20 20 20 20 20 20 20 31 30 2c 20 20 39 2c           10,  9,
1c920 20 20 38 2c 20 20 37 2c 20 20 36 20 2a 2f 0a 20    8,  7,  6 */. 
1c930 20 4c 6f 67 45 73 74 20 61 56 61 6c 5b 5d 20 3d   LogEst aVal[] =
1c940 20 7b 20 33 33 2c 20 33 32 2c 20 33 30 2c 20 32   { 33, 32, 30, 2
1c950 38 2c 20 32 36 20 7d 3b 0a 20 20 4c 6f 67 45 73  8, 26 };.  LogEs
1c960 74 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69 52  t *a = pIdx->aiR
1c970 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69 6e 74 20  owLogEst;.  int 
1c980 6e 43 6f 70 79 20 3d 20 4d 49 4e 28 41 72 72 61  nCopy = MIN(Arra
1c990 79 53 69 7a 65 28 61 56 61 6c 29 2c 20 70 49 64  ySize(aVal), pId
1c9a0 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 69  x->nKeyCol);.  i
1c9b0 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49 6e 64 65  nt i;..  /* Inde
1c9c0 78 65 73 20 77 69 74 68 20 64 65 66 61 75 6c 74  xes with default
1c9d0 20 72 6f 77 20 65 73 74 69 6d 61 74 65 73 20 73   row estimates s
1c9e0 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 73  hould not have s
1c9f0 74 61 74 31 20 64 61 74 61 20 2a 2f 0a 20 20 61  tat1 data */.  a
1ca00 73 73 65 72 74 28 20 21 70 49 64 78 2d 3e 68 61  ssert( !pIdx->ha
1ca10 73 53 74 61 74 31 20 29 3b 0a 0a 20 20 2f 2a 20  sStat1 );..  /* 
1ca20 53 65 74 20 74 68 65 20 66 69 72 73 74 20 65 6e  Set the first en
1ca30 74 72 79 20 28 6e 75 6d 62 65 72 20 6f 66 20 72  try (number of r
1ca40 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  ows in the index
1ca50 29 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74  ) to the estimat
1ca60 65 64 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  ed .  ** number 
1ca70 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
1ca80 61 62 6c 65 2c 20 6f 72 20 68 61 6c 66 20 74 68  able, or half th
1ca90 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
1caa0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 0a 20 20   in the table.  
1cab0 2a 2a 20 66 6f 72 20 61 20 70 61 72 74 69 61 6c  ** for a partial
1cac0 20 69 6e 64 65 78 2e 20 20 20 42 75 74 20 64 6f   index.   But do
1cad0 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 65 73 74   not let the est
1cae0 69 6d 61 74 65 20 64 72 6f 70 20 62 65 6c 6f 77  imate drop below
1caf0 20 31 30 2e 20 2a 2f 0a 20 20 61 5b 30 5d 20 3d   10. */.  a[0] =
1cb00 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e   pIdx->pTable->n
1cb10 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69 66 28  RowLogEst;.  if(
1cb20 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57   pIdx->pPartIdxW
1cb30 68 65 72 65 21 3d 30 20 29 20 61 5b 30 5d 20 2d  here!=0 ) a[0] -
1cb40 3d 20 31 30 3b 20 20 61 73 73 65 72 74 28 20 31  = 10;  assert( 1
1cb50 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
1cb60 28 32 29 20 29 3b 0a 20 20 69 66 28 20 61 5b 30  (2) );.  if( a[0
1cb70 5d 3c 33 33 20 29 20 61 5b 30 5d 20 3d 20 33 33  ]<33 ) a[0] = 33
1cb80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1cb90 20 20 20 61 73 73 65 72 74 28 20 33 33 3d 3d 73     assert( 33==s
1cba0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 29  qlite3LogEst(10)
1cbb0 20 29 3b 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61   );..  /* Estima
1cbc0 74 65 20 74 68 61 74 20 61 5b 31 5d 20 69 73 20  te that a[1] is 
1cbd0 31 30 2c 20 61 5b 32 5d 20 69 73 20 39 2c 20 61  10, a[2] is 9, a
1cbe0 5b 33 5d 20 69 73 20 38 2c 20 61 5b 34 5d 20 69  [3] is 8, a[4] i
1cbf0 73 20 37 2c 20 61 5b 35 5d 20 69 73 0a 20 20 2a  s 7, a[5] is.  *
1cc00 2a 20 36 20 61 6e 64 20 65 61 63 68 20 73 75 62  * 6 and each sub
1cc10 73 65 71 75 65 6e 74 20 76 61 6c 75 65 20 28 69  sequent value (i
1cc20 66 20 61 6e 79 29 20 69 73 20 35 2e 20 20 2a 2f  f any) is 5.  */
1cc30 0a 20 20 6d 65 6d 63 70 79 28 26 61 5b 31 5d 2c  .  memcpy(&a[1],
1cc40 20 61 56 61 6c 2c 20 6e 43 6f 70 79 2a 73 69 7a   aVal, nCopy*siz
1cc50 65 6f 66 28 4c 6f 67 45 73 74 29 29 3b 0a 20 20  eof(LogEst));.  
1cc60 66 6f 72 28 69 3d 6e 43 6f 70 79 2b 31 3b 20 69  for(i=nCopy+1; i
1cc70 3c 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  <=pIdx->nKeyCol;
1cc80 20 69 2b 2b 29 7b 0a 20 20 20 20 61 5b 69 5d 20   i++){.    a[i] 
1cc90 3d 20 32 33 3b 20 20 20 20 20 20 20 20 20 20 20  = 23;           
1cca0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1ccb0 20 32 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   23==sqlite3LogE
1ccc0 73 74 28 35 29 20 29 3b 0a 20 20 7d 0a 0a 20 20  st(5) );.  }..  
1ccd0 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
1cce0 65 33 4c 6f 67 45 73 74 28 31 29 20 29 3b 0a 20  e3LogEst(1) );. 
1ccf0 20 69 66 28 20 49 73 55 6e 69 71 75 65 49 6e 64   if( IsUniqueInd
1cd00 65 78 28 70 49 64 78 29 20 29 20 61 5b 70 49 64  ex(pIdx) ) a[pId
1cd10 78 2d 3e 6e 4b 65 79 43 6f 6c 5d 20 3d 20 30 3b  x->nKeyCol] = 0;
1cd20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1cd30 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70  outine will drop
1cd40 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d   an existing nam
1cd50 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20  ed index.  This 
1cd60 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65  routine.** imple
1cd70 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49  ments the DROP I
1cd80 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a  NDEX statement..
1cd90 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
1cda0 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a  ropIndex(Parse *
1cdb0 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
1cdc0 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45 78  *pName, int ifEx
1cdd0 69 73 74 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a  ists){.  Index *
1cde0 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a  pIndex;.  Vdbe *
1cdf0 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
1ce00 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1ce10 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 61 73 73   int iDb;..  ass
1ce20 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
1ce30 72 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 4e 65 76  r==0 );   /* Nev
1ce40 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70  er called with p
1ce50 72 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20  rior errors */. 
1ce60 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1ce70 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
1ce80 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1ce90 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  x;.  }.  assert(
1cea0 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20   pName->nSrc==1 
1ceb0 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
1cec0 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
1ced0 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
1cee0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
1cef0 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
1cf00 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
1cf10 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70  3FindIndex(db, p
1cf20 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65  Name->a[0].zName
1cf30 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  , pName->a[0].zD
1cf40 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20  atabase);.  if( 
1cf50 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20  pIndex==0 ){.   
1cf60 20 69 66 28 20 21 69 66 45 78 69 73 74 73 20 29   if( !ifExists )
1cf70 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1cf80 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1cf90 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20  "no such index: 
1cfa0 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a  %S", pName, 0);.
1cfb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cfc0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
1cfd0 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50  fyNamedSchema(pP
1cfe0 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  arse, pName->a[0
1cff0 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
1d000 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
1d010 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
1d020 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
1d030 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
1d040 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 69 64 78   if( pIndex->idx
1d050 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58  Type!=SQLITE_IDX
1d060 54 59 50 45 5f 41 50 50 44 45 46 20 29 7b 0a 20  TYPE_APPDEF ){. 
1d070 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1d080 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65  sg(pParse, "inde
1d090 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
1d0a0 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20  h UNIQUE ".     
1d0b0 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59   "or PRIMARY KEY
1d0c0 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e   constraint cann
1d0d0 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
1d0e0 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  0);.    goto exi
1d0f0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1d100 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  }.  iDb = sqlite
1d110 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
1d120 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  b, pIndex->pSche
1d130 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ma);.#ifndef SQL
1d140 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
1d150 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
1d160 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45  nt code = SQLITE
1d170 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _DROP_INDEX;.   
1d180 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
1d190 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20  Index->pTable;. 
1d1a0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1d1b0 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
1d1c0 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20  ].zDbSName;.    
1d1d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
1d1e0 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28   = SCHEMA_TABLE(
1d1f0 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71  iDb);.    if( sq
1d200 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1d210 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
1d220 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a  LETE, zTab, 0, z
1d230 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
1d240 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1d250 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
1d260 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
1d270 20 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51   iDb ) code = SQ
1d280 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49  LITE_DROP_TEMP_I
1d290 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71  NDEX;.    if( sq
1d2a0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1d2b0 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e  Parse, code, pIn
1d2c0 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62  dex->zName, pTab
1d2d0 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b  ->zName, zDb) ){
1d2e0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
1d2f0 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20  _drop_index;.   
1d300 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1d310 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1d320 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  e to remove the 
1d330 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74  index and from t
1d340 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
1d350 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
1d360 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1d370 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
1d380 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
1d390 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
1d3a0 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 1, iDb);.    
1d3b0 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
1d3c0 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
1d3d0 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
1d3e0 51 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d  Q.%s WHERE name=
1d3f0 25 51 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64  %Q AND type='ind
1d400 65 78 27 22 2c 0a 20 20 20 20 20 20 20 64 62 2d  ex'",.       db-
1d410 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
1d420 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c  me, MASTER_NAME,
1d430 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20   pIndex->zName. 
1d440 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
1d450 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73  3ClearStatTables
1d460 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69  (pParse, iDb, "i
1d470 64 78 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  dx", pIndex->zNa
1d480 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
1d490 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
1d4a0 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 64  rse, iDb);.    d
1d4b0 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
1d4c0 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74  Parse, pIndex->t
1d4d0 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  num, iDb);.    s
1d4e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1d4f0 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78  (v, OP_DropIndex
1d500 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 49 6e  , iDb, 0, 0, pIn
1d510 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  dex->zName, 0);.
1d520 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69    }..exit_drop_i
1d530 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53  ndex:.  sqlite3S
1d540 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
1d550 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pName);.}../*.*
1d560 2a 20 70 41 72 72 61 79 20 69 73 20 61 20 70 6f  * pArray is a po
1d570 69 6e 74 65 72 20 74 6f 20 61 6e 20 61 72 72 61  inter to an arra
1d580 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 45 61  y of objects. Ea
1d590 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  ch object in the
1d5a0 0a 2a 2a 20 61 72 72 61 79 20 69 73 20 73 7a 45  .** array is szE
1d5b0 6e 74 72 79 20 62 79 74 65 73 20 69 6e 20 73 69  ntry bytes in si
1d5c0 7a 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ze. This routine
1d5d0 20 75 73 65 73 20 73 71 6c 69 74 65 33 44 62 52   uses sqlite3DbR
1d5e0 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20 74 6f 20 65  ealloc().** to e
1d5f0 78 74 65 6e 64 20 74 68 65 20 61 72 72 61 79 20  xtend the array 
1d600 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 69 73  so that there is
1d610 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77   space for a new
1d620 20 6f 62 6a 65 63 74 20 61 74 20 74 68 65 20 65   object at the e
1d630 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  nd..**.** When t
1d640 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1d650 63 61 6c 6c 65 64 2c 20 2a 70 6e 45 6e 74 72 79  called, *pnEntry
1d660 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 75   contains the cu
1d670 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 2a 2a  rrent size of.**
1d680 20 74 68 65 20 61 72 72 61 79 20 28 69 6e 20 65   the array (in e
1d690 6e 74 72 69 65 73 20 2d 20 73 6f 20 74 68 65 20  ntries - so the 
1d6a0 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 28 28  allocation is ((
1d6b0 2a 70 6e 45 6e 74 72 79 29 20 2a 20 73 7a 45 6e  *pnEntry) * szEn
1d6c0 74 72 79 29 20 62 79 74 65 73 0a 2a 2a 20 69 6e  try) bytes.** in
1d6d0 20 74 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49   total)..**.** I
1d6e0 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20  f the realloc() 
1d6f0 69 73 20 73 75 63 63 65 73 73 66 75 6c 20 28 69  is successful (i
1d700 2e 65 2e 20 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f  .e. if no OOM co
1d710 6e 64 69 74 69 6f 6e 20 6f 63 63 75 72 73 29 2c  ndition occurs),
1d720 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 61 6c   the.** space al
1d730 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
1d740 6e 65 77 20 6f 62 6a 65 63 74 20 69 73 20 7a 65  new object is ze
1d750 72 6f 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 75  roed, *pnEntry u
1d760 70 64 61 74 65 64 20 74 6f 0a 2a 2a 20 72 65 66  pdated to.** ref
1d770 6c 65 63 74 20 74 68 65 20 6e 65 77 20 73 69 7a  lect the new siz
1d780 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 61  e of the array a
1d790 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  nd a pointer to 
1d7a0 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69  the new allocati
1d7b0 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20  on.** returned. 
1d7c0 2a 70 49 64 78 20 69 73 20 73 65 74 20 74 6f 20  *pIdx is set to 
1d7d0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
1d7e0 20 6e 65 77 20 61 72 72 61 79 20 65 6e 74 72 79   new array entry
1d7f0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
1d800 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1d810 69 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29  if the realloc()
1d820 20 66 61 69 6c 73 2c 20 2a 70 49 64 78 20 69 73   fails, *pIdx is
1d830 20 73 65 74 20 74 6f 20 2d 31 2c 20 2a 70 6e 45   set to -1, *pnE
1d840 6e 74 72 79 20 72 65 6d 61 69 6e 73 0a 2a 2a 20  ntry remains.** 
1d850 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20  unchanged and a 
1d860 63 6f 70 79 20 6f 66 20 70 41 72 72 61 79 20 72  copy of pArray r
1d870 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64  eturned..*/.void
1d880 20 2a 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c   *sqlite3ArrayAl
1d890 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c 69 74 65  locate(.  sqlite
1d8a0 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 43  3 *db,      /* C
1d8b0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74  onnection to not
1d8c0 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61  ify of malloc fa
1d8d0 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64  ilures */.  void
1d8e0 20 2a 70 41 72 72 61 79 2c 20 20 20 20 20 2f 2a   *pArray,     /*
1d8f0 20 41 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74   Array of object
1d900 73 2e 20 20 4d 69 67 68 74 20 62 65 20 72 65 61  s.  Might be rea
1d910 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e  llocated */.  in
1d920 74 20 73 7a 45 6e 74 72 79 2c 20 20 20 20 20 20  t szEntry,      
1d930 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61 63 68 20  /* Size of each 
1d940 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 61 72  object in the ar
1d950 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ray */.  int *pn
1d960 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75  Entry,     /* Nu
1d970 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20  mber of objects 
1d980 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
1d990 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49 64 78 20   */.  int *pIdx 
1d9a0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1d9b0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
1d9c0 6e 65 77 20 73 6c 6f 74 20 68 65 72 65 20 2a 2f  new slot here */
1d9d0 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  .){.  char *z;. 
1d9e0 20 69 6e 74 20 6e 20 3d 20 2a 70 6e 45 6e 74 72   int n = *pnEntr
1d9f0 79 3b 0a 20 20 69 66 28 20 28 6e 20 26 20 28 6e  y;.  if( (n & (n
1da00 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  -1))==0 ){.    i
1da10 6e 74 20 73 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f  nt sz = (n==0) ?
1da20 20 31 20 3a 20 32 2a 6e 3b 0a 20 20 20 20 76 6f   1 : 2*n;.    vo
1da30 69 64 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  id *pNew = sqlit
1da40 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
1da50 70 41 72 72 61 79 2c 20 73 7a 2a 73 7a 45 6e 74  pArray, sz*szEnt
1da60 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ry);.    if( pNe
1da70 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70  w==0 ){.      *p
1da80 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Idx = -1;.      
1da90 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 20  return pArray;. 
1daa0 20 20 20 7d 0a 20 20 20 20 70 41 72 72 61 79 20     }.    pArray 
1dab0 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20  = pNew;.  }.  z 
1dac0 3d 20 28 63 68 61 72 2a 29 70 41 72 72 61 79 3b  = (char*)pArray;
1dad0 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b 6e 20 2a  .  memset(&z[n *
1dae0 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a   szEntry], 0, sz
1daf0 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49 64 78 20  Entry);.  *pIdx 
1db00 3d 20 6e 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72  = n;.  ++*pnEntr
1db10 79 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72 72  y;.  return pArr
1db20 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  ay;.}../*.** App
1db30 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  end a new elemen
1db40 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49  t to the given I
1db50 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61  dList.  Create a
1db60 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a   new IdList if.*
1db70 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a  * need be..**.**
1db80 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73   A new IdList is
1db90 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55   returned, or NU
1dba0 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66  LL if malloc() f
1dbb0 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ails..**.** The 
1dbc0 7a 4e 61 6d 65 20 6d 75 73 74 20 68 61 76 65 20  zName must have 
1dbd0 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72  been obtained fr
1dbe0 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  om sqlite3DbMall
1dbf0 6f 63 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74  oc().  This rout
1dc00 69 6e 65 0a 2a 2a 20 61 63 63 65 70 74 73 20 6f  ine.** accepts o
1dc10 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65 20  wnership of the 
1dc20 7a 4e 61 6d 65 20 73 74 72 69 6e 67 20 61 6e 64  zName string and
1dc30 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61   will ensure tha
1dc40 74 20 69 74 20 69 73 20 66 72 65 65 64 0a 2a 2a  t it is freed.**
1dc50 20 77 68 65 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20   when no longer 
1dc60 69 6e 20 75 73 65 2e 0a 2a 2f 0a 49 64 4c 69 73  in use..*/.IdLis
1dc70 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t *sqlite3IdList
1dc80 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20  Append(.  Parse 
1dc90 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
1dca0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
1dcb0 74 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70  t */.  IdList *p
1dcc0 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 49  List,       /* I
1dcd0 44 20 6c 69 73 74 20 74 6f 20 61 70 70 65 6e 64  D list to append
1dce0 20 74 6f 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   to */.  char *z
1dcf0 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 2f 2a  Name          /*
1dd00 20 54 6f 6b 65 6e 20 74 6f 20 61 70 70 65 6e 64   Token to append
1dd10 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
1dd20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1dd30 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
1dd40 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
1dd50 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1dd60 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
1dd70 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29  , sizeof(IdList)
1dd80 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
1dd90 74 3d 3d 30 20 29 20 67 6f 74 6f 20 69 64 5f 6c  t==0 ) goto id_l
1dda0 69 73 74 5f 61 70 70 65 6e 64 5f 66 61 69 6c 3b  ist_append_fail;
1ddb0 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20  .  }.  pList->a 
1ddc0 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
1ddd0 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 64 62  locate(.      db
1dde0 2c 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61  ,.      pList->a
1ddf0 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  ,.      sizeof(p
1de00 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20  List->a[0]),.   
1de10 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a     &pList->nId,.
1de20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20        &i.  );.  
1de30 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 73  if( i<0 ){.    s
1de40 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
1de50 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
1de60 20 20 20 67 6f 74 6f 20 69 64 5f 6c 69 73 74 5f     goto id_list_
1de70 61 70 70 65 6e 64 5f 66 61 69 6c 3b 0a 20 20 7d  append_fail;.  }
1de80 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  .  pList->a[i].z
1de90 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
1dea0 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 69  return pList;..i
1deb0 64 5f 6c 69 73 74 5f 61 70 70 65 6e 64 5f 66 61  d_list_append_fa
1dec0 69 6c 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  il:.  sqlite3DbF
1ded0 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
1dee0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1def0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49  *.** Delete an I
1df00 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dList..*/.void s
1df10 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
1df20 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
1df30 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  IdList *pList){.
1df40 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1df50 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1df60 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1df70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
1df80 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1df90 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  ee(db, pList->a[
1dfa0 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  i].zName);.  }. 
1dfb0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1dfc0 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  b, pList->a);.  
1dfd0 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
1dfe0 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  db, pList);.}../
1dff0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1e000 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f  index in pList o
1e010 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  f the identifier
1e020 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74   named zId.  Ret
1e030 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74  urn -1.** if not
1e040 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73   found..*/.int s
1e050 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
1e060 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  x(IdList *pList,
1e070 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1e080 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
1e090 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1e0a0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28  eturn -1;.  for(
1e0b0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
1e0c0 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  d; i++){.    if(
1e0d0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1e0e0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1e0f0 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72  e, zName)==0 ) r
1e100 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
1e110 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
1e120 2a 2a 20 45 78 70 61 6e 64 20 74 68 65 20 73 70  ** Expand the sp
1e130 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
1e140 72 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c  r the given SrcL
1e150 69 73 74 20 6f 62 6a 65 63 74 20 62 79 0a 2a 2a  ist object by.**
1e160 20 63 72 65 61 74 69 6e 67 20 6e 45 78 74 72 61   creating nExtra
1e170 20 6e 65 77 20 73 6c 6f 74 73 20 62 65 67 69 6e   new slots begin
1e180 6e 69 6e 67 20 61 74 20 69 53 74 61 72 74 2e 20  ning at iStart. 
1e190 20 69 53 74 61 72 74 20 69 73 20 7a 65 72 6f 20   iStart is zero 
1e1a0 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c  based..** New sl
1e1b0 6f 74 73 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a  ots are zeroed..
1e1c0 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1e1d0 65 2c 20 73 75 70 70 6f 73 65 20 61 20 53 72 63  e, suppose a Src
1e1e0 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 63  List initially c
1e1f0 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65 6e 74 72  ontains two entr
1e200 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20  ies: A,B..** To 
1e210 61 70 70 65 6e 64 20 33 20 6e 65 77 20 65 6e 74  append 3 new ent
1e220 72 69 65 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e  ries onto the en
1e230 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a  d, do this:.**.*
1e240 2a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  *    sqlite3SrcL
1e250 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70  istEnlarge(db, p
1e260 53 72 63 6c 69 73 74 2c 20 33 2c 20 32 29 3b 0a  Srclist, 3, 2);.
1e270 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  **.** After the 
1e280 63 61 6c 6c 20 61 62 6f 76 65 20 69 74 20 77 6f  call above it wo
1e290 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20 20 41 2c  uld contain:  A,
1e2a0 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69   B, nil, nil, ni
1e2b0 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 53 74  l..** If the iSt
1e2c0 61 72 74 20 61 72 67 75 6d 65 6e 74 20 68 61 64  art argument had
1e2d0 20 62 65 65 6e 20 31 20 69 6e 73 74 65 61 64 20   been 1 instead 
1e2e0 6f 66 20 32 2c 20 74 68 65 6e 20 74 68 65 20 72  of 2, then the r
1e2f0 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20 68  esult.** would h
1e300 61 76 65 20 62 65 65 6e 3a 20 20 41 2c 20 6e 69  ave been:  A, ni
1e310 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20  l, nil, nil, B. 
1e320 20 54 6f 20 70 72 65 70 65 6e 64 20 74 68 65 20   To prepend the 
1e330 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68  new slots,.** th
1e340 65 20 69 53 74 61 72 74 20 76 61 6c 75 65 20 77  e iStart value w
1e350 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20  ould be 0.  The 
1e360 72 65 73 75 6c 74 20 74 68 65 6e 20 77 6f 75 6c  result then woul
1e370 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e 69  d.** be: nil, ni
1e380 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a  l, nil, A, B..**
1e390 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
1e3a0 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
1e3b0 20 74 68 65 20 53 72 63 4c 69 73 74 20 69 73 20   the SrcList is 
1e3c0 75 6e 63 68 61 6e 67 65 64 2e 20 20 54 68 65 0a  unchanged.  The.
1e3d0 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ** db->mallocFai
1e3e0 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c 20 62 65  led flag will be
1e3f0 20 73 65 74 20 74 6f 20 74 72 75 65 2e 0a 2a 2f   set to true..*/
1e400 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
1e410 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28  3SrcListEnlarge(
1e420 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
1e430 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1e440 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
1e450 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d 20 65 72  notify of OOM er
1e460 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73  rors */.  SrcLis
1e470 74 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20  t *pSrc,     /* 
1e480 54 68 65 20 53 72 63 4c 69 73 74 20 74 6f 20 62  The SrcList to b
1e490 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20  e enlarged */.  
1e4a0 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
1e4b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1e4c0 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20 61 64 64  new slots to add
1e4d0 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f   to pSrc->a[] */
1e4e0 0a 20 20 69 6e 74 20 69 53 74 61 72 74 20 20 20  .  int iStart   
1e4f0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
1e500 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66  n pSrc->a[] of f
1e510 69 72 73 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f  irst new slot */
1e520 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  .){.  int i;..  
1e530 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
1e540 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61  ng on calling pa
1e550 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61 73  rameters */.  as
1e560 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d 30 20  sert( iStart>=0 
1e570 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78  );.  assert( nEx
1e580 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  tra>=1 );.  asse
1e590 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20  rt( pSrc!=0 );. 
1e5a0 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3c   assert( iStart<
1e5b0 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a  =pSrc->nSrc );..
1e5c0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 64    /* Allocate ad
1e5d0 64 69 74 69 6f 6e 61 6c 20 73 70 61 63 65 20 69  ditional space i
1e5e0 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69 66  f needed */.  if
1e5f0 28 20 28 75 33 32 29 70 53 72 63 2d 3e 6e 53 72  ( (u32)pSrc->nSr
1e600 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e  c+nExtra>pSrc->n
1e610 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63  Alloc ){.    Src
1e620 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  List *pNew;.    
1e630 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72  int nAlloc = pSr
1e640 63 2d 3e 6e 53 72 63 2a 32 2b 6e 45 78 74 72 61  c->nSrc*2+nExtra
1e650 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a  ;.    int nGot;.
1e660 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
1e670 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
1e680 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20  pSrc,.          
1e690 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53 72       sizeof(*pSr
1e6a0 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a  c) + (nAlloc-1)*
1e6b0 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
1e6c0 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ]) );.    if( pN
1e6d0 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ew==0 ){.      a
1e6e0 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
1e6f0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
1e700 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 20 20   return pSrc;.  
1e710 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d 20 70    }.    pSrc = p
1e720 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20  New;.    nGot = 
1e730 28 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  (sqlite3DbMalloc
1e740 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29 20 2d  Size(db, pNew) -
1e750 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f   sizeof(*pSrc))/
1e760 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
1e770 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e  ])+1;.    pSrc->
1e780 6e 41 6c 6c 6f 63 20 3d 20 6e 47 6f 74 3b 0a 20  nAlloc = nGot;. 
1e790 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 65 78   }..  /* Move ex
1e7a0 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74 68 61  isting slots tha
1e7b0 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74 68 65  t come after the
1e7c0 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65 64 20   newly inserted 
1e7d0 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74 20 6f  slots.  ** out o
1e7e0 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20 20 66  f the way */.  f
1e7f0 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d  or(i=pSrc->nSrc-
1e800 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20 69 2d  1; i>=iStart; i-
1e810 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b  -){.    pSrc->a[
1e820 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53 72 63  i+nExtra] = pSrc
1e830 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70 53  ->a[i];.  }.  pS
1e840 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 6e 45 78 74  rc->nSrc += nExt
1e850 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74  ra;..  /* Zero t
1e860 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  he newly allocat
1e870 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65  ed slots */.  me
1e880 6d 73 65 74 28 26 70 53 72 63 2d 3e 61 5b 69 53  mset(&pSrc->a[iS
1e890 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  tart], 0, sizeof
1e8a0 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78  (pSrc->a[0])*nEx
1e8b0 74 72 61 29 3b 0a 20 20 66 6f 72 28 69 3d 69 53  tra);.  for(i=iS
1e8c0 74 61 72 74 3b 20 69 3c 69 53 74 61 72 74 2b 6e  tart; i<iStart+n
1e8d0 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a 20 20 20  Extra; i++){.   
1e8e0 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72   pSrc->a[i].iCur
1e8f0 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  sor = -1;.  }.. 
1e900 20 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69   /* Return a poi
1e910 6e 74 65 72 20 74 6f 20 74 68 65 20 65 6e 6c 61  nter to the enla
1e920 72 67 65 64 20 53 72 63 4c 69 73 74 20 2a 2f 0a  rged SrcList */.
1e930 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d    return pSrc;.}
1e940 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  .../*.** Append 
1e950 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65  a new table name
1e960 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72   to the given Sr
1e970 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61  cList.  Create a
1e980 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a   new SrcList if.
1e990 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e  ** need be.  A n
1e9a0 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65 61  ew entry is crea
1e9b0 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69  ted in the SrcLi
1e9c0 73 74 20 65 76 65 6e 20 69 66 20 70 54 61 62 6c  st even if pTabl
1e9d0 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  e is NULL..**.**
1e9e0 20 41 20 53 72 63 4c 69 73 74 20 69 73 20 72 65   A SrcList is re
1e9f0 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  turned, or NULL 
1ea00 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  if there is an O
1ea10 4f 4d 20 65 72 72 6f 72 2e 20 20 54 68 65 20 72  OM error.  The r
1ea20 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72 63 4c 69  eturned.** SrcLi
1ea30 73 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20  st might be the 
1ea40 73 61 6d 65 20 61 73 20 74 68 65 20 53 72 63 4c  same as the SrcL
1ea50 69 73 74 20 74 68 61 74 20 77 61 73 20 69 6e 70  ist that was inp
1ea60 75 74 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62  ut or it might b
1ea70 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 2e 20  e.** a new one. 
1ea80 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
1ea90 20 64 6f 65 73 20 6f 63 63 75 72 73 2c 20 74 68   does occurs, th
1eaa0 65 6e 20 74 68 65 20 70 72 69 6f 72 20 76 61 6c  en the prior val
1eab0 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a 2a 20 74  ue of pList.** t
1eac0 68 61 74 20 69 73 20 69 6e 70 75 74 20 74 6f 20  hat is input to 
1ead0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1eae0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66 72  automatically fr
1eaf0 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44  eed..**.** If pD
1eb00 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e  atabase is not n
1eb10 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ull, it means th
1eb20 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  at the table has
1eb30 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20   an optional.** 
1eb40 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72  database name pr
1eb50 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73  efix.  Like this
1eb60 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61 62  :  "database.tab
1eb70 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61 62  le".  The pDatab
1eb80 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  ase.** points to
1eb90 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
1eba0 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20 70  and the pTable p
1ebb0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74  oints to the dat
1ebc0 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54  abase name..** T
1ebd0 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  he SrcList.a[].z
1ebe0 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69  Name field is fi
1ebf0 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 61  lled with the ta
1ec00 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d  ble name which m
1ec10 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f  ight.** come fro
1ec20 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44 61  m pTable (if pDa
1ec30 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20  tabase is NULL) 
1ec40 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73  or from pDatabas
1ec50 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e  e.  .** SrcList.
1ec60 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73  a[].zDatabase is
1ec70 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
1ec80 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66   database name f
1ec90 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f  rom pTable,.** o
1eca0 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e  r with NULL if n
1ecb0 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73 70  o database is sp
1ecc0 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ecified..**.** I
1ecd0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
1ece0 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73  f call like this
1ecf0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1ed00 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1ed10 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a  pend(D,A,B,0);.*
1ed20 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61  *.** Then B is a
1ed30 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
1ed40 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1ed50 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65 64  e is unspecified
1ed60 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20  .  If called.** 
1ed70 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
1ed80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1ed90 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c  SrcListAppend(D,
1eda0 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,C);.**.** Th
1edb0 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c  en C is the tabl
1edc0 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20  e name and B is 
1edd0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1ede0 65 2e 20 20 49 66 20 43 20 69 73 20 64 65 66 69  e.  If C is defi
1edf0 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73 6f 20 69  ned.** then so i
1ee00 73 20 42 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  s B.  In other w
1ee10 6f 72 64 73 2c 20 77 65 20 6e 65 76 65 72 20 68  ords, we never h
1ee20 61 76 65 20 61 20 63 61 73 65 20 77 68 65 72 65  ave a case where
1ee30 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1ee40 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1ee50 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29 3b 0a 2a  pend(D,A,0,C);.*
1ee60 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61 62 6c 65  *.** Both pTable
1ee70 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 20 61   and pDatabase a
1ee80 72 65 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65  re assumed to be
1ee90 20 71 75 6f 74 65 64 2e 20 20 54 68 65 79 20 61   quoted.  They a
1eea0 72 65 20 64 65 71 75 6f 74 65 64 0a 2a 2a 20 62  re dequoted.** b
1eeb0 65 66 6f 72 65 20 62 65 69 6e 67 20 61 64 64 65  efore being adde
1eec0 64 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74  d to the SrcList
1eed0 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
1eee0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1eef0 6e 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  nd(.  sqlite3 *d
1ef00 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  b,        /* Con
1ef10 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66  nection to notif
1ef20 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  y of malloc fail
1ef30 75 72 65 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73  ures */.  SrcLis
1ef40 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a  t *pList,     /*
1ef50 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20   Append to this 
1ef60 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72  SrcList. NULL cr
1ef70 65 61 74 65 73 20 61 20 6e 65 77 20 53 72 63 4c  eates a new SrcL
1ef80 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ist */.  Token *
1ef90 70 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20  pTable,      /* 
1efa0 54 61 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20  Table to append 
1efb0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74  */.  Token *pDat
1efc0 61 62 61 73 65 20 20 20 20 2f 2a 20 44 61 74 61  abase    /* Data
1efd0 62 61 73 65 20 6f 66 20 74 68 65 20 74 61 62 6c  base of the tabl
1efe0 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  e */.){.  struct
1eff0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1f000 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 20  Item;.  assert( 
1f010 70 44 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20  pDatabase==0 || 
1f020 70 54 61 62 6c 65 21 3d 30 20 29 3b 20 20 2f 2a  pTable!=0 );  /*
1f030 20 43 61 6e 6e 6f 74 20 68 61 76 65 20 43 20 77   Cannot have C w
1f040 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20 20 61 73  ithout B */.  as
1f050 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
1f060 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
1f070 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
1f080 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
1f090 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 53 72 63  N(db, sizeof(Src
1f0a0 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
1f0b0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1f0c0 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d  rn 0;.    pList-
1f0d0 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 20  >nAlloc = 1;.   
1f0e0 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20 3d 20 31   pList->nSrc = 1
1f0f0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4c  ;.    memset(&pL
1f100 69 73 74 2d 3e 61 5b 30 5d 2c 20 30 2c 20 73 69  ist->a[0], 0, si
1f110 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
1f120 29 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  ));.    pList->a
1f130 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31  [0].iCursor = -1
1f140 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1f150 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 53 72  List = sqlite3Sr
1f160 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c  cListEnlarge(db,
1f170 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c 69 73 74   pList, 1, pList
1f180 2d 3e 6e 53 72 63 29 3b 0a 20 20 7d 0a 20 20 69  ->nSrc);.  }.  i
1f190 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
1f1a0 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  led ){.    sqlit
1f1b0 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
1f1c0 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  db, pList);.    
1f1d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1f1e0 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
1f1f0 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d  a[pList->nSrc-1]
1f200 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73  ;.  if( pDatabas
1f210 65 20 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e  e && pDatabase->
1f220 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74  z==0 ){.    pDat
1f230 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  abase = 0;.  }. 
1f240 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20 29   if( pDatabase )
1f250 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61  {.    pItem->zNa
1f260 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
1f270 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 44  FromToken(db, pD
1f280 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 49  atabase);.    pI
1f290 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
1f2a0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1f2b0 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65  Token(db, pTable
1f2c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1f2d0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
1f2e0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1f2f0 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  ken(db, pTable);
1f300 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74  .    pItem->zDat
1f310 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  abase = 0;.  }. 
1f320 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
1f330 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 56  ../*.** Assign V
1f340 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78 20  dbeCursor index 
1f350 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20 74  numbers to all t
1f360 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69  ables in a SrcLi
1f370 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  st.*/.void sqlit
1f380 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
1f390 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50  ursors(Parse *pP
1f3a0 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
1f3b0 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
1f3c0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1f3d0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1f3e0 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c 20  assert(pList || 
1f3f0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
1f400 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
1f410 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
1f420 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(i=0, pItem=pL
1f430 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d  ist->a; i<pList-
1f440 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
1f450 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  m++){.      if( 
1f460 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d  pItem->iCursor>=
1f470 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
1f480 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20   pItem->iCursor 
1f490 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
1f4a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
1f4b0 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  m->pSelect ){.  
1f4c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
1f4d0 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
1f4e0 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  s(pParse, pItem-
1f4f0 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b  >pSelect->pSrc);
1f500 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f510 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
1f520 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63  te an entire Src
1f530 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61  List including a
1f540 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74  ll its substruct
1f550 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ure..*/.void sql
1f560 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
1f570 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  e(sqlite3 *db, S
1f580 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
1f590 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
1f5a0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1f5b0 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69  pItem;.  if( pLi
1f5c0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
1f5d0 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
1f5e0 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69  t->a, i=0; i<pLi
1f5f0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
1f600 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
1f610 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1f620 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  Item->zDatabase)
1f630 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
1f640 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
1f650 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
1f660 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
1f670 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
1f680 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69   if( pItem->fg.i
1f690 73 49 6e 64 65 78 65 64 42 79 20 29 20 73 71 6c  sIndexedBy ) sql
1f6a0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1f6b0 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65  Item->u1.zIndexe
1f6c0 64 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49  dBy);.    if( pI
1f6d0 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  tem->fg.isTabFun
1f6e0 63 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 4c  c ) sqlite3ExprL
1f6f0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49  istDelete(db, pI
1f700 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67  tem->u1.pFuncArg
1f710 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
1f720 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 49  leteTable(db, pI
1f730 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20  tem->pTab);.    
1f740 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
1f750 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
1f760 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c  Select);.    sql
1f770 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1f780 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a  b, pItem->pOn);.
1f790 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
1f7a0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  tDelete(db, pIte
1f7b0 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a  m->pUsing);.  }.
1f7c0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
1f7d0 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  N(db, pList);.}.
1f7e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1f7f0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
1f800 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 61   the parser to a
1f810 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f  dd a new term to
1f820 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61   the.** end of a
1f830 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c   growing FROM cl
1f840 61 75 73 65 2e 20 20 54 68 65 20 22 70 22 20 70  ause.  The "p" p
1f850 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
1f860 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46  part of.** the F
1f870 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74 20  ROM clause that 
1f880 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1f890 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20 22   constructed.  "
1f8a0 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66  p" is NULL.** if
1f8b0 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
1f8c0 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46  st term of the F
1f8d0 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54 61  ROM clause.  pTa
1f8e0 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73  ble and pDatabas
1f8f0 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d  e.** are the nam
1f900 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61  e of the table a
1f910 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  nd database name
1f920 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  d in the FROM cl
1f930 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44  ause term..** pD
1f940 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 20  atabase is NULL 
1f950 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1f960 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20 69  name qualifier i
1f970 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65 0a  s missing - the.
1f980 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20 20  ** usual case.  
1f990 49 66 20 74 68 65 20 74 65 72 6d 20 68 61 73 20  If the term has 
1f9a0 61 6e 20 61 6c 69 61 73 2c 20 74 68 65 6e 20 70  an alias, then p
1f9b0 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f 20  Alias points to 
1f9c0 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b  the.** alias tok
1f9d0 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d  en.  If the term
1f9e0 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2c 20   is a subquery, 
1f9f0 74 68 65 6e 20 70 53 75 62 71 75 65 72 79 20 69  then pSubquery i
1fa00 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20  s the.** SELECT 
1fa10 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 74  statement that t
1fa20 68 65 20 73 75 62 71 75 65 72 79 20 65 6e 63 6f  he subquery enco
1fa30 64 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c 65  des.  The pTable
1fa40 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61 73   and.** pDatabas
1fa50 65 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65  e parameters are
1fa60 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75 65   NULL for subque
1fa70 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20 61  ries.  The pOn a
1fa80 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72  nd pUsing.** par
1fa90 61 6d 65 74 65 72 73 20 61 72 65 20 74 68 65 20  ameters are the 
1faa0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 4f  content of the O
1fab0 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
1fac0 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ses..**.** Retur
1fad0 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  n a new SrcList 
1fae0 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69 73  which encodes is
1faf0 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20 74   the FROM with t
1fb00 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61  he new.** term a
1fb10 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74  dded..*/.SrcList
1fb20 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
1fb30 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a  AppendFromTerm(.
1fb40 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1fb50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
1fb60 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1fb70 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20 20    SrcList *p,   
1fb80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1fb90 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74 68   left part of th
1fba0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c  e FROM clause al
1fbb0 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20  ready seen */.  
1fbc0 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20  Token *pTable,  
1fbd0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1fbe0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
1fbf0 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d 20  add to the FROM 
1fc00 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65  clause */.  Toke
1fc10 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20 20  n *pDatabase,   
1fc20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1fc30 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
1fc40 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f  aining pTable */
1fc50 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73  .  Token *pAlias
1fc60 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
1fc70 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
1fc80 65 20 6f 66 20 74 68 65 20 41 53 20 73 75 62 65  e of the AS sube
1fc90 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53  xpression */.  S
1fca0 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72 79  elect *pSubquery
1fcb0 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 71  ,      /* A subq
1fcc0 75 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c 61  uery used in pla
1fcd0 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61  ce of a table na
1fce0 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f  me */.  Expr *pO
1fcf0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
1fd00 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75 73 65  /* The ON clause
1fd10 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20   of a join */.  
1fd20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 20 20  IdList *pUsing  
1fd30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55          /* The U
1fd40 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61  SING clause of a
1fd50 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74   join */.){.  st
1fd60 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1fd70 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69  m *pItem;.  sqli
1fd80 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1fd90 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21 70 20 26  ->db;.  if( !p &
1fda0 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69 6e 67  & (pOn || pUsing
1fdb0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
1fdc0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1fdd0 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65 20   "a JOIN clause 
1fde0 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  is required befo
1fdf0 72 65 20 25 73 22 2c 20 0a 20 20 20 20 20 20 28  re %s", .      (
1fe00 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22 55 53  pOn ? "ON" : "US
1fe10 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20 20 20  ING").    );.   
1fe20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f   goto append_fro
1fe30 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  m_error;.  }.  p
1fe40 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
1fe50 74 41 70 70 65 6e 64 28 64 62 2c 20 70 2c 20 70  tAppend(db, p, p
1fe60 54 61 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65  Table, pDatabase
1fe70 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  );.  if( p==0 ||
1fe80 20 4e 45 56 45 52 28 70 2d 3e 6e 53 72 63 3d 3d   NEVER(p->nSrc==
1fe90 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61  0) ){.    goto a
1fea0 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72  ppend_from_error
1feb0 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20  ;.  }.  pItem = 
1fec0 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d  &p->a[p->nSrc-1]
1fed0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 41 6c 69  ;.  assert( pAli
1fee0 61 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  as!=0 );.  if( p
1fef0 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20  Alias->n ){.    
1ff00 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20  pItem->zAlias = 
1ff10 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1ff20 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61 73 29  oken(db, pAlias)
1ff30 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70  ;.  }.  pItem->p
1ff40 53 65 6c 65 63 74 20 3d 20 70 53 75 62 71 75 65  Select = pSubque
1ff50 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e  ry;.  pItem->pOn
1ff60 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d   = pOn;.  pItem-
1ff70 3e 70 55 73 69 6e 67 20 3d 20 70 55 73 69 6e 67  >pUsing = pUsing
1ff80 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20  ;.  return p;.. 
1ff90 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f  append_from_erro
1ffa0 72 3a 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  r:.  assert( p==
1ffb0 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  0 );.  sqlite3Ex
1ffc0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e  prDelete(db, pOn
1ffd0 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69  );.  sqlite3IdLi
1ffe0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 55 73  stDelete(db, pUs
1fff0 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ing);.  sqlite3S
20000 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
20010 70 53 75 62 71 75 65 72 79 29 3b 0a 20 20 72 65  pSubquery);.  re
20020 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
20030 20 41 64 64 20 61 6e 20 49 4e 44 45 58 45 44 20   Add an INDEXED 
20040 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45  BY or NOT INDEXE
20050 44 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20  D clause to the 
20060 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
20070 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20  ded .** element 
20080 6f 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69  of the source-li
20090 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  st passed as the
200a0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
200b0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
200c0 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42  3SrcListIndexedB
200d0 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
200e0 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b   SrcList *p, Tok
200f0 65 6e 20 2a 70 49 6e 64 65 78 65 64 42 79 29 7b  en *pIndexedBy){
20100 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65  .  assert( pInde
20110 78 65 64 42 79 21 3d 30 20 29 3b 0a 20 20 69 66  xedBy!=0 );.  if
20120 28 20 70 20 26 26 20 70 49 6e 64 65 78 65 64 42  ( p && pIndexedB
20130 79 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 73 74  y->n>0 ){.    st
20140 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
20150 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73  m *pItem;.    as
20160 73 65 72 74 28 20 70 2d 3e 6e 53 72 63 3e 30 20  sert( p->nSrc>0 
20170 29 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26  );.    pItem = &
20180 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b  p->a[p->nSrc-1];
20190 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
201a0 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65  em->fg.notIndexe
201b0 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
201c0 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  rt( pItem->fg.is
201d0 49 6e 64 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a  IndexedBy==0 );.
201e0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
201f0 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d  m->fg.isTabFunc=
20200 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  =0 );.    if( pI
20210 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26  ndexedBy->n==1 &
20220 26 20 21 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a  & !pIndexedBy->z
20230 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 22   ){.      /* A "
20240 4e 4f 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61  NOT INDEXED" cla
20250 75 73 65 20 77 61 73 20 73 75 70 70 6c 69 65 64  use was supplied
20260 2e 20 53 65 65 20 70 61 72 73 65 2e 79 20 0a 20  . See parse.y . 
20270 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63       ** construc
20280 74 20 22 69 6e 64 65 78 65 64 5f 6f 70 74 22 20  t "indexed_opt" 
20290 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a  for details. */.
202a0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e        pItem->fg.
202b0 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 31 3b 0a  notIndexed = 1;.
202c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
202d0 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65   pItem->u1.zInde
202e0 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65 33 4e  xedBy = sqlite3N
202f0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61  ameFromToken(pPa
20300 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78 65  rse->db, pIndexe
20310 64 42 79 29 3b 0a 20 20 20 20 20 20 70 49 74 65  dBy);.      pIte
20320 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
20330 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  y = 1;.    }.  }
20340 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68  .}../*.** Add th
20350 65 20 6c 69 73 74 20 6f 66 20 66 75 6e 63 74 69  e list of functi
20360 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  on arguments to 
20370 74 68 65 20 53 72 63 4c 69 73 74 20 65 6e 74 72  the SrcList entr
20380 79 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65  y for a.** table
20390 2d 76 61 6c 75 65 64 2d 66 75 6e 63 74 69 6f 6e  -valued-function
203a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
203b0 33 53 72 63 4c 69 73 74 46 75 6e 63 41 72 67 73  3SrcListFuncArgs
203c0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
203d0 53 72 63 4c 69 73 74 20 2a 70 2c 20 45 78 70 72  SrcList *p, Expr
203e0 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
203f0 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 74 72  if( p ){.    str
20400 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
20410 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b   *pItem = &p->a[
20420 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20  p->nSrc-1];.    
20430 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66  assert( pItem->f
20440 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20  g.notIndexed==0 
20450 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
20460 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  Item->fg.isIndex
20470 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61  edBy==0 );.    a
20480 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
20490 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b  .isTabFunc==0 );
204a0 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 31 2e 70  .    pItem->u1.p
204b0 46 75 6e 63 41 72 67 20 3d 20 70 4c 69 73 74 3b  FuncArg = pList;
204c0 0a 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69  .    pItem->fg.i
204d0 73 54 61 62 46 75 6e 63 20 3d 20 31 3b 0a 20 20  sTabFunc = 1;.  
204e0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
204f0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
20500 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69  (pParse->db, pLi
20510 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  st);.  }.}../*.*
20520 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 6e 67 20  * When building 
20530 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  up a FROM clause
20540 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 2c 20   in the parser, 
20550 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
20560 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c  r.** is initiall
20570 79 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  y attached to th
20580 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 2e 20  e left operand. 
20590 20 42 75 74 20 74 68 65 20 63 6f 64 65 20 67 65   But the code ge
205a0 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63  nerator.** expec
205b0 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  ts the join oper
205c0 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20 74 68  ator to be on th
205d0 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e  e right operand.
205e0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
205f0 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69  * Shifts all joi
20600 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 72 6f 6d  n operators from
20610 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 66   left to right f
20620 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 46 52 4f  or an entire FRO
20630 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  M.** clause..**.
20640 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75 70 70  ** Example: Supp
20650 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 69 73 20  ose the join is 
20660 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
20670 20 20 20 20 20 20 20 20 20 20 20 41 20 6e 61 74             A nat
20680 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20  ural cross join 
20690 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72  B.**.** The oper
206a0 61 74 6f 72 20 69 73 20 22 6e 61 74 75 72 61 6c  ator is "natural
206b0 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54   cross join".  T
206c0 68 65 20 41 20 61 6e 64 20 42 20 6f 70 65 72 61  he A and B opera
206d0 6e 64 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a  nds are stored.*
206e0 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64  * in p->a[0] and
206f0 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63   p->a[1], respec
20700 74 69 76 65 6c 79 2e 20 20 54 68 65 20 70 61 72  tively.  The par
20710 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 74  ser initially st
20720 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72  ores the.** oper
20730 61 74 6f 72 20 77 69 74 68 20 41 2e 20 20 54 68  ator with A.  Th
20740 69 73 20 72 6f 75 74 69 6e 65 20 73 68 69 66 74  is routine shift
20750 73 20 74 68 61 74 20 6f 70 65 72 61 74 6f 72 20  s that operator 
20760 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f  over to B..*/.vo
20770 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
20780 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65 28 53  tShiftJoinType(S
20790 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 69 66  rcList *p){.  if
207a0 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ( p ){.    int i
207b0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e  ;.    for(i=p->n
207c0 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29  Src-1; i>0; i--)
207d0 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e  {.      p->a[i].
207e0 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d  fg.jointype = p-
207f0 3e 61 5b 69 2d 31 5d 2e 66 67 2e 6a 6f 69 6e 74  >a[i-1].fg.joint
20800 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ype;.    }.    p
20810 2d 3e 61 5b 30 5d 2e 66 67 2e 6a 6f 69 6e 74 79  ->a[0].fg.jointy
20820 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pe = 0;.  }.}../
20830 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
20840 42 45 20 63 6f 64 65 20 66 6f 72 20 61 20 42 45  BE code for a BE
20850 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  GIN statement..*
20860 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65  /.void sqlite3Be
20870 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  ginTransaction(P
20880 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
20890 74 20 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74  t type){.  sqlit
208a0 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  e3 *db;.  Vdbe *
208b0 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61  v;.  int i;..  a
208c0 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30  ssert( pParse!=0
208d0 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73   );.  db = pPars
208e0 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
208f0 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
20900 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
20910 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
20920 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45  TRANSACTION, "BE
20930 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20  GIN", 0, 0) ){. 
20940 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
20950 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
20960 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
20970 66 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a  f( !v ) return;.
20980 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b 5f 44    if( type!=TK_D
20990 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20 66  EFERRED ){.    f
209a0 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
209b0 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  b; i++){.      s
209c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
209d0 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  (v, OP_Transacti
209e0 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b  on, i, (type==TK
209f0 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a  _EXCLUSIVE)+1);.
20a00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20a10 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 29  eUsesBtree(v, i)
20a20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
20a30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
20a40 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
20a50 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
20a60 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 66  rate VDBE code f
20a70 6f 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 52  or a COMMIT or R
20a80 4f 4c 4c 42 41 43 4b 20 73 74 61 74 65 6d 65 6e  OLLBACK statemen
20a90 74 2e 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 52  t..** Code for R
20aa0 4f 4c 4c 42 41 43 4b 20 69 73 20 67 65 6e 65 72  OLLBACK is gener
20ab0 61 74 65 64 20 69 66 20 65 54 79 70 65 3d 3d 54  ated if eType==T
20ac0 4b 5f 52 4f 4c 4c 42 41 43 4b 2e 20 20 4f 74 68  K_ROLLBACK.  Oth
20ad0 65 72 77 69 73 65 0a 2a 2a 20 63 6f 64 65 20 69  erwise.** code i
20ae0 73 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  s generated for 
20af0 61 20 43 4f 4d 4d 49 54 2e 0a 2a 2f 0a 76 6f 69  a COMMIT..*/.voi
20b00 64 20 73 71 6c 69 74 65 33 45 6e 64 54 72 61 6e  d sqlite3EndTran
20b10 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
20b20 50 61 72 73 65 2c 20 69 6e 74 20 65 54 79 70 65  Parse, int eType
20b30 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  ){.  Vdbe *v;.  
20b40 69 6e 74 20 69 73 52 6f 6c 6c 62 61 63 6b 3b 0a  int isRollback;.
20b50 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
20b60 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
20b70 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20  ( pParse->db!=0 
20b80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  );.  assert( eTy
20b90 70 65 3d 3d 54 4b 5f 43 4f 4d 4d 49 54 20 7c 7c  pe==TK_COMMIT ||
20ba0 20 65 54 79 70 65 3d 3d 54 4b 5f 45 4e 44 20 7c   eType==TK_END |
20bb0 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c  | eType==TK_ROLL
20bc0 42 41 43 4b 20 29 3b 0a 20 20 69 73 52 6f 6c 6c  BACK );.  isRoll
20bd0 62 61 63 6b 20 3d 20 65 54 79 70 65 3d 3d 54 4b  back = eType==TK
20be0 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 69 66 28  _ROLLBACK;.  if(
20bf0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
20c00 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
20c10 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 0a 20  _TRANSACTION, . 
20c20 20 20 20 20 20 20 69 73 52 6f 6c 6c 62 61 63 6b        isRollback
20c30 20 3f 20 22 52 4f 4c 4c 42 41 43 4b 22 20 3a 20   ? "ROLLBACK" : 
20c40 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20  "COMMIT", 0, 0) 
20c50 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
20c60 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33   }.  v = sqlite3
20c70 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
20c80 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
20c90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20ca0 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  2(v, OP_AutoComm
20cb0 69 74 2c 20 31 2c 20 69 73 52 6f 6c 6c 62 61 63  it, 1, isRollbac
20cc0 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  k);.  }.}../*.**
20cd0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
20ce0 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
20cf0 70 61 72 73 65 72 20 77 68 65 6e 20 69 74 20 70  parser when it p
20d00 61 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e 64 20  arses a command 
20d10 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20 72 65  to create,.** re
20d20 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63  lease or rollbac
20d30 6b 20 61 6e 20 53 51 4c 20 73 61 76 65 70 6f 69  k an SQL savepoi
20d40 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nt. .*/.void sql
20d50 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28 50 61  ite3Savepoint(Pa
20d60 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
20d70 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d   op, Token *pNam
20d80 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  e){.  char *zNam
20d90 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
20da0 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
20db0 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  >db, pName);.  i
20dc0 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
20dd0 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
20de0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
20df0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
20e00 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
20e10 49 4f 4e 0a 20 20 20 20 73 74 61 74 69 63 20 63  ION.    static c
20e20 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73  onst char * cons
20e30 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45 47 49  t az[] = { "BEGI
20e40 4e 22 2c 20 22 52 45 4c 45 41 53 45 22 2c 20 22  N", "RELEASE", "
20e50 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20 20 20  ROLLBACK" };.   
20e60 20 61 73 73 65 72 74 28 20 21 53 41 56 45 50 4f   assert( !SAVEPO
20e70 49 4e 54 5f 42 45 47 49 4e 20 26 26 20 53 41 56  INT_BEGIN && SAV
20e80 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3d 3d  EPOINT_RELEASE==
20e90 31 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52  1 && SAVEPOINT_R
20ea0 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a 23 65  OLLBACK==2 );.#e
20eb0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 21 76 20  ndif.    if( !v 
20ec0 7c 7c 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  || sqlite3AuthCh
20ed0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
20ee0 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20 61 7a  TE_SAVEPOINT, az
20ef0 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29 20  [op], zName, 0) 
20f00 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
20f10 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
20f20 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b, zName);.     
20f30 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
20f40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20f50 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76 65 70  dOp4(v, OP_Savep
20f60 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  oint, op, 0, 0, 
20f70 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49  zName, P4_DYNAMI
20f80 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  C);.  }.}../*.**
20f90 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 54   Make sure the T
20fa0 45 4d 50 20 64 61 74 61 62 61 73 65 20 69 73 20  EMP database is 
20fb0 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62  open and availab
20fc0 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74  le for use.  Ret
20fd0 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  urn.** the numbe
20fe0 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65  r of errors.  Le
20ff0 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ave any error me
21000 73 73 61 67 65 73 20 69 6e 20 74 68 65 20 70 50  ssages in the pP
21010 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  arse structure..
21020 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 70  */.int sqlite3Op
21030 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50  enTempDatabase(P
21040 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
21050 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
21060 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
21070 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d   db->aDb[1].pBt=
21080 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65  =0 && !pParse->e
21090 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e  xplain ){.    in
210a0 74 20 72 63 3b 0a 20 20 20 20 42 74 72 65 65 20  t rc;.    Btree 
210b0 2a 70 42 74 3b 0a 20 20 20 20 73 74 61 74 69 63  *pBt;.    static
210c0 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
210d0 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 53 51   = .          SQ
210e0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
210f0 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ITE |.          
21100 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
21110 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  TE |.          S
21120 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
21130 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20  SIVE |.         
21140 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
21150 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20  ETEONCLOSE |.   
21160 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
21170 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20  EN_TEMP_DB;..   
21180 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
21190 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c  eeOpen(db->pVfs,
211a0 20 30 2c 20 64 62 2c 20 26 70 42 74 2c 20 30 2c   0, db, &pBt, 0,
211b0 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28   flags);.    if(
211c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
211d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
211e0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
211f0 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "unable to open 
21200 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  a temporary data
21210 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22  base ".        "
21220 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67  file for storing
21230 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
21240 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  s");.      pPars
21250 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  e->rc = rc;.    
21260 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
21270 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b 31 5d  }.    db->aDb[1]
21280 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  .pBt = pBt;.    
21290 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
212a0 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  1].pSchema );.  
212b0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d    if( SQLITE_NOM
212c0 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65  EM==sqlite3Btree
212d0 53 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 2c  SetPageSize(pBt,
212e0 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a   db->nextPagesiz
212f0 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a 20 20 20  e, -1, 0) ){.   
21300 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
21310 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 72 65  lt(db);.      re
21320 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
21330 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
21340 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68  ./*.** Record th
21350 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20  e fact that the 
21360 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 77 69  schema cookie wi
21370 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 76 65  ll need to be ve
21380 72 69 66 69 65 64 0a 2a 2a 20 66 6f 72 20 64 61  rified.** for da
21390 74 61 62 61 73 65 20 69 44 62 2e 20 20 54 68 65  tabase iDb.  The
213a0 20 63 6f 64 65 20 74 6f 20 61 63 74 75 61 6c 6c   code to actuall
213b0 79 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68  y verify the sch
213c0 65 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a 20 77 69  ema cookie.** wi
213d0 6c 6c 20 6f 63 63 75 72 20 61 74 20 74 68 65 20  ll occur at the 
213e0 65 6e 64 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c  end of the top-l
213f0 65 76 65 6c 20 56 44 42 45 20 61 6e 64 20 77 69  evel VDBE and wi
21400 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a  ll be generated.
21410 2a 2a 20 6c 61 74 65 72 2c 20 62 79 20 73 71 6c  ** later, by sql
21420 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67  ite3FinishCoding
21430 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
21440 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
21450 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  ema(Parse *pPars
21460 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50  e, int iDb){.  P
21470 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
21480 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
21490 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
214a0 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
214b0 30 20 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d  0 && iDb<pParse-
214c0 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  >db->nDb );.  as
214d0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
214e0 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d  ->aDb[iDb].pBt!=
214f0 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20  0 || iDb==1 );. 
21500 20 61 73 73 65 72 74 28 20 69 44 62 3c 53 51 4c   assert( iDb<SQL
21510 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
21520 2b 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  +2 );.  assert( 
21530 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
21540 65 78 48 65 6c 64 28 70 50 61 72 73 65 2d 3e 64  exHeld(pParse->d
21550 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
21560 69 66 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70  if( DbMaskTest(p
21570 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65  Toplevel->cookie
21580 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20 29 7b  Mask, iDb)==0 ){
21590 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70  .    DbMaskSet(p
215a0 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65  Toplevel->cookie
215b0 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 20 20  Mask, iDb);.    
215c0 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
215d0 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20   && iDb==1 ){.  
215e0 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
215f0 65 6d 70 44 61 74 61 62 61 73 65 28 70 54 6f 70  empDatabase(pTop
21600 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  level);.    }.  
21610 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72  }.}../*.** If ar
21620 67 75 6d 65 6e 74 20 7a 44 62 20 69 73 20 4e 55  gument zDb is NU
21630 4c 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20 73 71  LL, then call sq
21640 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
21650 63 68 65 6d 61 28 29 20 66 6f 72 20 65 61 63 68  chema() for each
21660 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61   .** attached da
21670 74 61 62 61 73 65 2e 20 4f 74 68 65 72 77 69 73  tabase. Otherwis
21680 65 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66 6f 72  e, invoke it for
21690 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
216a0 6d 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a 2f  med zDb only..*/
216b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
216c0 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65  eVerifyNamedSche
216d0 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
216e0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
216f0 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  b){.  sqlite3 *d
21700 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
21710 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
21720 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
21730 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62  ++){.    Db *pDb
21740 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
21750 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
21760 20 26 26 20 28 21 7a 44 62 20 7c 7c 20 30 3d 3d   && (!zDb || 0==
21770 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
21780 44 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d  Db, pDb->zDbSNam
21790 65 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  e)) ){.      sql
217a0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
217b0 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b  hema(pParse, i);
217c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
217d0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
217e0 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70  E code that prep
217f0 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61  ares for doing a
21800 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  n operation that
21810 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65  .** might change
21820 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
21830 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
21840 65 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74  e starts a new t
21850 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65  ransaction if we
21860 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79   are not already
21870 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61   within.** a tra
21880 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65  nsaction.  If we
21890 20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74   are already wit
218a0 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hin a transactio
218b0 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70  n, then a checkp
218c0 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69  oint.** is set i
218d0 66 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65  f the setStateme
218e0 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nt parameter is 
218f0 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f  true.  A checkpo
21900 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  int should.** be
21910 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69   set for operati
21920 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66  ons that might f
21930 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f  ail (due to a co
21940 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f  nstraint) part o
21950 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72  f.** the way thr
21960 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77  ough and which w
21970 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f  ill need to undo
21980 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74   some writes wit
21990 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a  hout having to.*
219a0 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77  * rollback the w
219b0 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  hole transaction
219c0 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e  .  For operation
219d0 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73  s where all cons
219e0 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62  traints.** can b
219f0 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65  e checked before
21a00 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65   any changes are
21a10 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
21a20 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76  abase, it is nev
21a30 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20  er.** necessary 
21a40 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20  to undo a write 
21a50 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69  and the checkpoi
21a60 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  nt should not be
21a70 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   set..*/.void sq
21a80 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
21a90 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a  peration(Parse *
21aa0 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53  pParse, int setS
21ab0 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44  tatement, int iD
21ac0 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f  b){.  Parse *pTo
21ad0 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
21ae0 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
21af0 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
21b00 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
21b10 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
21b20 20 44 62 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c   DbMaskSet(pTopl
21b30 65 76 65 6c 2d 3e 77 72 69 74 65 4d 61 73 6b 2c  evel->writeMask,
21b40 20 69 44 62 29 3b 0a 20 20 70 54 6f 70 6c 65 76   iDb);.  pToplev
21b50 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65  el->isMultiWrite
21b60 20 7c 3d 20 73 65 74 53 74 61 74 65 6d 65 6e 74   |= setStatement
21b70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63  ;.}../*.** Indic
21b80 61 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61  ate that the sta
21b90 74 65 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79  tement currently
21ba0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
21bb0 69 6f 6e 20 6d 69 67 68 74 20 77 72 69 74 65 0a  ion might write.
21bc0 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ** more than one
21bd0 20 65 6e 74 72 79 20 28 65 78 61 6d 70 6c 65 3a   entry (example:
21be0 20 64 65 6c 65 74 69 6e 67 20 6f 6e 65 20 72 6f   deleting one ro
21bf0 77 20 74 68 65 6e 20 69 6e 73 65 72 74 69 6e 67  w then inserting
21c00 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e 73   another,.** ins
21c10 65 72 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20  erting multiple 
21c20 72 6f 77 73 20 69 6e 20 61 20 74 61 62 6c 65 2c  rows in a table,
21c30 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 61 20   or inserting a 
21c40 72 6f 77 20 61 6e 64 20 69 6e 64 65 78 20 65 6e  row and index en
21c50 74 72 69 65 73 2e 29 0a 2a 2a 20 49 66 20 61 6e  tries.).** If an
21c60 20 61 62 6f 72 74 20 6f 63 63 75 72 73 20 61 66   abort occurs af
21c70 74 65 72 20 73 6f 6d 65 20 6f 66 20 74 68 65 73  ter some of thes
21c80 65 20 77 72 69 74 65 73 20 68 61 76 65 20 63 6f  e writes have co
21c90 6d 70 6c 65 74 65 64 2c 20 74 68 65 6e 20 69 74  mpleted, then it
21ca0 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63 65   will.** be nece
21cb0 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 74 68  ssary to undo th
21cc0 65 20 63 6f 6d 70 6c 65 74 65 64 20 77 72 69 74  e completed writ
21cd0 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
21ce0 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28 50 61  te3MultiWrite(Pa
21cf0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
21d00 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
21d10 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
21d20 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
21d30 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73  .  pToplevel->is
21d40 4d 75 6c 74 69 57 72 69 74 65 20 3d 20 31 3b 0a  MultiWrite = 1;.
21d50 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 63 6f  }../* .** The co
21d60 64 65 20 67 65 6e 65 72 61 74 6f 72 20 63 61 6c  de generator cal
21d70 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
21d80 69 66 20 69 73 20 64 69 73 63 6f 76 65 72 73 20  if is discovers 
21d90 74 68 61 74 20 69 74 20 69 73 0a 2a 2a 20 70 6f  that it is.** po
21da0 73 73 69 62 6c 65 20 74 6f 20 61 62 6f 72 74 20  ssible to abort 
21db0 61 20 73 74 61 74 65 6d 65 6e 74 20 70 72 69 6f  a statement prio
21dc0 72 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e  r to completion.
21dd0 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 0a 2a    In order to .*
21de0 2a 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 61  * perform this a
21df0 62 6f 72 74 20 77 69 74 68 6f 75 74 20 63 6f 72  bort without cor
21e00 72 75 70 74 69 6e 67 20 74 68 65 20 64 61 74 61  rupting the data
21e10 62 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f  base, we need to
21e20 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 74 68   make.** sure th
21e30 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  at the statement
21e40 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79   is protected by
21e50 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
21e60 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
21e70 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20  Technically, we 
21e80 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 65 74  only need to set
21e90 20 74 68 65 20 6d 61 79 41 62 6f 72 74 20 66 6c   the mayAbort fl
21ea0 61 67 20 69 66 20 74 68 65 0a 2a 2a 20 69 73 4d  ag if the.** isM
21eb0 75 6c 74 69 57 72 69 74 65 20 66 6c 61 67 20 77  ultiWrite flag w
21ec0 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65  as previously se
21ed0 74 2e 20 20 54 68 65 72 65 20 69 73 20 61 20 74  t.  There is a t
21ee0 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a  ime dependency.*
21ef0 2a 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  * such that the 
21f00 61 62 6f 72 74 20 6d 75 73 74 20 6f 63 63 75 72  abort must occur
21f10 20 61 66 74 65 72 20 74 68 65 20 6d 75 6c 74 69   after the multi
21f20 77 72 69 74 65 2e 20 20 54 68 69 73 20 6d 61 6b  write.  This mak
21f30 65 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 61 74 65  es.** some state
21f40 6d 65 6e 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20  ments involving 
21f50 74 68 65 20 52 45 50 4c 41 43 45 20 63 6f 6e 66  the REPLACE conf
21f60 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
21f70 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f 20  algorithm.** go 
21f80 61 20 6c 69 74 74 6c 65 20 66 61 73 74 65 72 2e  a little faster.
21f90 20 20 42 75 74 20 74 61 6b 69 6e 67 20 61 64 76    But taking adv
21fa0 61 6e 74 61 67 65 20 6f 66 20 74 68 69 73 20 74  antage of this t
21fb0 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a  ime dependency.*
21fc0 2a 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72 65 20  * makes it more 
21fd0 64 69 66 66 69 63 75 6c 74 20 74 6f 20 70 72 6f  difficult to pro
21fe0 76 65 20 74 68 61 74 20 74 68 65 20 63 6f 64 65  ve that the code
21ff0 20 69 73 20 63 6f 72 72 65 63 74 20 28 69 6e 20   is correct (in 
22000 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 2c 20  .** particular, 
22010 69 74 20 70 72 65 76 65 6e 74 73 20 75 73 20 66  it prevents us f
22020 72 6f 6d 20 77 72 69 74 69 6e 67 20 61 6e 20 65  rom writing an e
22030 66 66 65 63 74 69 76 65 0a 2a 2a 20 69 6d 70 6c  ffective.** impl
22040 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71  ementation of sq
22050 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62  lite3AssertMayAb
22060 6f 72 74 28 29 29 20 61 6e 64 20 73 6f 20 77 65  ort()) and so we
22070 20 68 61 76 65 20 63 68 6f 73 65 6e 0a 2a 2a 20   have chosen.** 
22080 74 6f 20 74 61 6b 65 20 74 68 65 20 73 61 66 65  to take the safe
22090 20 72 6f 75 74 65 20 61 6e 64 20 73 6b 69 70 20   route and skip 
220a0 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
220b0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
220c0 33 4d 61 79 41 62 6f 72 74 28 50 61 72 73 65 20  3MayAbort(Parse 
220d0 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73  *pParse){.  Pars
220e0 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
220f0 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
22100 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70  vel(pParse);.  p
22110 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41 62 6f  Toplevel->mayAbo
22120 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rt = 1;.}../*.**
22130 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74   Code an OP_Halt
22140 20 74 68 61 74 20 63 61 75 73 65 73 20 74 68 65   that causes the
22150 20 76 64 62 65 20 74 6f 20 72 65 74 75 72 6e 20   vdbe to return 
22160 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  an SQLITE_CONSTR
22170 41 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e 20 54  AINT.** error. T
22180 68 65 20 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d  he onError param
22190 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20  eter determines 
221a0 77 68 69 63 68 20 28 69 66 20 61 6e 79 29 20 6f  which (if any) o
221b0 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  f the statement.
221c0 2a 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72 65 6e  ** and/or curren
221d0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
221e0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f   rolled back..*/
221f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 48 61 6c  .void sqlite3Hal
22200 74 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50  tConstraint(.  P
22210 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
22220 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
22230 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  ext */.  int err
22240 43 6f 64 65 2c 20 20 20 20 20 20 2f 2a 20 65 78  Code,      /* ex
22250 74 65 6e 64 65 64 20 65 72 72 6f 72 20 63 6f 64  tended error cod
22260 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  e */.  int onErr
22270 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73  or,      /* Cons
22280 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20  traint type */. 
22290 20 63 68 61 72 20 2a 70 34 2c 20 20 20 20 20 20   char *p4,      
222a0 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73     /* Error mess
222b0 61 67 65 20 2a 2f 0a 20 20 69 38 20 70 34 74 79  age */.  i8 p4ty
222c0 70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 34  pe,        /* P4
222d0 5f 53 54 41 54 49 43 20 6f 72 20 50 34 5f 54 52  _STATIC or P4_TR
222e0 41 4e 53 49 45 4e 54 20 2a 2f 0a 20 20 75 38 20  ANSIENT */.  u8 
222f0 70 35 45 72 72 6d 73 67 20 20 20 20 20 20 20 2f  p5Errmsg       /
22300 2a 20 50 35 5f 45 72 72 4d 73 67 20 74 79 70 65  * P5_ErrMsg type
22310 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
22320 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
22330 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  e(pParse);.  ass
22340 65 72 74 28 20 28 65 72 72 43 6f 64 65 26 30 78  ert( (errCode&0x
22350 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  ff)==SQLITE_CONS
22360 54 52 41 49 4e 54 20 29 3b 0a 20 20 69 66 28 20  TRAINT );.  if( 
22370 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72  onError==OE_Abor
22380 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
22390 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
223a0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
223b0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
223c0 48 61 6c 74 2c 20 65 72 72 43 6f 64 65 2c 20 6f  Halt, errCode, o
223d0 6e 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70  nError, 0, p4, p
223e0 34 74 79 70 65 29 3b 0a 20 20 73 71 6c 69 74 65  4type);.  sqlite
223f0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
22400 20 70 35 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f   p5Errmsg);.}../
22410 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
22420 48 61 6c 74 20 64 75 65 20 74 6f 20 55 4e 49 51  Halt due to UNIQ
22430 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45  UE or PRIMARY KE
22440 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f  Y constraint vio
22450 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  lation..*/.void 
22460 73 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e  sqlite3UniqueCon
22470 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65  straint(.  Parse
22480 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
22490 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
224a0 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
224b0 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  ,      /* Constr
224c0 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20 49  aint type */.  I
224d0 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20  ndex *pIdx      
224e0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68   /* The index th
224f0 61 74 20 74 72 69 67 67 65 72 73 20 74 68 65 20  at triggers the 
22500 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b  constraint */.){
22510 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20  .  char *zErr;. 
22520 20 69 6e 74 20 6a 3b 0a 20 20 53 74 72 41 63 63   int j;.  StrAcc
22530 75 6d 20 65 72 72 4d 73 67 3b 0a 20 20 54 61 62  um errMsg;.  Tab
22540 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 64 78 2d  le *pTab = pIdx-
22550 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 73 71 6c 69  >pTable;..  sqli
22560 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
22570 26 65 72 72 4d 73 67 2c 20 70 50 61 72 73 65 2d  &errMsg, pParse-
22580 3e 64 62 2c 20 30 2c 20 30 2c 20 32 30 30 29 3b  >db, 0, 0, 200);
22590 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 61 43 6f  .  if( pIdx->aCo
225a0 6c 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c  lExpr ){.    sql
225b0 69 74 65 33 58 50 72 69 6e 74 66 28 26 65 72 72  ite3XPrintf(&err
225c0 4d 73 67 2c 20 22 69 6e 64 65 78 20 27 25 71 27  Msg, "index '%q'
225d0 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b  ", pIdx->zName);
225e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
225f0 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e  r(j=0; j<pIdx->n
22600 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  KeyCol; j++){.  
22610 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a      char *zCol;.
22620 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
22630 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e  dx->aiColumn[j]>
22640 3d 30 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c  =0 );.      zCol
22650 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49   = pTab->aCol[pI
22660 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d  dx->aiColumn[j]]
22670 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 66  .zName;.      if
22680 28 20 6a 20 29 20 73 71 6c 69 74 65 33 53 74 72  ( j ) sqlite3Str
22690 41 63 63 75 6d 41 70 70 65 6e 64 28 26 65 72 72  AccumAppend(&err
226a0 4d 73 67 2c 20 22 2c 20 22 2c 20 32 29 3b 0a 20  Msg, ", ", 2);. 
226b0 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41       sqlite3StrA
226c0 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 65  ccumAppendAll(&e
226d0 72 72 4d 73 67 2c 20 70 54 61 62 2d 3e 7a 4e 61  rrMsg, pTab->zNa
226e0 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
226f0 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
22700 28 26 65 72 72 4d 73 67 2c 20 22 2e 22 2c 20 31  (&errMsg, ".", 1
22710 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22720 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c  StrAccumAppendAl
22730 6c 28 26 65 72 72 4d 73 67 2c 20 7a 43 6f 6c 29  l(&errMsg, zCol)
22740 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 45  ;.    }.  }.  zE
22750 72 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72 41  rr = sqlite3StrA
22760 63 63 75 6d 46 69 6e 69 73 68 28 26 65 72 72 4d  ccumFinish(&errM
22770 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 48 61  sg);.  sqlite3Ha
22780 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  ltConstraint(pPa
22790 72 73 65 2c 20 0a 20 20 20 20 49 73 50 72 69 6d  rse, .    IsPrim
227a0 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78  aryKeyIndex(pIdx
227b0 29 20 3f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ) ? SQLITE_CONST
227c0 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59  RAINT_PRIMARYKEY
227d0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
227e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20                : 
227f0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
22800 54 5f 55 4e 49 51 55 45 2c 0a 20 20 20 20 6f 6e  T_UNIQUE,.    on
22810 45 72 72 6f 72 2c 20 7a 45 72 72 2c 20 50 34 5f  Error, zErr, P4_
22820 44 59 4e 41 4d 49 43 2c 20 50 35 5f 43 6f 6e 73  DYNAMIC, P5_Cons
22830 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d  traintUnique);.}
22840 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  .../*.** Code an
22850 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20   OP_Halt due to 
22860 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64  non-unique rowid
22870 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22880 33 52 6f 77 69 64 43 6f 6e 73 74 72 61 69 6e 74  3RowidConstraint
22890 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
228a0 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
228b0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
228c0 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
228d0 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f  /* Conflict reso
228e0 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
228f0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
22900 62 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74  b       /* The t
22910 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 6e 6f  able with the no
22920 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 20 2a  n-unique rowid *
22930 2f 20 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4d  / .){.  char *zM
22940 73 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  sg;.  int rc;.  
22950 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e  if( pTab->iPKey>
22960 3d 30 20 29 7b 0a 20 20 20 20 7a 4d 73 67 20 3d  =0 ){.    zMsg =
22970 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
22980 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e  pParse->db, "%s.
22990 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
229a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
229b0 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
229c0 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b  ->aCol[pTab->iPK
229d0 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ey].zName);.    
229e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rc = SQLITE_CONS
229f0 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45  TRAINT_PRIMARYKE
22a00 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
22a10 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
22a20 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62  rintf(pParse->db
22a30 2c 20 22 25 73 2e 72 6f 77 69 64 22 2c 20 70 54  , "%s.rowid", pT
22a40 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
22a50 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rc = SQLITE_CONS
22a60 54 52 41 49 4e 54 5f 52 4f 57 49 44 3b 0a 20 20  TRAINT_ROWID;.  
22a70 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43  }.  sqlite3HaltC
22a80 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65  onstraint(pParse
22a90 2c 20 72 63 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a  , rc, onError, z
22aa0 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c  Msg, P4_DYNAMIC,
22ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22ac0 20 20 20 20 20 20 20 20 20 50 35 5f 43 6f 6e 73           P5_Cons
22ad0 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d  traintUnique);.}
22ae0 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
22af0 20 73 65 65 20 69 66 20 70 49 6e 64 65 78 20 75   see if pIndex u
22b00 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  ses the collatin
22b10 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
22b20 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
22b30 65 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64  e if it does and
22b40 20 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65   false if it doe
22b50 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65  s not..*/.#ifnde
22b60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
22b70 49 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74  INDEX.static int
22b80 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28   collationMatch(
22b90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
22ba0 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  l, Index *pIndex
22bb0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
22bc0 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29  sert( zColl!=0 )
22bd0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
22be0 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  Index->nColumn; 
22bf0 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
22c00 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78  char *z = pIndex
22c10 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20  ->azColl[i];.   
22c20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 7c 7c   assert( z!=0 ||
22c30 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
22c40 6e 5b 69 5d 3c 30 20 29 3b 0a 20 20 20 20 69 66  n[i]<0 );.    if
22c50 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  ( pIndex->aiColu
22c60 6d 6e 5b 69 5d 3e 3d 30 20 26 26 20 30 3d 3d 73  mn[i]>=0 && 0==s
22c70 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
22c80 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20   zColl) ){.     
22c90 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
22ca0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
22cb0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
22cc0 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   Recompute all i
22cd0 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 20 74  ndices of pTab t
22ce0 68 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c  hat use the coll
22cf0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
22d00 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c  Coll..** If pCol
22d10 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70  l==0 then recomp
22d20 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
22d30 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e  of pTab..*/.#ifn
22d40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22d50 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76  REINDEX.static v
22d60 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65  oid reindexTable
22d70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
22d80 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61  Table *pTab, cha
22d90 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b  r const *zColl){
22da0 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
22db0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
22dc0 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63  * An index assoc
22dd0 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20  iated with pTab 
22de0 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78  */..  for(pIndex
22df0 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
22e00 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49  Index; pIndex=pI
22e10 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  ndex->pNext){.  
22e20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c    if( zColl==0 |
22e30 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68  | collationMatch
22e40 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20  (zColl, pIndex) 
22e50 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62  ){.      int iDb
22e60 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
22e70 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
22e80 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
22e90 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  a);.      sqlite
22ea0 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
22eb0 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
22ec0 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
22ed0 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
22ee0 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d  Parse, pIndex, -
22ef0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  1);.    }.  }.}.
22f00 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
22f10 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
22f20 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ces of all table
22f30 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73  s in all databas
22f40 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20  es where the.** 
22f50 69 6e 64 69 63 65 73 20 75 73 65 20 74 68 65 20  indices use the 
22f60 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
22f70 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43  ce pColl.  If pC
22f80 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f  oll==0 then reco
22f90 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64  mpute.** all ind
22fa0 69 63 65 73 20 65 76 65 72 79 77 68 65 72 65 2e  ices everywhere.
22fb0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
22fc0 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
22fd0 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e  static void rein
22fe0 64 65 78 44 61 74 61 62 61 73 65 73 28 50 61 72  dexDatabases(Par
22ff0 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72  se *pParse, char
23000 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a   const *zColl){.
23010 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20    Db *pDb;      
23020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23030 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   A single databa
23040 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  se */.  int iDb;
23050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23060 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
23070 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ase index number
23080 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
23090 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
230a0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
230b0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
230c0 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20    HashElem *k;  
230d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
230e0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
230f0 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20  r tables in pDb 
23100 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
23110 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23120 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74   /* A table in t
23130 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a  he database */..
23140 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
23150 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
23160 74 65 78 65 73 28 64 62 29 20 29 3b 20 20 2f 2a  texes(db) );  /*
23170 20 4e 65 65 64 65 64 20 66 6f 72 20 73 63 68 65   Needed for sche
23180 6d 61 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 66  ma access */.  f
23190 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62  or(iDb=0, pDb=db
231a0 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e  ->aDb; iDb<db->n
231b0 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b  Db; iDb++, pDb++
231c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
231d0 44 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72  Db!=0 );.    for
231e0 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (k=sqliteHashFir
231f0 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61  st(&pDb->pSchema
23200 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20  ->tblHash);  k; 
23210 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  k=sqliteHashNext
23220 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62  (k)){.      pTab
23230 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74   = (Table*)sqlit
23240 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20  eHashData(k);.  
23250 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65      reindexTable
23260 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 7a  (pParse, pTab, z
23270 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Coll);.    }.  }
23280 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
23290 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
232a0 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58 20 63  or the REINDEX c
232b0 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  ommand..**.**   
232c0 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 20 20       REINDEX    
232d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232e0 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20          -- 1.** 
232f0 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
23300 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20  <collation>     
23310 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a            -- 2.*
23320 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
23330 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c    ?<database>.?<
23340 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33  tablename>  -- 3
23350 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
23360 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e  EX  ?<database>.
23370 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d  ?<indexname>  --
23380 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20   4.**.** Form 1 
23390 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63  causes all indic
233a0 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68  es in all attach
233b0 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f 20  ed databases to 
233c0 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46  be rebuilt..** F
233d0 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61  orm 2 rebuilds a
233e0 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c  ll indices in al
233f0 6c 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  l databases that
23400 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a   use the named.*
23410 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  * collating func
23420 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61  tion.  Forms 3 a
23430 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74 68 65  nd 4 rebuild the
23440 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20   named index or 
23450 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61  all.** indices a
23460 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
23470 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a  he named table..
23480 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
23490 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76  E_OMIT_REINDEX.v
234a0 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64  oid sqlite3Reind
234b0 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
234c0 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c  , Token *pName1,
234d0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b   Token *pName2){
234e0 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
234f0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
23500 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
23510 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64  ence to be reind
23520 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  exed, or NULL */
23530 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  .  char *z;     
23540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23550 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c  * Name of a tabl
23560 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e or index */.  
23570 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b  const char *zDb;
23580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
23590 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
235a0 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ase */.  Table *
235b0 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
235c0 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
235d0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
235e0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
235f0 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
23600 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73   /* An index ass
23610 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61  ociated with pTa
23620 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  b */.  int iDb; 
23630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23640 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
23650 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  se index number 
23660 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
23670 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
23680 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
23690 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
236a0 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65   Token *pObjName
236b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
236c0 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
236d0 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65  e or index to be
236e0 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20   reindexed */.. 
236f0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74   /* Read the dat
23700 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66  abase schema. If
23710 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
23720 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
23730 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e   message.  ** an
23740 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65  d code in pParse
23750 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
23760 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54  . */.  if( SQLIT
23770 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
23780 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
23790 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
237a0 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 31   }..  if( pName1
237b0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e 64  ==0 ){.    reind
237c0 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72  exDatabases(pPar
237d0 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  se, 0);.    retu
237e0 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  rn;.  }else if( 
237f0 4e 45 56 45 52 28 70 4e 61 6d 65 32 3d 3d 30 29  NEVER(pName2==0)
23800 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30   || pName2->z==0
23810 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43   ){.    char *zC
23820 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28  oll;.    assert(
23830 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20   pName1->z );.  
23840 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    zColl = sqlite
23850 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
23860 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65  Parse->db, pName
23870 31 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 43 6f  1);.    if( !zCo
23880 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ll ) return;.   
23890 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
238a0 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
238b0 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20  ENC(db), zColl, 
238c0 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  0);.    if( pCol
238d0 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 69 6e 64  l ){.      reind
238e0 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72  exDatabases(pPar
238f0 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  se, zColl);.    
23900 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
23910 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  db, zColl);.    
23920 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
23930 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
23940 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  e(db, zColl);.  
23950 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  }.  iDb = sqlite
23960 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
23970 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
23980 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b  me2, &pObjName);
23990 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72  .  if( iDb<0 ) r
239a0 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c  eturn;.  z = sql
239b0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
239c0 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b  n(db, pObjName);
239d0 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
239e0 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62  turn;.  zDb = db
239f0 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
23a00 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  ame;.  pTab = sq
23a10 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
23a20 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66  b, z, zDb);.  if
23a30 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65  ( pTab ){.    re
23a40 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73  indexTable(pPars
23a50 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20  e, pTab, 0);.   
23a60 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
23a70 62 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74 75 72  b, z);.    retur
23a80 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20  n;.  }.  pIndex 
23a90 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
23aa0 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a  ex(db, z, zDb);.
23ab0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
23ac0 64 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 49  db, z);.  if( pI
23ad0 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  ndex ){.    sqli
23ae0 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
23af0 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
23b00 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
23b10 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
23b20 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d  Parse, pIndex, -
23b30 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  1);.    return;.
23b40 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72    }.  sqlite3Err
23b50 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
23b60 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66  nable to identif
23b70 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20  y the object to 
23b80 62 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a  be reindexed");.
23b90 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
23ba0 52 65 74 75 72 6e 20 61 20 4b 65 79 49 6e 66 6f  Return a KeyInfo
23bb0 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
23bc0 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
23bd0 6f 72 20 74 68 65 20 67 69 76 65 6e 20 49 6e 64  or the given Ind
23be0 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ex..**.** The ca
23bf0 6c 6c 65 72 20 73 68 6f 75 6c 64 20 69 6e 76 6f  ller should invo
23c00 6b 65 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  ke sqlite3KeyInf
23c10 6f 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20  oUnref() on the 
23c20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 0a  returned object.
23c30 2a 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20 66  ** when it has f
23c40 69 6e 69 73 68 65 64 20 75 73 69 6e 67 20 69 74  inished using it
23c50 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71  ..*/.KeyInfo *sq
23c60 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e  lite3KeyInfoOfIn
23c70 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
23c80 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  e, Index *pIdx){
23c90 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
23ca0 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f  nCol = pIdx->nCo
23cb0 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e 4b 65 79  lumn;.  int nKey
23cc0 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   = pIdx->nKeyCol
23cd0 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  ;.  KeyInfo *pKe
23ce0 79 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  y;.  if( pParse-
23cf0 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30  >nErr ) return 0
23d00 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 75 6e  ;.  if( pIdx->un
23d10 69 71 4e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20  iqNotNull ){.   
23d20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b   pKey = sqlite3K
23d30 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72  eyInfoAlloc(pPar
23d40 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 2c 20 6e 43  se->db, nKey, nC
23d50 6f 6c 2d 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73  ol-nKey);.  }els
23d60 65 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71  e{.    pKey = sq
23d70 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
23d80 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 43  c(pParse->db, nC
23d90 6f 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  ol, 0);.  }.  if
23da0 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73  ( pKey ){.    as
23db0 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
23dc0 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
23dd0 70 4b 65 79 29 20 29 3b 0a 20 20 20 20 66 6f 72  pKey) );.    for
23de0 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
23df0 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  +){.      const 
23e00 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49  char *zColl = pI
23e10 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20  dx->azColl[i];. 
23e20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c       pKey->aColl
23e30 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3d 3d 73 71 6c  [i] = zColl==sql
23e40 69 74 65 33 53 74 72 42 49 4e 41 52 59 20 3f 20  ite3StrBINARY ? 
23e50 30 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  0 :.            
23e60 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
23e70 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
23e80 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b  (pParse, zColl);
23e90 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f  .      pKey->aSo
23ea0 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 64  rtOrder[i] = pId
23eb0 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  x->aSortOrder[i]
23ec0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
23ed0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
23ee0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79        sqlite3Key
23ef0 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 29 3b  InfoUnref(pKey);
23f00 0a 20 20 20 20 20 20 70 4b 65 79 20 3d 20 30 3b  .      pKey = 0;
23f10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
23f20 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a 0a 23 69 66  urn pKey;.}..#if
23f30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
23f40 5f 43 54 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  _CTE./* .** This
23f50 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
23f60 6b 65 64 20 6f 6e 63 65 20 70 65 72 20 43 54 45  ked once per CTE
23f70 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
23f80 68 69 6c 65 20 70 61 72 73 69 6e 67 20 61 20 0a  hile parsing a .
23f90 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20  ** WITH clause. 
23fa0 0a 2a 2f 0a 57 69 74 68 20 2a 73 71 6c 69 74 65  .*/.With *sqlite
23fb0 33 57 69 74 68 41 64 64 28 0a 20 20 50 61 72 73  3WithAdd(.  Pars
23fc0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
23fd0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
23fe0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 69 74 68  ontext */.  With
23ff0 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20 20   *pWith,        
24000 20 20 20 20 2f 2a 20 45 78 69 73 74 69 6e 67 20      /* Existing 
24010 57 49 54 48 20 63 6c 61 75 73 65 2c 20 6f 72 20  WITH clause, or 
24020 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
24030 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *pName,         
24040 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
24050 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 20 2a 2f   common-table */
24060 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41 72  .  ExprList *pAr
24070 67 6c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4f 70  glist,     /* Op
24080 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 6e 61  tional column na
24090 6d 65 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20  me list for the 
240a0 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63  table */.  Selec
240b0 74 20 2a 70 51 75 65 72 79 20 20 20 20 20 20 20  t *pQuery       
240c0 20 20 20 2f 2a 20 51 75 65 72 79 20 75 73 65 64     /* Query used
240d0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   to initialize t
240e0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  he table */.){. 
240f0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
24100 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 57 69 74  Parse->db;.  Wit
24110 68 20 2a 70 4e 65 77 3b 0a 20 20 63 68 61 72 20  h *pNew;.  char 
24120 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 43 68  *zName;..  /* Ch
24130 65 63 6b 20 74 68 61 74 20 74 68 65 20 43 54 45  eck that the CTE
24140 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 20   name is unique 
24150 77 69 74 68 69 6e 20 74 68 69 73 20 57 49 54 48  within this WITH
24160 20 63 6c 61 75 73 65 2e 20 49 66 0a 20 20 2a 2a   clause. If.  **
24170 20 6e 6f 74 2c 20 73 74 6f 72 65 20 61 6e 20 65   not, store an e
24180 72 72 6f 72 20 69 6e 20 74 68 65 20 50 61 72 73  rror in the Pars
24190 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  e structure. */.
241a0 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
241b0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
241c0 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65  Parse->db, pName
241d0 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 26  );.  if( zName &
241e0 26 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69  & pWith ){.    i
241f0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
24200 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65  0; i<pWith->nCte
24210 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
24220 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
24230 28 7a 4e 61 6d 65 2c 20 70 57 69 74 68 2d 3e 61  (zName, pWith->a
24240 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
24250 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24260 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
24270 20 22 64 75 70 6c 69 63 61 74 65 20 57 49 54 48   "duplicate WITH
24280 20 74 61 62 6c 65 20 6e 61 6d 65 3a 20 25 73 22   table name: %s"
24290 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
242a0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
242b0 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20  f( pWith ){.    
242c0 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  int nByte = size
242d0 6f 66 28 2a 70 57 69 74 68 29 20 2b 20 28 73 69  of(*pWith) + (si
242e0 7a 65 6f 66 28 70 57 69 74 68 2d 3e 61 5b 31 5d  zeof(pWith->a[1]
242f0 29 20 2a 20 70 57 69 74 68 2d 3e 6e 43 74 65 29  ) * pWith->nCte)
24300 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
24310 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
24320 2c 20 70 57 69 74 68 2c 20 6e 42 79 74 65 29 3b  , pWith, nByte);
24330 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
24340 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
24350 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
24360 65 6f 66 28 2a 70 57 69 74 68 29 29 3b 0a 20 20  eof(*pWith));.  
24370 7d 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65  }.  assert( (pNe
24380 77 21 3d 30 20 26 26 20 7a 4e 61 6d 65 21 3d 30  w!=0 && zName!=0
24390 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ) || db->mallocF
243a0 61 69 6c 65 64 20 29 3b 0a 0a 20 20 69 66 28 20  ailed );..  if( 
243b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
243c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
243d0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
243e0 2c 20 70 41 72 67 6c 69 73 74 29 3b 0a 20 20 20  , pArglist);.   
243f0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
24400 6c 65 74 65 28 64 62 2c 20 70 51 75 65 72 79 29  lete(db, pQuery)
24410 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
24420 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
24430 20 20 20 20 70 4e 65 77 20 3d 20 70 57 69 74 68      pNew = pWith
24440 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
24450 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74  New->a[pNew->nCt
24460 65 5d 2e 70 53 65 6c 65 63 74 20 3d 20 70 51 75  e].pSelect = pQu
24470 65 72 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ery;.    pNew->a
24480 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 43 6f  [pNew->nCte].pCo
24490 6c 73 20 3d 20 70 41 72 67 6c 69 73 74 3b 0a 20  ls = pArglist;. 
244a0 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
244b0 3e 6e 43 74 65 5d 2e 7a 4e 61 6d 65 20 3d 20 7a  >nCte].zName = z
244c0 4e 61 6d 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Name;.    pNew->
244d0 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 43  a[pNew->nCte].zC
244e0 74 65 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70  teErr = 0;.    p
244f0 4e 65 77 2d 3e 6e 43 74 65 2b 2b 3b 0a 20 20 7d  New->nCte++;.  }
24500 0a 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ..  return pNew;
24510 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
24520 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
24530 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74 20 70  he With object p
24540 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
24550 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
24560 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 74  .void sqlite3Wit
24570 68 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  hDelete(sqlite3 
24580 2a 64 62 2c 20 57 69 74 68 20 2a 70 57 69 74 68  *db, With *pWith
24590 29 7b 0a 20 20 69 66 28 20 70 57 69 74 68 20 29  ){.  if( pWith )
245a0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
245b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69 74   for(i=0; i<pWit
245c0 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20  h->nCte; i++){. 
245d0 20 20 20 20 20 73 74 72 75 63 74 20 43 74 65 20       struct Cte 
245e0 2a 70 43 74 65 20 3d 20 26 70 57 69 74 68 2d 3e  *pCte = &pWith->
245f0 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  a[i];.      sqli
24600 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
24610 65 28 64 62 2c 20 70 43 74 65 2d 3e 70 43 6f 6c  e(db, pCte->pCol
24620 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  s);.      sqlite
24630 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
24640 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 29  , pCte->pSelect)
24650 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
24660 62 46 72 65 65 28 64 62 2c 20 70 43 74 65 2d 3e  bFree(db, pCte->
24670 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
24680 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
24690 64 62 2c 20 70 57 69 74 68 29 3b 0a 20 20 7d 0a  db, pWith);.  }.
246a0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
246b0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
246c0 5f 43 54 45 29 20 2a 2f 0a                       _CTE) */.