/ Hex Artifact Content
Login

Artifact 3b611e7da095f2c4ff470c7368355be9c9c8e15fc234cb00eeea7c233108b2f2:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
03a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
03b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
03c0: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
03d0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20  */.  int iTab;  
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03f0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
0400: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0410: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0420: 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20 20 20 20  sWriteLock;     
0430: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 77     /* True for w
0440: 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c 73  rite lock.  Fals
0450: 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f 63  e for a read loc
0460: 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  k */.  const cha
0470: 72 20 2a 7a 4c 6f 63 6b 4e 61 6d 65 3b 20 2f 2a  r *zLockName; /*
0480: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
0490: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
04a0: 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
04b0: 74 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20  that we want to 
04c0: 6c 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20  lock a table at 
04d0: 72 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a  run-time.  .**.*
04e0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
04f0: 65 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f  e locked has roo
0500: 74 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20  t page iTab and 
0510: 69 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61  is found in data
0520: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72  base iDb..** A r
0530: 65 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c  ead or a write l
0540: 6f 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e  ock can be taken
0550: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73   depending on is
0560: 57 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  Writelock..**.**
0570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
0580: 73 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66  st records the f
0590: 61 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63  act that the loc
05a0: 6b 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54  k is desired.  T
05b0: 68 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61  he.** code to ma
05c0: 6b 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75  ke the lock occu
05d0: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  r is generated b
05e0: 79 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74  y a later call t
05f0: 6f 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f  o.** codeTableLo
0600: 63 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75  cks() which occu
0610: 72 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  rs during sqlite
0620: 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
0630: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0640: 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72  TableLock(.  Par
0650: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0660: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0670: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
0680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
0690: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
06a0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
06b0: 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  he table to lock
06c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
06d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
06e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
06f0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0700: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0710: 73 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f  sWriteLock,    /
0720: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69  * True for a wri
0730: 74 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e  te lock */.  con
0740: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
0750: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0760: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0770: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
0780: 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
0790: 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
07a0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  l(pParse);.  int
07b0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   i;.  int nBytes
07c0: 3b 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70  ;.  TableLock *p
07d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
07e0: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62  =0 );..  if( iDb
07f0: 3d 3d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==1 ) return;.  
0800: 69 66 28 20 21 73 71 6c 69 74 65 33 42 74 72 65  if( !sqlite3Btre
0810: 65 53 68 61 72 61 62 6c 65 28 70 50 61 72 73 65  eSharable(pParse
0820: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ->db->aDb[iDb].p
0830: 42 74 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Bt) ) return;.  
0840: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 70 6c  for(i=0; i<pTopl
0850: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0860: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
0870: 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62  &pToplevel->aTab
0880: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0890: 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20 26  f( p->iDb==iDb &
08a0: 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62 20  & p->iTab==iTab 
08b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57 72  ){.      p->isWr
08c0: 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69 73  iteLock = (p->is
08d0: 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73 57  WriteLock || isW
08e0: 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  riteLock);.     
08f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
0900: 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20 73   }..  nBytes = s
0910: 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b 29  izeof(TableLock)
0920: 20 2a 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e   * (pToplevel->n
0930: 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20  TableLock+1);.  
0940: 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c  pToplevel->aTabl
0950: 65 4c 6f 63 6b 20 3d 0a 20 20 20 20 20 20 73 71  eLock =.      sq
0960: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
0970: 46 72 65 65 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  Free(pToplevel->
0980: 64 62 2c 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61  db, pToplevel->a
0990: 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74 65  TableLock, nByte
09a0: 73 29 3b 0a 20 20 69 66 28 20 70 54 6f 70 6c 65  s);.  if( pTople
09b0: 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20  vel->aTableLock 
09c0: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 54 6f 70  ){.    p = &pTop
09d0: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
09e0: 6b 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61  k[pToplevel->nTa
09f0: 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20  bleLock++];.    
0a00: 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  p->iDb = iDb;.  
0a10: 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62    p->iTab = iTab
0a20: 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65  ;.    p->isWrite
0a30: 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f  Lock = isWriteLo
0a40: 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4c 6f 63 6b  ck;.    p->zLock
0a50: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
0a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 70 6c  }else{.    pTopl
0a70: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0a80: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
0a90: 33 4f 6f 6d 46 61 75 6c 74 28 70 54 6f 70 6c 65  3OomFault(pTople
0aa0: 76 65 6c 2d 3e 64 62 29 3b 0a 20 20 7d 0a 7d 0a  vel->db);.  }.}.
0ab0: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
0ac0: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74  P_TableLock inst
0ad0: 72 75 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68  ruction for each
0ae0: 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79   table locked by
0af0: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
0b00: 74 20 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79  t (configured by
0b10: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
0b20: 33 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a  3TableLock())..*
0b30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
0b40: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72  deTableLocks(Par
0b50: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
0b60: 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56  nt i;.  Vdbe *pV
0b70: 64 62 65 3b 20 0a 0a 20 20 70 56 64 62 65 20 3d  dbe; ..  pVdbe =
0b80: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
0b90: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
0ba0: 74 28 20 70 56 64 62 65 21 3d 30 20 29 3b 20 2f  t( pVdbe!=0 ); /
0bb0: 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  * sqlite3GetVdbe
0bc0: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 3a 20 56 44   cannot fail: VD
0bd0: 42 45 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  BE already alloc
0be0: 61 74 65 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  ated */..  for(i
0bf0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54  =0; i<pParse->nT
0c00: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0c10: 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70      TableLock *p
0c20: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62   = &pParse->aTab
0c30: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0c40: 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a  nt p1 = p->iDb;.
0c50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
0c60: 64 64 4f 70 34 28 70 56 64 62 65 2c 20 4f 50 5f  ddOp4(pVdbe, OP_
0c70: 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70  TableLock, p1, p
0c80: 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73 57 72 69  ->iTab, p->isWri
0c90: 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  teLock,.        
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
0cb0: 3e 7a 4c 6f 63 6b 4e 61 6d 65 2c 20 50 34 5f 53  >zLockName, P4_S
0cc0: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  TATIC);.  }.}.#e
0cd0: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f  lse.  #define co
0ce0: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a  deTableLocks(x).
0cf0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0d00: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0d10: 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20 6f   given yDbMask o
0d20: 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20 2d  bject is empty -
0d30: 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 20   if it contains 
0d40: 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20 54  no.** 1 bits.  T
0d50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0d60: 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61 73  sed by the DbMas
0d70: 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20 44  kAllZero() and D
0d80: 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a 2a  bMaskNotZero().*
0d90: 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53 51  * macros when SQ
0da0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0db0: 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  D is greater tha
0dc0: 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  n 30..*/.#if SQL
0dd0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
0de0: 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33 44  >30.int sqlite3D
0df0: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44 62  bMaskAllZero(yDb
0e00: 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20 69  Mask m){.  int i
0e10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
0e20: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b 20  izeof(yDbMask); 
0e30: 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29 20  i++) if( m[i] ) 
0e40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
0e50: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
0e60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0e70: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
0e80: 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  er a single SQL 
0e90: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ea0: 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64  en.** parsed and
0eb0: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20   a VDBE program 
0ec0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20  to execute that 
0ed0: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ee0: 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e 20  en.** prepared. 
0ef0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
0f00: 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e 67  ts the finishing
0f10: 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65 0a   touches on the.
0f20: 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  ** VDBE program 
0f30: 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 70  and resets the p
0f40: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20  Parse structure 
0f50: 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20  for the next.** 
0f60: 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  parse..**.** Not
0f70: 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72 72  e that if an err
0f80: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20  or occurred, it 
0f90: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
0fa0: 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42  e that.** no VDB
0fb0: 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72  E code was gener
0fc0: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
0fd0: 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
0fe0: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
0ff0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1000: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
1010: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
1020: 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a 20  Toplevel==0 );. 
1030: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1040: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1050: 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b  nested ) return;
1060: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1070: 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
1080: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 69  e->nErr ){.    i
1090: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
10a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 72 73  QLITE_OK ) pPars
10b0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
10c0: 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
10d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
10e0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
10f0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
1100: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
1110: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
1120: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
1130: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1140: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
1150: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
1160: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20  isMultiWrite .  
1170: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
1180: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
1190: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  t(v, pParse->may
11a0: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76  Abort));.  if( v
11b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11c0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
11d0: 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53 51 4c 49  Halt);..#if SQLI
11e0: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
11f0: 43 41 54 49 4f 4e 0a 20 20 20 20 69 66 28 20 70  CATION.    if( p
1200: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
1210: 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  k>0 && db->init.
1220: 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  busy==0 ){.     
1230: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
1240: 49 6e 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20  Init(db);.      
1250: 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74  if( db->auth.aut
1260: 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55 73 65  hLevel<UAUTH_Use
1270: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
1280: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1290: 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20 61  rse, "user not a
12a0: 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b 0a  uthenticated");.
12b0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
12c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 48  rc = SQLITE_AUTH
12d0: 5f 55 53 45 52 3b 0a 20 20 20 20 20 20 20 20 72  _USER;.        r
12e0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
12f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1300: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
1310: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
1320: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
1330: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
1340: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
1350: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
1360: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
1370: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
1380: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
1390: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
13a0: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
13b0: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
13c0: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
13d0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
13e0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
13f0: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
1400: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
1410: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
1420: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
1430: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1440: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1450: 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 26 26  iled==0 .     &&
1460: 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72 6f 28   (DbMaskNonZero(
1470: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1480: 73 6b 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70  sk) || pParse->p
1490: 43 6f 6e 73 74 45 78 70 72 29 0a 20 20 20 20 29  ConstExpr).    )
14a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 2c  {.      int iDb,
14b0: 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   i;.      assert
14c0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
14d0: 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f 64 65  Op(v, 0)->opcode
14e0: 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20 20 20  ==OP_Init );.   
14f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1500: 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a 20 20  mpHere(v, 0);.  
1510: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69      for(iDb=0; i
1520: 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
1530: 2b 29 7b 0a 20 20 20 20 20 20 20 20 53 63 68 65  +){.        Sche
1540: 6d 61 20 2a 70 53 63 68 65 6d 61 3b 0a 20 20 20  ma *pSchema;.   
1550: 20 20 20 20 20 69 66 28 20 44 62 4d 61 73 6b 54       if( DbMaskT
1560: 65 73 74 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  est(pParse->cook
1570: 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
1580: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
15a0: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
15b0: 3b 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d  ;.        pSchem
15c0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
15d0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  .pSchema;.      
15e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f0: 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20 20 20  Op4Int(v,.      
1600: 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63 74 69      OP_Transacti
1610: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
1620: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
1630: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 44   */.          iD
1640: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20 20   /* P1 */.      
1670: 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74 28 70      DbMaskTest(p
1680: 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
1690: 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a 2f 0a  ,iDb), /* P2 */.
16a0: 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d            pSchem
16b0: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
16c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
16d0: 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  P3 */.          
16e0: 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
16f0: 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
1700: 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20     /* P4 */.    
1710: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1720: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1730: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
1740: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b  eChangeP5(v, 1);
1750: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
1760: 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20 20 20  ment((v,.       
1770: 20 20 20 20 20 20 20 22 75 73 65 73 53 74 6d 74         "usesStmt
1780: 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70 50 61  Journal=%d", pPa
1790: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20 26 26  rse->mayAbort &&
17a0: 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69   pParse->isMulti
17b0: 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20 20 7d  Write));.      }
17c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
17e0: 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  E.      for(i=0;
17f0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61 62   i<pParse->nVtab
1800: 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Lock; i++){.    
1810: 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20 3d      char *vtab =
1820: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1830: 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 50  GetVTable(db, pP
1840: 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63 6b  arse->apVtabLock
1850: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [i]);.        sq
1860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1870: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c  v, OP_VBegin, 0,
1880: 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f   0, 0, vtab, P4_
1890: 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a 20  VTAB);.      }. 
18a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 74       pParse->nVt
18b0: 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e 64  abLock = 0;.#end
18c0: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 63  if..      /* Onc
18d0: 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69 65  e all the cookie
18e0: 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72 69  s have been veri
18f0: 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61 63  fied and transac
1900: 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a 20  tions opened, . 
1910: 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 74       ** obtain t
1920: 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
1930: 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69 73  e-locks. This is
1940: 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
1950: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 68  the .      ** sh
1960: 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75  ared-cache featu
1970: 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20  re is enabled.. 
1980: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
1990: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50 61  deTableLocks(pPa
19a0: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  rse);..      /* 
19b0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20 41  Initialize any A
19c0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61 74  UTOINCREMENT dat
19d0: 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65 71  a structures req
19e0: 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  uired..      */.
19f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74        sqlite3Aut
1a00: 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e 28  oincrementBegin(
1a10: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1a20: 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e 74  /* Code constant
1a30: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1a40: 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65 64  t where factored
1a50: 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c 6f   out of inner lo
1a60: 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ops */.      if(
1a70: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1a80: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45  xpr ){.        E
1a90: 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20 70  xprList *pEL = p
1aa0: 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
1ab0: 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  r;.        pPars
1ac0: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
1ad0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
1ae0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e 45  r(i=0; i<pEL->nE
1af0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1b00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b10: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
1b20: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  ->a[i].pExpr, pE
1b30: 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73 74  L->a[i].u.iConst
1b40: 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20 20  ExprReg);.      
1b50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
1b60: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a     /* Finally, j
1b70: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1b80: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1b90: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65   executable code
1ba0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1bb0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31 29  e3VdbeGoto(v, 1)
1bc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
1bd0: 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20  /* Get the VDBE 
1be0: 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f  program ready fo
1bf0: 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f  r execution.  */
1c00: 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72  .  if( v && pPar
1c10: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21  se->nErr==0 && !
1c20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c30: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e   ){.    /* A min
1c40: 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73  imum of one curs
1c50: 6f 72 20 69 73 20 72 65 71 75 69 72 65 64 20 69  or is required i
1c60: 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
1c70: 69 73 20 75 73 65 64 0a 20 20 20 20 2a 20 20 53  is used.    *  S
1c80: 65 65 20 74 69 63 6b 65 74 20 5b 61 36 39 36 33  ee ticket [a6963
1c90: 37 39 63 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20  79c1f08866] */. 
1ca0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70     if( pParse->p
1cb0: 41 69 6e 63 21 3d 30 20 26 26 20 70 50 61 72 73  Ainc!=0 && pPars
1cc0: 65 2d 3e 6e 54 61 62 3d 3d 30 20 29 20 70 50 61  e->nTab==0 ) pPa
1cd0: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20  rse->nTab = 1;. 
1ce0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61     sqlite3VdbeMa
1cf0: 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61 72 73  keReady(v, pPars
1d00: 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  e);.    pParse->
1d10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1d20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1d30: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
1d40: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 7d 0a  TE_ERROR;.  }.}.
1d50: 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70  ./*.** Run the p
1d60: 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67  arser and code g
1d70: 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72 73 69  enerator recursi
1d80: 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  vely in order to
1d90: 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64   generate.** cod
1da0: 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74  e for the SQL st
1db0: 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e  atement given on
1dc0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1dd0: 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74  e pParse context
1de0: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
1df0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1e00: 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61 72 73  .  When the pars
1e10: 65 72 20 69 73 20 72 75 6e 20 72 65 63 75 72 73  er is run recurs
1e20: 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61  ively.** this wa
1e30: 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f  y, the final OP_
1e40: 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65  Halt is not appe
1e50: 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69  nded and other i
1e60: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a  nitialization.**
1e70: 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f   and finalizatio
1e80: 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74  n steps are omit
1e90: 74 65 64 20 62 65 63 61 75 73 65 20 74 68 6f 73  ted because thos
1ea0: 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62  e are handling b
1eb0: 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f  y the.** outermo
1ec0: 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a  st parser..**.**
1ed0: 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20   Not everything 
1ee0: 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68  is nestable.  Th
1ef0: 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20 64  is facility is d
1f00: 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69  esigned to permi
1f10: 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44  t.** INSERT, UPD
1f20: 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20  ATE, and DELETE 
1f30: 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e  operations again
1f40: 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  st SQLITE_MASTER
1f50: 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69  .  Use.** care i
1f60: 66 20 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20  f you decide to 
1f70: 74 72 79 20 74 6f 20 75 73 65 20 74 68 69 73 20  try to use this 
1f80: 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65  routine for some
1f90: 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e   other purposes.
1fa0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1fb0: 4e 65 73 74 65 64 50 61 72 73 65 28 50 61 72 73  NestedParse(Pars
1fc0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
1fd0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
1fe0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
1ff0: 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  ap;.  char *zSql
2000: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
2010: 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  g = 0;.  sqlite3
2020: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
2030: 62 3b 0a 20 20 63 68 61 72 20 73 61 76 65 42 75  b;.  char saveBu
2040: 66 5b 50 41 52 53 45 5f 54 41 49 4c 5f 53 5a 5d  f[PARSE_TAIL_SZ]
2050: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
2060: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  >nErr ) return;.
2070: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
2080: 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b 20 20  ->nested<10 );  
2090: 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c  /* Nesting shoul
20a0: 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d  d only be of lim
20b0: 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a 20 20  ited depth */.  
20c0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
20d0: 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  rmat);.  zSql = 
20e0: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
20f0: 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  db, zFormat, ap)
2100: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
2110: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b    if( zSql==0 ){
2120: 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20 20 2f  .    return;   /
2130: 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74 20  * A malloc must 
2140: 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  have failed */. 
2150: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73   }.  pParse->nes
2160: 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28  ted++;.  memcpy(
2170: 73 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f 54  saveBuf, PARSE_T
2180: 41 49 4c 28 70 50 61 72 73 65 29 2c 20 50 41 52  AIL(pParse), PAR
2190: 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 6d  SE_TAIL_SZ);.  m
21a0: 65 6d 73 65 74 28 50 41 52 53 45 5f 54 41 49 4c  emset(PARSE_TAIL
21b0: 28 70 50 61 72 73 65 29 2c 20 30 2c 20 50 41 52  (pParse), 0, PAR
21c0: 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 73  SE_TAIL_SZ);.  s
21d0: 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28  qlite3RunParser(
21e0: 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a  pParse, zSql, &z
21f0: 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
2200: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72  e3DbFree(db, zEr
2210: 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  rMsg);.  sqlite3
2220: 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29  DbFree(db, zSql)
2230: 3b 0a 20 20 6d 65 6d 63 70 79 28 50 41 52 53 45  ;.  memcpy(PARSE
2240: 5f 54 41 49 4c 28 70 50 61 72 73 65 29 2c 20 73  _TAIL(pParse), s
2250: 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f 54 41  aveBuf, PARSE_TA
2260: 49 4c 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73 65  IL_SZ);.  pParse
2270: 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 23  ->nested--;.}..#
2280: 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  if SQLITE_USER_A
2290: 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a  UTHENTICATION./*
22a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
22b0: 69 66 20 7a 54 61 62 6c 65 20 69 73 20 74 68 65  if zTable is the
22c0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73   name of the sys
22d0: 74 65 6d 20 74 61 62 6c 65 20 74 68 61 74 20 73  tem table that s
22e0: 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6c 69 73  tores the.** lis
22f0: 74 20 6f 66 20 75 73 65 72 73 20 61 6e 64 20 74  t of users and t
2300: 68 65 69 72 20 61 63 63 65 73 73 20 63 72 65 64  heir access cred
2310: 65 6e 74 69 61 6c 73 2e 0a 2a 2f 0a 69 6e 74 20  entials..*/.int 
2320: 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54  sqlite3UserAuthT
2330: 61 62 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20  able(const char 
2340: 2a 7a 54 61 62 6c 65 29 7b 0a 20 20 72 65 74 75  *zTable){.  retu
2350: 72 6e 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  rn sqlite3_stric
2360: 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69  mp(zTable, "sqli
2370: 74 65 5f 75 73 65 72 22 29 3d 3d 30 3b 0a 7d 0a  te_user")==0;.}.
2380: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  #endif../*.** Lo
2390: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
23a0: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
23b0: 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61  t describes a pa
23c0: 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
23d0: 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e  e.** table given
23e0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
23f0: 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74  t table and (opt
2400: 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d  ionally) the nam
2410: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
2420: 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
2430: 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
2440: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
2450: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
2460: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
2470: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
2480: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
2490: 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a  e table and the.
24a0: 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  ** first matchin
24b0: 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75 72  g table is retur
24c0: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
24d0: 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  ng for duplicate
24e0: 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20   table.** names 
24f0: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
2500: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 20 54  earch order is T
2510: 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20  EMP first, then 
2520: 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a  MAIN, then any.*
2530: 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  * auxiliary data
2540: 62 61 73 65 73 20 61 64 64 65 64 20 75 73 69 6e  bases added usin
2550: 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d  g the ATTACH com
2560: 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  mand..**.** See 
2570: 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61  also sqlite3Loca
2580: 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61  teTable()..*/.Ta
2590: 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  ble *sqlite3Find
25a0: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
25b0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
25c0: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
25d0: 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20 20   *zDatabase){.  
25e0: 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20  Table *p = 0;.  
25f0: 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  int i;..  /* All
2600: 20 6d 75 74 65 78 65 73 20 61 72 65 20 72 65 71   mutexes are req
2610: 75 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d 61  uired for schema
2620: 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20 73   access.  Make s
2630: 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65 6d  ure we hold them
2640: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a  . */.  assert( z
2650: 44 61 74 61 62 61 73 65 21 3d 30 20 7c 7c 20 73  Database!=0 || s
2660: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
2670: 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29  AllMutexes(db) )
2680: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  ;.#if SQLITE_USE
2690: 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
26a0: 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20 61  .  /* Only the a
26b0: 64 6d 69 6e 20 75 73 65 72 20 69 73 20 61 6c 6c  dmin user is all
26c0: 6f 77 65 64 20 74 6f 20 6b 6e 6f 77 20 74 68 61  owed to know tha
26d0: 74 20 74 68 65 20 73 71 6c 69 74 65 5f 75 73 65  t the sqlite_use
26e0: 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 65 78 69  r table.  ** exi
26f0: 73 74 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  sts */.  if( db-
2700: 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c 3c  >auth.authLevel<
2710: 55 41 55 54 48 5f 41 64 6d 69 6e 20 26 26 20 73  UAUTH_Admin && s
2720: 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54 61  qlite3UserAuthTa
2730: 62 6c 65 28 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  ble(zName)!=0 ){
2740: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2750: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68 69 6c   }.#endif.  whil
2760: 65 28 31 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  e(1){.    for(i=
2770: 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64  OMIT_TEMPDB; i<d
2780: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
2790: 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32      int j = (i<2
27a0: 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f  ) ? i^1 : i;   /
27b0: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
27c0: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
27d0: 20 20 20 69 66 28 20 7a 44 61 74 61 62 61 73 65     if( zDatabase
27e0: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74  ==0 || sqlite3St
27f0: 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65 2c  rICmp(zDatabase,
2800: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62 53   db->aDb[j].zDbS
2810: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
2820: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
2830: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
2840: 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a  ld(db, j, 0) );.
2850: 20 20 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69          p = sqli
2860: 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
2870: 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d  >aDb[j].pSchema-
2880: 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 29  >tblHash, zName)
2890: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 20  ;.        if( p 
28a0: 29 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20  ) return p;.    
28b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a    }.    }.    /*
28c0: 20 4e 6f 74 20 66 6f 75 6e 64 2e 20 20 49 66 20   Not found.  If 
28d0: 74 68 65 20 6e 61 6d 65 20 77 65 20 77 65 72 65  the name we were
28e0: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 77 61 73   looking for was
28f0: 20 74 65 6d 70 2e 73 71 6c 69 74 65 5f 6d 61 73   temp.sqlite_mas
2900: 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ter.    ** then 
2910: 63 68 61 6e 67 65 20 74 68 65 20 6e 61 6d 65 20  change the name 
2920: 74 6f 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  to sqlite_temp_m
2930: 61 73 74 65 72 20 61 6e 64 20 74 72 79 20 61 67  aster and try ag
2940: 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ain. */.    if( 
2950: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
2960: 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d  Name, MASTER_NAM
2970: 45 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  E)!=0 ) break;. 
2980: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
2990: 74 72 69 63 6d 70 28 7a 44 61 74 61 62 61 73 65  tricmp(zDatabase
29a0: 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 44 62  , db->aDb[1].zDb
29b0: 53 4e 61 6d 65 29 21 3d 30 20 29 20 62 72 65 61  SName)!=0 ) brea
29c0: 6b 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54  k;.    zName = T
29d0: 45 4d 50 5f 4d 41 53 54 45 52 5f 4e 41 4d 45 3b  EMP_MASTER_NAME;
29e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
29f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  .}../*.** Locate
2a00: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   the in-memory s
2a10: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
2a20: 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63  scribes a partic
2a30: 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a  ular database.**
2a40: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65   table given the
2a50: 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61   name of that ta
2a60: 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61  ble and (optiona
2a70: 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66  lly) the name of
2a80: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
2a90: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
2aa0: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e  table.  Return N
2ab0: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
2ac0: 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e  .  Also leave an
2ad0: 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67  .** error messag
2ae0: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
2af0: 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rMsg..**.** The 
2b00: 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
2b10: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2b20: 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 54  and sqlite3FindT
2b30: 61 62 6c 65 28 29 20 69 73 20 74 68 61 74 20 74  able() is that t
2b40: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6c  his.** routine l
2b50: 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d  eaves an error m
2b60: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
2b70: 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65 0a  ->zErrMsg where.
2b80: 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  ** sqlite3FindTa
2b90: 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a  ble() does not..
2ba0: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
2bb0: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 0a 20 20  3LocateTable(.  
2bc0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2bd0: 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65 78         /* contex
2be0: 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 72 65  t in which to re
2bf0: 70 6f 72 74 20 65 72 72 6f 72 73 20 2a 2f 0a 20  port errors */. 
2c00: 20 75 33 32 20 66 6c 61 67 73 2c 20 20 20 20 20   u32 flags,     
2c10: 20 20 20 20 20 20 20 20 2f 2a 20 4c 4f 43 41 54          /* LOCAT
2c20: 45 5f 56 49 45 57 20 6f 72 20 4c 4f 43 41 54 45  E_VIEW or LOCATE
2c30: 5f 4e 4f 45 52 52 20 2a 2f 0a 20 20 63 6f 6e 73  _NOERR */.  cons
2c40: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
2c50: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2c60: 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 6c  e table we are l
2c70: 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20  ooking for */.  
2c80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 61  const char *zDba
2c90: 73 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  se     /* Name o
2ca0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
2cb0: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
2cc0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
2cd0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2ce0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
2cf0: 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
2d00: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
2d10: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
2d20: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
2d30: 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
2d40: 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
2d50: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
2d60: 20 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d 3e 6d   */.  if( (db->m
2d70: 44 62 46 6c 61 67 73 20 26 20 44 42 46 4c 41 47  DbFlags & DBFLAG
2d80: 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 29 3d  _SchemaKnownOk)=
2d90: 3d 30 20 0a 20 20 20 26 26 20 53 51 4c 49 54 45  =0 .   && SQLITE
2da0: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
2db0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 0a 20  Schema(pParse). 
2dc0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
2dd0: 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c  ;.  }..  p = sql
2de0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
2df0: 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29  , zName, zDbase)
2e00: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
2e10: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2e20: 7a 4d 73 67 20 3d 20 66 6c 61 67 73 20 26 20 4c  zMsg = flags & L
2e30: 4f 43 41 54 45 5f 56 49 45 57 20 3f 20 22 6e 6f  OCATE_VIEW ? "no
2e40: 20 73 75 63 68 20 76 69 65 77 22 20 3a 20 22 6e   such view" : "n
2e50: 6f 20 73 75 63 68 20 74 61 62 6c 65 22 3b 0a 23  o such table";.#
2e60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2e70: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
2e80: 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20      /* If zName 
2e90: 69 73 20 74 68 65 20 6e 6f 74 20 74 68 65 20 6e  is the not the n
2ea0: 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 69  ame of a table i
2eb0: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 63 72 65  n the schema cre
2ec0: 61 74 65 64 20 75 73 69 6e 67 0a 20 20 20 20 2a  ated using.    *
2ed0: 2a 20 43 52 45 41 54 45 2c 20 74 68 65 6e 20 63  * CREATE, then c
2ee0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
2ef0: 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  t is the name of
2f00: 20 61 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c   an virtual tabl
2f10: 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 61  e that.    ** ca
2f20: 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79 6d 6f 75  n be an eponymou
2f30: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  s virtual table.
2f40: 20 2a 2f 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a   */.    Module *
2f50: 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 2a 29  pMod = (Module*)
2f60: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
2f70: 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20 7a 4e  &db->aModule, zN
2f80: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4d  ame);.    if( pM
2f90: 6f 64 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33  od==0 && sqlite3
2fa0: 5f 73 74 72 6e 69 63 6d 70 28 7a 4e 61 6d 65 2c  _strnicmp(zName,
2fb0: 20 22 70 72 61 67 6d 61 5f 22 2c 20 37 29 3d 3d   "pragma_", 7)==
2fc0: 30 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f 64 20  0 ){.      pMod 
2fd0: 3d 20 73 71 6c 69 74 65 33 50 72 61 67 6d 61 56  = sqlite3PragmaV
2fe0: 74 61 62 52 65 67 69 73 74 65 72 28 64 62 2c 20  tabRegister(db, 
2ff0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
3000: 20 20 69 66 28 20 70 4d 6f 64 20 26 26 20 73 71    if( pMod && sq
3010: 6c 69 74 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f  lite3VtabEponymo
3020: 75 73 54 61 62 6c 65 49 6e 69 74 28 70 50 61 72  usTableInit(pPar
3030: 73 65 2c 20 70 4d 6f 64 29 20 29 7b 0a 20 20 20  se, pMod) ){.   
3040: 20 20 20 72 65 74 75 72 6e 20 70 4d 6f 64 2d 3e     return pMod->
3050: 70 45 70 6f 54 61 62 3b 0a 20 20 20 20 7d 0a 23  pEpoTab;.    }.#
3060: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 66  endif.    if( (f
3070: 6c 61 67 73 20 26 20 4c 4f 43 41 54 45 5f 4e 4f  lags & LOCATE_NO
3080: 45 52 52 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ERR)==0 ){.     
3090: 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b 0a 20   if( zDbase ){. 
30a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
30b0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
30c0: 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a 4d 73 67  %s: %s.%s", zMsg
30d0: 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29  , zDbase, zName)
30e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
30f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
3100: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3110: 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c 20 7a  %s: %s", zMsg, z
3120: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
3130: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65       pParse->che
3140: 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
3150: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
3160: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  n p;.}../*.** Lo
3170: 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69  cate the table i
3180: 64 65 6e 74 69 66 69 65 64 20 62 79 20 2a 70 2e  dentified by *p.
3190: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
31a0: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
31b0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
31c0: 6c 65 28 29 2e 20 54 68 65 20 64 69 66 66 65 72  le(). The differ
31d0: 65 6e 63 65 20 62 65 74 77 65 65 6e 0a 2a 2a 20  ence between.** 
31e0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
31f0: 6c 65 28 29 20 61 6e 64 20 74 68 69 73 20 66 75  le() and this fu
3200: 6e 63 74 69 6f 6e 20 69 73 20 74 68 61 74 20 74  nction is that t
3210: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 73  his function res
3220: 74 72 69 63 74 73 0a 2a 2a 20 74 68 65 20 73 65  tricts.** the se
3230: 61 72 63 68 20 74 6f 20 73 63 68 65 6d 61 20 28  arch to schema (
3240: 70 2d 3e 70 53 63 68 65 6d 61 29 20 69 66 20 69  p->pSchema) if i
3250: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20 70  t is not NULL. p
3260: 2d 3e 70 53 63 68 65 6d 61 20 6d 61 79 20 62 65  ->pSchema may be
3270: 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20  .** non-NULL if 
3280: 69 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  it is part of a 
3290: 76 69 65 77 20 6f 72 20 74 72 69 67 67 65 72 20  view or trigger 
32a0: 70 72 6f 67 72 61 6d 20 64 65 66 69 6e 69 74 69  program definiti
32b0: 6f 6e 2e 20 53 65 65 0a 2a 2a 20 73 71 6c 69 74  on. See.** sqlit
32c0: 65 33 46 69 78 53 72 63 4c 69 73 74 28 29 20 66  e3FixSrcList() f
32d0: 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 54  or details..*/.T
32e0: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63  able *sqlite3Loc
32f0: 61 74 65 54 61 62 6c 65 49 74 65 6d 28 0a 20 20  ateTableItem(.  
3300: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
3310: 20 20 75 33 32 20 66 6c 61 67 73 2c 0a 20 20 73    u32 flags,.  s
3320: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
3330: 65 6d 20 2a 70 0a 29 7b 0a 20 20 63 6f 6e 73 74  em *p.){.  const
3340: 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 61 73   char *zDb;.  as
3350: 73 65 72 74 28 20 70 2d 3e 70 53 63 68 65 6d 61  sert( p->pSchema
3360: 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 61 74 61 62  ==0 || p->zDatab
3370: 61 73 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ase==0 );.  if( 
3380: 70 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  p->pSchema ){.  
3390: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
33a0: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
33b0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
33c0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7a 44  pSchema);.    zD
33d0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  b = pParse->db->
33e0: 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
33f0: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
3400: 7a 44 62 20 3d 20 70 2d 3e 7a 44 61 74 61 62 61  zDb = p->zDataba
3410: 73 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  se;.  }.  return
3420: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
3430: 62 6c 65 28 70 50 61 72 73 65 2c 20 66 6c 61 67  ble(pParse, flag
3440: 73 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  s, p->zName, zDb
3450: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  );.}../*.** Loca
3460: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
3470: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
3480: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
3490: 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
34a0: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
34b0: 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a  of that index.**
34c0: 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66   and the name of
34d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
34e0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
34f0: 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e  index..** Return
3500: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
3510: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61  nd..**.** If zDa
3520: 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c  tabase is 0, all
3530: 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73   databases are s
3540: 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a  earched for the.
3550: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  ** table and the
3560: 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20   first matching 
3570: 69 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e 65  index is returne
3580: 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67  d.  (No checking
3590: 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74  .** for duplicat
35a0: 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69 73  e index names is
35b0: 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61   done.)  The sea
35c0: 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20  rch order is.** 
35d0: 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e  TEMP first, then
35e0: 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20   MAIN, then any 
35f0: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
3600: 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69  ses added.** usi
3610: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
3620: 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20  mmand..*/.Index 
3630: 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65  *sqlite3FindInde
3640: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  x(sqlite3 *db, c
3650: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
3660: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
3670: 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  b){.  Index *p =
3680: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 2f   0;.  int i;.  /
3690: 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72  * All mutexes ar
36a0: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  e required for s
36b0: 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d  chema access.  M
36c0: 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64  ake sure we hold
36d0: 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65   them. */.  asse
36e0: 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20 73 71  rt( zDb!=0 || sq
36f0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
3700: 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b  llMutexes(db) );
3710: 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45  .  for(i=OMIT_TE
3720: 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  MPDB; i<db->nDb;
3730: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
3740: 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a   = (i<2) ? i^1 :
3750: 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54   i;  /* Search T
3760: 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20  EMP before MAIN 
3770: 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  */.    Schema *p
3780: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
3790: 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20  [j].pSchema;.   
37a0: 20 61 73 73 65 72 74 28 20 70 53 63 68 65 6d 61   assert( pSchema
37b0: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20   );.    if( zDb 
37c0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
37d0: 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a  p(zDb, db->aDb[j
37e0: 5d 2e 7a 44 62 53 4e 61 6d 65 29 20 29 20 63 6f  ].zDbSName) ) co
37f0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
3800: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
3810: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a  aMutexHeld(db, j
3820: 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 20 3d 20  , 0) );.    p = 
3830: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
3840: 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  &pSchema->idxHas
3850: 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  h, zName);.    i
3860: 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20  f( p ) break;.  
3870: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
3880: 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74  ./*.** Reclaim t
3890: 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  he memory used b
38a0: 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 76 6f  y an index.*/.vo
38b0: 69 64 20 73 71 6c 69 74 65 33 46 72 65 65 49 6e  id sqlite3FreeIn
38c0: 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dex(sqlite3 *db,
38d0: 20 49 6e 64 65 78 20 2a 70 29 7b 0a 23 69 66 6e   Index *p){.#ifn
38e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
38f0: 41 4e 41 4c 59 5a 45 0a 20 20 73 71 6c 69 74 65  ANALYZE.  sqlite
3900: 33 44 65 6c 65 74 65 49 6e 64 65 78 53 61 6d 70  3DeleteIndexSamp
3910: 6c 65 73 28 64 62 2c 20 70 29 3b 0a 23 65 6e 64  les(db, p);.#end
3920: 69 66 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  if.  sqlite3Expr
3930: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50  Delete(db, p->pP
3940: 61 72 74 49 64 78 57 68 65 72 65 29 3b 0a 20 20  artIdxWhere);.  
3950: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
3960: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 61 43 6f  elete(db, p->aCo
3970: 6c 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  lExpr);.  sqlite
3980: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
3990: 43 6f 6c 41 66 66 29 3b 0a 20 20 69 66 28 20 70  ColAff);.  if( p
39a0: 2d 3e 69 73 52 65 73 69 7a 65 64 20 29 20 73 71  ->isResized ) sq
39b0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
39c0: 28 76 6f 69 64 20 2a 29 70 2d 3e 61 7a 43 6f 6c  (void *)p->azCol
39d0: 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  l);.#ifdef SQLIT
39e0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
39f0: 52 5f 53 54 41 54 34 0a 20 20 73 71 6c 69 74 65  R_STAT4.  sqlite
3a00: 33 5f 66 72 65 65 28 70 2d 3e 61 69 52 6f 77 45  3_free(p->aiRowE
3a10: 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  st);.#endif.  sq
3a20: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3a30: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  p);.}../*.** For
3a40: 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c 6c 65   the index calle
3a50: 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69 63 68  d zIdxName which
3a60: 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   is found in the
3a70: 20 64 61 74 61 62 61 73 65 20 69 44 62 2c 0a 2a   database iDb,.*
3a80: 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20 69 6e  * unlike that in
3a90: 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54 61 62  dex from its Tab
3aa0: 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74  le then remove t
3ab0: 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a 2a 2a  he index from.**
3ac0: 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20   the index hash 
3ad0: 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65 20 61  table and free a
3ae0: 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  ll memory struct
3af0: 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a  ures associated.
3b00: 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 64 65  ** with the inde
3b10: 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  x..*/.void sqlit
3b20: 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  e3UnlinkAndDelet
3b30: 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a  eIndex(sqlite3 *
3b40: 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e  db, int iDb, con
3b50: 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e 61 6d  st char *zIdxNam
3b60: 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  e){.  Index *pIn
3b70: 64 65 78 3b 0a 20 20 48 61 73 68 20 2a 70 48 61  dex;.  Hash *pHa
3b80: 73 68 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  sh;..  assert( s
3b90: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
3ba0: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
3bb0: 29 20 29 3b 0a 20 20 70 48 61 73 68 20 3d 20 26  ) );.  pHash = &
3bc0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
3bd0: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20  hema->idxHash;. 
3be0: 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
3bf0: 33 48 61 73 68 49 6e 73 65 72 74 28 70 48 61 73  3HashInsert(pHas
3c00: 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 30 29 3b  h, zIdxName, 0);
3c10: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49  .  if( ALWAYS(pI
3c20: 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69 66 28  ndex) ){.    if(
3c30: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
3c40: 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20  >pIndex==pIndex 
3c50: 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
3c60: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20  >pTable->pIndex 
3c70: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
3c80: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3c90: 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
3ca0: 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69    /* Justificati
3cb0: 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28 29 3b 20  on of ALWAYS(); 
3cc0: 20 54 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20   The index must 
3cd0: 62 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f  be on the list o
3ce0: 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63  f.      ** indic
3cf0: 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 20 3d  es. */.      p =
3d00: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
3d10: 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77  >pIndex;.      w
3d20: 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 29 20  hile( ALWAYS(p) 
3d30: 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e  && p->pNext!=pIn
3d40: 64 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e  dex ){ p = p->pN
3d50: 65 78 74 3b 20 7d 0a 20 20 20 20 20 20 69 66 28  ext; }.      if(
3d60: 20 41 4c 57 41 59 53 28 70 20 26 26 20 70 2d 3e   ALWAYS(p && p->
3d70: 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29 20 29  pNext==pIndex) )
3d80: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65  {.        p->pNe
3d90: 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  xt = pIndex->pNe
3da0: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
3db0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 72 65  }.    sqlite3Fre
3dc0: 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  eIndex(db, pInde
3dd0: 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6d 44  x);.  }.  db->mD
3de0: 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47  bFlags |= DBFLAG
3df0: 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 7d  _SchemaChange;.}
3e00: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 74 68 72  ../*.** Look thr
3e10: 6f 75 67 68 20 74 68 65 20 6c 69 73 74 20 6f 66  ough the list of
3e20: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
3e30: 69 6c 65 73 20 69 6e 20 64 62 2d 3e 61 44 62 5b  iles in db->aDb[
3e40: 5d 20 61 6e 64 20 69 66 0a 2a 2a 20 61 6e 79 20  ] and if.** any 
3e50: 68 61 76 65 20 62 65 65 6e 20 63 6c 6f 73 65 64  have been closed
3e60: 2c 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72  , remove them fr
3e70: 6f 6d 20 74 68 65 20 6c 69 73 74 2e 20 20 52 65  om the list.  Re
3e80: 61 6c 6c 6f 63 61 74 65 20 74 68 65 0a 2a 2a 20  allocate the.** 
3e90: 64 62 2d 3e 61 44 62 5b 5d 20 73 74 72 75 63 74  db->aDb[] struct
3ea0: 75 72 65 20 74 6f 20 61 20 73 6d 61 6c 6c 65 72  ure to a smaller
3eb0: 20 73 69 7a 65 2c 20 69 66 20 70 6f 73 73 69 62   size, if possib
3ec0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 79 20  le..**.** Entry 
3ed0: 30 20 28 74 68 65 20 22 6d 61 69 6e 22 20 64 61  0 (the "main" da
3ee0: 74 61 62 61 73 65 29 20 61 6e 64 20 65 6e 74 72  tabase) and entr
3ef0: 79 20 31 20 28 74 68 65 20 22 74 65 6d 70 22 20  y 1 (the "temp" 
3f00: 64 61 74 61 62 61 73 65 29 0a 2a 2a 20 61 72 65  database).** are
3f10: 20 6e 65 76 65 72 20 63 61 6e 64 69 64 61 74 65   never candidate
3f20: 73 20 66 6f 72 20 62 65 69 6e 67 20 63 6f 6c 6c  s for being coll
3f30: 61 70 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  apsed..*/.void s
3f40: 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61  qlite3CollapseDa
3f50: 74 61 62 61 73 65 41 72 72 61 79 28 73 71 6c 69  tabaseArray(sqli
3f60: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
3f70: 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  i, j;.  for(i=j=
3f80: 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  2; i<db->nDb; i+
3f90: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44  +){.    struct D
3fa0: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
3fb0: 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
3fc0: 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  b->pBt==0 ){.   
3fd0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3fe0: 28 64 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61  (db, pDb->zDbSNa
3ff0: 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  me);.      pDb->
4000: 7a 44 62 53 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  zDbSName = 0;.  
4010: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
4020: 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69 20    }.    if( j<i 
4030: 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ){.      db->aDb
4040: 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  [j] = db->aDb[i]
4050: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b  ;.    }.    j++;
4060: 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 44 62 20 3d  .  }.  db->nDb =
4070: 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44   j;.  if( db->nD
4080: 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21  b<=2 && db->aDb!
4090: 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29  =db->aDbStatic )
40a0: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d  {.    memcpy(db-
40b0: 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e  >aDbStatic, db->
40c0: 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62  aDb, 2*sizeof(db
40d0: 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20  ->aDb[0]));.    
40e0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
40f0: 2c 20 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20  , db->aDb);.    
4100: 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44  db->aDb = db->aD
4110: 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a  bStatic;.  }.}..
4120: 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20  /*.** Reset the 
4130: 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 20 64  schema for the d
4140: 61 74 61 62 61 73 65 20 61 74 20 69 6e 64 65 78  atabase at index
4150: 20 69 44 62 2e 20 20 41 6c 73 6f 20 72 65 73 65   iDb.  Also rese
4160: 74 20 74 68 65 0a 2a 2a 20 54 45 4d 50 20 73 63  t the.** TEMP sc
4170: 68 65 6d 61 2e 20 20 54 68 65 20 72 65 73 65 74  hema.  The reset
4180: 20 69 73 20 64 65 66 65 72 72 65 64 20 69 66 20   is deferred if 
4190: 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 20  db->nSchemaLock 
41a0: 69 73 20 6e 6f 74 20 7a 65 72 6f 2e 0a 2a 2a 20  is not zero..** 
41b0: 44 65 66 65 72 72 65 64 20 72 65 73 65 74 73 20  Deferred resets 
41c0: 6d 61 79 20 62 65 20 72 75 6e 20 62 79 20 63 61  may be run by ca
41d0: 6c 6c 69 6e 67 20 77 69 74 68 20 69 44 62 3c 30  lling with iDb<0
41e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
41f0: 33 52 65 73 65 74 4f 6e 65 53 63 68 65 6d 61 28  3ResetOneSchema(
4200: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
4210: 20 69 44 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   iDb){.  int i;.
4220: 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62    assert( iDb<db
4230: 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 69 66 28 20  ->nDb );..  if( 
4240: 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73  iDb>=0 ){.    as
4250: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
4260: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
4270: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
4280: 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 64 62  DbSetProperty(db
4290: 2c 20 69 44 62 2c 20 44 42 5f 52 65 73 65 74 57  , iDb, DB_ResetW
42a0: 61 6e 74 65 64 29 3b 0a 20 20 20 20 44 62 53 65  anted);.    DbSe
42b0: 74 50 72 6f 70 65 72 74 79 28 64 62 2c 20 31 2c  tProperty(db, 1,
42c0: 20 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64 29   DB_ResetWanted)
42d0: 3b 0a 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61  ;.    db->mDbFla
42e0: 67 73 20 26 3d 20 7e 44 42 46 4c 41 47 5f 53 63  gs &= ~DBFLAG_Sc
42f0: 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 3b 0a 20 20 7d  hemaKnownOk;.  }
4300: 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 63 68  ..  if( db->nSch
4310: 65 6d 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  emaLock==0 ){.  
4320: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
4330: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
4340: 20 20 69 66 28 20 44 62 48 61 73 50 72 6f 70 65    if( DbHasPrope
4350: 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f 52 65  rty(db, i, DB_Re
4360: 73 65 74 57 61 6e 74 65 64 29 20 29 7b 0a 20 20  setWanted) ){.  
4370: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 63 68        sqlite3Sch
4380: 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61 44 62  emaClear(db->aDb
4390: 5b 69 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20  [i].pSchema);.  
43a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
43b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61  }../*.** Erase a
43c0: 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d  ll schema inform
43d0: 61 74 69 6f 6e 20 66 72 6f 6d 20 61 6c 6c 20 61  ation from all a
43e0: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
43f0: 73 20 28 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20  s (including.** 
4400: 22 6d 61 69 6e 22 20 61 6e 64 20 22 74 65 6d 70  "main" and "temp
4410: 22 29 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ") for a single 
4420: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
4430: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
4440: 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65  ite3ResetAllSche
4450: 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28  masOfConnection(
4460: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
4470: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
4480: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
4490: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
44a0: 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 3d 3d 30 20  >nSchemaLock==0 
44b0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
44c0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
44d0: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
44e0: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
44f0: 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 29  ( pDb->pSchema )
4500: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
4510: 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e  chemaClear(pDb->
4520: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
4530: 20 20 7d 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61    }.  db->mDbFla
4540: 67 73 20 26 3d 20 7e 28 44 42 46 4c 41 47 5f 53  gs &= ~(DBFLAG_S
4550: 63 68 65 6d 61 43 68 61 6e 67 65 7c 44 42 46 4c  chemaChange|DBFL
4560: 41 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b  AG_SchemaKnownOk
4570: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  );.  sqlite3Vtab
4580: 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a  UnlockList(db);.
4590: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
45a0: 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71  aveAll(db);.  sq
45b0: 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74  lite3CollapseDat
45c0: 61 62 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a  abaseArray(db);.
45d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
45e0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
45f0: 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63  when a commit oc
4600: 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  curs..*/.void sq
4610: 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72  lite3CommitInter
4620: 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74  nalChanges(sqlit
4630: 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 6d  e3 *db){.  db->m
4640: 44 62 46 6c 61 67 73 20 26 3d 20 7e 44 42 46 4c  DbFlags &= ~DBFL
4650: 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b  AG_SchemaChange;
4660: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
4670: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65   memory allocate
4680: 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  d for the column
4690: 20 6e 61 6d 65 73 20 6f 66 20 61 20 74 61 62 6c   names of a tabl
46a0: 65 20 6f 72 20 76 69 65 77 20 28 74 68 65 0a 2a  e or view (the.*
46b0: 2a 20 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20 61  * Table.aCol[] a
46c0: 72 72 61 79 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rray)..*/.void s
46d0: 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75  qlite3DeleteColu
46e0: 6d 6e 4e 61 6d 65 73 28 73 71 6c 69 74 65 33 20  mnNames(sqlite3 
46f0: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  *db, Table *pTab
4700: 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  le){.  int i;.  
4710: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
4720: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d  assert( pTable!=
4730: 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c  0 );.  if( (pCol
4740: 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29   = pTable->aCol)
4750: 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  !=0 ){.    for(i
4760: 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43  =0; i<pTable->nC
4770: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
4780: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
4790: 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  bFree(db, pCol->
47a0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  zName);.      sq
47b0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
47c0: 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29  db, pCol->pDflt)
47d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
47e0: 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  bFree(db, pCol->
47f0: 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  zColl);.    }.  
4800: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4810: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  db, pTable->aCol
4820: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
4830: 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72  Remove the memor
4840: 79 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  y data structure
4850: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
4860: 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54  h the given.** T
4870: 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65  able.  No change
4880: 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69  s are made to di
4890: 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  sk by this routi
48a0: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ne..**.** This r
48b0: 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65  outine just dele
48c0: 74 65 73 20 74 68 65 20 64 61 74 61 20 73 74 72  tes the data str
48d0: 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73  ucture.  It does
48e0: 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74   not unlink.** t
48f0: 68 65 20 74 61 62 6c 65 20 64 61 74 61 20 73 74  he table data st
4900: 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
4910: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75   hash table.  Bu
4920: 74 20 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f  t it does destro
4930: 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75  y.** memory stru
4940: 63 74 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e  ctures of the in
4950: 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67  dices and foreig
4960: 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65  n keys associate
4970: 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74  d with .** the t
4980: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able..**.** The 
4990: 64 62 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  db parameter is 
49a0: 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 74 20 69 73  optional.  It is
49b0: 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 54   needed if the T
49c0: 61 62 6c 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20  able object .** 
49d0: 63 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61 73 69  contains lookasi
49e0: 64 65 20 6d 65 6d 6f 72 79 2e 20 20 28 54 61 62  de memory.  (Tab
49f0: 6c 65 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68  le objects in th
4a00: 65 20 73 63 68 65 6d 61 20 64 6f 20 6e 6f 74 20  e schema do not 
4a10: 75 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65  use.** lookaside
4a20: 20 6d 65 6d 6f 72 79 2c 20 62 75 74 20 73 6f 6d   memory, but som
4a30: 65 20 65 70 68 65 6d 65 72 61 6c 20 54 61 62 6c  e ephemeral Tabl
4a40: 65 20 6f 62 6a 65 63 74 73 20 64 6f 2e 29 20 20  e objects do.)  
4a50: 4f 72 20 74 68 65 0a 2a 2a 20 64 62 20 70 61 72  Or the.** db par
4a60: 61 6d 65 74 65 72 20 63 61 6e 20 62 65 20 75 73  ameter can be us
4a70: 65 64 20 77 69 74 68 20 64 62 2d 3e 70 6e 42 79  ed with db->pnBy
4a80: 74 65 73 46 72 65 65 64 20 74 6f 20 6d 65 61 73  tesFreed to meas
4a90: 75 72 65 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a  ure the memory.*
4aa0: 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 54 61  * used by the Ta
4ab0: 62 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  ble object..*/.s
4ac0: 74 61 74 69 63 20 76 6f 69 64 20 53 51 4c 49 54  tatic void SQLIT
4ad0: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 64 65 6c 65 74  E_NOINLINE delet
4ae0: 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a  eTable(sqlite3 *
4af0: 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  db, Table *pTabl
4b00: 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  e){.  Index *pIn
4b10: 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 0a 23 69  dex, *pNext;..#i
4b20: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
4b30: 47 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68  G.  /* Record th
4b40: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73  e number of outs
4b50: 74 61 6e 64 69 6e 67 20 6c 6f 6f 6b 61 73 69 64  tanding lookasid
4b60: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 69 6e  e allocations in
4b70: 20 73 63 68 65 6d 61 20 54 61 62 6c 65 73 0a 20   schema Tables. 
4b80: 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 64 6f 69   ** prior to doi
4b90: 6e 67 20 61 6e 79 20 66 72 65 65 28 29 20 6f 70  ng any free() op
4ba0: 65 72 61 74 69 6f 6e 73 2e 20 20 53 69 6e 63 65  erations.  Since
4bb0: 20 73 63 68 65 6d 61 20 54 61 62 6c 65 73 20 64   schema Tables d
4bc0: 6f 20 6e 6f 74 20 75 73 65 0a 20 20 2a 2a 20 6c  o not use.  ** l
4bd0: 6f 6f 6b 61 73 69 64 65 2c 20 74 68 69 73 20 6e  ookaside, this n
4be0: 75 6d 62 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74  umber should not
4bf0: 20 63 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 69 6e   change. */.  in
4c00: 74 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 30  t nLookaside = 0
4c10: 3b 0a 20 20 69 66 28 20 64 62 20 26 26 20 28 70  ;.  if( db && (p
4c20: 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61 67 73 20  Table->tabFlags 
4c30: 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d  & TF_Ephemeral)=
4c40: 3d 30 20 29 7b 0a 20 20 20 20 6e 4c 6f 6f 6b 61  =0 ){.    nLooka
4c50: 73 69 64 65 20 3d 20 73 71 6c 69 74 65 33 4c 6f  side = sqlite3Lo
4c60: 6f 6b 61 73 69 64 65 55 73 65 64 28 64 62 2c 20  okasideUsed(db, 
4c70: 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
4c80: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20    /* Delete all 
4c90: 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
4ca0: 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62  ed with this tab
4cb0: 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e  le. */.  for(pIn
4cc0: 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49  dex = pTable->pI
4cd0: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
4ce0: 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20  ndex=pNext){.   
4cf0: 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d   pNext = pIndex-
4d00: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65  >pNext;.    asse
4d10: 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  rt( pIndex->pSch
4d20: 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63  ema==pTable->pSc
4d30: 68 65 6d 61 0a 20 20 20 20 20 20 20 20 20 7c 7c  hema.         ||
4d40: 20 28 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   (IsVirtual(pTab
4d50: 6c 65 29 20 26 26 20 70 49 6e 64 65 78 2d 3e 69  le) && pIndex->i
4d60: 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49  dxType!=SQLITE_I
4d70: 44 58 54 59 50 45 5f 41 50 50 44 45 46 29 20 29  DXTYPE_APPDEF) )
4d80: 3b 0a 20 20 20 20 69 66 28 20 28 64 62 3d 3d 30  ;.    if( (db==0
4d90: 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46   || db->pnBytesF
4da0: 72 65 65 64 3d 3d 30 29 20 26 26 20 21 49 73 56  reed==0) && !IsV
4db0: 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29  irtual(pTable) )
4dc0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  {.      char *zN
4dd0: 61 6d 65 20 3d 20 70 49 6e 64 65 78 2d 3e 7a 4e  ame = pIndex->zN
4de0: 61 6d 65 3b 20 0a 20 20 20 20 20 20 54 45 53 54  ame; .      TEST
4df0: 4f 4e 4c 59 20 28 20 49 6e 64 65 78 20 2a 70 4f  ONLY ( Index *pO
4e00: 6c 64 20 3d 20 29 20 73 71 6c 69 74 65 33 48 61  ld = ) sqlite3Ha
4e10: 73 68 49 6e 73 65 72 74 28 0a 20 20 20 20 20 20  shInsert(.      
4e20: 20 20 20 26 70 49 6e 64 65 78 2d 3e 70 53 63 68     &pIndex->pSch
4e30: 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e  ema->idxHash, zN
4e40: 61 6d 65 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a  ame, 0.      );.
4e50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
4e60: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 63  ==0 || sqlite3Sc
4e70: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
4e80: 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63  , 0, pIndex->pSc
4e90: 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 61  hema) );.      a
4ea0: 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 49 6e  ssert( pOld==pIn
4eb0: 64 65 78 20 7c 7c 20 70 4f 6c 64 3d 3d 30 20 29  dex || pOld==0 )
4ec0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
4ed0: 74 65 33 46 72 65 65 49 6e 64 65 78 28 64 62 2c  te3FreeIndex(db,
4ee0: 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20   pIndex);.  }.. 
4ef0: 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 66   /* Delete any f
4f00: 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 74 74 61  oreign keys atta
4f10: 63 68 65 64 20 74 6f 20 74 68 69 73 20 74 61 62  ched to this tab
4f20: 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  le. */.  sqlite3
4f30: 46 6b 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61  FkDelete(db, pTa
4f40: 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  ble);..  /* Dele
4f50: 74 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  te the Table str
4f60: 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20  ucture itself.. 
4f70: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
4f80: 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41 4c 49  E_ENABLE_NORMALI
4f90: 5a 45 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  ZE.  if( pTable-
4fa0: 3e 70 43 6f 6c 48 61 73 68 20 29 7b 0a 20 20 20  >pColHash ){.   
4fb0: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
4fc0: 72 28 70 54 61 62 6c 65 2d 3e 70 43 6f 6c 48 61  r(pTable->pColHa
4fd0: 73 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sh);.    sqlite3
4fe0: 5f 66 72 65 65 28 70 54 61 62 6c 65 2d 3e 70 43  _free(pTable->pC
4ff0: 6f 6c 48 61 73 68 29 3b 0a 20 20 7d 0a 23 65 6e  olHash);.  }.#en
5000: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44 65 6c  dif.  sqlite3Del
5010: 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64  eteColumnNames(d
5020: 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 73 71  b, pTable);.  sq
5030: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5040: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
5050: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5060: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c  db, pTable->zCol
5070: 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  Aff);.  sqlite3S
5080: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
5090: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29  pTable->pSelect)
50a0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
50b0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54  istDelete(db, pT
50c0: 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 23  able->pCheck);.#
50d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
50e0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
50f0: 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65    sqlite3VtabCle
5100: 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  ar(db, pTable);.
5110: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
5120: 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c  DbFree(db, pTabl
5130: 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79  e);..  /* Verify
5140: 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61 73 69   that no lookasi
5150: 64 65 20 6d 65 6d 6f 72 79 20 77 61 73 20 75 73  de memory was us
5160: 65 64 20 62 79 20 73 63 68 65 6d 61 20 74 61 62  ed by schema tab
5170: 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  les */.  assert(
5180: 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30 20 7c   nLookaside==0 |
5190: 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 73 71  | nLookaside==sq
51a0: 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55 73  lite3LookasideUs
51b0: 65 64 28 64 62 2c 30 29 20 29 3b 0a 7d 0a 76 6f  ed(db,0) );.}.vo
51c0: 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  id sqlite3Delete
51d0: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
51e0: 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  b, Table *pTable
51f0: 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64  ){.  /* Do not d
5200: 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c 65 20  elete the table 
5210: 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65 72 65  until the refere
5220: 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65  nce count reache
5230: 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 28  s zero. */.  if(
5240: 20 21 70 54 61 62 6c 65 20 29 20 72 65 74 75 72   !pTable ) retur
5250: 6e 3b 0a 20 20 69 66 28 20 28 28 21 64 62 20 7c  n;.  if( ((!db |
5260: 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  | db->pnBytesFre
5270: 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d 70 54 61  ed==0) && (--pTa
5280: 62 6c 65 2d 3e 6e 54 61 62 52 65 66 29 3e 30 29  ble->nTabRef)>0)
5290: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 65 6c   ) return;.  del
52a0: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61  eteTable(db, pTa
52b0: 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ble);.}.../*.** 
52c0: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
52d0: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
52e0: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
52f0: 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a  the delete the.*
5300: 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  * table structur
5310: 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69  e with all its i
5320: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
5330: 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64  gn keys..*/.void
5340: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
5350: 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  dDeleteTable(sql
5360: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
5370: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
5380: 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c  TabName){.  Tabl
5390: 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b  e *p;.  Db *pDb;
53a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
53b0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
53c0: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
53d0: 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
53e0: 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20  ( zTabName );.  
53f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
5400: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
5410: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
5420: 74 65 73 74 63 61 73 65 28 20 7a 54 61 62 4e 61  testcase( zTabNa
5430: 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20  me[0]==0 );  /* 
5440: 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c  Zero-length tabl
5450: 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f  e names are allo
5460: 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26  wed */.  pDb = &
5470: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
5480: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  p = sqlite3HashI
5490: 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68  nsert(&pDb->pSch
54a0: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54  ema->tblHash, zT
54b0: 61 62 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71  abName, 0);.  sq
54c0: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
54d0: 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d 3e 6d  (db, p);.  db->m
54e0: 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41  DbFlags |= DBFLA
54f0: 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a  G_SchemaChange;.
5500: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
5510: 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61   token, return a
5520: 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e   string that con
5530: 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65 78  sists of the tex
5540: 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b  t of that.** tok
5550: 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  en.  Space to ho
5560: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
5570: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74  string.** is obt
5580: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
5590: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
55a0: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
55b0: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
55c0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e  nction..**.** An
55d0: 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b  y quotation mark
55e0: 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c 20  s (ex:  "name", 
55f0: 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20  'name', [name], 
5600: 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61 74 0a  or `name`) that.
5610: 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68 65 20  ** surround the 
5620: 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f 6b 65  body of the toke
5630: 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a  n are removed..*
5640: 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20  *.** Tokens are 
5650: 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74  often just point
5660: 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ers into the ori
5670: 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61  ginal SQL text a
5680: 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74  nd so.** are not
5690: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
56a0: 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72   and are not per
56b0: 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65  sistent.  The re
56c0: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a  turned string.**
56d0: 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61   is \000 termina
56e0: 74 65 64 20 61 6e 64 20 69 73 20 70 65 72 73 69  ted and is persi
56f0: 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a  stent..*/.char *
5700: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
5710: 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  oken(sqlite3 *db
5720: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
5730: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
5740: 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
5750: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
5760: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
5770: 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c  (char*)pName->z,
5780: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
5790: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
57a0: 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Name);.  }else{.
57b0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20      zName = 0;. 
57c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d   }.  return zNam
57d0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  e;.}../*.** Open
57e0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
57f0: 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20  er table stored 
5800: 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62  in database numb
5810: 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72  er iDb for.** wr
5820: 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65  iting. The table
5830: 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67   is opened using
5840: 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f   cursor 0..*/.vo
5850: 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61  id sqlite3OpenMa
5860: 73 74 65 72 54 61 62 6c 65 28 50 61 72 73 65 20  sterTable(Parse 
5870: 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  *p, int iDb){.  
5880: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
5890: 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73  3GetVdbe(p);.  s
58a0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
58b0: 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52  p, iDb, MASTER_R
58c0: 4f 4f 54 2c 20 31 2c 20 4d 41 53 54 45 52 5f 4e  OOT, 1, MASTER_N
58d0: 41 4d 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  AME);.  sqlite3V
58e0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
58f0: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c  OP_OpenWrite, 0,
5900: 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 69 44   MASTER_ROOT, iD
5910: 62 2c 20 35 29 3b 0a 20 20 69 66 28 20 70 2d 3e  b, 5);.  if( p->
5920: 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 70  nTab==0 ){.    p
5930: 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 7d 0a  ->nTab = 1;.  }.
5940: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
5950: 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73 20  er zName points 
5960: 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  to a nul-termina
5970: 74 65 64 20 62 75 66 66 65 72 20 63 6f 6e 74 61  ted buffer conta
5980: 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 0a 2a  ining the name.*
5990: 2a 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  * of a database 
59a0: 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20  ("main", "temp" 
59b0: 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  or the name of a
59c0: 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e 20  n attached db). 
59d0: 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
59e0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 69 6e 64   returns the ind
59f0: 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20  ex of the named 
5a00: 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e  database in db->
5a10: 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d 31 20  aDb[], or.** -1 
5a20: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20  if the named db 
5a30: 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
5a40: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
5a50: 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69 74 65  indDbName(sqlite
5a60: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
5a70: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
5a80: 20 69 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20   i = -1;        
5a90: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
5aa0: 62 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a 4e 61  ber */.  if( zNa
5ab0: 6d 65 20 29 7b 0a 20 20 20 20 44 62 20 2a 70 44  me ){.    Db *pD
5ac0: 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 64 62  b;.    for(i=(db
5ad0: 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26 64  ->nDb-1), pDb=&d
5ae0: 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b  b->aDb[i]; i>=0;
5af0: 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20   i--, pDb--){.  
5b00: 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
5b10: 65 33 5f 73 74 72 69 63 6d 70 28 70 44 62 2d 3e  e3_stricmp(pDb->
5b20: 7a 44 62 53 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  zDbSName, zName)
5b30: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
5b40: 2f 2a 20 22 6d 61 69 6e 22 20 69 73 20 61 6c 77  /* "main" is alw
5b50: 61 79 73 20 61 6e 20 61 63 63 65 70 74 61 62 6c  ays an acceptabl
5b60: 65 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20  e alias for the 
5b70: 70 72 69 6d 61 72 79 20 64 61 74 61 62 61 73 65  primary database
5b80: 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 69  .      ** even i
5b90: 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 72 65  f it has been re
5ba0: 6e 61 6d 65 64 20 75 73 69 6e 67 20 53 51 4c 49  named using SQLI
5bb0: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4d 41 49 4e  TE_DBCONFIG_MAIN
5bc0: 44 42 4e 41 4d 45 2e 20 2a 2f 0a 20 20 20 20 20  DBNAME. */.     
5bd0: 20 69 66 28 20 69 3d 3d 30 20 26 26 20 30 3d 3d   if( i==0 && 0==
5be0: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
5bf0: 22 6d 61 69 6e 22 2c 20 7a 4e 61 6d 65 29 20 29  "main", zName) )
5c00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5c10: 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  }.  return i;.}.
5c20: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e  ./*.** The token
5c30: 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73   *pName contains
5c40: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64   the name of a d
5c50: 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72 20  atabase (either 
5c60: 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65  "main" or.** "te
5c70: 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20  mp" or the name 
5c80: 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  of an attached d
5c90: 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  b). This routine
5ca0: 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20   returns the.** 
5cb0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d  index of the nam
5cc0: 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64  ed database in d
5cd0: 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20  b->aDb[], or -1 
5ce0: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20  if the named db 
5cf0: 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  .** does not exi
5d00: 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  st..*/.int sqlit
5d10: 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74 65 33  e3FindDb(sqlite3
5d20: 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61   *db, Token *pNa
5d30: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  me){.  int i;   
5d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
5d60: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a  atabase number *
5d70: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  /.  char *zName;
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
5da0: 20 77 65 20 61 72 65 20 73 65 61 72 63 68 69 6e   we are searchin
5db0: 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65  g for */.  zName
5dc0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
5dd0: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d  omToken(db, pNam
5de0: 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74 65  e);.  i = sqlite
5df0: 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
5e00: 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
5e10: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
5e20: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  e);.  return i;.
5e30: 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  }../* The table 
5e40: 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69 67 67  or view or trigg
5e50: 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65  er name is passe
5e60: 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  d to this routin
5e70: 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20  e via tokens.** 
5e80: 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65  pName1 and pName
5e90: 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  2. If the table 
5ea0: 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71  name was fully q
5eb0: 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78  ualified, for ex
5ec0: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45  ample:.**.** CRE
5ed0: 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79  ATE TABLE xxx.yy
5ee0: 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20  y (...);.** .** 
5ef0: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
5f00: 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20  et to "xxx" and 
5f10: 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e  pName2 "yyy". On
5f20: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20   the other hand 
5f30: 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  if.** the table 
5f40: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c  name is not full
5f50: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65  y qualified, i.e
5f60: 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20  .:.**.** CREATE 
5f70: 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a  TABLE yyy(...);.
5f80: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  **.** Then pName
5f90: 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79  1 is set to "yyy
5fa0: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20  " and pName2 is 
5fb0: 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ""..**.** This r
5fc0: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
5fd0: 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65  *ppUnqual pointe
5fe0: 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  r to point at th
5ff0: 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20  e token (pName1 
6000: 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68  or.** pName2) th
6010: 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e  at stores the un
6020: 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20  qualified table 
6030: 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78  name.  The index
6040: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
6050: 61 73 65 20 22 78 78 78 22 20 69 73 20 72 65 74  ase "xxx" is ret
6060: 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
6070: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
6080: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
6090: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  e,      /* Parsi
60a0: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
60b0: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
60c0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
60d0: 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  1,      /* The "
60e0: 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  xxx" in the name
60f0: 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78   "xxx.yyy" or "x
6100: 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  xx" */.  Token *
6110: 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20  pName2,      /* 
6120: 54 68 65 20 22 79 79 79 22 20 69 6e 20 74 68 65  The "yyy" in the
6130: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
6140: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e  */.  Token **pUn
6150: 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74  qual     /* Writ
6160: 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65  e the unqualifie
6170: 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65  d object name he
6180: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  re */.){.  int i
6190: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
61a0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
61b0: 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f  se holding the o
61c0: 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
61d0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
61e0: 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  >db;..  assert( 
61f0: 70 4e 61 6d 65 32 21 3d 30 20 29 3b 0a 20 20 69  pName2!=0 );.  i
6200: 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29  f( pName2->n>0 )
6210: 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e  {.    if( db->in
6220: 69 74 2e 62 75 73 79 20 29 20 7b 0a 20 20 20 20  it.busy ) {.    
6230: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
6240: 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72 72 75  g(pParse, "corru
6250: 70 74 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20  pt database");. 
6260: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
6270: 20 20 20 20 7d 0a 20 20 20 20 2a 70 55 6e 71 75      }.    *pUnqu
6280: 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20  al = pName2;.   
6290: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69   iDb = sqlite3Fi
62a0: 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29  ndDb(db, pName1)
62b0: 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
62c0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
62d0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
62e0: 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61   "unknown databa
62f0: 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b  se %T", pName1);
6300: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
6310: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
6320: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
6330: 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20  >init.iDb==0 || 
6340: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c  db->init.busy ||
6350: 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
6360: 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  T.             |
6370: 7c 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20  | (db->mDbFlags 
6380: 26 20 44 42 46 4c 41 47 5f 56 61 63 75 75 6d 29  & DBFLAG_Vacuum)
6390: 21 3d 30 29 3b 0a 20 20 20 20 69 44 62 20 3d 20  !=0);.    iDb = 
63a0: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20  db->init.iDb;.  
63b0: 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61    *pUnqual = pNa
63c0: 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  me1;.  }.  retur
63d0: 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n iDb;.}../*.** 
63e0: 54 72 75 65 20 69 66 20 50 52 41 47 4d 41 20 77  True if PRAGMA w
63f0: 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 69  ritable_schema i
6400: 73 20 4f 4e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  s ON.*/.int sqli
6410: 74 65 33 57 72 69 74 61 62 6c 65 53 63 68 65 6d  te3WritableSchem
6420: 61 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  a(sqlite3 *db){.
6430: 20 20 74 65 73 74 63 61 73 65 28 20 28 64 62 2d    testcase( (db-
6440: 3e 66 6c 61 67 73 26 28 53 51 4c 49 54 45 5f 57  >flags&(SQLITE_W
6450: 72 69 74 65 53 63 68 65 6d 61 7c 53 51 4c 49 54  riteSchema|SQLIT
6460: 45 5f 44 65 66 65 6e 73 69 76 65 29 29 3d 3d 30  E_Defensive))==0
6470: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
6480: 28 64 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49  (db->flags&(SQLI
6490: 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c 53  TE_WriteSchema|S
64a0: 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65 29  QLITE_Defensive)
64b0: 29 3d 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  )==.            
64c0: 20 20 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53     SQLITE_WriteS
64d0: 63 68 65 6d 61 20 29 3b 0a 20 20 74 65 73 74 63  chema );.  testc
64e0: 61 73 65 28 20 28 64 62 2d 3e 66 6c 61 67 73 26  ase( (db->flags&
64f0: 28 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68  (SQLITE_WriteSch
6500: 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e  ema|SQLITE_Defen
6510: 73 69 76 65 29 29 3d 3d 0a 20 20 20 20 20 20 20  sive))==.       
6520: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
6530: 65 66 65 6e 73 69 76 65 20 29 3b 0a 20 20 74 65  efensive );.  te
6540: 73 74 63 61 73 65 28 20 28 64 62 2d 3e 66 6c 61  stcase( (db->fla
6550: 67 73 26 28 53 51 4c 49 54 45 5f 57 72 69 74 65  gs&(SQLITE_Write
6560: 53 63 68 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65  Schema|SQLITE_De
6570: 66 65 6e 73 69 76 65 29 29 3d 3d 0a 20 20 20 20  fensive))==.    
6580: 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49             (SQLI
6590: 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c 53  TE_WriteSchema|S
65a0: 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65 29  QLITE_Defensive)
65b0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 64 62   );.  return (db
65c0: 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49 54 45 5f  ->flags&(SQLITE_
65d0: 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51 4c 49  WriteSchema|SQLI
65e0: 54 45 5f 44 65 66 65 6e 73 69 76 65 29 29 3d 3d  TE_Defensive))==
65f0: 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65  SQLITE_WriteSche
6600: 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ma;.}../*.** Thi
6610: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
6620: 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68  d to check if th
6630: 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 7a  e UTF-8 string z
6640: 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c 0a  Name is a legal.
6650: 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6e  ** unqualified n
6660: 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73 63  ame for a new sc
6670: 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61 62  hema object (tab
6680: 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77 20  le, index, view 
6690: 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e 20  or.** trigger). 
66a0: 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c 65  All names are le
66b0: 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73 65  gal except those
66c0: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
66d0: 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22   the string.** "
66e0: 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70 70  sqlite_" (in upp
66f0: 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78  er, lower or mix
6700: 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20 70  ed case). This p
6710: 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61  ortion of the na
6720: 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72 65  mespace.** is re
6730: 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72  served for inter
6740: 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20  nal use..*/.int 
6750: 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
6760: 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70 50  ctName(Parse *pP
6770: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
6780: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20   *zName){.  if( 
6790: 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69  !pParse->db->ini
67a0: 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73 65  t.busy && pParse
67b0: 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20 20  ->nested==0 .   
67c0: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
67d0: 33 57 72 69 74 61 62 6c 65 53 63 68 65 6d 61 28  3WritableSchema(
67e0: 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 0a 20  pParse->db)==0. 
67f0: 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73           && 0==s
6800: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a  qlite3StrNICmp(z
6810: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
6820: 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   7) ){.    sqlit
6830: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
6840: 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20  e, "object name 
6850: 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74  reserved for int
6860: 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20  ernal use: %s", 
6870: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
6880: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
6890: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
68a0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
68b0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 52 49  * Return the PRI
68c0: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 6f  MARY KEY index o
68d0: 66 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49 6e 64  f a table.*/.Ind
68e0: 65 78 20 2a 73 71 6c 69 74 65 33 50 72 69 6d 61  ex *sqlite3Prima
68f0: 72 79 4b 65 79 49 6e 64 65 78 28 54 61 62 6c 65  ryKeyIndex(Table
6900: 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78   *pTab){.  Index
6910: 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 54 61   *p;.  for(p=pTa
6920: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20  b->pIndex; p && 
6930: 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  !IsPrimaryKeyInd
6940: 65 78 28 70 29 3b 20 70 3d 70 2d 3e 70 4e 65 78  ex(p); p=p->pNex
6950: 74 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  t){}.  return p;
6960: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
6970: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 69   the column of i
6980: 6e 64 65 78 20 70 49 64 78 20 74 68 61 74 20 63  ndex pIdx that c
6990: 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 61  orresponds to ta
69a0: 62 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43  ble.** column iC
69b0: 6f 6c 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  ol.  Return -1 i
69c0: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
69d0: 69 31 36 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  i16 sqlite3Colum
69e0: 6e 4f 66 49 6e 64 65 78 28 49 6e 64 65 78 20 2a  nOfIndex(Index *
69f0: 70 49 64 78 2c 20 69 31 36 20 69 43 6f 6c 29 7b  pIdx, i16 iCol){
6a00: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
6a10: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f  i=0; i<pIdx->nCo
6a20: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
6a30: 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e  if( iCol==pIdx->
6a40: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20 72 65  aiColumn[i] ) re
6a50: 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
6a60: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
6a70: 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63  * Begin construc
6a80: 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65  ting a new table
6a90: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
6aa0: 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73  in memory.  This
6ab0: 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   is.** the first
6ac0: 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69   of several acti
6ad0: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74  on routines that
6ae0: 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72   get called in r
6af0: 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20  esponse.** to a 
6b00: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
6b10: 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74  tement.  In part
6b20: 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75  icular, this rou
6b30: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a  tine is called.*
6b40: 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74  * after seeing t
6b50: 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61  okens "CREATE" a
6b60: 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74  nd "TABLE" and t
6b70: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54  he table name. T
6b80: 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61  he isTemp.** fla
6b90: 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
6ba0: 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65   table should be
6bb0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61   stored in the a
6bc0: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
6bd0: 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61  e.** file instea
6be0: 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e  d of in the main
6bf0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
6c00: 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
6c10: 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68  y the case.** wh
6c20: 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72  en the "TEMP" or
6c30: 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79   "TEMPORARY" key
6c40: 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62  word occurs in b
6c50: 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45  etween.** CREATE
6c60: 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a   and TABLE..**.*
6c70: 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * The new table 
6c80: 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61  record is initia
6c90: 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e  lized and put in
6ca0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
6cb0: 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f  le..** As more o
6cc0: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
6cd0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  LE statement is 
6ce0: 70 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e  parsed, addition
6cf0: 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75  al action.** rou
6d00: 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61  tines will be ca
6d10: 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65  lled to add more
6d20: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
6d30: 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20  this record..** 
6d40: 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
6d50: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
6d60: 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71  tatement, the sq
6d70: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20  lite3EndTable() 
6d80: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
6d90: 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65  lled to complete
6da0: 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f   the constructio
6db0: 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  n of the new tab
6dc0: 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f  le record..*/.vo
6dd0: 69 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  id sqlite3StartT
6de0: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
6df0: 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73  Parse,   /* Pars
6e00: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
6e10: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
6e20: 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f   /* First part o
6e30: 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  f the name of th
6e40: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
6e50: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
6e60: 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  e2,   /* Second 
6e70: 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65  part of the name
6e80: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
6e90: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
6ea0: 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54  sTemp,      /* T
6eb0: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
6ec0: 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20   TEMP table */. 
6ed0: 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20   int isView,    
6ee0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
6ef0: 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20  s is a VIEW */. 
6f00: 20 69 6e 74 20 69 73 56 69 72 74 75 61 6c 2c 20   int isVirtual, 
6f10: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
6f20: 73 20 69 73 20 61 20 56 49 52 54 55 41 4c 20 74  s is a VIRTUAL t
6f30: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  able */.  int no
6f40: 45 72 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  Err        /* Do
6f50: 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c   nothing if tabl
6f60: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
6f70: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
6f80: 70 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a  pTable;.  char *
6f90: 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68  zName = 0; /* Th
6fa0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65  e name of the ne
6fb0: 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  w table */.  sql
6fc0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
6fd0: 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
6fe0: 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  ;.  int iDb;    
6ff0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
7000: 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74   number to creat
7010: 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a  e the table in *
7020: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
7030: 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66  ;    /* Unqualif
7040: 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ied name of the 
7050: 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  table to create 
7060: 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e  */..  if( db->in
7070: 69 74 2e 62 75 73 79 20 26 26 20 64 62 2d 3e 69  it.busy && db->i
7080: 6e 69 74 2e 6e 65 77 54 6e 75 6d 3d 3d 31 20 29  nit.newTnum==1 )
7090: 7b 0a 20 20 20 20 2f 2a 20 53 70 65 63 69 61 6c  {.    /* Special
70a0: 20 63 61 73 65 3a 20 20 50 61 72 73 69 6e 67 20   case:  Parsing 
70b0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
70c0: 72 20 6f 72 20 73 71 6c 69 74 65 5f 74 65 6d 70  r or sqlite_temp
70d0: 5f 6d 61 73 74 65 72 20 73 63 68 65 6d 61 20 2a  _master schema *
70e0: 2f 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e  /.    iDb = db->
70f0: 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 7a 4e  init.iDb;.    zN
7100: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
7110: 74 72 44 75 70 28 64 62 2c 20 53 43 48 45 4d 41  trDup(db, SCHEMA
7120: 5f 54 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20  _TABLE(iDb));.  
7130: 20 20 70 4e 61 6d 65 20 3d 20 70 4e 61 6d 65 31    pName = pName1
7140: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
7150: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
7160: 65 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73  e */.    iDb = s
7170: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
7180: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
7190: 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
71a0: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
71b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69   ) return;.    i
71c0: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
71d0: 26 26 20 69 73 54 65 6d 70 20 26 26 20 70 4e 61  && isTemp && pNa
71e0: 6d 65 32 2d 3e 6e 3e 30 20 26 26 20 69 44 62 21  me2->n>0 && iDb!
71f0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =1 ){.      /* I
7200: 66 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d  f creating a tem
7210: 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d  p table, the nam
7220: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61  e may not be qua
7230: 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73 73 20 0a  lified. Unless .
7240: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
7250: 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 22 74  abase name is "t
7260: 65 6d 70 22 20 61 6e 79 77 61 79 2e 20 20 2a 2f  emp" anyway.  */
7270: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
7280: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
7290: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
72a0: 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71  name must be unq
72b0: 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20  ualified");.    
72c0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
72d0: 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
72e0: 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29  MPDB && isTemp )
72f0: 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 7a 4e   iDb = 1;.    zN
7300: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
7310: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
7320: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 49  Name);.    if( I
7330: 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
7340: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7350: 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70  RenameTokenMap(p
7360: 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 7a 4e  Parse, (void*)zN
7370: 61 6d 65 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20  ame, pName);.   
7380: 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d   }.  }.  pParse-
7390: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70  >sNameToken = *p
73a0: 4e 61 6d 65 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  Name;.  if( zNam
73b0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
73c0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
73d0: 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
73e0: 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a  ctName(pParse, z
73f0: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  Name) ){.    got
7400: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
7410: 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  ror;.  }.  if( d
7420: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29  b->init.iDb==1 )
7430: 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66   isTemp = 1;.#if
7440: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7450: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
7460: 20 61 73 73 65 72 74 28 20 69 73 54 65 6d 70 3d   assert( isTemp=
7470: 3d 30 20 7c 7c 20 69 73 54 65 6d 70 3d 3d 31 20  =0 || isTemp==1 
7480: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 56  );.  assert( isV
7490: 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69 65 77  iew==0 || isView
74a0: 3d 3d 31 20 29 3b 0a 20 20 7b 0a 20 20 20 20 73  ==1 );.  {.    s
74b0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
74c0: 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Code[] = {.     
74d0: 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f    SQLITE_CREATE_
74e0: 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 53 51  TABLE,.       SQ
74f0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
7500: 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 53  _TABLE,.       S
7510: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45  QLITE_CREATE_VIE
7520: 57 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45  W,.       SQLITE
7530: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45  _CREATE_TEMP_VIE
7540: 57 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 68 61  W.    };.    cha
7550: 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
7560: 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a  [iDb].zDbSName;.
7570: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
7580: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
7590: 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
75a0: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54  SCHEMA_TABLE(isT
75b0: 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b  emp), 0, zDb) ){
75c0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
75d0: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
75e0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73     }.    if( !is
75f0: 56 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74  Virtual && sqlit
7600: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
7610: 73 65 2c 20 28 69 6e 74 29 61 43 6f 64 65 5b 69  se, (int)aCode[i
7620: 73 54 65 6d 70 2b 32 2a 69 73 56 69 65 77 5d 2c  sTemp+2*isView],
7630: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7650: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 30          zName, 0
7660: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
7670: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
7680: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
7690: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d  }.#endif..  /* M
76a0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77  ake sure the new
76b0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73   table name does
76c0: 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74   not collide wit
76d0: 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20  h an existing.  
76e0: 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
76f0: 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 61  e name in the sa
7700: 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 73  me database.  Is
7710: 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  sue an error mes
7720: 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74 20  sage if.  ** it 
7730: 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70 74  does. The except
7740: 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73 74  ion is if the st
7750: 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70 61  atement being pa
7760: 72 73 65 64 20 77 61 73 20 70 61 73 73 65 64 0a  rsed was passed.
7770: 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74    ** to an sqlit
7780: 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28  e3_declare_vtab(
7790: 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20  ) call. In that 
77a0: 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f  case only the co
77b0: 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20  lumn names.  ** 
77c0: 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20 62  and types will b
77d0: 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72 65  e used, so there
77e0: 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74   is no need to t
77f0: 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61 63  est for namespac
7800: 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e  e.  ** collision
7810: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 49  s..  */.  if( !I
7820: 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52 53 45 20  N_SPECIAL_PARSE 
7830: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62  ){.    char *zDb
7840: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
7850: 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69 66  zDbSName;.    if
7860: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
7870: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
7880: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20  Parse) ){.      
7890: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
78a0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
78b0: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
78c0: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
78d0: 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20  zName, zDb);.   
78e0: 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20   if( pTable ){. 
78f0: 20 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20       if( !noErr 
7900: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7910: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7920: 65 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72  e, "table %T alr
7930: 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e  eady exists", pN
7940: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
7950: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
7960: 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
7970: 79 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  y || CORRUPT_DB 
7980: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7990: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
79a0: 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
79b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
79c0: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
79d0: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
79e0: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
79f0: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
7a00: 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20   zDb)!=0 ){.    
7a10: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
7a20: 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
7a30: 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69   is already an i
7a40: 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20  ndex named %s", 
7a50: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f  zName);.      go
7a60: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7a70: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rror;.    }.  }.
7a80: 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  .  pTable = sqli
7a90: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
7aa0: 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
7ab0: 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65  ));.  if( pTable
7ac0: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
7ad0: 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
7ae0: 6c 65 64 20 29 3b 0a 20 20 20 20 70 50 61 72 73  led );.    pPars
7af0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  e->rc = SQLITE_N
7b00: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 70  OMEM_BKPT;.    p
7b10: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
7b20: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
7b30: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  ble_error;.  }. 
7b40: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d   pTable->zName =
7b50: 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65   zName;.  pTable
7b60: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
7b70: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20  pTable->pSchema 
7b80: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
7b90: 53 63 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65  Schema;.  pTable
7ba0: 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 23  ->nTabRef = 1;.#
7bb0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46  ifdef SQLITE_DEF
7bc0: 41 55 4c 54 5f 52 4f 57 45 53 54 0a 20 20 70 54  AULT_ROWEST.  pT
7bd0: 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  able->nRowLogEst
7be0: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
7bf0: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
7c00: 52 4f 57 45 53 54 29 3b 0a 23 65 6c 73 65 0a 20  ROWEST);.#else. 
7c10: 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67   pTable->nRowLog
7c20: 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72  Est = 200; asser
7c30: 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c  t( 200==sqlite3L
7c40: 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29  ogEst(1048576) )
7c50: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
7c60: 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  t( pParse->pNewT
7c70: 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 70 50 61  able==0 );.  pPa
7c80: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d  rse->pNewTable =
7c90: 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49   pTable;..  /* I
7ca0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d 61  f this is the ma
7cb0: 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75 65  gic sqlite_seque
7cc0: 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64 20 62  nce table used b
7cd0: 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c  y autoincrement,
7ce0: 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72  .  ** then recor
7cf0: 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  d a pointer to t
7d00: 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68 65  his table in the
7d10: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73   main database s
7d20: 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f  tructure.  ** so
7d30: 20 74 68 61 74 20 49 4e 53 45 52 54 20 63 61 6e   that INSERT can
7d40: 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20   find the table 
7d50: 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  easily..  */.#if
7d60: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7d70: 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
7d80: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65   if( !pParse->ne
7d90: 73 74 65 64 20 26 26 20 73 74 72 63 6d 70 28 7a  sted && strcmp(z
7da0: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 65  Name, "sqlite_se
7db0: 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20  quence")==0 ){. 
7dc0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
7dd0: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
7de0: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
7df0: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63  .    pTable->pSc
7e00: 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d 20  hema->pSeqTab = 
7e10: 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64  pTable;.  }.#end
7e20: 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67  if..  /* Begin g
7e30: 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f  enerating the co
7e40: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73  de that will ins
7e50: 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72 65  ert the table re
7e60: 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74  cord into.  ** t
7e70: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
7e80: 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e   table.  Note in
7e90: 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61 74   particular that
7ea0: 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61   we must go ahea
7eb0: 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63  d.  ** and alloc
7ec0: 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ate the record n
7ed0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
7ee0: 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20  ble entry now.  
7ef0: 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20  Before any.  ** 
7f00: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
7f10: 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61  NIQUE keywords a
7f20: 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73  re parsed.  Thos
7f30: 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20  e keywords will 
7f40: 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63  cause.  ** indic
7f50: 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  es to be created
7f60: 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72   and the table r
7f70: 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20  ecord must come 
7f80: 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a  before the .  **
7f90: 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65   indices.  Hence
7fa0: 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  , the record num
7fb0: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
7fc0: 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61  e must be alloca
7fd0: 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20  ted.  ** now..  
7fe0: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
7ff0: 69 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20  it.busy && (v = 
8000: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
8010: 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20  Parse))!=0 ){.  
8020: 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 20    int addr1;.   
8030: 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b   int fileFormat;
8040: 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20 72  .    int reg1, r
8050: 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20 2f  eg2, reg3;.    /
8060: 2a 20 6e 75 6c 6c 52 6f 77 5b 5d 20 69 73 20 61  * nullRow[] is a
8070: 6e 20 4f 50 5f 52 65 63 6f 72 64 20 65 6e 63 6f  n OP_Record enco
8080: 64 69 6e 67 20 6f 66 20 61 20 72 6f 77 20 63 6f  ding of a row co
8090: 6e 74 61 69 6e 69 6e 67 20 35 20 4e 55 4c 4c 73  ntaining 5 NULLs
80a0: 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63   */.    static c
80b0: 6f 6e 73 74 20 63 68 61 72 20 6e 75 6c 6c 52 6f  onst char nullRo
80c0: 77 5b 5d 20 3d 20 7b 20 36 2c 20 30 2c 20 30 2c  w[] = { 6, 0, 0,
80d0: 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20   0, 0, 0 };.    
80e0: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
80f0: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
8100: 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66  e, 1, iDb);..#if
8110: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8120: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
8130: 20 20 69 66 28 20 69 73 56 69 72 74 75 61 6c 20    if( isVirtual 
8140: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8150: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
8160: 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a  _VBegin);.    }.
8170: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
8180: 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  f the file forma
8190: 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69  t and encoding i
81a0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
81b0: 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74  ave not been set
81c0: 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68  , .    ** set th
81d0: 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20  em now..    */. 
81e0: 20 20 20 72 65 67 31 20 3d 20 70 50 61 72 73 65     reg1 = pParse
81f0: 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70  ->regRowid = ++p
8200: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
8210: 20 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d 3e   reg2 = pParse->
8220: 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72  regRoot = ++pPar
8230: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65  se->nMem;.    re
8240: 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  g3 = ++pParse->n
8250: 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
8260: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8270: 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62  _ReadCookie, iDb
8280: 2c 20 72 65 67 33 2c 20 42 54 52 45 45 5f 46 49  , reg3, BTREE_FI
8290: 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20 20  LE_FORMAT);.    
82a0: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
82b0: 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  tree(v, iDb);.  
82c0: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
82d0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
82e0: 50 5f 49 66 2c 20 72 65 67 33 29 3b 20 56 64 62  P_If, reg3); Vdb
82f0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
8300: 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28    fileFormat = (
8310: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
8320: 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74  TE_LegacyFileFmt
8330: 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20  )!=0 ?.         
8340: 20 20 20 20 20 20 20 20 20 31 20 3a 20 53 51 4c           1 : SQL
8350: 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52  ITE_MAX_FILE_FOR
8360: 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  MAT;.    sqlite3
8370: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8380: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
8390: 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d   BTREE_FILE_FORM
83a0: 41 54 2c 20 66 69 6c 65 46 6f 72 6d 61 74 29 3b  AT, fileFormat);
83b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
83c0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74  AddOp3(v, OP_Set
83d0: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52  Cookie, iDb, BTR
83e0: 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49 4e 47  EE_TEXT_ENCODING
83f0: 2c 20 45 4e 43 28 64 62 29 29 3b 0a 20 20 20 20  , ENC(db));.    
8400: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
8410: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a  ere(v, addr1);..
8420: 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74      /* This just
8430: 20 63 72 65 61 74 65 73 20 61 20 70 6c 61 63 65   creates a place
8440: 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69  -holder record i
8450: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
8460: 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  ter table..    *
8470: 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63 72 65  * The record cre
8480: 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f  ated does not co
8490: 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79  ntain anything y
84a0: 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20  et.  It will be 
84b0: 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20  replaced.    ** 
84c0: 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72  by the real entr
84d0: 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61  y in code genera
84e0: 74 65 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e  ted at sqlite3En
84f0: 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a  dTable()..    **
8500: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69  .    ** The rowi
8510: 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e  d for the new en
8520: 74 72 79 20 69 73 20 6c 65 66 74 20 69 6e 20 72  try is left in r
8530: 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e  egister pParse->
8540: 72 65 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a  regRowid..    **
8550: 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   The root page n
8560: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77  umber of the new
8570: 20 74 61 62 6c 65 20 69 73 20 6c 65 66 74 20 69   table is left i
8580: 6e 20 72 65 67 20 70 50 61 72 73 65 2d 3e 72 65  n reg pParse->re
8590: 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68  gRoot..    ** Th
85a0: 65 20 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74  e rowid and root
85b0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 76 61 6c   page number val
85c0: 75 65 73 20 61 72 65 20 6e 65 65 64 65 64 20 62  ues are needed b
85d0: 79 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 0a  y the code that.
85e0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e      ** sqlite3En
85f0: 64 54 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65  dTable will gene
8600: 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  rate..    */.#if
8610: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8620: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
8630: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
8640: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
8650: 29 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  ).    if( isView
8660: 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20 29 7b   || isVirtual ){
8670: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8680: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
8690: 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 32 29  nteger, 0, reg2)
86a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
86b0: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 70  if.    {.      p
86c0: 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62  Parse->addrCrTab
86d0: 20 3d 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69   =.         sqli
86e0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
86f0: 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65 2c   OP_CreateBtree,
8700: 20 69 44 62 2c 20 72 65 67 32 2c 20 42 54 52 45   iDb, reg2, BTRE
8710: 45 5f 49 4e 54 4b 45 59 29 3b 0a 20 20 20 20 7d  E_INTKEY);.    }
8720: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  .    sqlite3Open
8730: 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50 61 72  MasterTable(pPar
8740: 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  se, iDb);.    sq
8750: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8760: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
8770: 30 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71  0, reg1);.    sq
8780: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
8790: 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 36 2c 20 72  v, OP_Blob, 6, r
87a0: 65 67 33 2c 20 30 2c 20 6e 75 6c 6c 52 6f 77 2c  eg3, 0, nullRow,
87b0: 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
87c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
87d0: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
87e0: 20 30 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b   0, reg3, reg1);
87f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8800: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
8810: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
8820: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8830: 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a  0(v, OP_Close);.
8840: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
8850: 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74   (non-error) ret
8860: 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  urn. */.  return
8870: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
8880: 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a  ror occurs, we j
8890: 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69  ump here */.begi
88a0: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20  n_table_error:. 
88b0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
88c0: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  b, zName);.  ret
88d0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 74 20 70  urn;.}../* Set p
88e0: 72 6f 70 65 72 74 69 65 73 20 6f 66 20 61 20 74  roperties of a t
88f0: 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 62 61 73 65  able column base
8900: 64 20 6f 6e 20 74 68 65 20 28 6d 61 67 69 63 61  d on the (magica
8910: 6c 29 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68  l).** name of th
8920: 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 23 69 66  e column..*/.#if
8930: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 48   SQLITE_ENABLE_H
8940: 49 44 44 45 4e 5f 43 4f 4c 55 4d 4e 53 0a 76 6f  IDDEN_COLUMNS.vo
8950: 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  id sqlite3Column
8960: 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61  PropertiesFromNa
8970: 6d 65 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  me(Table *pTab, 
8980: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b 0a 20  Column *pCol){. 
8990: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
89a0: 6e 69 63 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  nicmp(pCol->zNam
89b0: 65 2c 20 22 5f 5f 68 69 64 64 65 6e 5f 5f 22 2c  e, "__hidden__",
89c0: 20 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70   10)==0 ){.    p
89d0: 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d  Col->colFlags |=
89e0: 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e 3b   COLFLAG_HIDDEN;
89f0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61  .  }else if( pTa
8a00: 62 20 26 26 20 70 43 6f 6c 21 3d 70 54 61 62 2d  b && pCol!=pTab-
8a10: 3e 61 43 6f 6c 20 26 26 20 28 70 43 6f 6c 5b 2d  >aCol && (pCol[-
8a20: 31 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f  1].colFlags & CO
8a30: 4c 46 4c 41 47 5f 48 49 44 44 45 4e 29 20 29 7b  LFLAG_HIDDEN) ){
8a40: 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c  .    pTab->tabFl
8a50: 61 67 73 20 7c 3d 20 54 46 5f 4f 4f 4f 48 69 64  ags |= TF_OOOHid
8a60: 64 65 6e 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  den;.  }.}.#endi
8a70: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  f.../*.** Add a 
8a80: 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68  new column to th
8a90: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
8aa0: 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63  y being construc
8ab0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
8ac0: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
8ad0: 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f   routine once fo
8ae0: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65  r each column de
8af0: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  claration.** in 
8b00: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
8b10: 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74  tatement.  sqlit
8b20: 65 33 53 74 61 72 74 54 61 62 6c 65 28 29 20 67  e3StartTable() g
8b30: 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69  ets called.** fi
8b40: 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e 67  rst to get thing
8b50: 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74  s going.  Then t
8b60: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
8b70: 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a 2a  alled for each.*
8b80: 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69  * column..*/.voi
8b90: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  d sqlite3AddColu
8ba0: 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  mn(Parse *pParse
8bb0: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20  , Token *pName, 
8bc0: 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20  Token *pType){. 
8bd0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
8be0: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   i;.  char *z;. 
8bf0: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20   char *zType;.  
8c00: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
8c10: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
8c20: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
8c30: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
8c40: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
8c50: 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 43  urn;.  if( p->nC
8c60: 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  ol+1>db->aLimit[
8c70: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
8c80: 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  UMN] ){.    sqli
8c90: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8ca0: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f  se, "too many co
8cb0: 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d  lumns on %s", p-
8cc0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
8cd0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73  urn;.  }.  z = s
8ce0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
8cf0: 77 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 6e 20 2b  w(db, pName->n +
8d00: 20 70 54 79 70 65 2d 3e 6e 20 2b 20 32 29 3b 0a   pType->n + 2);.
8d10: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
8d20: 75 72 6e 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45  urn;.  if( IN_RE
8d30: 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 20 73 71  NAME_OBJECT ) sq
8d40: 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e  lite3RenameToken
8d50: 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f 69  Map(pParse, (voi
8d60: 64 2a 29 7a 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  d*)z, pName);.  
8d70: 6d 65 6d 63 70 79 28 7a 2c 20 70 4e 61 6d 65 2d  memcpy(z, pName-
8d80: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20  >z, pName->n);. 
8d90: 20 7a 5b 70 4e 61 6d 65 2d 3e 6e 5d 20 3d 20 30   z[pName->n] = 0
8da0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f  ;.  sqlite3Dequo
8db0: 74 65 28 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 30  te(z);.  for(i=0
8dc0: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
8dd0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
8de0: 65 33 5f 73 74 72 69 63 6d 70 28 7a 2c 20 70 2d  e3_stricmp(z, p-
8df0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  >aCol[i].zName)=
8e00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
8e10: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8e20: 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63  se, "duplicate c
8e30: 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c  olumn name: %s",
8e40: 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   z);.      sqlit
8e50: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
8e60: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
8e70: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28     }.  }.  if( (
8e80: 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d  p->nCol & 0x7)==
8e90: 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20  0 ){.    Column 
8ea0: 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20  *aNew;.    aNew 
8eb0: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
8ec0: 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70  oc(db,p->aCol,(p
8ed0: 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66  ->nCol+8)*sizeof
8ee0: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
8ef0: 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
8f00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
8f10: 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20  bFree(db, z);.  
8f20: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
8f30: 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20  }.    p->aCol = 
8f40: 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c  aNew;.  }.  pCol
8f50: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e   = &p->aCol[p->n
8f60: 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  Col];.  memset(p
8f70: 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  Col, 0, sizeof(p
8f80: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70  ->aCol[0]));.  p
8f90: 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a  Col->zName = z;.
8fa0: 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50    sqlite3ColumnP
8fb0: 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d  ropertiesFromNam
8fc0: 65 28 70 2c 20 70 43 6f 6c 29 3b 0a 20 0a 20 20  e(p, pCol);. .  
8fd0: 69 66 28 20 70 54 79 70 65 2d 3e 6e 3d 3d 30 20  if( pType->n==0 
8fe0: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
8ff0: 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70  re is no type sp
9000: 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73  ecified, columns
9010: 20 68 61 76 65 20 74 68 65 20 64 65 66 61 75 6c   have the defaul
9020: 74 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20 2a  t affinity.    *
9030: 2a 20 27 42 4c 4f 42 27 20 77 69 74 68 20 61 20  * 'BLOB' with a 
9040: 64 65 66 61 75 6c 74 20 73 69 7a 65 20 6f 66 20  default size of 
9050: 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20  4 bytes. */.    
9060: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
9070: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
9080: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a 45 73  ;.    pCol->szEs
9090: 74 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51  t = 1;.#ifdef SQ
90a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
90b0: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
90c0: 20 20 69 66 28 20 34 3e 3d 73 71 6c 69 74 65 33    if( 4>=sqlite3
90d0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53  GlobalConfig.szS
90e0: 6f 72 74 65 72 52 65 66 20 29 7b 0a 20 20 20 20  orterRef ){.    
90f0: 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73    pCol->colFlags
9100: 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 53 4f 52 54   |= COLFLAG_SORT
9110: 45 52 52 45 46 3b 0a 20 20 20 20 7d 0a 23 65 6e  ERREF;.    }.#en
9120: 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
9130: 20 7a 54 79 70 65 20 3d 20 7a 20 2b 20 73 71 6c   zType = z + sql
9140: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20  ite3Strlen30(z) 
9150: 2b 20 31 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  + 1;.    memcpy(
9160: 7a 54 79 70 65 2c 20 70 54 79 70 65 2d 3e 7a 2c  zType, pType->z,
9170: 20 70 54 79 70 65 2d 3e 6e 29 3b 0a 20 20 20 20   pType->n);.    
9180: 7a 54 79 70 65 5b 70 54 79 70 65 2d 3e 6e 5d 20  zType[pType->n] 
9190: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
91a0: 44 65 71 75 6f 74 65 28 7a 54 79 70 65 29 3b 0a  Dequote(zType);.
91b0: 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69      pCol->affini
91c0: 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69  ty = sqlite3Affi
91d0: 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65 2c 20  nityType(zType, 
91e0: 70 43 6f 6c 29 3b 0a 20 20 20 20 70 43 6f 6c 2d  pCol);.    pCol-
91f0: 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c  >colFlags |= COL
9200: 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a 20 20  FLAG_HASTYPE;.  
9210: 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 20  }.  p->nCol++;. 
9220: 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61   pParse->constra
9230: 69 6e 74 4e 61 6d 65 2e 6e 20 3d 20 30 3b 0a 7d  intName.n = 0;.}
9240: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
9250: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
9260: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
9270: 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
9280: 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61   of.** parsing a
9290: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
92a0: 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54  atement.  A "NOT
92b0: 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e   NULL" constrain
92c0: 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65  t has.** been se
92d0: 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20  en on a column. 
92e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
92f0: 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66  ts the notNull f
9300: 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f  lag on.** the co
9310: 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75  lumn currently u
9320: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
9330: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
9340: 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72  e3AddNotNull(Par
9350: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
9360: 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c  onError){.  Tabl
9370: 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  e *p;.  Column *
9380: 70 43 6f 6c 3b 0a 20 20 70 20 3d 20 70 50 61 72  pCol;.  p = pPar
9390: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
93a0: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56   if( p==0 || NEV
93b0: 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20  ER(p->nCol<1) ) 
93c0: 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d  return;.  pCol =
93d0: 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f   &p->aCol[p->nCo
93e0: 6c 2d 31 5d 3b 0a 20 20 70 43 6f 6c 2d 3e 6e 6f  l-1];.  pCol->no
93f0: 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45 72  tNull = (u8)onEr
9400: 72 6f 72 3b 0a 20 20 70 2d 3e 74 61 62 46 6c 61  ror;.  p->tabFla
9410: 67 73 20 7c 3d 20 54 46 5f 48 61 73 4e 6f 74 4e  gs |= TF_HasNotN
9420: 75 6c 6c 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  ull;..  /* Set t
9430: 68 65 20 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 66  he uniqNotNull f
9440: 6c 61 67 20 6f 6e 20 61 6e 79 20 55 4e 49 51 55  lag on any UNIQU
9450: 45 20 6f 72 20 50 4b 20 69 6e 64 65 78 65 73 20  E or PK indexes 
9460: 61 6c 72 65 61 64 79 20 63 72 65 61 74 65 64 0a  already created.
9470: 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 63 6f 6c    ** on this col
9480: 75 6d 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  umn.  */.  if( p
9490: 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 20  Col->colFlags & 
94a0: 43 4f 4c 46 4c 41 47 5f 55 4e 49 51 55 45 20 29  COLFLAG_UNIQUE )
94b0: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
94c0: 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  x;.    for(pIdx=
94d0: 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  p->pIndex; pIdx;
94e0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
94f0: 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t){.      assert
9500: 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d  ( pIdx->nKeyCol=
9510: 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e 45 72  =1 && pIdx->onEr
9520: 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a  ror!=OE_None );.
9530: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
9540: 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 70 2d 3e  aiColumn[0]==p->
9550: 6e 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20  nCol-1 ){.      
9560: 20 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e    pIdx->uniqNotN
9570: 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ull = 1;.      }
9580: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
9590: 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c  .** Scan the col
95a0: 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54  umn type name zT
95b0: 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70  ype (length nTyp
95c0: 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  e) and return th
95d0: 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  e.** associated 
95e0: 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a  affinity type..*
95f0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
9600: 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e  e does a case-in
9610: 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68  dependent search
9620: 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68   of zType for th
9630: 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73  e .** substrings
9640: 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
9650: 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20  g table. If one 
9660: 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67  of the substring
9670: 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74  s is.** found, t
9680: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
9690: 20 61 66 66 69 6e 69 74 79 20 69 73 20 72 65 74   affinity is ret
96a0: 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20  urned. If zType 
96b0: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65  contains.** more
96c0: 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65   than one of the
96d0: 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74   substrings, ent
96e0: 72 69 65 73 20 74 6f 77 61 72 64 20 74 68 65 20  ries toward the 
96f0: 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74  top of .** the t
9700: 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69  able take priori
9710: 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  ty. For example,
9720: 20 69 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c   if zType is 'BL
9730: 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49  OBINT', .** SQLI
9740: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69  TE_AFF_INTEGER i
9750: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
9760: 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20 20 20  * Substring     
9770: 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d  | Affinity.** --
9780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
97a0: 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20 20 20  * 'INT'         
97b0: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  | SQLITE_AFF_INT
97c0: 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20  EGER.** 'CHAR'  
97d0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
97e0: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42  FF_TEXT.** 'CLOB
97f0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
9800: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54  E_AFF_TEXT.** 'T
9810: 45 58 54 27 20 20 20 20 20 20 20 20 7c 20 53 51  EXT'        | SQ
9820: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
9830: 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c   'BLOB'        |
9840: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
9850: 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20  .** 'REAL'      
9860: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52    | SQLITE_AFF_R
9870: 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20  EAL.** 'FLOA'   
9880: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
9890: 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27  F_REAL.** 'DOUB'
98a0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
98b0: 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20  _AFF_REAL.**.** 
98c0: 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73  If none of the s
98d0: 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65  ubstrings in the
98e0: 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65   above table are
98f0: 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54   found,.** SQLIT
9900: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73  E_AFF_NUMERIC is
9910: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68   returned..*/.ch
9920: 61 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69  ar sqlite3Affini
9930: 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61  tyType(const cha
9940: 72 20 2a 7a 49 6e 2c 20 43 6f 6c 75 6d 6e 20 2a  r *zIn, Column *
9950: 70 43 6f 6c 29 7b 0a 20 20 75 33 32 20 68 20 3d  pCol){.  u32 h =
9960: 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66 20 3d   0;.  char aff =
9970: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
9980: 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  RIC;.  const cha
9990: 72 20 2a 7a 43 68 61 72 20 3d 20 30 3b 0a 0a 20  r *zChar = 0;.. 
99a0: 20 61 73 73 65 72 74 28 20 7a 49 6e 21 3d 30 20   assert( zIn!=0 
99b0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 5b  );.  while( zIn[
99c0: 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20 28 68  0] ){.    h = (h
99d0: 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55 70  <<8) + sqlite3Up
99e0: 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49 6e  perToLower[(*zIn
99f0: 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a 49 6e  )&0xff];.    zIn
9a00: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 28  ++;.    if( h==(
9a10: 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c  ('c'<<24)+('h'<<
9a20: 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27  16)+('a'<<8)+'r'
9a30: 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  ) ){            
9a40: 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20 20   /* CHAR */.    
9a50: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
9a60: 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 7a  FF_TEXT;.      z
9a70: 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 20 20 20 20  Char = zIn;.    
9a80: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
9a90: 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  c'<<24)+('l'<<16
9aa0: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20  )+('o'<<8)+'b') 
9ab0: 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42  ){       /* CLOB
9ac0: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
9ad0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
9ae0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
9af0: 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65  ==(('t'<<24)+('e
9b00: 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b  '<<16)+('x'<<8)+
9b10: 27 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a  't') ){       /*
9b20: 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61   TEXT */.      a
9b30: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
9b40: 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20  TEXT;.    }else 
9b50: 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34  if( h==(('b'<<24
9b60: 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27  )+('l'<<16)+('o'
9b70: 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20  <<8)+'b')       
9b80: 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20     /* BLOB */.  
9b90: 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53        && (aff==S
9ba0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
9bb0: 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  C || aff==SQLITE
9bc0: 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20  _AFF_REAL) ){.  
9bd0: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
9be0: 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20  _AFF_BLOB;.     
9bf0: 20 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27 28 27   if( zIn[0]=='('
9c00: 20 29 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a   ) zChar = zIn;.
9c10: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9c20: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
9c30: 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  NT.    }else if(
9c40: 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28   h==(('r'<<24)+(
9c50: 27 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38  'e'<<16)+('a'<<8
9c60: 29 2b 27 6c 27 29 20 20 20 20 20 20 20 20 20 20  )+'l')          
9c70: 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20  /* REAL */.     
9c80: 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54     && aff==SQLIT
9c90: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b  E_AFF_NUMERIC ){
9ca0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
9cb0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20  ITE_AFF_REAL;.  
9cc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
9cd0: 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c  ('f'<<24)+('l'<<
9ce0: 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27  16)+('o'<<8)+'a'
9cf0: 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 4c  )          /* FL
9d00: 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26  OA */.        &&
9d10: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
9d20: 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20  _NUMERIC ){.    
9d30: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
9d40: 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c  FF_REAL;.    }el
9d50: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 64 27 3c  se if( h==(('d'<
9d60: 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28  <24)+('o'<<16)+(
9d70: 27 75 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20  'u'<<8)+'b')    
9d80: 20 20 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f        /* DOUB */
9d90: 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d  .        && aff=
9da0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
9db0: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66  RIC ){.      aff
9dc0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   = SQLITE_AFF_RE
9dd0: 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  AL;.#endif.    }
9de0: 65 6c 73 65 20 69 66 28 20 28 68 26 30 78 30 30  else if( (h&0x00
9df0: 46 46 46 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c  FFFFFF)==(('i'<<
9e00: 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27  16)+('n'<<8)+'t'
9e10: 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a  ) ){    /* INT *
9e20: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
9e30: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
9e40: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9e50: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
9e60: 66 20 70 43 6f 6c 20 69 73 20 6e 6f 74 20 4e 55  f pCol is not NU
9e70: 4c 4c 2c 20 73 74 6f 72 65 20 61 6e 20 65 73 74  LL, store an est
9e80: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 66 69 65  imate of the fie
9e90: 6c 64 20 73 69 7a 65 2e 20 20 54 68 65 0a 20 20  ld size.  The.  
9ea0: 2a 2a 20 65 73 74 69 6d 61 74 65 20 69 73 20 73  ** estimate is s
9eb0: 63 61 6c 65 64 20 73 6f 20 74 68 61 74 20 74 68  caled so that th
9ec0: 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 69 6e 74  e size of an int
9ed0: 65 67 65 72 20 69 73 20 31 2e 20 20 2a 2f 0a 20  eger is 1.  */. 
9ee0: 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20   if( pCol ){.   
9ef0: 20 69 6e 74 20 76 20 3d 20 30 3b 20 20 20 2f 2a   int v = 0;   /*
9f00: 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20 69 73   default size is
9f10: 20 61 70 70 72 6f 78 20 34 20 62 79 74 65 73 20   approx 4 bytes 
9f20: 2a 2f 0a 20 20 20 20 69 66 28 20 61 66 66 3c 53  */.    if( aff<S
9f30: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
9f40: 43 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  C ){.      if( z
9f50: 43 68 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Char ){.        
9f60: 77 68 69 6c 65 28 20 7a 43 68 61 72 5b 30 5d 20  while( zChar[0] 
9f70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
9f80: 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28   sqlite3Isdigit(
9f90: 7a 43 68 61 72 5b 30 5d 29 20 29 7b 0a 20 20 20  zChar[0]) ){.   
9fa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42           /* BLOB
9fb0: 28 6b 29 2c 20 56 41 52 43 48 41 52 28 6b 29 2c  (k), VARCHAR(k),
9fc0: 20 43 48 41 52 28 6b 29 20 2d 3e 20 72 3d 28 6b   CHAR(k) -> r=(k
9fd0: 2f 34 2b 31 29 20 2a 2f 0a 20 20 20 20 20 20 20  /4+1) */.       
9fe0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 74 49       sqlite3GetI
9ff0: 6e 74 33 32 28 7a 43 68 61 72 2c 20 26 76 29 3b  nt32(zChar, &v);
a000: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
a010: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
a020: 20 20 20 20 20 20 20 20 20 20 7a 43 68 61 72 2b            zChar+
a030: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
a040: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a050: 20 20 76 20 3d 20 31 36 3b 20 20 20 2f 2a 20 42    v = 16;   /* B
a060: 4c 4f 42 2c 20 54 45 58 54 2c 20 43 4c 4f 42 20  LOB, TEXT, CLOB 
a070: 2d 3e 20 72 3d 35 20 20 28 61 70 70 72 6f 78 20  -> r=5  (approx 
a080: 32 30 20 62 79 74 65 73 29 2a 2f 0a 20 20 20 20  20 bytes)*/.    
a090: 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66    }.    }.#ifdef
a0a0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
a0b0: 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53  ORTER_REFERENCES
a0c0: 0a 20 20 20 20 69 66 28 20 76 3e 3d 73 71 6c 69  .    if( v>=sqli
a0d0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
a0e0: 73 7a 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20  szSorterRef ){. 
a0f0: 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c       pCol->colFl
a100: 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 53  ags |= COLFLAG_S
a110: 4f 52 54 45 52 52 45 46 3b 0a 20 20 20 20 7d 0a  ORTERREF;.    }.
a120: 23 65 6e 64 69 66 0a 20 20 20 20 76 20 3d 20 76  #endif.    v = v
a130: 2f 34 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20  /4 + 1;.    if( 
a140: 76 3e 32 35 35 20 29 20 76 20 3d 20 32 35 35 3b  v>255 ) v = 255;
a150: 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a 45 73 74  .    pCol->szEst
a160: 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = v;.  }.  retu
a170: 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aff;.}../*.**
a180: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
a190: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76  is the default v
a1a0: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 73  alue for the mos
a1b0: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
a1c0: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68   column.** of th
a1d0: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
a1e0: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
a1f0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61  tion..**.** Defa
a200: 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65 73  ult value expres
a210: 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63 6f  sions must be co
a220: 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20 61  nstant.  Raise a
a230: 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74  n exception if t
a240: 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68  his.** is not th
a250: 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e case..**.** Th
a260: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
a270: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
a280: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
a290: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
a2a0: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
a2b0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
a2c0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
a2d0: 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 0a 20  dDefaultValue(. 
a2e0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
a2f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
a300: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
a310: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
a320: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
a330: 65 20 70 61 72 73 65 64 20 65 78 70 72 65 73 73  e parsed express
a340: 69 6f 6e 20 6f 66 20 74 68 65 20 64 65 66 61 75  ion of the defau
a350: 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 63 6f  lt value */.  co
a360: 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61 72 74  nst char *zStart
a370: 2c 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20  ,      /* Start 
a380: 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 76  of the default v
a390: 61 6c 75 65 20 74 65 78 74 20 2a 2f 0a 20 20 63  alue text */.  c
a3a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 20  onst char *zEnd 
a3b0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
a3c0: 20 63 68 61 72 61 63 74 65 72 20 70 61 73 74 20   character past 
a3d0: 65 6e 64 20 6f 66 20 64 65 66 61 75 74 20 76 61  end of defaut va
a3e0: 6c 75 65 20 74 65 78 74 20 2a 2f 0a 29 7b 0a 20  lue text */.){. 
a3f0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c   Table *p;.  Col
a400: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c  umn *pCol;.  sql
a410: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
a420: 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 70 50 61  e->db;.  p = pPa
a430: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
a440: 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20    if( p!=0 ){.  
a450: 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43    pCol = &(p->aC
a460: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a  ol[p->nCol-1]);.
a470: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
a480: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
a490: 46 75 6e 63 74 69 6f 6e 28 70 45 78 70 72 2c 20  Function(pExpr, 
a4a0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20 29  db->init.busy) )
a4b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
a4c0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
a4d0: 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f  "default value o
a4e0: 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73  f column [%s] is
a4f0: 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a   not constant",.
a500: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
a510: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
a520: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 63 6f  e{.      /* A co
a530: 70 79 20 6f 66 20 70 45 78 70 72 20 69 73 20 75  py of pExpr is u
a540: 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74  sed instead of t
a550: 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73 20  he original, as 
a560: 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a 20  pExpr contains. 
a570: 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 74       ** tokens t
a580: 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f 6c  hat point to vol
a590: 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 0a 20 20  atile memory..  
a5a0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70      */.      Exp
a5b0: 72 20 78 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r x;.      sqlit
a5c0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
a5d0: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20   pCol->pDflt);. 
a5e0: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 78 2c 20       memset(&x, 
a5f0: 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20  0, sizeof(x));. 
a600: 20 20 20 20 20 78 2e 6f 70 20 3d 20 54 4b 5f 53       x.op = TK_S
a610: 50 41 4e 3b 0a 20 20 20 20 20 20 78 2e 75 2e 7a  PAN;.      x.u.z
a620: 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 44  Token = sqlite3D
a630: 62 53 70 61 6e 44 75 70 28 64 62 2c 20 7a 53 74  bSpanDup(db, zSt
a640: 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20 20 20  art, zEnd);.    
a650: 20 20 78 2e 70 4c 65 66 74 20 3d 20 70 45 78 70    x.pLeft = pExp
a660: 72 3b 0a 20 20 20 20 20 20 78 2e 66 6c 61 67 73  r;.      x.flags
a670: 20 3d 20 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20   = EP_Skip;.    
a680: 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20    pCol->pDflt = 
a690: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
a6a0: 62 2c 20 26 78 2c 20 45 58 50 52 44 55 50 5f 52  b, &x, EXPRDUP_R
a6b0: 45 44 55 43 45 29 3b 0a 20 20 20 20 20 20 73 71  EDUCE);.      sq
a6c0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
a6d0: 78 2e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  x.u.zToken);.   
a6e0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 49 4e 5f   }.  }.  if( IN_
a6f0: 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
a700: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61  .    sqlite3Rena
a710: 6d 65 45 78 70 72 55 6e 6d 61 70 28 70 50 61 72  meExprUnmap(pPar
a720: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d 0a  se, pExpr);.  }.
a730: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
a740: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
a750: 7d 0a 0a 2f 2a 0a 2a 2a 20 42 61 63 6b 77 61 72  }../*.** Backwar
a760: 64 73 20 43 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds Compatibility
a770: 20 48 61 63 6b 3a 0a 2a 2a 20 0a 2a 2a 20 48 69   Hack:.** .** Hi
a780: 73 74 6f 72 69 63 61 6c 20 76 65 72 73 69 6f 6e  storical version
a790: 73 20 6f 66 20 53 51 4c 69 74 65 20 61 63 63 65  s of SQLite acce
a7a0: 70 74 65 64 20 73 74 72 69 6e 67 73 20 61 73 20  pted strings as 
a7b0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 0a  column names in.
a7c0: 2a 2a 20 69 6e 64 65 78 65 73 20 61 6e 64 20 50  ** indexes and P
a7d0: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
a7e0: 72 61 69 6e 74 73 20 61 6e 64 20 69 6e 20 55 4e  raints and in UN
a7f0: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73  IQUE constraints
a800: 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  .  Example:.**.*
a810: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
a820: 4c 45 20 78 79 7a 28 61 2c 62 2c 63 2c 64 2c 65  LE xyz(a,b,c,d,e
a830: 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 27 61 27  ,PRIMARY KEY('a'
a840: 29 2c 55 4e 49 51 55 45 28 27 62 27 2c 27 63 27  ),UNIQUE('b','c'
a850: 20 43 4f 4c 4c 41 54 45 20 74 72 69 6d 29 0a 2a   COLLATE trim).*
a860: 2a 20 20 20 20 20 43 52 45 41 54 45 20 49 4e 44  *     CREATE IND
a870: 45 58 20 61 62 63 20 4f 4e 20 78 79 7a 28 27 63  EX abc ON xyz('c
a880: 27 2c 27 64 27 20 44 45 53 43 2c 27 65 27 20 43  ','d' DESC,'e' C
a890: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 44 45  OLLATE nocase DE
a8a0: 53 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SC);.**.** This 
a8b0: 69 73 20 67 6f 6f 66 79 2e 20 20 42 75 74 20 74  is goofy.  But t
a8c0: 6f 20 70 72 65 73 65 72 76 65 20 62 61 63 6b 77  o preserve backw
a8d0: 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
a8e0: 74 79 20 77 65 20 63 6f 6e 74 69 6e 75 65 20 74  ty we continue t
a8f0: 6f 0a 2a 2a 20 61 63 63 65 70 74 20 69 74 2e 20  o.** accept it. 
a900: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
a910: 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  es the necessary
a920: 20 63 6f 6e 76 65 72 73 69 6f 6e 2e 20 20 49 74   conversion.  It
a930: 20 63 6f 6e 76 65 72 74 73 0a 2a 2a 20 74 68 65   converts.** the
a940: 20 65 78 70 72 65 73 73 69 6f 6e 20 67 69 76 65   expression give
a950: 6e 20 69 6e 20 69 74 73 20 61 72 67 75 6d 65 6e  n in its argumen
a960: 74 20 66 72 6f 6d 20 61 20 54 4b 5f 53 54 52 49  t from a TK_STRI
a970: 4e 47 20 69 6e 74 6f 20 61 20 54 4b 5f 49 44 0a  NG into a TK_ID.
a980: 2a 2a 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ** if the expres
a990: 73 69 6f 6e 20 69 73 20 6a 75 73 74 20 61 20 54  sion is just a T
a9a0: 4b 5f 53 54 52 49 4e 47 20 77 69 74 68 20 61 6e  K_STRING with an
a9b0: 20 6f 70 74 69 6f 6e 61 6c 20 43 4f 4c 4c 41 54   optional COLLAT
a9c0: 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 49 66 20  E clause..** If 
a9d0: 74 68 65 20 65 70 78 72 65 73 73 69 6f 6e 20 69  the epxression i
a9e0: 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72  s anything other
a9f0: 20 74 68 61 6e 20 54 4b 5f 53 54 52 49 4e 47 2c   than TK_STRING,
aa00: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
aa10: 69 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e  is.** unchanged.
aa20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
aa30: 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49  sqlite3StringToI
aa40: 64 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  d(Expr *p){.  if
aa50: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49  ( p->op==TK_STRI
aa60: 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e 6f 70 20  NG ){.    p->op 
aa70: 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 65 6c 73 65  = TK_ID;.  }else
aa80: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
aa90: 4f 4c 4c 41 54 45 20 26 26 20 70 2d 3e 70 4c 65  OLLATE && p->pLe
aaa0: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e  ft->op==TK_STRIN
aab0: 47 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 65 66  G ){.    p->pLef
aac0: 74 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a 20  t->op = TK_ID;. 
aad0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69   }.}../*.** Desi
aae0: 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41 52  gnate the PRIMAR
aaf0: 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61  Y KEY for the ta
ab00: 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61  ble.  pList is a
ab10: 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a   list of names .
ab20: 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68  ** of columns th
ab30: 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d  at form the prim
ab40: 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69  ary key.  If pLi
ab50: 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  st is NULL, then
ab60: 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63   the.** most rec
ab70: 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75  ently added colu
ab80: 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  mn of the table 
ab90: 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  is the primary k
aba0: 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c  ey..**.** A tabl
abb0: 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f  e can have at mo
abc0: 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b  st one primary k
abd0: 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c  ey.  If the tabl
abe0: 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a  e already has.**
abf0: 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28   a primary key (
ac00: 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20  and this is the 
ac10: 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b  second primary k
ac20: 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65 20  ey) then create 
ac30: 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a  an.** error..**.
ac40: 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41 52  ** If the PRIMAR
ac50: 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69  Y KEY is on a si
ac60: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73  ngle column whos
ac70: 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49 4e  e datatype is IN
ac80: 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77  TEGER,.** then w
ac90: 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73  e will try to us
aca0: 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73  e that column as
acb0: 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65 74   the rowid.  Set
acc0: 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79   the Table.iPKey
acd0: 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65  .** field of the
ace0: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
acf0: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
ad00: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
ad10: 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d  .** INTEGER PRIM
ad20: 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20  ARY KEY column. 
ad30: 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20   Table.iPKey is 
ad40: 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65  set to -1 if the
ad50: 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45  re is.** no INTE
ad60: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
ad70: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65  .**.** If the ke
ad80: 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45  y is not an INTE
ad90: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
ada0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 75   then create a u
adb0: 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66  nique.** index f
adc0: 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20  or the key.  No 
add0: 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64  index is created
ade0: 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49   for INTEGER PRI
adf0: 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f  MARY KEYs..*/.vo
ae00: 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72 69  id sqlite3AddPri
ae10: 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73 65  maryKey(.  Parse
ae20: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
ae30: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
ae40: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
ae50: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
ae60: 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f  f field names to
ae70: 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
ae80: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
ae90: 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
aea0: 20 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e 65   with a uniquene
aeb0: 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20  ss conflict */. 
aec0: 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20 20   int autoInc,   
aed0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
aee0: 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  e AUTOINCREMENT 
aef0: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
af00: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74  nt */.  int sort
af10: 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51 4c  Order     /* SQL
af20: 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51  ITE_SO_ASC or SQ
af30: 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a  LITE_SO_DESC */.
af40: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
af50: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
af60: 61 62 6c 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  able;.  Column *
af70: 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pCol = 0;.  int 
af80: 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20  iCol = -1, i;.  
af90: 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 69 66 28  int nTerm;.  if(
afa0: 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20   pTab==0 ) goto 
afb0: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
afc0: 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61  ;.  if( pTab->ta
afd0: 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50  bFlags & TF_HasP
afe0: 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20 20  rimaryKey ){.   
aff0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
b000: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
b010: 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68 61  "table \"%s\" ha
b020: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
b030: 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70 54  primary key", pT
b040: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
b050: 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79  goto primary_key
b060: 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61  _exit;.  }.  pTa
b070: 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  b->tabFlags |= T
b080: 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 3b  F_HasPrimaryKey;
b090: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
b0a0: 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54  ){.    iCol = pT
b0b0: 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20  ab->nCol - 1;.  
b0c0: 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e    pCol = &pTab->
b0d0: 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  aCol[iCol];.    
b0e0: 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c  pCol->colFlags |
b0f0: 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45  = COLFLAG_PRIMKE
b100: 59 3b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 31  Y;.    nTerm = 1
b110: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
b120: 54 65 72 6d 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  Term = pList->nE
b130: 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  xpr;.    for(i=0
b140: 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b  ; i<nTerm; i++){
b150: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 45  .      Expr *pCE
b160: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
b170: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69  rSkipCollate(pLi
b180: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
b190: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
b1a0: 43 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  CExpr!=0 );.    
b1b0: 20 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54    sqlite3StringT
b1c0: 6f 49 64 28 70 43 45 78 70 72 29 3b 0a 20 20 20  oId(pCExpr);.   
b1d0: 20 20 20 69 66 28 20 70 43 45 78 70 72 2d 3e 6f     if( pCExpr->o
b1e0: 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20  p==TK_ID ){.    
b1f0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
b200: 7a 43 4e 61 6d 65 20 3d 20 70 43 45 78 70 72 2d  zCName = pCExpr-
b210: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
b220: 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
b230: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  Col<pTab->nCol; 
b240: 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iCol++){.       
b250: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
b260: 72 49 43 6d 70 28 7a 43 4e 61 6d 65 2c 20 70 54  rICmp(zCName, pT
b270: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
b280: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
b290: 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26          pCol = &
b2a0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
b2b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
b2c0: 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20  ol->colFlags |= 
b2d0: 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b  COLFLAG_PRIMKEY;
b2e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
b2f0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
b300: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b310: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
b320: 28 20 6e 54 65 72 6d 3d 3d 31 0a 20 20 20 26 26  ( nTerm==1.   &&
b330: 20 70 43 6f 6c 0a 20 20 20 26 26 20 73 71 6c 69   pCol.   && sqli
b340: 74 65 33 53 74 72 49 43 6d 70 28 73 71 6c 69 74  te3StrICmp(sqlit
b350: 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70 43 6f  e3ColumnType(pCo
b360: 6c 2c 22 22 29 2c 20 22 49 4e 54 45 47 45 52 22  l,""), "INTEGER"
b370: 29 3d 3d 30 0a 20 20 20 26 26 20 73 6f 72 74 4f  )==0.   && sortO
b380: 72 64 65 72 21 3d 53 51 4c 49 54 45 5f 53 4f 5f  rder!=SQLITE_SO_
b390: 44 45 53 43 0a 20 20 29 7b 0a 20 20 20 20 69 66  DESC.  ){.    if
b3a0: 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  ( IN_RENAME_OBJE
b3b0: 43 54 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20  CT && pList ){. 
b3c0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61       sqlite3Rena
b3d0: 6d 65 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61  meTokenRemap(pPa
b3e0: 72 73 65 2c 20 26 70 54 61 62 2d 3e 69 50 4b 65  rse, &pTab->iPKe
b3f0: 79 2c 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  y, pList->a[0].p
b400: 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Expr);.    }.   
b410: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69   pTab->iPKey = i
b420: 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b  Col;.    pTab->k
b430: 65 79 43 6f 6e 66 20 3d 20 28 75 38 29 6f 6e 45  eyConf = (u8)onE
b440: 72 72 6f 72 3b 0a 20 20 20 20 61 73 73 65 72 74  rror;.    assert
b450: 28 20 61 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20  ( autoInc==0 || 
b460: 61 75 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20 20  autoInc==1 );.  
b470: 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73    pTab->tabFlags
b480: 20 7c 3d 20 61 75 74 6f 49 6e 63 2a 54 46 5f 41   |= autoInc*TF_A
b490: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 20 20  utoincrement;.  
b4a0: 20 20 69 66 28 20 70 4c 69 73 74 20 29 20 70 50    if( pList ) pP
b4b0: 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64  arse->iPkSortOrd
b4c0: 65 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  er = pList->a[0]
b4d0: 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 65  .sortOrder;.  }e
b4e0: 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20  lse if( autoInc 
b4f0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
b500: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
b510: 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33  MENT.    sqlite3
b520: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
b530: 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20   "AUTOINCREMENT 
b540: 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20  is only allowed 
b550: 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22  on an ".       "
b560: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
b570: 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20  KEY");.#endif.  
b580: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
b590: 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50  e3CreateIndex(pP
b5a0: 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70  arse, 0, 0, 0, p
b5b0: 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30  List, onError, 0
b5c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
b5e0: 73 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20 53 51  sortOrder, 0, SQ
b5f0: 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49  LITE_IDXTYPE_PRI
b600: 4d 41 52 59 4b 45 59 29 3b 0a 20 20 20 20 70 4c  MARYKEY);.    pL
b610: 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72  ist = 0;.  }..pr
b620: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a  imary_key_exit:.
b630: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
b640: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
b650: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65  db, pList);.  re
b660: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  turn;.}../*.** A
b670: 64 64 20 61 20 6e 65 77 20 43 48 45 43 4b 20 63  dd a new CHECK c
b680: 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 74 68 65  onstraint to the
b690: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
b6a0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
b6b0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
b6c0: 69 74 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73  ite3AddCheckCons
b6d0: 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20  traint(.  Parse 
b6e0: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
b6f0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
b700: 2f 0a 20 20 45 78 70 72 20 2a 70 43 68 65 63 6b  /.  Expr *pCheck
b710: 45 78 70 72 20 20 2f 2a 20 54 68 65 20 63 68 65  Expr  /* The che
b720: 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  ck expression */
b730: 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
b740: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20  TE_OMIT_CHECK.  
b750: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50  Table *pTab = pP
b760: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
b770: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
b780: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
b790: 66 28 20 70 54 61 62 20 26 26 20 21 49 4e 5f 44  f( pTab && !IN_D
b7a0: 45 43 4c 41 52 45 5f 56 54 41 42 0a 20 20 20 26  ECLARE_VTAB.   &
b7b0: 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 49  & !sqlite3BtreeI
b7c0: 73 52 65 61 64 6f 6e 6c 79 28 64 62 2d 3e 61 44  sReadonly(db->aD
b7d0: 62 5b 64 62 2d 3e 69 6e 69 74 2e 69 44 62 5d 2e  b[db->init.iDb].
b7e0: 70 42 74 29 0a 20 20 29 7b 0a 20 20 20 20 70 54  pBt).  ){.    pT
b7f0: 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c  ab->pCheck = sql
b800: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
b810: 6e 64 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d  nd(pParse, pTab-
b820: 3e 70 43 68 65 63 6b 2c 20 70 43 68 65 63 6b 45  >pCheck, pCheckE
b830: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50  xpr);.    if( pP
b840: 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74  arse->constraint
b850: 4e 61 6d 65 2e 6e 20 29 7b 0a 20 20 20 20 20 20  Name.n ){.      
b860: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
b870: 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  etName(pParse, p
b880: 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 26 70 50  Tab->pCheck, &pP
b890: 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74  arse->constraint
b8a0: 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  Name, 1);.    }.
b8b0: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
b8c0: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   {.    sqlite3Ex
b8d0: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
b8e0: 3e 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29  >db, pCheckExpr)
b8f0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
b900: 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  et the collation
b910: 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65   function of the
b920: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70   most recently p
b930: 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75  arsed table colu
b940: 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c  mn.** to the Col
b950: 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76  lSeq given..*/.v
b960: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
b970: 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73 65 20  llateType(Parse 
b980: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
b990: 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65  pToken){.  Table
b9a0: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
b9b0: 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20  char *zColl;    
b9c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 71            /* Deq
b9d0: 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f  uoted name of co
b9e0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
b9f0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
ba00: 62 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70  b;..  if( (p = p
ba10: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
ba20: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
ba30: 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a   i = p->nCol-1;.
ba40: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
ba50: 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c  b;.  zColl = sql
ba60: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
ba70: 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20  n(db, pToken);. 
ba80: 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65   if( !zColl ) re
ba90: 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c  turn;..  if( sql
baa0: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
bab0: 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29  q(pParse, zColl)
bac0: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
bad0: 49 64 78 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Idx;.    sqlite3
bae0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
baf0: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a 20 20  ol[i].zColl);.  
bb00: 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f    p->aCol[i].zCo
bb10: 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20  ll = zColl;.  . 
bb20: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
bb30: 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20  umn is declared 
bb40: 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41  as "<name> PRIMA
bb50: 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c  RY KEY COLLATE <
bb60: 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74  type>",.    ** t
bb70: 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79  hen an index may
bb80: 20 68 61 76 65 20 62 65 65 6e 20 63 72 65 61 74   have been creat
bb90: 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d  ed on this colum
bba0: 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20  n before the.   
bbb0: 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79   ** collation ty
bbc0: 70 65 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f  pe was added. Co
bbd0: 72 72 65 63 74 20 74 68 69 73 20 69 66 20 69 74  rrect this if it
bbe0: 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20   is the case..  
bbf0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 49 64    */.    for(pId
bc00: 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  x=p->pIndex; pId
bc10: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
bc20: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
bc30: 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  rt( pIdx->nKeyCo
bc40: 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  l==1 );.      if
bc50: 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
bc60: 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20  [0]==i ){.      
bc70: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30    pIdx->azColl[0
bc80: 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  ] = p->aCol[i].z
bc90: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
bca0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
bcb0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
bcc0: 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d  b, zColl);.  }.}
bcd0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
bce0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
bcf0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
bd00: 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62 61 73  ence for databas
bd10: 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a  e native text.**
bd20: 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69   encoding identi
bd30: 66 69 65 64 20 62 79 20 74 68 65 20 73 74 72 69  fied by the stri
bd40: 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68  ng zName, length
bd50: 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   nName..**.** If
bd60: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
bd70: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
bd80: 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  e is not availab
bd90: 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c  le, or not avail
bda0: 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64  able.** in the d
bdb0: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 65  atabase native e
bdc0: 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c  ncoding, the col
bdd0: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69  lation factory i
bde0: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20  s invoked to.** 
bdf0: 72 65 71 75 65 73 74 20 69 74 2e 20 49 66 20 74  request it. If t
be00: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
be10: 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75  tory does not su
be20: 70 70 6c 79 20 73 75 63 68 20 61 20 73 65 71 75  pply such a sequ
be30: 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65  ence,.** and the
be40: 20 73 65 71 75 65 6e 63 65 20 69 73 20 61 76 61   sequence is ava
be50: 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65  ilable in anothe
be60: 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c  r text encoding,
be70: 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a   then that is.**
be80: 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61   returned instea
be90: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76  d..**.** If no v
bea0: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72  ersions of the r
beb0: 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69  equested collati
bec0: 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61 72 65  ons sequence are
bed0: 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a   available, or.*
bee0: 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20  * another error 
bef0: 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20  occurs, NULL is 
bf00: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20  returned and an 
bf10: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72  error message wr
bf20: 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50  itten into.** pP
bf30: 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  arse..**.** This
bf40: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 77 72   routine is a wr
bf50: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c  apper around sql
bf60: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
bf70: 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ).  This routine
bf80: 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  .** invokes the 
bf90: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
bfa0: 79 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 63  y if the named c
bfb0: 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  ollation cannot 
bfc0: 62 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20  be found.** and 
bfd0: 67 65 6e 65 72 61 74 65 73 20 61 6e 20 65 72 72  generates an err
bfe0: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a  or message..**.*
bff0: 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69  * See also: sqli
c000: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29  te3FindCollSeq()
c010: 2c 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c  , sqlite3GetColl
c020: 53 65 71 28 29 0a 2a 2f 0a 43 6f 6c 6c 53 65 71  Seq().*/.CollSeq
c030: 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43   *sqlite3LocateC
c040: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
c050: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
c060: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69   *zName){.  sqli
c070: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
c080: 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d  ->db;.  u8 enc =
c090: 20 45 4e 43 28 64 62 29 3b 0a 20 20 75 38 20 69   ENC(db);.  u8 i
c0a0: 6e 69 74 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e  nitbusy = db->in
c0b0: 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53  it.busy;.  CollS
c0c0: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43  eq *pColl;..  pC
c0d0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
c0e0: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63  dCollSeq(db, enc
c0f0: 2c 20 7a 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73  , zName, initbus
c100: 79 29 3b 0a 20 20 69 66 28 20 21 69 6e 69 74 62  y);.  if( !initb
c110: 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c  usy && (!pColl |
c120: 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20  | !pColl->xCmp) 
c130: 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  ){.    pColl = s
c140: 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71  qlite3GetCollSeq
c150: 28 70 50 61 72 73 65 2c 20 65 6e 63 2c 20 70 43  (pParse, enc, pC
c160: 6f 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d  oll, zName);.  }
c170: 0a 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c  ..  return pColl
c180: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ;.}.../*.** Gene
c190: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
c1a0: 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  ill increment th
c1b0: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
c1c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d  .**.** The schem
c1d0: 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64  a cookie is used
c1e0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
c1f0: 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f  en the schema fo
c200: 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  r the.** databas
c210: 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65  e changes.  Afte
c220: 72 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68  r each schema ch
c230: 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65  ange, the cookie
c240: 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65   value.** change
c250: 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65  s.  When a proce
c260: 73 73 20 66 69 72 73 74 20 72 65 61 64 73 20 74  ss first reads t
c270: 68 65 20 73 63 68 65 6d 61 20 69 74 20 72 65 63  he schema it rec
c280: 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b  ords the.** cook
c290: 69 65 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c  ie.  Thereafter,
c2a0: 20 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65   whenever it goe
c2b0: 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  s to access the 
c2c0: 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20  database,.** it 
c2d0: 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69  checks the cooki
c2e0: 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
c2f0: 68 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f  he schema has no
c300: 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e  t changed.** sin
c310: 63 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 72  ce it was last r
c320: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ead..**.** This 
c330: 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70  plan is not comp
c340: 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72  letely bullet-pr
c350: 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73  oof.  It is poss
c360: 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  ible for.** the 
c370: 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65  schema to change
c380: 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20   multiple times 
c390: 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b  and for the cook
c3a0: 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20  ie to be.** set 
c3b0: 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61  back to prior va
c3c0: 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61  lue.  But schema
c3d0: 20 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66   changes are inf
c3e0: 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74  requent.** and t
c3f0: 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  he probability o
c400: 66 20 68 69 74 74 69 6e 67 20 74 68 65 20 73 61  f hitting the sa
c410: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  me cookie value 
c420: 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61  is only.** 1 cha
c430: 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f  nce in 2^32.  So
c440: 20 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75   we're safe enou
c450: 67 68 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d  gh..**.** IMPLEM
c460: 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 33  ENTATION-OF: R-3
c470: 34 32 33 30 2d 35 36 30 34 39 20 53 51 4c 69 74  4230-56049 SQLit
c480: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
c490: 69 6e 63 72 65 6d 65 6e 74 73 0a 2a 2a 20 74 68  increments.** th
c4a0: 65 20 73 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e  e schema-version
c4b0: 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 73 63   whenever the sc
c4c0: 68 65 6d 61 20 63 68 61 6e 67 65 73 2e 0a 2a 2f  hema changes..*/
c4d0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68 61  .void sqlite3Cha
c4e0: 6e 67 65 43 6f 6f 6b 69 65 28 50 61 72 73 65 20  ngeCookie(Parse 
c4f0: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62  *pParse, int iDb
c500: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
c510: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
c520: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
c530: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
c540: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
c550: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
c560: 44 62 2c 20 30 29 20 29 3b 0a 20 20 73 71 6c 69  Db, 0) );.  sqli
c570: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
c580: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
c590: 44 62 2c 20 42 54 52 45 45 5f 53 43 48 45 4d 41  Db, BTREE_SCHEMA
c5a0: 5f 56 45 52 53 49 4f 4e 2c 20 0a 20 20 20 20 20  _VERSION, .     
c5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
c5c0: 6e 74 29 28 31 2b 28 75 6e 73 69 67 6e 65 64 29  nt)(1+(unsigned)
c5d0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
c5e0: 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  hema->schema_coo
c5f0: 6b 69 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  kie));.}../*.** 
c600: 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62  Measure the numb
c610: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
c620: 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75   needed to outpu
c630: 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69  t the given.** i
c640: 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20  dentifier.  The 
c650: 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20  number returned 
c660: 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f  includes any quo
c670: 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20  tes used.** but 
c680: 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65  does not include
c690: 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e   the null termin
c6a0: 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
c6b0: 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e 73  estimate is cons
c6c0: 65 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d 69  ervative.  It mi
c6d0: 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68  ght be larger th
c6e0: 61 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72 65  at what is.** re
c6f0: 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  ally needed..*/.
c700: 73 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74  static int ident
c710: 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61  Length(const cha
c720: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  r *z){.  int n;.
c730: 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e    for(n=0; *z; n
c740: 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, z++){.    if
c750: 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b  ( *z=='"' ){ n++
c760: 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ; }.  }.  return
c770: 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   n + 2;.}../*.**
c780: 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d   The first param
c790: 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65  eter is a pointe
c7a0: 72 20 74 6f 20 61 6e 20 6f 75 74 70 75 74 20 62  r to an output b
c7b0: 75 66 66 65 72 2e 20 54 68 65 20 73 65 63 6f 6e  uffer. The secon
c7c0: 64 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  d .** parameter 
c7d0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
c7e0: 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74 20  an integer that 
c7f0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6f 66 66  contains the off
c800: 73 65 74 20 61 74 0a 2a 2a 20 77 68 69 63 68 20  set at.** which 
c810: 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68  to write into th
c820: 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e  e output buffer.
c830: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
c840: 6f 70 69 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6c  opies the.** nul
c850: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
c860: 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ng pointed to by
c870: 20 74 68 65 20 74 68 69 72 64 20 70 61 72 61 6d   the third param
c880: 65 74 65 72 2c 20 7a 53 69 67 6e 65 64 49 64 65  eter, zSignedIde
c890: 6e 74 2c 0a 2a 2a 20 74 6f 20 74 68 65 20 73 70  nt,.** to the sp
c8a0: 65 63 69 66 69 65 64 20 6f 66 66 73 65 74 20 69  ecified offset i
c8b0: 6e 20 74 68 65 20 62 75 66 66 65 72 20 61 6e 64  n the buffer and
c8c0: 20 75 70 64 61 74 65 73 20 2a 70 49 64 78 20 74   updates *pIdx t
c8d0: 6f 20 72 65 66 65 72 0a 2a 2a 20 74 6f 20 74 68  o refer.** to th
c8e0: 65 20 66 69 72 73 74 20 62 79 74 65 20 61 66 74  e first byte aft
c8f0: 65 72 20 74 68 65 20 6c 61 73 74 20 62 79 74 65  er the last byte
c900: 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20   written before 
c910: 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a  returning..** .*
c920: 2a 20 49 66 20 74 68 65 20 73 74 72 69 6e 67 20  * If the string 
c930: 7a 53 69 67 6e 65 64 49 64 65 6e 74 20 63 6f 6e  zSignedIdent con
c940: 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f  sists entirely o
c950: 66 20 61 6c 70 68 61 2d 6e 75 6d 65 72 69 63 0a  f alpha-numeric.
c960: 2a 2a 20 63 68 61 72 61 63 74 65 72 73 2c 20 64  ** characters, d
c970: 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69  oes not begin wi
c980: 74 68 20 61 20 64 69 67 69 74 20 61 6e 64 20 69  th a digit and i
c990: 73 20 6e 6f 74 20 61 6e 20 53 51 4c 20 6b 65 79  s not an SQL key
c9a0: 77 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74  word,.** then it
c9b0: 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68   is copied to th
c9c0: 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
c9d0: 65 78 61 63 74 6c 79 20 61 73 20 69 74 20 69 73  exactly as it is
c9e0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20  . Otherwise,.** 
c9f0: 69 74 20 69 73 20 71 75 6f 74 65 64 20 75 73 69  it is quoted usi
ca00: 6e 67 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73  ng double-quotes
ca10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ca20: 20 69 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a   identPut(char *
ca30: 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68  z, int *pIdx, ch
ca40: 61 72 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74  ar *zSignedIdent
ca50: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
ca60: 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e  ar *zIdent = (un
ca70: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 69  signed char*)zSi
ca80: 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74  gnedIdent;.  int
ca90: 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65   i, j, needQuote
caa0: 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 0a  ;.  i = *pIdx;..
cab0: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
cac0: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
cad0: 69 66 28 20 21 73 71 6c 69 74 65 33 49 73 61 6c  if( !sqlite3Isal
cae0: 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26  num(zIdent[j]) &
caf0: 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27  & zIdent[j]!='_'
cb00: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
cb10: 6e 65 65 64 51 75 6f 74 65 20 3d 20 73 71 6c 69  needQuote = sqli
cb20: 74 65 33 49 73 64 69 67 69 74 28 7a 49 64 65 6e  te3Isdigit(zIden
cb30: 74 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20  t[0]).          
cb40: 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77    || sqlite3Keyw
cb50: 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20  ordCode(zIdent, 
cb60: 6a 29 21 3d 54 4b 5f 49 44 0a 20 20 20 20 20 20  j)!=TK_ID.      
cb70: 20 20 20 20 20 20 7c 7c 20 7a 49 64 65 6e 74 5b        || zIdent[
cb80: 6a 5d 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  j]!=0.          
cb90: 20 20 7c 7c 20 6a 3d 3d 30 3b 0a 0a 20 20 69 66    || j==0;..  if
cba0: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
cbb0: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f  i++] = '"';.  fo
cbc0: 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d  r(j=0; zIdent[j]
cbd0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b  ; j++){.    z[i+
cbe0: 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a  +] = zIdent[j];.
cbf0: 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a      if( zIdent[j
cc00: 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20  ]=='"' ) z[i++] 
cc10: 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28  = '"';.  }.  if(
cc20: 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69   needQuote ) z[i
cc30: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69  ++] = '"';.  z[i
cc40: 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d  ] = 0;.  *pIdx =
cc50: 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   i;.}../*.** Gen
cc60: 65 72 61 74 65 20 61 20 43 52 45 41 54 45 20 54  erate a CREATE T
cc70: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61  ABLE statement a
cc80: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
cc90: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c  he given.** tabl
cca0: 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f  e.  Memory to ho
ccb0: 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66 20 74  ld the text of t
ccc0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
ccd0: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d  obtained.** from
cce0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
ccf0: 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
cd00: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
cd10: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
cd20: 61 74 69 63 20 63 68 61 72 20 2a 63 72 65 61 74  atic char *creat
cd30: 65 54 61 62 6c 65 53 74 6d 74 28 73 71 6c 69 74  eTableStmt(sqlit
cd40: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
cd50: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e  ){.  int i, k, n
cd60: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b  ;.  char *zStmt;
cd70: 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a  .  char *zSep, *
cd80: 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20  zSep2, *zEnd;.  
cd90: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
cda0: 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f  n = 0;.  for(pCo
cdb0: 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30  l = p->aCol, i=0
cdc0: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
cdd0: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e  , pCol++){.    n
cde0: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
cdf0: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b 20 35  pCol->zName) + 5
ce00: 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65  ;.  }.  n += ide
ce10: 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d  ntLength(p->zNam
ce20: 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20 29  e);.  if( n<50 )
ce30: 7b 20 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22  { .    zSep = ""
ce40: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
ce50: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29  ";.    zEnd = ")
ce60: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
ce70: 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20  zSep = "\n  ";. 
ce80: 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20     zSep2 = ",\n 
ce90: 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22   ";.    zEnd = "
cea0: 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d  \n)";.  }.  n +=
ceb0: 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b   35 + 6*p->nCol;
cec0: 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74  .  zStmt = sqlit
ced0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c  e3DbMallocRaw(0,
cee0: 20 6e 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74   n);.  if( zStmt
cef0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
cf00: 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
cf10: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
cf20: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  }.  sqlite3_snpr
cf30: 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74 2c 20 22  intf(n, zStmt, "
cf40: 43 52 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b  CREATE TABLE ");
cf50: 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65 33 53 74  .  k = sqlite3St
cf60: 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29 3b 0a 20  rlen30(zStmt);. 
cf70: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
cf80: 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a   &k, p->zName);.
cf90: 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27    zStmt[k++] = '
cfa0: 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70  (';.  for(pCol=p
cfb0: 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70  ->aCol, i=0; i<p
cfc0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
cfd0: 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 61 74 69 63  l++){.    static
cfe0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f   const char * co
cff0: 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20 3d 20 7b  nst azType[] = {
d000: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49  .        /* SQLI
d010: 54 45 5f 41 46 46 5f 42 4c 4f 42 20 20 20 20 2a  TE_AFF_BLOB    *
d020: 2f 20 22 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a  / "",.        /*
d030: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
d040: 20 20 20 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a      */ " TEXT",.
d050: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
d060: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 2a 2f  E_AFF_NUMERIC */
d070: 20 22 20 4e 55 4d 22 2c 0a 20 20 20 20 20 20 20   " NUM",.       
d080: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49   /* SQLITE_AFF_I
d090: 4e 54 45 47 45 52 20 2a 2f 20 22 20 49 4e 54 22  NTEGER */ " INT"
d0a0: 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  ,.        /* SQL
d0b0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20  ITE_AFF_REAL    
d0c0: 2a 2f 20 22 20 52 45 41 4c 22 0a 20 20 20 20 7d  */ " REAL".    }
d0d0: 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  ;.    int len;. 
d0e0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
d0f0: 54 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74  Type;..    sqlit
d100: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c  e3_snprintf(n-k,
d110: 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70   &zStmt[k], zSep
d120: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69  );.    k += sqli
d130: 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 53 74  te3Strlen30(&zSt
d140: 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70  mt[k]);.    zSep
d150: 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64   = zSep2;.    id
d160: 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b  entPut(zStmt, &k
d170: 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCol->zName);.
d180: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
d190: 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54  ->affinity-SQLIT
d1a0: 45 5f 41 46 46 5f 42 4c 4f 42 20 3e 3d 20 30 20  E_AFF_BLOB >= 0 
d1b0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
d1c0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51  Col->affinity-SQ
d1d0: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 3c 20  LITE_AFF_BLOB < 
d1e0: 41 72 72 61 79 53 69 7a 65 28 61 7a 54 79 70 65  ArraySize(azType
d1f0: 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ) );.    testcas
d200: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
d210: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  y==SQLITE_AFF_BL
d220: 4f 42 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  OB );.    testca
d230: 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  se( pCol->affini
d240: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ty==SQLITE_AFF_T
d250: 45 58 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63  EXT );.    testc
d260: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
d270: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
d280: 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 74  NUMERIC );.    t
d290: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
d2a0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
d2b0: 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20  AFF_INTEGER );. 
d2c0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f     testcase( pCo
d2d0: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
d2e0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29 3b 0a  ITE_AFF_REAL );.
d2f0: 20 20 20 20 0a 20 20 20 20 7a 54 79 70 65 20 3d      .    zType =
d300: 20 61 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e 61 66   azType[pCol->af
d310: 66 69 6e 69 74 79 20 2d 20 53 51 4c 49 54 45 5f  finity - SQLITE_
d320: 41 46 46 5f 42 4c 4f 42 5d 3b 0a 20 20 20 20 6c  AFF_BLOB];.    l
d330: 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  en = sqlite3Strl
d340: 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20 20 20  en30(zType);.   
d350: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61   assert( pCol->a
d360: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
d370: 41 46 46 5f 42 4c 4f 42 20 0a 20 20 20 20 20 20  AFF_BLOB .      
d380: 20 20 20 20 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61        || pCol->a
d390: 66 66 69 6e 69 74 79 3d 3d 73 71 6c 69 74 65 33  ffinity==sqlite3
d3a0: 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79  AffinityType(zTy
d3b0: 70 65 2c 20 30 29 20 29 3b 0a 20 20 20 20 6d 65  pe, 0) );.    me
d3c0: 6d 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20  mcpy(&zStmt[k], 
d3d0: 7a 54 79 70 65 2c 20 6c 65 6e 29 3b 0a 20 20 20  zType, len);.   
d3e0: 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 61   k += len;.    a
d3f0: 73 73 65 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20  ssert( k<=n );. 
d400: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70   }.  sqlite3_snp
d410: 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d  rintf(n-k, &zStm
d420: 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64  t[k], "%s", zEnd
d430: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d  );.  return zStm
d440: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69  t;.}../*.** Resi
d450: 7a 65 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65  ze an Index obje
d460: 63 74 20 74 6f 20 68 6f 6c 64 20 4e 20 63 6f 6c  ct to hold N col
d470: 75 6d 6e 73 20 74 6f 74 61 6c 2e 20 20 52 65 74  umns total.  Ret
d480: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
d490: 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20   on success and 
d4a0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 6e 20  SQLITE_NOMEM on 
d4b0: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 0a 2a 2f  an OOM error..*/
d4c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 69  .static int resi
d4d0: 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 73 71  zeIndexObject(sq
d4e0: 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78  lite3 *db, Index
d4f0: 20 2a 70 49 64 78 2c 20 69 6e 74 20 4e 29 7b 0a   *pIdx, int N){.
d500: 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a    char *zExtra;.
d510: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69    int nByte;.  i
d520: 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  f( pIdx->nColumn
d530: 3e 3d 4e 20 29 20 72 65 74 75 72 6e 20 53 51 4c  >=N ) return SQL
d540: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
d550: 28 20 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65  ( pIdx->isResize
d560: 64 3d 3d 30 20 29 3b 0a 20 20 6e 42 79 74 65 20  d==0 );.  nByte 
d570: 3d 20 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  = (sizeof(char*)
d580: 20 2b 20 73 69 7a 65 6f 66 28 69 31 36 29 20 2b   + sizeof(i16) +
d590: 20 31 29 2a 4e 3b 0a 20 20 7a 45 78 74 72 61 20   1)*N;.  zExtra 
d5a0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
d5b0: 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29  cZero(db, nByte)
d5c0: 3b 0a 20 20 69 66 28 20 7a 45 78 74 72 61 3d 3d  ;.  if( zExtra==
d5d0: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
d5e0: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
d5f0: 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70  memcpy(zExtra, p
d600: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 2c 20 73 69 7a  Idx->azColl, siz
d610: 65 6f 66 28 63 68 61 72 2a 29 2a 70 49 64 78 2d  eof(char*)*pIdx-
d620: 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64  >nColumn);.  pId
d630: 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e  x->azColl = (con
d640: 73 74 20 63 68 61 72 2a 2a 29 7a 45 78 74 72 61  st char**)zExtra
d650: 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69  ;.  zExtra += si
d660: 7a 65 6f 66 28 63 68 61 72 2a 29 2a 4e 3b 0a 20  zeof(char*)*N;. 
d670: 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20   memcpy(zExtra, 
d680: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20  pIdx->aiColumn, 
d690: 73 69 7a 65 6f 66 28 69 31 36 29 2a 70 49 64 78  sizeof(i16)*pIdx
d6a0: 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49  ->nColumn);.  pI
d6b0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28  dx->aiColumn = (
d6c0: 69 31 36 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a  i16*)zExtra;.  z
d6d0: 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28  Extra += sizeof(
d6e0: 69 31 36 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79  i16)*N;.  memcpy
d6f0: 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61  (zExtra, pIdx->a
d700: 53 6f 72 74 4f 72 64 65 72 2c 20 70 49 64 78 2d  SortOrder, pIdx-
d710: 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64  >nColumn);.  pId
d720: 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  x->aSortOrder = 
d730: 28 75 38 2a 29 7a 45 78 74 72 61 3b 0a 20 20 70  (u8*)zExtra;.  p
d740: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 4e  Idx->nColumn = N
d750: 3b 0a 20 20 70 49 64 78 2d 3e 69 73 52 65 73 69  ;.  pIdx->isResi
d760: 7a 65 64 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  zed = 1;.  retur
d770: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d780: 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
d790: 68 65 20 74 6f 74 61 6c 20 72 6f 77 20 77 69 64  he total row wid
d7a0: 74 68 20 66 6f 72 20 61 20 74 61 62 6c 65 2e 0a  th for a table..
d7b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
d7c0: 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74  stimateTableWidt
d7d0: 68 28 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a  h(Table *pTab){.
d7e0: 20 20 75 6e 73 69 67 6e 65 64 20 77 54 61 62 6c    unsigned wTabl
d7f0: 65 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 43  e = 0;.  const C
d800: 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a  olumn *pTabCol;.
d810: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
d820: 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61  =pTab->nCol, pTa
d830: 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  bCol=pTab->aCol;
d840: 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 61 62 43   i>0; i--, pTabC
d850: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 77 54 61 62 6c  ol++){.    wTabl
d860: 65 20 2b 3d 20 70 54 61 62 43 6f 6c 2d 3e 73 7a  e += pTabCol->sz
d870: 45 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  Est;.  }.  if( p
d880: 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 29 20 77  Tab->iPKey<0 ) w
d890: 54 61 62 6c 65 2b 2b 3b 0a 20 20 70 54 61 62 2d  Table++;.  pTab-
d8a0: 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c 69  >szTabRow = sqli
d8b0: 74 65 33 4c 6f 67 45 73 74 28 77 54 61 62 6c 65  te3LogEst(wTable
d8c0: 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73  *4);.}../*.** Es
d8d0: 74 69 6d 61 74 65 20 74 68 65 20 61 76 65 72 61  timate the avera
d8e0: 67 65 20 73 69 7a 65 20 6f 66 20 61 20 72 6f 77  ge size of a row
d8f0: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 2e 0a 2a   for an index..*
d900: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 73  /.static void es
d910: 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68  timateIndexWidth
d920: 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20  (Index *pIdx){. 
d930: 20 75 6e 73 69 67 6e 65 64 20 77 49 6e 64 65 78   unsigned wIndex
d940: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
d950: 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 61   const Column *a
d960: 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  Col = pIdx->pTab
d970: 6c 65 2d 3e 61 43 6f 6c 3b 0a 20 20 66 6f 72 28  le->aCol;.  for(
d980: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f  i=0; i<pIdx->nCo
d990: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
d9a0: 69 31 36 20 78 20 3d 20 70 49 64 78 2d 3e 61 69  i16 x = pIdx->ai
d9b0: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61  Column[i];.    a
d9c0: 73 73 65 72 74 28 20 78 3c 70 49 64 78 2d 3e 70  ssert( x<pIdx->p
d9d0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  Table->nCol );. 
d9e0: 20 20 20 77 49 6e 64 65 78 20 2b 3d 20 78 3c 30     wIndex += x<0
d9f0: 20 3f 20 31 20 3a 20 61 43 6f 6c 5b 70 49 64 78   ? 1 : aCol[pIdx
da00: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73  ->aiColumn[i]].s
da10: 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 70 49 64 78  zEst;.  }.  pIdx
da20: 2d 3e 73 7a 49 64 78 52 6f 77 20 3d 20 73 71 6c  ->szIdxRow = sql
da30: 69 74 65 33 4c 6f 67 45 73 74 28 77 49 6e 64 65  ite3LogEst(wInde
da40: 78 2a 34 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  x*4);.}../* Retu
da50: 72 6e 20 74 72 75 65 20 69 66 20 76 61 6c 75 65  rn true if value
da60: 20 78 20 69 73 20 66 6f 75 6e 64 20 61 6e 79 20   x is found any 
da70: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6e 43 6f  of the first nCo
da80: 6c 20 65 6e 74 72 69 65 73 20 6f 66 20 61 69 43  l entries of aiC
da90: 6f 6c 5b 5d 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ol[].*/.static i
daa0: 6e 74 20 68 61 73 43 6f 6c 75 6d 6e 28 63 6f 6e  nt hasColumn(con
dab0: 73 74 20 69 31 36 20 2a 61 69 43 6f 6c 2c 20 69  st i16 *aiCol, i
dac0: 6e 74 20 6e 43 6f 6c 2c 20 69 6e 74 20 78 29 7b  nt nCol, int x){
dad0: 0a 20 20 77 68 69 6c 65 28 20 6e 43 6f 6c 2d 2d  .  while( nCol--
dae0: 20 3e 20 30 20 29 20 69 66 28 20 78 3d 3d 2a 28   > 0 ) if( x==*(
daf0: 61 69 43 6f 6c 2b 2b 29 20 29 20 72 65 74 75 72  aiCol++) ) retur
db00: 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
db10: 0a 7d 0a 0a 2f 2a 20 52 65 63 6f 6d 70 75 74 65  .}../* Recompute
db20: 20 74 68 65 20 63 6f 6c 4e 6f 74 49 64 78 65 64   the colNotIdxed
db30: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 49 6e   field of the In
db40: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 63 6f 6c 4e 6f  dex..**.** colNo
db50: 74 49 64 78 65 64 20 69 73 20 61 20 62 69 74 6d  tIdxed is a bitm
db60: 61 73 6b 20 74 68 61 74 20 68 61 73 20 61 20 30  ask that has a 0
db70: 20 62 69 74 20 72 65 70 72 65 73 65 6e 74 69 6e   bit representin
db80: 67 20 65 61 63 68 20 69 6e 64 65 78 65 64 0a 2a  g each indexed.*
db90: 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61  * columns that a
dba0: 72 65 20 77 69 74 68 69 6e 20 74 68 65 20 66 69  re within the fi
dbb0: 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73 20 6f  rst 63 columns o
dbc0: 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  f the table.  Th
dbd0: 65 0a 2a 2a 20 68 69 67 68 2d 6f 72 64 65 72 20  e.** high-order 
dbe0: 62 69 74 20 6f 66 20 63 6f 6c 4e 6f 74 49 64 78  bit of colNotIdx
dbf0: 65 64 20 69 73 20 61 6c 77 61 79 73 20 31 2e 20  ed is always 1. 
dc00: 20 41 6c 6c 20 75 6e 69 6e 64 65 78 65 64 20 63   All unindexed c
dc10: 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65  olumns.** of the
dc20: 20 74 61 62 6c 65 20 68 61 76 65 20 61 20 31 2e   table have a 1.
dc30: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 4e 6f  .**.** The colNo
dc40: 74 49 64 78 65 64 20 6d 61 73 6b 20 69 73 20 41  tIdxed mask is A
dc50: 4e 44 2d 65 64 20 77 69 74 68 20 74 68 65 20 53  ND-ed with the S
dc60: 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c 55 73  rcList.a[].colUs
dc70: 65 64 20 6d 61 73 6b 0a 2a 2a 20 74 6f 20 64 65  ed mask.** to de
dc80: 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 69  termine if the i
dc90: 6e 64 65 78 20 69 73 20 63 6f 76 65 72 69 6e 67  ndex is covering
dca0: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
dcb0: 63 20 76 6f 69 64 20 72 65 63 6f 6d 70 75 74 65  c void recompute
dcc0: 43 6f 6c 75 6d 6e 73 4e 6f 74 49 6e 64 65 78 65  ColumnsNotIndexe
dcd0: 64 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  d(Index *pIdx){.
dce0: 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b    Bitmask m = 0;
dcf0: 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28  .  int j;.  for(
dd00: 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d  j=pIdx->nColumn-
dd10: 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20  1; j>=0; j--){. 
dd20: 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78 2d     int x = pIdx-
dd30: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
dd40: 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20    if( x>=0 ){.  
dd50: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
dd60: 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
dd70: 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53  testcase( x==BMS
dd80: 2d 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  -2 );.      if( 
dd90: 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d  x<BMS-1 ) m |= M
dda0: 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 20 20 7d  ASKBIT(x);.    }
ddb0: 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e 63 6f 6c  .  }.  pIdx->col
ddc0: 4e 6f 74 49 64 78 65 64 20 3d 20 7e 6d 3b 0a 20  NotIdxed = ~m;. 
ddd0: 20 61 73 73 65 72 74 28 20 28 70 49 64 78 2d 3e   assert( (pIdx->
dde0: 63 6f 6c 4e 6f 74 49 64 78 65 64 3e 3e 36 33 29  colNotIdxed>>63)
ddf0: 3d 3d 31 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ==1 );.}../*.** 
de00: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  This routine run
de10: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
de20: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
de30: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
de40: 20 74 68 61 74 0a 2a 2a 20 68 61 73 20 61 20 57   that.** has a W
de50: 49 54 48 4f 55 54 20 52 4f 57 49 44 20 63 6c 61  ITHOUT ROWID cla
de60: 75 73 65 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66  use.  The job of
de70: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
de80: 20 74 6f 20 63 6f 6e 76 65 72 74 20 62 6f 74 68   to convert both
de90: 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  .** internal sch
dea0: 65 6d 61 20 64 61 74 61 20 73 74 72 75 63 74 75  ema data structu
deb0: 72 65 73 20 61 6e 64 20 74 68 65 20 67 65 6e 65  res and the gene
dec0: 72 61 74 65 64 20 56 44 42 45 20 63 6f 64 65 20  rated VDBE code 
ded0: 73 6f 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20  so that they.** 
dee0: 61 72 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  are appropriate 
def0: 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f  for a WITHOUT RO
df00: 57 49 44 20 74 61 62 6c 65 20 69 6e 73 74 65 61  WID table instea
df10: 64 20 6f 66 20 61 20 72 6f 77 69 64 20 74 61 62  d of a rowid tab
df20: 6c 65 2e 0a 2a 2a 20 43 68 61 6e 67 65 73 20 69  le..** Changes i
df30: 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  nclude:.**.**   
df40: 20 20 28 31 29 20 20 53 65 74 20 61 6c 6c 20 63    (1)  Set all c
df50: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52  olumns of the PR
df60: 49 4d 41 52 59 20 4b 45 59 20 73 63 68 65 6d 61  IMARY KEY schema
df70: 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 4e 4f   object to be NO
df80: 54 20 4e 55 4c 4c 2e 0a 2a 2a 20 20 20 20 20 28  T NULL..**     (
df90: 32 29 20 20 43 6f 6e 76 65 72 74 20 50 33 20 70  2)  Convert P3 p
dfa0: 61 72 61 6d 65 74 65 72 20 6f 66 20 74 68 65 20  arameter of the 
dfb0: 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65 20 66  OP_CreateBtree f
dfc0: 72 6f 6d 20 42 54 52 45 45 5f 49 4e 54 4b 45 59  rom BTREE_INTKEY
dfd0: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e   .**          in
dfe0: 74 6f 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59  to BTREE_BLOBKEY
dff0: 2e 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 42 79  ..**     (3)  By
e000: 70 61 73 73 20 74 68 65 20 63 72 65 61 74 69 6f  pass the creatio
e010: 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  n of the sqlite_
e020: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74  master table ent
e030: 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  ry.**          f
e040: 6f 72 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  or the PRIMARY K
e050: 45 59 20 61 73 20 74 68 65 20 70 72 69 6d 61 72  EY as the primar
e060: 79 20 6b 65 79 20 69 6e 64 65 78 20 69 73 20 6e  y key index is n
e070: 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  ow.**          i
e080: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
e090: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
e0a0: 61 62 6c 65 20 65 6e 74 72 79 20 6f 66 20 74 68  able entry of th
e0b0: 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e 0a  e table itself..
e0c0: 2a 2a 20 20 20 20 20 28 34 29 20 20 53 65 74 20  **     (4)  Set 
e0d0: 74 68 65 20 49 6e 64 65 78 2e 74 6e 75 6d 20 6f  the Index.tnum o
e0e0: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
e0f0: 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69  Y Index object i
e100: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
e110: 20 20 73 63 68 65 6d 61 20 74 6f 20 74 68 65 20    schema to the 
e120: 72 6f 6f 74 70 61 67 65 20 66 72 6f 6d 20 74 68  rootpage from th
e130: 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a  e main table..**
e140: 20 20 20 20 20 28 35 29 20 20 41 64 64 20 61 6c       (5)  Add al
e150: 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  l table columns 
e160: 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  to the PRIMARY K
e170: 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 0a  EY Index object.
e180: 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f 20 74  **          so t
e190: 68 61 74 20 74 68 65 20 50 52 49 4d 41 52 59 20  hat the PRIMARY 
e1a0: 4b 45 59 20 69 73 20 61 20 63 6f 76 65 72 69 6e  KEY is a coverin
e1b0: 67 20 69 6e 64 65 78 2e 20 20 54 68 65 20 73 75  g index.  The su
e1c0: 72 70 6c 75 73 0a 2a 2a 20 20 20 20 20 20 20 20  rplus.**        
e1d0: 20 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 70 61    columns are pa
e1e0: 72 74 20 6f 66 20 4b 65 79 49 6e 66 6f 2e 6e 41  rt of KeyInfo.nA
e1f0: 6c 6c 46 69 65 6c 64 20 61 6e 64 20 61 72 65 20  llField and are 
e200: 6e 6f 74 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  not used for.** 
e210: 20 20 20 20 20 20 20 20 20 73 6f 72 74 69 6e 67           sorting
e220: 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72 20 75 6e   or lookup or un
e230: 69 71 75 65 6e 65 73 73 20 63 68 65 63 6b 73 2e  iqueness checks.
e240: 0a 2a 2a 20 20 20 20 20 28 36 29 20 20 52 65 70  .**     (6)  Rep
e250: 6c 61 63 65 20 74 68 65 20 72 6f 77 69 64 20 74  lace the rowid t
e260: 61 69 6c 20 6f 6e 20 61 6c 6c 20 61 75 74 6f 6d  ail on all autom
e270: 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74  atically generat
e280: 65 64 20 55 4e 49 51 55 45 0a 2a 2a 20 20 20 20  ed UNIQUE.**    
e290: 20 20 20 20 20 20 69 6e 64 69 63 65 73 20 77 69        indices wi
e2a0: 74 68 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  th the PRIMARY K
e2b0: 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a  EY columns..**.*
e2c0: 2a 20 46 6f 72 20 76 69 72 74 75 61 6c 20 74 61  * For virtual ta
e2d0: 62 6c 65 73 2c 20 6f 6e 6c 79 20 28 31 29 20 69  bles, only (1) i
e2e0: 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2f 0a  s performed..*/.
e2f0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 76  static void conv
e300: 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69  ertToWithoutRowi
e310: 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  dTable(Parse *pP
e320: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
e330: 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  b){.  Index *pId
e340: 78 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b  x;.  Index *pPk;
e350: 0a 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20 69 6e  .  int nPk;.  in
e360: 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65  t i, j;.  sqlite
e370: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
e380: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  db;.  Vdbe *v = 
e390: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a  pParse->pVdbe;..
e3a0: 20 20 2f 2a 20 4d 61 72 6b 20 65 76 65 72 79 20    /* Mark every 
e3b0: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
e3c0: 6d 6e 20 61 73 20 4e 4f 54 20 4e 55 4c 4c 20 28  mn as NOT NULL (
e3d0: 65 78 63 65 70 74 20 66 6f 72 20 69 6d 70 6f 73  except for impos
e3e0: 74 65 72 20 74 61 62 6c 65 73 29 0a 20 20 2a 2f  ter tables).  */
e3f0: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
e400: 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 29  .imposterTable )
e410: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
e420: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
e430: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  ){.      if( (pT
e440: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 63 6f 6c 46  ab->aCol[i].colF
e450: 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50  lags & COLFLAG_P
e460: 52 49 4d 4b 45 59 29 21 3d 30 20 29 7b 0a 20 20  RIMKEY)!=0 ){.  
e470: 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
e480: 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 4f 45  [i].notNull = OE
e490: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
e4a0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
e4b0: 43 6f 6e 76 65 72 74 20 74 68 65 20 50 33 20 6f  Convert the P3 o
e4c0: 70 65 72 61 6e 64 20 6f 66 20 74 68 65 20 4f 50  perand of the OP
e4d0: 5f 43 72 65 61 74 65 42 74 72 65 65 20 6f 70 63  _CreateBtree opc
e4e0: 6f 64 65 20 66 72 6f 6d 20 42 54 52 45 45 5f 49  ode from BTREE_I
e4f0: 4e 54 4b 45 59 0a 20 20 2a 2a 20 69 6e 74 6f 20  NTKEY.  ** into 
e500: 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 2e 0a 20  BTREE_BLOBKEY.. 
e510: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
e520: 2d 3e 61 64 64 72 43 72 54 61 62 20 29 7b 0a 20  ->addrCrTab ){. 
e530: 20 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a     assert( v );.
e540: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
e550: 68 61 6e 67 65 50 33 28 76 2c 20 70 50 61 72 73  hangeP3(v, pPars
e560: 65 2d 3e 61 64 64 72 43 72 54 61 62 2c 20 42 54  e->addrCrTab, BT
e570: 52 45 45 5f 42 4c 4f 42 4b 45 59 29 3b 0a 20 20  REE_BLOBKEY);.  
e580: 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  }..  /* Locate t
e590: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
e5a0: 6e 64 65 78 2e 20 20 4f 72 2c 20 69 66 20 74 68  ndex.  Or, if th
e5b0: 69 73 20 74 61 62 6c 65 20 77 61 73 20 6f 72 69  is table was ori
e5c0: 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 61 6e 20  ginally.  ** an 
e5d0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
e5e0: 4b 45 59 20 74 61 62 6c 65 2c 20 63 72 65 61 74  KEY table, creat
e5f0: 65 20 61 20 6e 65 77 20 50 52 49 4d 41 52 59 20  e a new PRIMARY 
e600: 4b 45 59 20 69 6e 64 65 78 2e 20 0a 20 20 2a 2f  KEY index. .  */
e610: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b  .  if( pTab->iPK
e620: 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 45 78 70  ey>=0 ){.    Exp
e630: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20  rList *pList;.  
e640: 20 20 54 6f 6b 65 6e 20 69 70 6b 54 6f 6b 65 6e    Token ipkToken
e650: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b  ;.    sqlite3Tok
e660: 65 6e 49 6e 69 74 28 26 69 70 6b 54 6f 6b 65 6e  enInit(&ipkToken
e670: 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61  , pTab->aCol[pTa
e680: 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29  b->iPKey].zName)
e690: 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  ;.    pList = sq
e6a0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
e6b0: 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 0a  end(pParse, 0, .
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c    sqlite3ExprAll
e6e0: 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c 20 26 69  oc(db, TK_ID, &i
e6f0: 70 6b 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20  pkToken, 0));.  
e700: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
e710: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 69   return;.    pLi
e720: 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64  st->a[0].sortOrd
e730: 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 69 50 6b  er = pParse->iPk
e740: 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 61  SortOrder;.    a
e750: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
e760: 4e 65 77 54 61 62 6c 65 3d 3d 70 54 61 62 20 29  NewTable==pTab )
e770: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65  ;.    sqlite3Cre
e780: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
e790: 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c   0, 0, 0, pList,
e7a0: 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 2c 20   pTab->keyConf, 
e7b0: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20  0, 0, 0, 0,.    
e7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7d0: 20 20 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50     SQLITE_IDXTYP
e7e0: 45 5f 50 52 49 4d 41 52 59 4b 45 59 29 3b 0a 20  E_PRIMARYKEY);. 
e7f0: 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
e800: 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
e810: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
e820: 3b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69  ;.    pPk = sqli
e830: 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
e840: 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 70 54  ex(pTab);.    pT
e850: 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
e860: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b    }else{.    pPk
e870: 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
e880: 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
e890: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
e8a0: 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65 64 75 6e  Remove all redun
e8b0: 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  dant columns fro
e8c0: 6d 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  m the PRIMARY KE
e8d0: 59 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  Y.  For example,
e8e0: 20 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20 22   change.    ** "
e8f0: 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c  PRIMARY KEY(a,b,
e900: 61 2c 62 2c 63 2c 62 2c 63 2c 64 29 22 20 69 6e  a,b,c,b,c,d)" in
e910: 74 6f 20 6a 75 73 74 20 22 50 52 49 4d 41 52 59  to just "PRIMARY
e920: 20 4b 45 59 28 61 2c 62 2c 63 2c 64 29 22 2e 20   KEY(a,b,c,d)". 
e930: 20 4c 61 74 65 72 0a 20 20 20 20 2a 2a 20 63 6f   Later.    ** co
e940: 64 65 20 61 73 73 75 6d 65 73 20 74 68 65 20 50  de assumes the P
e950: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 74 61  RIMARY KEY conta
e960: 69 6e 73 20 6e 6f 20 72 65 70 65 61 74 65 64 20  ins no repeated 
e970: 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a 2f 0a  columns..    */.
e980: 20 20 20 20 66 6f 72 28 69 3d 6a 3d 31 3b 20 69      for(i=j=1; i
e990: 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69  <pPk->nKeyCol; i
e9a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68  ++){.      if( h
e9b0: 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69  asColumn(pPk->ai
e9c0: 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 70 50 6b 2d 3e  Column, j, pPk->
e9d0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a  aiColumn[i]) ){.
e9e0: 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 6e 43 6f          pPk->nCo
e9f0: 6c 75 6d 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65  lumn--;.      }e
ea00: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 6b  lse{.        pPk
ea10: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 2b 2b 5d 20  ->aiColumn[j++] 
ea20: 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  = pPk->aiColumn[
ea30: 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i];.      }.    
ea40: 7d 0a 20 20 20 20 70 50 6b 2d 3e 6e 4b 65 79 43  }.    pPk->nKeyC
ea50: 6f 6c 20 3d 20 6a 3b 0a 20 20 7d 0a 20 20 61 73  ol = j;.  }.  as
ea60: 73 65 72 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a  sert( pPk!=0 );.
ea70: 20 20 70 50 6b 2d 3e 69 73 43 6f 76 65 72 69 6e    pPk->isCoverin
ea80: 67 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 64 62  g = 1;.  if( !db
ea90: 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54  ->init.imposterT
eaa0: 61 62 6c 65 20 29 20 70 50 6b 2d 3e 75 6e 69 71  able ) pPk->uniq
eab0: 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 6e  NotNull = 1;.  n
eac0: 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  Pk = pPk->nKeyCo
ead0: 6c 3b 0a 0a 20 20 2f 2a 20 42 79 70 61 73 73 20  l;..  /* Bypass 
eae0: 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20  the creation of 
eaf0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
eb00: 62 74 72 65 65 20 61 6e 64 20 74 68 65 20 73 71  btree and the sq
eb10: 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a  lite_master.  **
eb20: 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 54 68   table entry. Th
eb30: 69 73 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69  is is only requi
eb40: 72 65 64 20 69 66 20 63 75 72 72 65 6e 74 6c 79  red if currently
eb50: 20 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45   generating VDBE
eb60: 0a 20 20 2a 2a 20 63 6f 64 65 20 66 6f 72 20 61  .  ** code for a
eb70: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 28 6e   CREATE TABLE (n
eb80: 6f 74 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20  ot when parsing 
eb90: 6f 6e 65 20 61 73 20 70 61 72 74 20 6f 66 20 72  one as part of r
eba0: 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61 20 64 61  eading.  ** a da
ebb0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 29 2e 20  tabase schema). 
ebc0: 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26 20 70   */.  if( v && p
ebd0: 50 6b 2d 3e 74 6e 75 6d 3e 30 20 29 7b 0a 20 20  Pk->tnum>0 ){.  
ebe0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e    assert( db->in
ebf0: 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20  it.busy==0 );.  
ec00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
ec10: 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 70 50 6b  ngeOpcode(v, pPk
ec20: 2d 3e 74 6e 75 6d 2c 20 4f 50 5f 47 6f 74 6f 29  ->tnum, OP_Goto)
ec30: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
ec40: 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
ec50: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20   PRIMARY KEY is 
ec60: 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 20 70  the table root p
ec70: 61 67 65 20 2a 2f 0a 20 20 70 50 6b 2d 3e 74 6e  age */.  pPk->tn
ec80: 75 6d 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b  um = pTab->tnum;
ec90: 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
eca0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
ecb0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c  esentation of al
ecc0: 6c 20 55 4e 49 51 55 45 20 69 6e 64 69 63 65 73  l UNIQUE indices
ecd0: 20 62 79 20 63 6f 6e 76 65 72 74 69 6e 67 0a 20   by converting. 
ece0: 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 72 6f   ** the final ro
ecf0: 77 69 64 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20  wid column into 
ed00: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75  one or more colu
ed10: 6d 6e 73 20 6f 66 20 74 68 65 20 50 52 49 4d 41  mns of the PRIMA
ed20: 52 59 20 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 66  RY KEY..  */.  f
ed30: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
ed40: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
ed50: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
ed60: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69 66     int n;.    if
ed70: 28 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e  ( IsPrimaryKeyIn
ed80: 64 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e 74  dex(pIdx) ) cont
ed90: 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d  inue;.    for(i=
eda0: 6e 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29  n=0; i<nPk; i++)
edb0: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73  {.      if( !has
edc0: 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43  Column(pIdx->aiC
edd0: 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65  olumn, pIdx->nKe
ede0: 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c  yCol, pPk->aiCol
edf0: 75 6d 6e 5b 69 5d 29 20 29 20 6e 2b 2b 3b 0a 20  umn[i]) ) n++;. 
ee00: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3d 3d     }.    if( n==
ee10: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
ee20: 69 73 20 69 6e 64 65 78 20 69 73 20 61 20 73 75  is index is a su
ee30: 70 65 72 73 65 74 20 6f 66 20 74 68 65 20 70 72  perset of the pr
ee40: 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 20  imary key */.   
ee50: 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e     pIdx->nColumn
ee60: 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   = pIdx->nKeyCol
ee70: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
ee80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ee90: 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63  resizeIndexObjec
eea0: 74 28 64 62 2c 20 70 49 64 78 2c 20 70 49 64 78  t(db, pIdx, pIdx
eeb0: 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 29 20 29 20 72  ->nKeyCol+n) ) r
eec0: 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69  eturn;.    for(i
eed0: 3d 30 2c 20 6a 3d 70 49 64 78 2d 3e 6e 4b 65 79  =0, j=pIdx->nKey
eee0: 43 6f 6c 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29  Col; i<nPk; i++)
eef0: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73  {.      if( !has
ef00: 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43  Column(pIdx->aiC
ef10: 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65  olumn, pIdx->nKe
ef20: 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c  yCol, pPk->aiCol
ef30: 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  umn[i]) ){.     
ef40: 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d     pIdx->aiColum
ef50: 6e 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f  n[j] = pPk->aiCo
ef60: 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20  lumn[i];.       
ef70: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d   pIdx->azColl[j]
ef80: 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69   = pPk->azColl[i
ef90: 5d 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a  ];.        j++;.
efa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
efb0: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
efc0: 6e 43 6f 6c 75 6d 6e 3e 3d 70 49 64 78 2d 3e 6e  nColumn>=pIdx->n
efd0: 4b 65 79 43 6f 6c 2b 6e 20 29 3b 0a 20 20 20 20  KeyCol+n );.    
efe0: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43  assert( pIdx->nC
eff0: 6f 6c 75 6d 6e 3e 3d 6a 20 29 3b 0a 20 20 7d 0a  olumn>=j );.  }.
f000: 0a 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20 74 61  .  /* Add all ta
f010: 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74  ble columns to t
f020: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
f030: 6e 64 65 78 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ndex.  */.  if( 
f040: 6e 50 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  nPk<pTab->nCol )
f050: 7b 0a 20 20 20 20 69 66 28 20 72 65 73 69 7a 65  {.    if( resize
f060: 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20  IndexObject(db, 
f070: 70 50 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29  pPk, pTab->nCol)
f080: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66   ) return;.    f
f090: 6f 72 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20 69  or(i=0, j=nPk; i
f0a0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
f0b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68 61  ){.      if( !ha
f0c0: 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43  sColumn(pPk->aiC
f0d0: 6f 6c 75 6d 6e 2c 20 6a 2c 20 69 29 20 29 7b 0a  olumn, j, i) ){.
f0e0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f0f0: 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  j<pPk->nColumn )
f100: 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61  ;.        pPk->a
f110: 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a  iColumn[j] = i;.
f120: 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 7a 43          pPk->azC
f130: 6f 6c 6c 5b 6a 5d 20 3d 20 73 71 6c 69 74 65 33  oll[j] = sqlite3
f140: 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20  StrBINARY;.     
f150: 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     j++;.      }.
f160: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
f170: 28 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d  ( pPk->nColumn==
f180: 6a 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  j );.    assert(
f190: 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29   pTab->nCol==j )
f1a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
f1b0: 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54  Pk->nColumn = pT
f1c0: 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20  ab->nCol;.  }.  
f1d0: 72 65 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 73  recomputeColumns
f1e0: 4e 6f 74 49 6e 64 65 78 65 64 28 70 50 6b 29 3b  NotIndexed(pPk);
f1f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
f200: 20 74 72 75 65 20 69 66 20 7a 4e 61 6d 65 20 69   true if zName i
f210: 73 20 61 20 73 68 61 64 6f 77 20 74 61 62 6c 65  s a shadow table
f220: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 63 75 72   name in the cur
f230: 72 65 6e 74 20 64 61 74 61 62 61 73 65 0a 2a 2a  rent database.**
f240: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
f250: 2a 2a 20 7a 4e 61 6d 65 20 69 73 20 74 65 6d 70  ** zName is temp
f260: 6f 72 61 72 69 6c 79 20 6d 6f 64 69 66 69 65 64  orarily modified
f270: 20 77 68 69 6c 65 20 74 68 69 73 20 72 6f 75 74   while this rout
f280: 69 6e 65 20 69 73 20 72 75 6e 6e 69 6e 67 2c 20  ine is running, 
f290: 62 75 74 20 69 73 0a 2a 2a 20 72 65 73 74 6f 72  but is.** restor
f2a0: 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
f2b0: 61 6c 20 76 61 6c 75 65 20 70 72 69 6f 72 20 74  al value prior t
f2c0: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  o this routine r
f2d0: 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
f2e0: 74 69 63 20 69 6e 74 20 69 73 53 68 61 64 6f 77  tic int isShadow
f2f0: 54 61 62 6c 65 4e 61 6d 65 28 73 71 6c 69 74 65  TableName(sqlite
f300: 33 20 2a 64 62 2c 20 63 68 61 72 20 2a 7a 4e 61  3 *db, char *zNa
f310: 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 61  me){.  char *zTa
f320: 69 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  il;             
f330: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
f340: 74 6f 20 74 68 65 20 6c 61 73 74 20 22 5f 22 20  to the last "_" 
f350: 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 54 61  in zName */.  Ta
f360: 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
f370: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f380: 61 62 6c 65 20 74 68 61 74 20 7a 4e 61 6d 65 20  able that zName 
f390: 69 73 20 61 20 73 68 61 64 6f 77 20 6f 66 20 2a  is a shadow of *
f3a0: 2f 0a 20 20 56 54 61 62 6c 65 20 2a 70 56 54 61  /.  VTable *pVTa
f3b0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
f3c0: 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62    /* Virtual tab
f3d0: 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  le corresponding
f3e0: 20 74 6f 20 70 54 61 62 20 2a 2f 0a 20 20 63 6f   to pTab */.  co
f3f0: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  nst sqlite3_modu
f400: 6c 65 20 2a 70 4d 6f 64 3b 20 20 20 2f 2a 20 6d  le *pMod;   /* m
f410: 6f 64 75 6c 65 20 6d 65 74 68 6f 64 73 20 66 6f  odule methods fo
f420: 72 20 70 56 54 61 62 20 2a 2f 0a 20 20 7a 54 61  r pVTab */.  zTa
f430: 69 6c 20 3d 20 73 74 72 72 63 68 72 28 7a 4e 61  il = strrchr(zNa
f440: 6d 65 2c 20 27 5f 27 29 3b 0a 20 20 69 66 28 20  me, '_');.  if( 
f450: 7a 54 61 69 6c 3d 3d 30 20 29 20 72 65 74 75 72  zTail==0 ) retur
f460: 6e 20 30 3b 0a 20 20 2a 7a 54 61 69 6c 20 3d 20  n 0;.  *zTail = 
f470: 30 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  0;.  pTab = sqli
f480: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
f490: 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 2a 7a   zName, 0);.  *z
f4a0: 54 61 69 6c 20 3d 20 27 5f 27 3b 0a 20 20 69 66  Tail = '_';.  if
f4b0: 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
f4c0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 49 73 56  rn 0;.  if( !IsV
f4d0: 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
f4e0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 56 54 61 62  eturn 0;.  pVTab
f4f0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54 61   = sqlite3GetVTa
f500: 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20  ble(db, pTab);. 
f510: 20 69 66 28 20 70 56 54 61 62 3d 3d 30 20 29 20   if( pVTab==0 ) 
f520: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
f530: 70 56 54 61 62 2d 3e 70 4d 6f 64 3d 3d 30 20 29  pVTab->pMod==0 )
f540: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4d 6f   return 0;.  pMo
f550: 64 20 3d 20 70 56 54 61 62 2d 3e 70 4d 6f 64 2d  d = pVTab->pMod-
f560: 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 61 73 73 65  >pModule;.  asse
f570: 72 74 28 20 70 4d 6f 64 21 3d 30 20 29 3b 0a 20  rt( pMod!=0 );. 
f580: 20 69 66 28 20 70 4d 6f 64 2d 3e 69 56 65 72 73   if( pMod->iVers
f590: 69 6f 6e 3c 33 20 29 20 72 65 74 75 72 6e 20 30  ion<3 ) return 0
f5a0: 3b 0a 20 20 69 66 28 20 70 4d 6f 64 2d 3e 78 53  ;.  if( pMod->xS
f5b0: 68 61 64 6f 77 4e 61 6d 65 3d 3d 30 20 29 20 72  hadowName==0 ) r
f5c0: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
f5d0: 6e 20 70 4d 6f 64 2d 3e 78 53 68 61 64 6f 77 4e  n pMod->xShadowN
f5e0: 61 6d 65 28 7a 54 61 69 6c 2b 31 29 3b 0a 7d 0a  ame(zTail+1);.}.
f5f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
f600: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
f610: 20 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61   report the fina
f620: 6c 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69  l ")" that termi
f630: 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54  nates.** a CREAT
f640: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
f650: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62  t..**.** The tab
f660: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
f670: 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72  t other action r
f680: 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65  outines have bee
f690: 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73  n building.** is
f6a0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
f6b0: 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c  ternal hash tabl
f6c0: 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20  es, assuming no 
f6d0: 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f  errors have.** o
f6e0: 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  ccurred..**.** A
f6f0: 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  n entry for the 
f700: 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e  table is made in
f710: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
f720: 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73  e on disk, unles
f730: 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74  s.** this is a t
f740: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f  emporary table o
f750: 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  r db->init.busy=
f760: 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e  =1.  When db->in
f770: 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74  it.busy==1.** it
f780: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65   means we are re
f790: 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  ading the sqlite
f7a0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65  _master table be
f7b0: 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a  cause we just.**
f7c0: 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68   connected to th
f7d0: 65 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65  e database or be
f7e0: 63 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65  cause the sqlite
f7f0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61  _master table ha
f800: 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68  s.** recently ch
f810: 61 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e  anged, so the en
f820: 74 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62  try for this tab
f830: 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
f840: 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69  s in.** the sqli
f850: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
f860: 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74    We do not want
f870: 20 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67   to create it ag
f880: 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ain..**.** If th
f890: 65 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65  e pSelect argume
f8a0: 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nt is not NULL, 
f8b0: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
f8c0: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61  is routine.** wa
f8d0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
f8e0: 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72  te a table gener
f8f0: 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20  ated from a .** 
f900: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e  "CREATE TABLE ..
f910: 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22  . AS SELECT ..."
f920: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
f930: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66   column names of
f940: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c  .** the new tabl
f950: 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65  e will match the
f960: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
f970: 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f  he SELECT..*/.vo
f980: 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  id sqlite3EndTab
f990: 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
f9a0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
f9b0: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
f9c0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73  /.  Token *pCons
f9d0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
f9e0: 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74  he ',' token aft
f9f0: 65 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  er the last colu
fa00: 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f  mn defn. */.  To
fa10: 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20  ken *pEnd,      
fa20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 27 29 27        /* The ')'
fa30: 20 62 65 66 6f 72 65 20 6f 70 74 69 6f 6e 73 20   before options 
fa40: 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41  in the CREATE TA
fa50: 42 4c 45 20 2a 2f 0a 20 20 75 38 20 74 61 62 4f  BLE */.  u8 tabO
fa60: 70 74 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  pts,            
fa70: 20 2f 2a 20 45 78 74 72 61 20 74 61 62 6c 65 20   /* Extra table 
fa80: 6f 70 74 69 6f 6e 73 2e 20 55 73 75 61 6c 6c 79  options. Usually
fa90: 20 30 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20   0. */.  Select 
faa0: 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 20  *pSelect        
fab0: 20 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20   /* Select from 
fac0: 61 20 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53  a "CREATE ... AS
fad0: 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20   SELECT" */.){. 
fae0: 20 54 61 62 6c 65 20 2a 70 3b 20 20 20 20 20 20   Table *p;      
faf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
fb00: 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20  e new table */. 
fb10: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
fb20: 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68  Parse->db; /* Th
fb30: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
fb40: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
fb50: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
fb60: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
fb70: 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 74 61   in which the ta
fb80: 62 6c 65 20 6c 69 76 65 73 20 2a 2f 0a 20 20 49  ble lives */.  I
fb90: 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
fba0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
fbb0: 6d 70 6c 69 65 64 20 69 6e 64 65 78 20 6f 66 20  mplied index of 
fbc0: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20  the table */..  
fbd0: 69 66 28 20 70 45 6e 64 3d 3d 30 20 26 26 20 70  if( pEnd==0 && p
fbe0: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
fbf0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
fc00: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
fc10: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 70 20  ocFailed );.  p 
fc20: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
fc30: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
fc40: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28  ) return;..  if(
fc50: 20 70 53 65 6c 65 63 74 3d 3d 30 20 26 26 20 69   pSelect==0 && i
fc60: 73 53 68 61 64 6f 77 54 61 62 6c 65 4e 61 6d 65  sShadowTableName
fc70: 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 20 29  (db, p->zName) )
fc80: 7b 0a 20 20 20 20 70 2d 3e 74 61 62 46 6c 61 67  {.    p->tabFlag
fc90: 73 20 7c 3d 20 54 46 5f 53 68 61 64 6f 77 3b 0a  s |= TF_Shadow;.
fca0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
fcb0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
fcc0: 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20  s 1 it means we 
fcd0: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
fce0: 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a  SQL off the.  **
fcf0: 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22   "sqlite_master"
fd00: 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70   or "sqlite_temp
fd10: 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f  _master" table o
fd20: 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a  n the disk..  **
fd30: 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65   So do not write
fd40: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61   to the disk aga
fd50: 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65  in.  Extract the
fd60: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
fd70: 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74  r.  ** for the t
fd80: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62  able from the db
fd90: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66  ->init.newTnum f
fda0: 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65  ield.  (The page
fdb0: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f   number.  ** sho
fdc0: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75  uld have been pu
fdd0: 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73  t there by the s
fde0: 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74  qliteOpenCb rout
fdf0: 69 6e 65 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ine.).  **.  ** 
fe00: 49 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  If the root page
fe10: 20 6e 75 6d 62 65 72 20 69 73 20 31 2c 20 74 68   number is 1, th
fe20: 61 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 73  at means this is
fe30: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
fe40: 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20 69 74  er.  ** table it
fe50: 73 65 6c 66 2e 20 20 53 6f 20 6d 61 72 6b 20 69  self.  So mark i
fe60: 74 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 20 20 2a  t read-only..  *
fe70: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
fe80: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69 66 28  .busy ){.    if(
fe90: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
fea0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
feb0: 67 28 70 50 61 72 73 65 2c 20 22 22 29 3b 0a 20  g(pParse, "");. 
fec0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
fed0: 20 7d 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d   }.    p->tnum =
fee0: 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
fef0: 6d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 6e  m;.    if( p->tn
ff00: 75 6d 3d 3d 31 20 29 20 70 2d 3e 74 61 62 46 6c  um==1 ) p->tabFl
ff10: 61 67 73 20 7c 3d 20 54 46 5f 52 65 61 64 6f 6e  ags |= TF_Readon
ff20: 6c 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70  ly;.  }..  /* Sp
ff30: 65 63 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67  ecial processing
ff40: 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57   for WITHOUT ROW
ff50: 49 44 20 54 61 62 6c 65 73 20 2a 2f 0a 20 20 69  ID Tables */.  i
ff60: 66 28 20 74 61 62 4f 70 74 73 20 26 20 54 46 5f  f( tabOpts & TF_
ff70: 57 69 74 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a  WithoutRowid ){.
ff80: 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46      if( (p->tabF
ff90: 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e  lags & TF_Autoin
ffa0: 63 72 65 6d 65 6e 74 29 20 29 7b 0a 20 20 20 20  crement) ){.    
ffb0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
ffc0: 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
ffd0: 20 20 20 20 22 41 55 54 4f 49 4e 43 52 45 4d 45      "AUTOINCREME
ffe0: 4e 54 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f  NT not allowed o
fff0: 6e 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  n WITHOUT ROWID 
10000 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20  tables");.      
10010 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
10020 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61    if( (p->tabFla
10030 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61  gs & TF_HasPrima
10040 72 79 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20  ryKey)==0 ){.   
10050 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
10060 73 67 28 70 50 61 72 73 65 2c 20 22 50 52 49 4d  sg(pParse, "PRIM
10070 41 52 59 20 4b 45 59 20 6d 69 73 73 69 6e 67 20  ARY KEY missing 
10080 6f 6e 20 74 61 62 6c 65 20 25 73 22 2c 20 70 2d  on table %s", p-
10090 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c  >zName);.    }el
100a0 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 74 61 62  se{.      p->tab
100b0 46 6c 61 67 73 20 7c 3d 20 54 46 5f 57 69 74 68  Flags |= TF_With
100c0 6f 75 74 52 6f 77 69 64 20 7c 20 54 46 5f 4e 6f  outRowid | TF_No
100d0 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20  VisibleRowid;.  
100e0 20 20 20 20 63 6f 6e 76 65 72 74 54 6f 57 69 74      convertToWit
100f0 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28 70  houtRowidTable(p
10100 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d  Parse, p);.    }
10110 0a 20 20 7d 0a 0a 20 20 69 44 62 20 3d 20 73 71  .  }..  iDb = sq
10120 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
10130 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d  ex(db, p->pSchem
10140 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  a);..#ifndef SQL
10150 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20  ITE_OMIT_CHECK. 
10160 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65   /* Resolve name
10170 73 20 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63  s in all CHECK c
10180 6f 6e 73 74 72 61 69 6e 74 20 65 78 70 72 65 73  onstraint expres
10190 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  sions..  */.  if
101a0 28 20 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20  ( p->pCheck ){. 
101b0 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
101c0 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70  eSelfReference(p
101d0 50 61 72 73 65 2c 20 70 2c 20 4e 43 5f 49 73 43  Parse, p, NC_IsC
101e0 68 65 63 6b 2c 20 30 2c 20 70 2d 3e 70 43 68 65  heck, 0, p->pChe
101f0 63 6b 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  ck);.  }.#endif 
10200 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
10210 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a  TE_OMIT_CHECK) *
10220 2f 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74 65  /..  /* Estimate
10230 20 74 68 65 20 61 76 65 72 61 67 65 20 72 6f 77   the average row
10240 20 73 69 7a 65 20 66 6f 72 20 74 68 65 20 74 61   size for the ta
10250 62 6c 65 20 61 6e 64 20 66 6f 72 20 61 6c 6c 20  ble and for all 
10260 69 6d 70 6c 69 65 64 20 69 6e 64 69 63 65 73 20  implied indices 
10270 2a 2f 0a 20 20 65 73 74 69 6d 61 74 65 54 61 62  */.  estimateTab
10280 6c 65 57 69 64 74 68 28 70 29 3b 0a 20 20 66 6f  leWidth(p);.  fo
10290 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78  r(pIdx=p->pIndex
102a0 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
102b0 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 65  x->pNext){.    e
102c0 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74  stimateIndexWidt
102d0 68 28 70 49 64 78 29 3b 0a 20 20 7d 0a 0a 20 20  h(pIdx);.  }..  
102e0 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61  /* If not initia
102f0 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65  lizing, then cre
10300 61 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72  ate a record for
10310 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20   the new table. 
10320 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54   ** in the SQLIT
10330 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f  E_MASTER table o
10340 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
10350 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    **.  ** If thi
10360 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59  s is a TEMPORARY
10370 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68   table, write th
10380 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  e entry into the
10390 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20   auxiliary.  ** 
103a0 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
103b0 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61  into the main da
103c0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
103d0 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  /.  if( !db->ini
103e0 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e  t.busy ){.    in
103f0 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  t n;.    Vdbe *v
10400 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  ;.    char *zTyp
10410 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20  e;    /* "view" 
10420 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20  or "table" */.  
10430 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20    char *zType2; 
10440 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22    /* "VIEW" or "
10450 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68  TABLE" */.    ch
10460 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a  ar *zStmt;    /*
10470 20 54 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   Text of the CRE
10480 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45  ATE TABLE or CRE
10490 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65  ATE VIEW stateme
104a0 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73  nt */..    v = s
104b0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
104c0 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 4e  arse);.    if( N
104d0 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74  EVER(v==0) ) ret
104e0 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  urn;..    sqlite
104f0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
10500 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20 20  P_Close, 0);..  
10510 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20 49 6e 69    /* .    ** Ini
10520 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20 66 6f  tialize zType fo
10530 72 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 6f  r the new view o
10540 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  r table..    */.
10550 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65      if( p->pSele
10560 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ct==0 ){.      /
10570 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c  * A regular tabl
10580 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65  e */.      zType
10590 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20 20 20   = "table";.    
105a0 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41 42 4c    zType2 = "TABL
105b0 45 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  E";.#ifndef SQLI
105c0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20  TE_OMIT_VIEW.   
105d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
105e0 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20   A view */.     
105f0 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77 22 3b   zType = "view";
10600 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20  .      zType2 = 
10610 22 56 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20  "VIEW";.#endif. 
10620 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
10630 74 68 69 73 20 69 73 20 61 20 43 52 45 41 54 45  this is a CREATE
10640 20 54 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c   TABLE xx AS SEL
10650 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65  ECT ..., execute
10660 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20   the SELECT.    
10670 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  ** statement to 
10680 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77  populate the new
10690 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74   table. The root
106a0 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72  -page number for
106b0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20   the.    ** new 
106c0 74 61 62 6c 65 20 69 73 20 69 6e 20 72 65 67 69  table is in regi
106d0 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67  ster pParse->reg
106e0 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  Root..    **.   
106f0 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c   ** Once the SEL
10700 45 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64  ECT has been cod
10710 65 64 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c  ed by sqlite3Sel
10720 65 63 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20  ect(), it is in 
10730 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c  a.    ** suitabl
10740 65 20 73 74 61 74 65 20 74 6f 20 71 75 65 72 79  e state to query
10750 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
10760 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20  names and types 
10770 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a  to be used.    *
10780 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74 61 62  * by the new tab
10790 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
107a0 2a 20 41 20 73 68 61 72 65 64 2d 63 61 63 68 65  * A shared-cache
107b0 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e   write-lock is n
107c0 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f 20 77  ot required to w
107d0 72 69 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20  rite to the new 
107e0 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73  table,.    ** as
107f0 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d   a schema-lock m
10800 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ust have already
10810 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74   been obtained t
10820 6f 20 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e  o create it. Sin
10830 63 65 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65  ce.    ** a sche
10840 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73  ma-lock excludes
10850 20 61 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62   all other datab
10860 61 73 65 20 75 73 65 72 73 2c 20 74 68 65 20 77  ase users, the w
10870 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a  rite-lock would.
10880 20 20 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64      ** be redund
10890 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ant..    */.    
108a0 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
108b0 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
108c0 64 65 73 74 3b 20 20 20 20 2f 2a 20 57 68 65 72  dest;    /* Wher
108d0 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 68 6f  e the SELECT sho
108e0 75 6c 64 20 73 74 6f 72 65 20 72 65 73 75 6c 74  uld store result
108f0 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  s */.      int r
10900 65 67 59 69 65 6c 64 3b 20 20 20 20 20 20 20 2f  egYield;       /
10910 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
10920 6e 67 20 63 6f 2d 72 6f 75 74 69 6e 65 20 65 6e  ng co-routine en
10930 74 72 79 2d 70 6f 69 6e 74 20 2a 2f 0a 20 20 20  try-point */.   
10940 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20     int addrTop; 
10950 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66         /* Top of
10960 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20   the co-routine 
10970 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  */.      int reg
10980 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Rec;         /* 
10990 41 20 72 65 63 6f 72 64 20 74 6f 20 62 65 20 69  A record to be i
109a0 6e 73 65 72 74 20 69 6e 74 6f 20 74 68 65 20 6e  nsert into the n
109b0 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ew table */.    
109c0 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 20    int regRowid; 
109d0 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 6f        /* Rowid o
109e0 66 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 74  f the next row t
109f0 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20  o insert */.    
10a00 20 20 69 6e 74 20 61 64 64 72 49 6e 73 4c 6f 6f    int addrInsLoo
10a10 70 3b 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20  p;    /* Top of 
10a20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 69 6e 73  the loop for ins
10a30 65 72 74 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20  erting rows */. 
10a40 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c       Table *pSel
10a50 54 61 62 3b 20 20 20 20 20 2f 2a 20 41 20 74 61  Tab;     /* A ta
10a60 62 6c 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ble that describ
10a70 65 73 20 74 68 65 20 53 45 4c 45 43 54 20 72 65  es the SELECT re
10a80 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 20 20 20 20  sults */..      
10a90 72 65 67 59 69 65 6c 64 20 3d 20 2b 2b 70 50 61  regYield = ++pPa
10aa0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
10ab0 20 72 65 67 52 65 63 20 3d 20 2b 2b 70 50 61 72   regRec = ++pPar
10ac0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
10ad0 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61  regRowid = ++pPa
10ae0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
10af0 20 61 73 73 65 72 74 28 70 50 61 72 73 65 2d 3e   assert(pParse->
10b00 6e 54 61 62 3d 3d 31 29 3b 0a 20 20 20 20 20 20  nTab==1);.      
10b10 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
10b20 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
10b30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10b40 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
10b50 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 72 65 67  , 1, pParse->reg
10b60 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20 20  Root, iDb);.    
10b70 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
10b80 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
10b90 50 32 49 53 52 45 47 29 3b 0a 20 20 20 20 20 20  P2ISREG);.      
10ba0 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32  pParse->nTab = 2
10bb0 3b 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 20  ;.      addrTop 
10bc0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
10bd0 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b  rentAddr(v) + 1;
10be0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10bf0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
10c00 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  nitCoroutine, re
10c10 67 59 69 65 6c 64 2c 20 30 2c 20 61 64 64 72 54  gYield, 0, addrT
10c20 6f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  op);.      if( p
10c30 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
10c40 74 75 72 6e 3b 0a 20 20 20 20 20 20 70 53 65 6c  turn;.      pSel
10c50 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
10c60 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
10c70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 3b  Parse, pSelect);
10c80 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 54  .      if( pSelT
10c90 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ab==0 ) return;.
10ca0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
10cb0 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
10cc0 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c    p->nCol = pSel
10cd0 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  Tab->nCol;.     
10ce0 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54   p->aCol = pSelT
10cf0 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->aCol;.      
10d00 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  pSelTab->nCol = 
10d10 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  0;.      pSelTab
10d20 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
10d30 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
10d40 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62  able(db, pSelTab
10d50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10d60 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
10d70 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74  dest, SRT_Corout
10d80 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a  ine, regYield);.
10d90 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
10da0 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
10db0 65 63 74 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  ect, &dest);.   
10dc0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
10dd0 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Err ) return;.  
10de0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
10df0 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72  ndCoroutine(v, r
10e00 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 20 20  egYield);.      
10e10 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
10e20 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 20 2d  ere(v, addrTop -
10e30 20 31 29 3b 0a 20 20 20 20 20 20 61 64 64 72 49   1);.      addrI
10e40 6e 73 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33  nsLoop = sqlite3
10e50 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
10e60 5f 59 69 65 6c 64 2c 20 64 65 73 74 2e 69 53 44  _Yield, dest.iSD
10e70 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 56 64 62  Parm);.      Vdb
10e80 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
10e90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10ea0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
10eb0 52 65 63 6f 72 64 2c 20 64 65 73 74 2e 69 53 64  Record, dest.iSd
10ec0 73 74 2c 20 64 65 73 74 2e 6e 53 64 73 74 2c 20  st, dest.nSdst, 
10ed0 72 65 67 52 65 63 29 3b 0a 20 20 20 20 20 20 73  regRec);.      s
10ee0 71 6c 69 74 65 33 54 61 62 6c 65 41 66 66 69 6e  qlite3TableAffin
10ef0 69 74 79 28 76 2c 20 70 2c 20 30 29 3b 0a 20 20  ity(v, p, 0);.  
10f00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10f10 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
10f20 6f 77 69 64 2c 20 31 2c 20 72 65 67 52 6f 77 69  owid, 1, regRowi
10f30 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
10f40 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
10f50 50 5f 49 6e 73 65 72 74 2c 20 31 2c 20 72 65 67  P_Insert, 1, reg
10f60 52 65 63 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Rec, regRowid);.
10f70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10f80 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 49 6e 73  eGoto(v, addrIns
10f90 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Loop);.      sql
10fa0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
10fb0 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29  (v, addrInsLoop)
10fc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10fd0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
10fe0 43 6c 6f 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d  Close, 1);.    }
10ff0 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
11000 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65   the complete te
11010 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
11020 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
11030 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
11040 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63  .      zStmt = c
11050 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 64  reateTableStmt(d
11060 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  b, p);.    }else
11070 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70  {.      Token *p
11080 45 6e 64 32 20 3d 20 74 61 62 4f 70 74 73 20 3f  End2 = tabOpts ?
11090 20 26 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54   &pParse->sLastT
110a0 6f 6b 65 6e 20 3a 20 70 45 6e 64 3b 0a 20 20 20  oken : pEnd;.   
110b0 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e     n = (int)(pEn
110c0 64 32 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e  d2->z - pParse->
110d0 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20  sNameToken.z);. 
110e0 20 20 20 20 20 69 66 28 20 70 45 6e 64 32 2d 3e       if( pEnd2->
110f0 7a 5b 30 5d 21 3d 27 3b 27 20 29 20 6e 20 2b 3d  z[0]!=';' ) n +=
11100 20 70 45 6e 64 32 2d 3e 6e 3b 0a 20 20 20 20 20   pEnd2->n;.     
11110 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
11120 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20  MPrintf(db, .   
11130 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 25         "CREATE %
11140 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c  s %.*s", zType2,
11150 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d   n, pParse->sNam
11160 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29  eToken.z.      )
11170 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
11180 41 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72  A slot for the r
11190 65 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64  ecord has alread
111a0 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
111b0 20 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   in the .    ** 
111c0 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
111d0 62 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65  ble.  We just ne
111e0 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 61  ed to update tha
111f0 74 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a  t slot with all.
11200 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72      ** the infor
11210 6d 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c  mation we've col
11220 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  lected..    */. 
11230 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
11240 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
11250 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
11260 73 20 22 0a 20 20 20 20 20 20 20 20 20 22 53 45  s ".         "SE
11270 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d  T type='%s', nam
11280 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25  e=%Q, tbl_name=%
11290 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c  Q, rootpage=#%d,
112a0 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20   sql=%Q ".      
112b0 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23 25   "WHERE rowid=#%
112c0 64 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44  d",.      db->aD
112d0 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c  b[iDb].zDbSName,
112e0 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a 20 20   MASTER_NAME,.  
112f0 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20      zType,.     
11300 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
11310 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
11320 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
11330 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a 20  ,.      zStmt,. 
11340 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67       pParse->reg
11350 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20 20 20  Rowid.    );.   
11360 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
11370 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73  b, zStmt);.    s
11380 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
11390 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
113a0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
113b0 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
113c0 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  ENT.    /* Check
113d0 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65   to see if we ne
113e0 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ed to create an 
113f0 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
11400 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a  table for.    **
11410 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f   keeping track o
11420 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
11430 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  keys..    */.   
11440 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67   if( (p->tabFlag
11450 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65  s & TF_Autoincre
11460 6d 65 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  ment)!=0 ){.    
11470 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
11480 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20  >aDb[iDb];.     
11490 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
114a0 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
114b0 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
114c0 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53       if( pDb->pS
114d0 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d  chema->pSeqTab==
114e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
114f0 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
11500 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
11510 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
11520 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  %Q.sqlite_sequen
11530 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20  ce(name,seq)",. 
11540 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 44           pDb->zD
11550 62 53 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29  bSName.        )
11560 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11570 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52  #endif..    /* R
11580 65 70 61 72 73 65 20 65 76 65 72 79 74 68 69 6e  eparse everythin
11590 67 20 74 6f 20 75 70 64 61 74 65 20 6f 75 72 20  g to update our 
115a0 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74  internal data st
115b0 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20  ructures */.    
115c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61  sqlite3VdbeAddPa
115d0 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69  rseSchemaOp(v, i
115e0 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73  Db,.           s
115f0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
11600 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27  , "tbl_name='%q'
11610 20 41 4e 44 20 74 79 70 65 21 3d 27 74 72 69 67   AND type!='trig
11620 67 65 72 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29  ger'", p->zName)
11630 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64  );.  }...  /* Ad
11640 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74  d the table to t
11650 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
11660 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
11670 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  he database..  *
11680 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
11690 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 54 61 62  .busy ){.    Tab
116a0 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 53 63  le *pOld;.    Sc
116b0 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
116c0 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  p->pSchema;.    
116d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
116e0 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
116f0 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
11700 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33    pOld = sqlite3
11710 48 61 73 68 49 6e 73 65 72 74 28 26 70 53 63 68  HashInsert(&pSch
11720 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d  ema->tblHash, p-
11730 3e 7a 4e 61 6d 65 2c 20 70 29 3b 0a 20 20 20 20  >zName, p);.    
11740 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20  if( pOld ){.    
11750 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c    assert( p==pOl
11760 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  d );  /* Malloc 
11770 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
11780 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65   inside HashInse
11790 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 73 71  rt() */.      sq
117a0 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
117b0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
117c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
117d0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30  e->pNewTable = 0
117e0 3b 0a 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61  ;.    db->mDbFla
117f0 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68  gs |= DBFLAG_Sch
11800 65 6d 61 43 68 61 6e 67 65 3b 0a 0a 23 69 66 6e  emaChange;..#ifn
11810 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11820 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69  ALTERTABLE.    i
11830 66 28 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29  f( !p->pSelect )
11840 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
11850 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e  ar *zName = (con
11860 73 74 20 63 68 61 72 20 2a 29 70 50 61 72 73 65  st char *)pParse
11870 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a  ->sNameToken.z;.
11880 20 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b        int nName;
11890 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
118a0 70 53 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73  pSelect && pCons
118b0 20 26 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20   && pEnd );.    
118c0 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d    if( pCons->z==
118d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  0 ){.        pCo
118e0 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20  ns = pEnd;.     
118f0 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d   }.      nName =
11900 20 28 69 6e 74 29 28 28 63 6f 6e 73 74 20 63 68   (int)((const ch
11910 61 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20  ar *)pCons->z - 
11920 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d  zName);.      p-
11930 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20  >addColOffset = 
11940 31 33 20 2b 20 73 71 6c 69 74 65 33 55 74 66 38  13 + sqlite3Utf8
11950 43 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e  CharLen(zName, n
11960 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Name);.    }.#en
11970 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  dif.  }.}..#ifnd
11980 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
11990 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  IEW./*.** The pa
119a0 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  rser calls this 
119b0 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72  routine in order
119c0 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
119d0 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71   VIEW.*/.void sq
119e0 6c 69 74 65 33 43 72 65 61 74 65 56 69 65 77 28  lite3CreateView(
119f0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
11a00 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  ,     /* The par
11a10 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
11a20 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c    Token *pBegin,
11a30 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41       /* The CREA
11a40 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65  TE token that be
11a50 67 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65  gins the stateme
11a60 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  nt */.  Token *p
11a70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68  Name1,     /* Th
11a80 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c  e token that hol
11a90 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ds the name of t
11aa0 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b  he view */.  Tok
11ab0 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
11ac0 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61  /* The token tha
11ad0 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  t holds the name
11ae0 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a   of the view */.
11af0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43 4e 61    ExprList *pCNa
11b00 6d 65 73 2c 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c  mes, /* Optional
11b10 20 6c 69 73 74 20 6f 66 20 76 69 65 77 20 63 6f   list of view co
11b20 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
11b30 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
11b40 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73     /* A SELECT s
11b50 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69  tatement that wi
11b60 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
11b70 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  w view */.  int 
11b80 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  isTemp,        /
11b90 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d  * TRUE for a TEM
11ba0 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20  PORARY view */. 
11bb0 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20   int noErr      
11bc0 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20      /* Suppress 
11bd0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
11be0 66 20 56 49 45 57 20 61 6c 72 65 61 64 79 20 65  f VIEW already e
11bf0 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61  xists */.){.  Ta
11c00 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b  ble *p;.  int n;
11c10 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
11c20 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a  ;.  Token sEnd;.
11c30 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a    DbFixer sFix;.
11c40 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d    Token *pName =
11c50 20 30 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20   0;.  int iDb;. 
11c60 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
11c70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
11c80 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30  ( pParse->nVar>0
11c90 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
11ca0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11cb0 22 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20  "parameters are 
11cc0 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76  not allowed in v
11cd0 69 65 77 73 22 29 3b 0a 20 20 20 20 67 6f 74 6f  iews");.    goto
11ce0 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69   create_view_fai
11cf0 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  l;.  }.  sqlite3
11d00 53 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73  StartTable(pPars
11d10 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
11d20 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c  2, isTemp, 1, 0,
11d30 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20 70   noErr);.  p = p
11d40 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
11d50 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
11d60 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67  pParse->nErr ) g
11d70 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f  oto create_view_
11d80 66 61 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33 54  fail;.  sqlite3T
11d90 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
11da0 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
11db0 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44  2, &pName);.  iD
11dc0 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
11dd0 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e  aToIndex(db, p->
11de0 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69  pSchema);.  sqli
11df0 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78  te3FixInit(&sFix
11e00 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  , pParse, iDb, "
11e10 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  view", pName);. 
11e20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 53   if( sqlite3FixS
11e30 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53 65  elect(&sFix, pSe
11e40 6c 65 63 74 29 20 29 20 67 6f 74 6f 20 63 72 65  lect) ) goto cre
11e50 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a  ate_view_fail;..
11e60 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79    /* Make a copy
11e70 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53   of the entire S
11e80 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
11e90 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
11ea0 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73   view..  ** This
11eb0 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20   will force all 
11ec0 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a  the Expr.token.z
11ed0 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79   values to be dy
11ee0 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61  namically.  ** a
11ef0 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20  llocated rather 
11f00 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68  than point to th
11f10 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d  e input string -
11f20 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61   which means tha
11f30 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c  t.  ** they will
11f40 20 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74   persist after t
11f50 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74  he current sqlit
11f60 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72  e3_exec() call r
11f70 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  eturns..  */.  i
11f80 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
11f90 45 43 54 20 29 7b 0a 20 20 20 20 70 2d 3e 70 53  ECT ){.    p->pS
11fa0 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b  elect = pSelect;
11fb0 0a 20 20 20 20 70 53 65 6c 65 63 74 20 3d 20 30  .    pSelect = 0
11fc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
11fd0 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
11fe0 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
11ff0 20 70 53 65 6c 65 63 74 2c 20 45 58 50 52 44 55   pSelect, EXPRDU
12000 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 7d 0a 20  P_REDUCE);.  }. 
12010 20 70 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c   p->pCheck = sql
12020 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
12030 64 62 2c 20 70 43 4e 61 6d 65 73 2c 20 45 58 50  db, pCNames, EXP
12040 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
12050 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
12060 69 6c 65 64 20 29 20 67 6f 74 6f 20 63 72 65 61  iled ) goto crea
12070 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20  te_view_fail;.. 
12080 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65   /* Locate the e
12090 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
120a0 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e   VIEW statement.
120b0 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e    Make sEnd poin
120c0 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e  t to.  ** the en
120d0 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d  d..  */.  sEnd =
120e0 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f   pParse->sLastTo
120f0 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ken;.  assert( s
12100 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 7c 7c 20 73  End.z[0]!=0 || s
12110 45 6e 64 2e 6e 3d 3d 30 20 29 3b 0a 20 20 69 66  End.n==0 );.  if
12120 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27  ( sEnd.z[0]!=';'
12130 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b   ){.    sEnd.z +
12140 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20  = sEnd.n;.  }.  
12150 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20  sEnd.n = 0;.  n 
12160 3d 20 28 69 6e 74 29 28 73 45 6e 64 2e 7a 20 2d  = (int)(sEnd.z -
12170 20 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20 61   pBegin->z);.  a
12180 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20  ssert( n>0 );.  
12190 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20  z = pBegin->z;. 
121a0 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49   while( sqlite3I
121b0 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 20 29  sspace(z[n-1]) )
121c0 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e  { n--; }.  sEnd.
121d0 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73  z = &z[n-1];.  s
121e0 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a  End.n = 1;..  /*
121f0 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54   Use sqlite3EndT
12200 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68  able() to add th
12210 65 20 76 69 65 77 20 74 6f 20 74 68 65 20 53 51  e view to the SQ
12220 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
12230 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e  e */.  sqlite3En
12240 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30  dTable(pParse, 0
12250 2c 20 26 73 45 6e 64 2c 20 30 2c 20 30 29 3b 0a  , &sEnd, 0, 0);.
12260 0a 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69  .create_view_fai
12270 6c 3a 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  l:.  sqlite3Sele
12280 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
12290 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 49 4e 5f  lect);.  if( IN_
122a0 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
122b0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61  .    sqlite3Rena
122c0 6d 65 45 78 70 72 6c 69 73 74 55 6e 6d 61 70 28  meExprlistUnmap(
122d0 70 50 61 72 73 65 2c 20 70 43 4e 61 6d 65 73 29  pParse, pCNames)
122e0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
122f0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
12300 2c 20 70 43 4e 61 6d 65 73 29 3b 0a 20 20 72 65  , pCNames);.  re
12310 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  turn;.}.#endif /
12320 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
12330 45 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  EW */..#if !defi
12340 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
12350 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
12360 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
12370 52 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a  RTUALTABLE)./*.*
12380 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
12390 63 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20  cture pTable is 
123a0 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20  really a VIEW.  
123b0 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65  Fill in the name
123c0 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  s of.** the colu
123d0 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20  mns of the view 
123e0 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74  in the pTable st
123f0 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e  ructure.  Return
12400 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
12410 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
12420 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c   error is seen l
12430 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
12440 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
12450 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  >zErrMsg..*/.int
12460 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
12470 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65  olumnNames(Parse
12480 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
12490 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c  *pTable){.  Tabl
124a0 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a  e *pSelTab;   /*
124b0 20 41 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72   A fake table fr
124c0 6f 6d 20 77 68 69 63 68 20 77 65 20 67 65 74 20  om which we get 
124d0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
124e0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
124f0 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66  ;     /* Copy of
12500 20 74 68 65 20 53 45 4c 45 43 54 20 74 68 61 74   the SELECT that
12510 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
12520 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  view */.  int nE
12530 72 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e  rr = 0;     /* N
12540 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
12550 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20  encountered */. 
12560 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
12570 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c     /* Temporaril
12580 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62  y holds the numb
12590 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73  er of cursors as
125a0 73 69 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69  signed */.  sqli
125b0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
125c0 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61  ->db;  /* Databa
125d0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f  se connection fo
125e0 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  r malloc errors 
125f0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
12600 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
12610 42 4c 45 0a 20 20 69 6e 74 20 72 63 3b 0a 23 65  BLE.  int rc;.#e
12620 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
12630 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
12640 5a 41 54 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33  ZATION.  sqlite3
12650 5f 78 61 75 74 68 20 78 41 75 74 68 3b 20 20 20  _xauth xAuth;   
12660 20 20 20 20 2f 2a 20 53 61 76 65 64 20 78 41 75      /* Saved xAu
12670 74 68 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 23 65  th pointer */.#e
12680 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
12690 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64  pTable );..#ifnd
126a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
126b0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 64 62  IRTUALTABLE.  db
126c0 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 2b 2b 3b  ->nSchemaLock++;
126d0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
126e0 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70  tabCallConnect(p
126f0 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29 3b 0a  Parse, pTable);.
12700 20 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63    db->nSchemaLoc
12710 6b 2d 2d 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  k--;.  if( rc ){
12720 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
12730 20 7d 0a 20 20 69 66 28 20 49 73 56 69 72 74 75   }.  if( IsVirtu
12740 61 6c 28 70 54 61 62 6c 65 29 20 29 20 72 65 74  al(pTable) ) ret
12750 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  urn 0;.#endif..#
12760 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12770 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41 20 70  IT_VIEW.  /* A p
12780 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61  ositive nCol mea
12790 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e  ns the columns n
127a0 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69  ames for this vi
127b0 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65  ew are.  ** alre
127c0 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a  ady known..  */.
127d0 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43    if( pTable->nC
127e0 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b  ol>0 ) return 0;
127f0 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76  ..  /* A negativ
12800 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63  e nCol is a spec
12810 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69  ial marker meani
12820 6e 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63  ng that we are c
12830 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72  urrently.  ** tr
12840 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20  ying to compute 
12850 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
12860 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74  .  If we enter t
12870 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
12880 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65  .  ** a negative
12890 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20   nCol, it means 
128a0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77  two or more view
128b0 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c  s form a loop, l
128c0 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ike this:.  **. 
128d0 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56   **     CREATE V
128e0 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43  IEW one AS SELEC
128f0 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20  T * FROM two;.  
12900 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
12910 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54  EW two AS SELECT
12920 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a   * FROM one;.  *
12930 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  *.  ** Actually,
12940 20 74 68 65 20 65 72 72 6f 72 20 61 62 6f 76 65   the error above
12950 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70   is now caught p
12960 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67  rior to reaching
12970 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a   this point..  *
12980 2a 20 42 75 74 20 74 68 65 20 66 6f 6c 6c 6f 77  * But the follow
12990 69 6e 67 20 74 65 73 74 20 69 73 20 73 74 69 6c  ing test is stil
129a0 6c 20 69 6d 70 6f 72 74 61 6e 74 20 61 73 20 69  l important as i
129b0 74 20 64 6f 65 73 20 63 6f 6d 65 20 75 70 0a 20  t does come up. 
129c0 20 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f   ** in the follo
129d0 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a  wing:.  ** .  **
129e0 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
129f0 45 20 6d 61 69 6e 2e 65 78 31 28 61 29 3b 0a 20  E main.ex1(a);. 
12a00 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54   **     CREATE T
12a10 45 4d 50 20 56 49 45 57 20 65 78 31 20 41 53 20  EMP VIEW ex1 AS 
12a20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 65 78  SELECT a FROM ex
12a30 31 3b 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  1;.  **     SELE
12a40 43 54 20 2a 20 46 52 4f 4d 20 74 65 6d 70 2e 65  CT * FROM temp.e
12a50 78 31 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  x1;.  */.  if( p
12a60 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b  Table->nCol<0 ){
12a70 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
12a80 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
12a90 65 77 20 25 73 20 69 73 20 63 69 72 63 75 6c 61  ew %s is circula
12aa0 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54  rly defined", pT
12ab0 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  able->zName);.  
12ac0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
12ad0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
12ae0 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20  ->nCol>=0 );..  
12af0 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
12b00 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
12b10 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75  we need to compu
12b20 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  te the table nam
12b30 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68  es..  ** Note th
12b40 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  at the call to s
12b50 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
12b60 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65  fSelect() will e
12b70 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22  xpand any.  ** "
12b80 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  *" elements in t
12b90 68 65 20 72 65 73 75 6c 74 73 20 73 65 74 20 6f  he results set o
12ba0 66 20 74 68 65 20 76 69 65 77 20 61 6e 64 20 77  f the view and w
12bb0 69 6c 6c 20 61 73 73 69 67 6e 20 63 75 72 73 6f  ill assign curso
12bc0 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 65  rs.  ** to the e
12bd0 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 46  lements of the F
12be0 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42 75 74  ROM clause.  But
12bf0 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   we do not want 
12c00 74 68 65 73 65 20 63 68 61 6e 67 65 73 0a 20 20  these changes.  
12c10 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d 61 6e 65  ** to be permane
12c20 6e 74 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d 70  nt.  So the comp
12c30 75 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20  utation is done 
12c40 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  on a copy of the
12c50 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61   SELECT.  ** sta
12c60 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69  tement that defi
12c70 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20  nes the view..  
12c80 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  */.  assert( pTa
12c90 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a  ble->pSelect );.
12ca0 20 20 70 53 65 6c 20 3d 20 73 71 6c 69 74 65 33    pSel = sqlite3
12cb0 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54  SelectDup(db, pT
12cc0 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30  able->pSelect, 0
12cd0 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 20 29 7b  );.  if( pSel ){
12ce0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12cf0 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a  OMIT_ALTERTABLE.
12d00 20 20 20 20 75 38 20 65 50 61 72 73 65 4d 6f 64      u8 eParseMod
12d10 65 20 3d 20 70 50 61 72 73 65 2d 3e 65 50 61 72  e = pParse->ePar
12d20 73 65 4d 6f 64 65 3b 0a 20 20 20 20 70 50 61 72  seMode;.    pPar
12d30 73 65 2d 3e 65 50 61 72 73 65 4d 6f 64 65 20 3d  se->eParseMode =
12d40 20 50 41 52 53 45 5f 4d 4f 44 45 5f 4e 4f 52 4d   PARSE_MODE_NORM
12d50 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 6e  AL;.#endif.    n
12d60 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b   = pParse->nTab;
12d70 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  .    sqlite3SrcL
12d80 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
12d90 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70  (pParse, pSel->p
12da0 53 72 63 29 3b 0a 20 20 20 20 70 54 61 62 6c 65  Src);.    pTable
12db0 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20  ->nCol = -1;.   
12dc0 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
12dd0 44 69 73 61 62 6c 65 2b 2b 3b 0a 23 69 66 6e 64  Disable++;.#ifnd
12de0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
12df0 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20  UTHORIZATION.   
12e00 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78 41 75   xAuth = db->xAu
12e10 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74  th;.    db->xAut
12e20 68 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54  h = 0;.    pSelT
12e30 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
12e40 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
12e50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20  arse, pSel);.   
12e60 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 78 41 75   db->xAuth = xAu
12e70 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 53  th;.#else.    pS
12e80 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
12e90 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
12ea0 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a  (pParse, pSel);.
12eb0 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 72 73  #endif.    pPars
12ec0 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 20  e->nTab = n;.   
12ed0 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 70 43 68   if( pTable->pCh
12ee0 65 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  eck ){.      /* 
12ef0 43 52 45 41 54 45 20 56 49 45 57 20 6e 61 6d 65  CREATE VIEW name
12f00 28 61 72 67 6c 69 73 74 29 20 41 53 20 2e 2e 2e  (arglist) AS ...
12f10 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6e 61  .      ** The na
12f20 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  mes of the colum
12f30 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
12f40 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 0a 20  are taken from. 
12f50 20 20 20 20 20 2a 2a 20 61 72 67 6c 69 73 74 20       ** arglist 
12f60 77 68 69 63 68 20 69 73 20 73 74 6f 72 65 64 20  which is stored 
12f70 69 6e 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63  in pTable->pChec
12f80 6b 2e 20 20 54 68 65 20 70 43 68 65 63 6b 20 66  k.  The pCheck f
12f90 69 65 6c 64 0a 20 20 20 20 20 20 2a 2a 20 6e 6f  ield.      ** no
12fa0 72 6d 61 6c 6c 79 20 68 6f 6c 64 73 20 43 48 45  rmally holds CHE
12fb0 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  CK constraints o
12fc0 6e 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 74 61  n an ordinary ta
12fd0 62 6c 65 2c 20 62 75 74 20 66 6f 72 0a 20 20 20  ble, but for.   
12fe0 20 20 20 2a 2a 20 61 20 56 49 45 57 20 69 74 20     ** a VIEW it 
12ff0 68 6f 6c 64 73 20 74 68 65 20 6c 69 73 74 20 6f  holds the list o
13000 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 0a  f column names..
13010 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
13020 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f  qlite3ColumnsFro
13030 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
13040 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b  , pTable->pCheck
13050 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
13060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13070 20 20 20 20 26 70 54 61 62 6c 65 2d 3e 6e 43 6f      &pTable->nCo
13080 6c 2c 20 26 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  l, &pTable->aCol
13090 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
130a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
130b0 20 0a 20 20 20 20 20 20 20 26 26 20 70 50 61 72   .       && pPar
130c0 73 65 2d 3e 6e 45 72 72 3d 3d 30 0a 20 20 20 20  se->nErr==0.    
130d0 20 20 20 26 26 20 70 54 61 62 6c 65 2d 3e 6e 43     && pTable->nC
130e0 6f 6c 3d 3d 70 53 65 6c 2d 3e 70 45 4c 69 73 74  ol==pSel->pEList
130f0 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 29 7b  ->nExpr.      ){
13100 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13110 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  SelectAddColumnT
13120 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
13130 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 2c 20  pParse, pTable, 
13140 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pSel);.      }. 
13150 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53 65     }else if( pSe
13160 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a  lTab ){.      /*
13170 20 43 52 45 41 54 45 20 56 49 45 57 20 6e 61 6d   CREATE VIEW nam
13180 65 20 41 53 2e 2e 2e 20 20 77 69 74 68 6f 75 74  e AS...  without
13190 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 6c 69 73   an argument lis
131a0 74 2e 20 20 43 6f 6e 73 74 72 75 63 74 0a 20 20  t.  Construct.  
131b0 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6c 75 6d      ** the colum
131c0 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74 68 65  n names from the
131d0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
131e0 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
131f0 68 65 20 76 69 65 77 2e 0a 20 20 20 20 20 20 2a  he view..      *
13200 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
13210 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20  pTable->aCol==0 
13220 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d  );.      pTable-
13230 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >nCol = pSelTab-
13240 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61  >nCol;.      pTa
13250 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c  ble->aCol = pSel
13260 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  Tab->aCol;.     
13270 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
13280 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61   0;.      pSelTa
13290 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
132a0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
132b0 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
132c0 64 28 64 62 2c 20 30 2c 20 70 54 61 62 6c 65 2d  d(db, 0, pTable-
132d0 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20  >pSchema) );.   
132e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
132f0 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  able->nCol = 0;.
13300 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
13310 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
13320 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
13330 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 73 71 6c  SelTab);.    sql
13340 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
13350 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  (db, pSel);.    
13360 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44  db->lookaside.bD
13370 69 73 61 62 6c 65 2d 2d 3b 0a 23 69 66 6e 64 65  isable--;.#ifnde
13380 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c  f SQLITE_OMIT_AL
13390 54 45 52 54 41 42 4c 45 0a 20 20 20 20 70 50 61  TERTABLE.    pPa
133a0 72 73 65 2d 3e 65 50 61 72 73 65 4d 6f 64 65 20  rse->eParseMode 
133b0 3d 20 65 50 61 72 73 65 4d 6f 64 65 3b 0a 23 65  = eParseMode;.#e
133c0 6e 64 69 66 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  ndif.  } else {.
133d0 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a      nErr++;.  }.
133e0 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d    pTable->pSchem
133f0 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 20 7c  a->schemaFlags |
13400 3d 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  = DB_UnresetView
13410 73 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  s;.  if( db->mal
13420 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
13430 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f   sqlite3DeleteCo
13440 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54  lumnNames(db, pT
13450 61 62 6c 65 29 3b 0a 20 20 20 20 70 54 61 62 6c  able);.    pTabl
13460 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  e->aCol = 0;.   
13470 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
13480 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  0;.  }.#endif /*
13490 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
134a0 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45  W */.  return nE
134b0 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f  rr;  .}.#endif /
134c0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
134d0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
134e0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
134f0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
13500 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  E) */..#ifndef S
13510 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
13520 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
13530 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f  column names fro
13540 6d 20 65 76 65 72 79 20 56 49 45 57 20 69 6e 20  m every VIEW in 
13550 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f  database idx..*/
13560 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
13570 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
13580 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
13590 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65   idx){.  HashEle
135a0 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72 74 28 20  m *i;.  assert( 
135b0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
135c0 65 78 48 65 6c 64 28 64 62 2c 20 69 64 78 2c 20  exHeld(db, idx, 
135d0 30 29 20 29 3b 0a 20 20 69 66 28 20 21 44 62 48  0) );.  if( !DbH
135e0 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  asProperty(db, i
135f0 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69  dx, DB_UnresetVi
13600 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ews) ) return;. 
13610 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
13620 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b  hFirst(&db->aDb[
13630 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62  idx].pSchema->tb
13640 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69  lHash); i;i=sqli
13650 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
13660 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
13670 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
13680 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  (i);.    if( pTa
13690 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
136a0 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
136b0 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c  eColumnNames(db,
136c0 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 70 54   pTab);.      pT
136d0 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
136e0 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d      pTab->nCol =
136f0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
13700 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  DbClearProperty(
13710 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65  db, idx, DB_Unre
13720 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c  setViews);.}.#el
13730 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69  se.# define sqli
13740 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 41  teViewResetAll(A
13750 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ,B).#endif /* SQ
13760 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
13770 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /../*.** This fu
13780 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
13790 20 62 79 20 74 68 65 20 56 44 42 45 20 74 6f 20   by the VDBE to 
137a0 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65 72  adjust the inter
137b0 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73  nal schema.** us
137c0 65 64 20 62 79 20 53 51 4c 69 74 65 20 77 68 65  ed by SQLite whe
137d0 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  n the btree laye
137e0 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65 20  r moves a table 
137f0 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a 2a  root page. The.*
13800 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61  * root-page of a
13810 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
13820 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 20  in database iDb 
13830 68 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d  has changed from
13840 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f   iFrom.** to iTo
13850 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23  ..**.** Ticket #
13860 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d 62 6f  1728:  The symbo
13870 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 73 74  l table might st
13880 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f  ill contain info
13890 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61  rmation.** on ta
138a0 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69  bles and/or indi
138b0 63 65 73 20 74 68 61 74 20 61 72 65 20 74 68 65  ces that are the
138c0 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e   process of bein
138d0 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66  g deleted..** If
138e0 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b 79   you are unlucky
138f0 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 64  , one of those d
13900 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 20 6f  eleted indices o
13910 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a  r tables might.*
13920 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  * have the same 
13930 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72 20  rootpage number 
13940 61 73 20 74 68 65 20 72 65 61 6c 20 74 61 62 6c  as the real tabl
13950 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61 74 20  e or index that 
13960 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65  is.** being move
13970 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74  d.  So we cannot
13980 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e 67 20   stop searching 
13990 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74 20  after the first 
139a0 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61 75 73  match .** becaus
139b0 65 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  e the first matc
139c0 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72 20 6f  h might be for o
139d0 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65 74 65  ne of the delete
139e0 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20  d indices.** or 
139f0 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74  tables and not t
13a00 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 74  he table/index t
13a10 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20  hat is actually 
13a20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20  being moved..** 
13a30 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65  We must continue
13a40 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61   looping until a
13a50 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e  ll tables and in
13a60 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f  dices with.** ro
13a70 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61  otpage==iFrom ha
13a80 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65  ve been converte
13a90 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f 6f 74  d to have a root
13aa0 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69  page of iTo.** i
13ab0 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 65  n order to be ce
13ac0 72 74 61 69 6e 20 74 68 61 74 20 77 65 20 67 6f  rtain that we go
13ad0 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e 65 2e  t the right one.
13ae0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
13af0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
13b00 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  UM.void sqlite3R
13b10 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 73 71 6c  ootPageMoved(sql
13b20 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
13b30 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  b, int iFrom, in
13b40 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c  t iTo){.  HashEl
13b50 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73  em *pElem;.  Has
13b60 68 20 2a 70 48 61 73 68 3b 0a 20 20 44 62 20 2a  h *pHash;.  Db *
13b70 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pDb;..  assert( 
13b80 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
13b90 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
13ba0 30 29 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64  0) );.  pDb = &d
13bb0 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70  b->aDb[iDb];.  p
13bc0 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63  Hash = &pDb->pSc
13bd0 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20  hema->tblHash;. 
13be0 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
13bf0 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68  eHashFirst(pHash
13c00 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
13c10 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
13c20 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c  Elem)){.    Tabl
13c30 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
13c40 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
13c50 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74  .    if( pTab->t
13c60 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  num==iFrom ){.  
13c70 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d      pTab->tnum =
13c80 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   iTo;.    }.  }.
13c90 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e    pHash = &pDb->
13ca0 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
13cb0 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  ;.  for(pElem=sq
13cc0 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48  liteHashFirst(pH
13cd0 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
13ce0 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
13cf0 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49  t(pElem)){.    I
13d00 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c  ndex *pIdx = sql
13d10 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
13d20 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  m);.    if( pIdx
13d30 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b  ->tnum==iFrom ){
13d40 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75  .      pIdx->tnu
13d50 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20  m = iTo;.    }. 
13d60 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
13d70 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f  ** Write code to
13d80 20 65 72 61 73 65 20 74 68 65 20 74 61 62 6c 65   erase the table
13d90 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
13da0 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61  iTable from data
13db0 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73  base iDb..** Als
13dc0 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20  o write code to 
13dd0 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69 74  modify the sqlit
13de0 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e_master table a
13df0 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  nd internal sche
13e00 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d  ma.** if a root-
13e10 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20  page of another 
13e20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62  table is moved b
13e30 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65  y the btree-laye
13e40 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73  r whilst.** eras
13e50 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69 73  ing iTable (this
13e60 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
13e70 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
13e80 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73  database)..*/ .s
13e90 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72  tatic void destr
13ea0 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65  oyRootPage(Parse
13eb0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54   *pParse, int iT
13ec0 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  able, int iDb){.
13ed0 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
13ee0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
13ef0 65 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73  e);.  int r1 = s
13f00 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
13f10 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
13f20 69 54 61 62 6c 65 3c 32 20 29 20 73 71 6c 69 74  iTable<2 ) sqlit
13f30 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
13f40 65 2c 20 22 63 6f 72 72 75 70 74 20 73 63 68 65  e, "corrupt sche
13f50 6d 61 22 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ma");.  sqlite3V
13f60 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
13f70 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c  Destroy, iTable,
13f80 20 72 31 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c   r1, iDb);.  sql
13f90 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
13fa0 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  rse);.#ifndef SQ
13fb0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
13fc0 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73  CUUM.  /* OP_Des
13fd0 74 72 6f 79 20 73 74 6f 72 65 73 20 61 6e 20 69  troy stores an i
13fe0 6e 20 69 6e 74 65 67 65 72 20 72 31 2e 20 49 66  n integer r1. If
13ff0 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20   this integer.  
14000 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ** is non-zero, 
14010 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72  then it is the r
14020 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
14030 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64  of a table moved
14040 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f   to.  ** locatio
14050 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f  n iTable. The fo
14060 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64  llowing code mod
14070 69 66 69 65 73 20 74 68 65 20 73 71 6c 69 74 65  ifies the sqlite
14080 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f  _master table to
14090 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68  .  ** reflect th
140a0 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  is..  **.  ** Th
140b0 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20  e "#NNN" in the 
140c0 53 51 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c  SQL is a special
140d0 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d   constant that m
140e0 65 61 6e 73 20 77 68 61 74 65 76 65 72 20 76 61  eans whatever va
140f0 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72  lue.  ** is in r
14100 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65  egister NNN.  Se
14110 65 20 67 72 61 6d 6d 61 72 20 72 75 6c 65 73 20  e grammar rules 
14120 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
14130 74 68 65 20 54 4b 5f 52 45 47 49 53 54 45 52 0a  the TK_REGISTER.
14140 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61    ** token for a
14150 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
14160 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71  ation..  */.  sq
14170 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
14180 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22  (pParse, .     "
14190 55 50 44 41 54 45 20 25 51 2e 25 73 20 53 45 54  UPDATE %Q.%s SET
141a0 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45   rootpage=%d WHE
141b0 52 45 20 23 25 64 20 41 4e 44 20 72 6f 6f 74 70  RE #%d AND rootp
141c0 61 67 65 3d 23 25 64 22 2c 0a 20 20 20 20 20 70  age=#%d",.     p
141d0 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
141e0 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41  Db].zDbSName, MA
141f0 53 54 45 52 5f 4e 41 4d 45 2c 20 69 54 61 62 6c  STER_NAME, iTabl
14200 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23 65 6e 64  e, r1, r1);.#end
14210 69 66 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  if.  sqlite3Rele
14220 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
14230 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e, r1);.}../*.**
14240 20 57 72 69 74 65 20 56 44 42 45 20 63 6f 64 65   Write VDBE code
14250 20 74 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20   to erase table 
14260 70 54 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73  pTab and all ass
14270 6f 63 69 61 74 65 64 20 69 6e 64 69 63 65 73 20  ociated indices 
14280 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65  on disk..** Code
14290 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 73   to update the s
142a0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
142b0 6c 65 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c  les and internal
142c0 20 73 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69   schema definiti
142d0 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61  ons.** in case a
142e0 20 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e   root-page belon
142f0 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20  ging to another 
14300 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62  table is moved b
14310 79 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  y the btree laye
14320 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64  r.** is also add
14330 65 64 20 28 74 68 69 73 20 63 61 6e 20 68 61 70  ed (this can hap
14340 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f  pen with an auto
14350 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
14360 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
14370 64 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50  d destroyTable(P
14380 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
14390 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 2f 2a  ble *pTab){.  /*
143a0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
143b0 20 6d 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63   may be auto-vac
143c0 75 75 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20  uum capable (if 
143d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
143e0 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e  VACUUM.  ** is n
143f0 6f 74 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65  ot defined), the
14400 6e 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  n it is importan
14410 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73  t to call OP_Des
14420 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  troy on the.  **
14430 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
14440 20 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f   root-pages in o
14450 72 64 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77  rder, starting w
14460 69 74 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61  ith the numerica
14470 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73  lly .  ** larges
14480 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  t root-page numb
14490 65 72 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74  er. This guarant
144a0 65 65 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66  ees that none of
144b0 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a   the root-pages.
144c0 20 20 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72    ** to be destr
144d0 6f 79 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65  oyed is relocate
144e0 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
144f0 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e  OP_Destroy. i.e.
14500 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c   if the.  ** fol
14510 6c 6f 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65  lowing were code
14520 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f  d:.  **.  ** OP_
14530 44 65 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a  Destroy 4 0.  **
14540 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73   ....  ** OP_Des
14550 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20  troy 5 0.  **.  
14560 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65  ** and root page
14570 20 35 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62   5 happened to b
14580 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f  e the largest ro
14590 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69  ot-page number i
145a0 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
145b0 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70  ase, then root p
145c0 61 67 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d  age 5 would be m
145d0 6f 76 65 64 20 74 6f 20 70 61 67 65 20 34 20 62  oved to page 4 b
145e0 79 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f  y the .  ** "OP_
145f0 44 65 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63  Destroy 4 0" opc
14600 6f 64 65 2e 20 54 68 65 20 73 75 62 73 65 71 75  ode. The subsequ
14610 65 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20  ent "OP_Destroy 
14620 35 20 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20  5 0" would hit. 
14630 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20   ** a free-list 
14640 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  page..  */.  int
14650 20 69 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e   iTab = pTab->tn
14660 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72  um;.  int iDestr
14670 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69  oyed = 0;..  whi
14680 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64  le( 1 ){.    Ind
14690 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e  ex *pIdx;.    in
146a0 74 20 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a  t iLargest = 0;.
146b0 0a 20 20 20 20 69 66 28 20 69 44 65 73 74 72 6f  .    if( iDestro
146c0 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69  yed==0 || iTab<i
146d0 44 65 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20  Destroyed ){.   
146e0 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54     iLargest = iT
146f0 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ab;.    }.    fo
14700 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
14710 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
14720 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
14730 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70      int iIdx = p
14740 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20  Idx->tnum;.     
14750 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70   assert( pIdx->p
14760 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
14770 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 69  chema );.      i
14780 66 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d  f( (iDestroyed==
14790 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74  0 || (iIdx<iDest
147a0 72 6f 79 65 64 29 29 20 26 26 20 69 49 64 78 3e  royed)) && iIdx>
147b0 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20  iLargest ){.    
147c0 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69      iLargest = i
147d0 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Idx;.      }.   
147e0 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67   }.    if( iLarg
147f0 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  est==0 ){.      
14800 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73  return;.    }els
14810 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62  e{.      int iDb
14820 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
14830 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
14840 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
14850 61 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  a);.      assert
14860 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
14870 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20  pParse->db->nDb 
14880 29 3b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79  );.      destroy
14890 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
148a0 20 69 4c 61 72 67 65 73 74 2c 20 69 44 62 29 3b   iLargest, iDb);
148b0 0a 20 20 20 20 20 20 69 44 65 73 74 72 6f 79 65  .      iDestroye
148c0 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20 20  d = iLargest;.  
148d0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
148e0 20 52 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20   Remove entries 
148f0 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f  from the sqlite_
14900 73 74 61 74 4e 20 74 61 62 6c 65 73 20 28 66 6f  statN tables (fo
14910 72 20 4e 20 69 6e 20 28 31 2c 32 2c 33 29 29 0a  r N in (1,2,3)).
14920 2a 2a 20 61 66 74 65 72 20 61 20 44 52 4f 50 20  ** after a DROP 
14930 49 4e 44 45 58 20 6f 72 20 44 52 4f 50 20 54 41  INDEX or DROP TA
14940 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  BLE command..*/.
14950 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
14960 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c  te3ClearStatTabl
14970 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
14980 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
14990 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
149a0 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ext */.  int iDb
149b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
149c0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
149d0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 6f 6e 73  number */.  cons
149e0 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 20  t char *zType,  
149f0 20 20 20 2f 2a 20 22 69 64 78 22 20 6f 72 20 22     /* "idx" or "
14a00 74 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tbl" */.  const 
14a10 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20  char *zName     
14a20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 69 6e 64 65   /* Name of inde
14a30 78 20 6f 72 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  x or table */.){
14a40 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
14a50 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20  t char *zDbName 
14a60 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44  = pParse->db->aD
14a70 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b  b[iDb].zDbSName;
14a80 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 34  .  for(i=1; i<=4
14a90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
14aa0 20 7a 54 61 62 5b 32 34 5d 3b 0a 20 20 20 20 73   zTab[24];.    s
14ab0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
14ac0 73 69 7a 65 6f 66 28 7a 54 61 62 29 2c 7a 54 61  sizeof(zTab),zTa
14ad0 62 2c 22 73 71 6c 69 74 65 5f 73 74 61 74 25 64  b,"sqlite_stat%d
14ae0 22 2c 69 29 3b 0a 20 20 20 20 69 66 28 20 73 71  ",i);.    if( sq
14af0 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70  lite3FindTable(p
14b00 50 61 72 73 65 2d 3e 64 62 2c 20 7a 54 61 62 2c  Parse->db, zTab,
14b10 20 7a 44 62 4e 61 6d 65 29 20 29 7b 0a 20 20 20   zDbName) ){.   
14b20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
14b30 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
14b40 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
14b50 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 25  OM %Q.%s WHERE %
14b60 73 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 7a  s=%Q",.        z
14b70 44 62 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 7a 54  DbName, zTab, zT
14b80 79 70 65 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 20  ype, zName.     
14b90 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   );.    }.  }.}.
14ba0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
14bb0 63 6f 64 65 20 74 6f 20 64 72 6f 70 20 61 20 74  code to drop a t
14bc0 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  able..*/.void sq
14bd0 6c 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62  lite3CodeDropTab
14be0 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
14bf0 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 69  , Table *pTab, i
14c00 6e 74 20 69 44 62 2c 20 69 6e 74 20 69 73 56 69  nt iDb, int isVi
14c10 65 77 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  ew){.  Vdbe *v;.
14c20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
14c30 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 54 72  pParse->db;.  Tr
14c40 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b  igger *pTrigger;
14c50 0a 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  .  Db *pDb = &db
14c60 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 76  ->aDb[iDb];..  v
14c70 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
14c80 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  e(pParse);.  ass
14c90 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73  ert( v!=0 );.  s
14ca0 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
14cb0 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
14cc0 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e  , 1, iDb);..#ifn
14cd0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14ce0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
14cf0 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
14d00 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
14d10 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
14d20 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 7d 0a 23  P_VBegin);.  }.#
14d30 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70  endif..  /* Drop
14d40 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73   all triggers as
14d50 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
14d60 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
14d70 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 2a 2a  opped. Code.  **
14d80 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f   is generated to
14d90 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20   remove entries 
14da0 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74  from sqlite_mast
14db0 65 72 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 73  er and/or.  ** s
14dc0 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
14dd0 72 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20  r if required.. 
14de0 20 2a 2f 0a 20 20 70 54 72 69 67 67 65 72 20 3d   */.  pTrigger =
14df0 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 4c   sqlite3TriggerL
14e00 69 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ist(pParse, pTab
14e10 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 54 72 69  );.  while( pTri
14e20 67 67 65 72 20 29 7b 0a 20 20 20 20 61 73 73 65  gger ){.    asse
14e30 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 70 53  rt( pTrigger->pS
14e40 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
14e50 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20 20  hema || .       
14e60 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65   pTrigger->pSche
14e70 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ma==db->aDb[1].p
14e80 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71  Schema );.    sq
14e90 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72  lite3DropTrigger
14ea0 50 74 72 28 70 50 61 72 73 65 2c 20 70 54 72 69  Ptr(pParse, pTri
14eb0 67 67 65 72 29 3b 0a 20 20 20 20 70 54 72 69 67  gger);.    pTrig
14ec0 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e  ger = pTrigger->
14ed0 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e  pNext;.  }..#ifn
14ee0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14ef0 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
14f00 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e  /* Remove any en
14f10 74 72 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c  tries of the sql
14f20 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
14f30 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
14f40 74 68 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c  th.  ** the tabl
14f50 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e  e being dropped.
14f60 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
14f70 66 6f 72 65 20 74 68 65 20 74 61 62 6c 65 20 69  fore the table i
14f80 73 20 64 72 6f 70 70 65 64 0a 20 20 2a 2a 20 61  s dropped.  ** a
14f90 74 20 74 68 65 20 62 74 72 65 65 20 6c 65 76 65  t the btree leve
14fa0 6c 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  l, in case the s
14fb0 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
14fc0 61 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20 20  able needs to.  
14fd0 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73  ** move as a res
14fe0 75 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20  ult of the drop 
14ff0 28 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61  (can happen in a
15000 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29  uto-vacuum mode)
15010 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ..  */.  if( pTa
15020 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
15030 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29  _Autoincrement )
15040 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  {.    sqlite3Nes
15050 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
15060 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46  .      "DELETE F
15070 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 65  ROM %Q.sqlite_se
15080 71 75 65 6e 63 65 20 57 48 45 52 45 20 6e 61 6d  quence WHERE nam
15090 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 70 44 62  e=%Q",.      pDb
150a0 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 70 54 61 62  ->zDbSName, pTab
150b0 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20  ->zName.    );. 
150c0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
150d0 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f  Drop all SQLITE_
150e0 4d 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64  MASTER table and
150f0 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74   index entries t
15100 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
15110 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65  .  ** table. The
15120 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f   program name lo
15130 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  ops through the 
15140 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
15150 20 64 65 6c 65 74 65 73 0a 20 20 2a 2a 20 65 76   deletes.  ** ev
15160 65 72 79 20 72 6f 77 20 74 68 61 74 20 72 65 66  ery row that ref
15170 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f  ers to a table o
15180 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  f the same name 
15190 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67  as the one being
151a0 0a 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54  .  ** dropped. T
151b0 72 69 67 67 65 72 73 20 61 72 65 20 68 61 6e 64  riggers are hand
151c0 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 20 62  led separately b
151d0 65 63 61 75 73 65 20 61 20 74 72 69 67 67 65 72  ecause a trigger
151e0 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 63 72 65   can be.  ** cre
151f0 61 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70  ated in the temp
15200 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 72   database that r
15210 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
15220 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a   in another.  **
15230 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
15240 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
15250 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
15260 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
15270 20 25 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c   %Q.%s WHERE tbl
15280 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70  _name=%Q and typ
15290 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20  e!='trigger'",. 
152a0 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61       pDb->zDbSNa
152b0 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c  me, MASTER_NAME,
152c0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
152d0 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20   if( !isView && 
152e0 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  !IsVirtual(pTab)
152f0 20 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 54   ){.    destroyT
15300 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
15310 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  b);.  }..  /* Re
15320 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 65  move the table e
15330 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74 65  ntry from SQLite
15340 27 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  's internal sche
15350 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20  ma and modify.  
15360 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  ** the schema co
15370 6f 6b 69 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  okie..  */.  if(
15380 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
15390 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
153a0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
153b0 56 44 65 73 74 72 6f 79 2c 20 69 44 62 2c 20 30  VDestroy, iDb, 0
153c0 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
153d0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
153e0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
153f0 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69   OP_DropTable, i
15400 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e  Db, 0, 0, pTab->
15410 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c  zName, 0);.  sql
15420 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
15430 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
15440 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
15450 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 7d 0a  All(db, iDb);.}.
15460 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
15470 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
15480 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20   do the work of 
15490 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61  a DROP TABLE sta
154a0 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65  tement..** pName
154b0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
154c0 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
154d0 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64  dropped..*/.void
154e0 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c   sqlite3DropTabl
154f0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
15500 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c   SrcList *pName,
15510 20 69 6e 74 20 69 73 56 69 65 77 2c 20 69 6e 74   int isView, int
15520 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62 6c 65   noErr){.  Table
15530 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20 2a   *pTab;.  Vdbe *
15540 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
15550 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
15560 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28   int iDb;..  if(
15570 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
15580 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d ){.    goto ex
15590 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
155a0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
155b0 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a  rse->nErr==0 );.
155c0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
155d0 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66  >nSrc==1 );.  if
155e0 28 20 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  ( sqlite3ReadSch
155f0 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f  ema(pParse) ) go
15600 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
15610 6c 65 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20  le;.  if( noErr 
15620 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72  ) db->suppressEr
15630 72 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 69  r++;.  assert( i
15640 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69  sView==0 || isVi
15650 65 77 3d 3d 4c 4f 43 41 54 45 5f 56 49 45 57 20  ew==LOCATE_VIEW 
15660 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  );.  pTab = sqli
15670 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74  te3LocateTableIt
15680 65 6d 28 70 50 61 72 73 65 2c 20 69 73 56 69 65  em(pParse, isVie
15690 77 2c 20 26 70 4e 61 6d 65 2d 3e 61 5b 30 5d 29  w, &pName->a[0])
156a0 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20  ;.  if( noErr ) 
156b0 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72 2d  db->suppressErr-
156c0 2d 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  -;..  if( pTab==
156d0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f 45  0 ){.    if( noE
156e0 72 72 20 29 20 73 71 6c 69 74 65 33 43 6f 64 65  rr ) sqlite3Code
156f0 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d  VerifyNamedSchem
15700 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d  a(pParse, pName-
15710 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
15720 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
15730 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
15740 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
15750 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
15760 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
15770 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
15780 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
15790 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61   );..  /* If pTa
157a0 62 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74  b is a virtual t
157b0 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69 65 77 47  able, call ViewG
157c0 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20  etColumnNames() 
157d0 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a 2a 20 69  to ensure.  ** i
157e0 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  t is initialized
157f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  ..  */.  if( IsV
15800 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26 20  irtual(pTab) && 
15810 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
15820 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
15830 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 67  , pTab) ){.    g
15840 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
15850 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  ble;.  }.#ifndef
15860 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
15870 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
15880 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20     int code;.   
15890 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
158a0 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
158b0 28 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74  (iDb);.    const
158c0 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
158d0 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
158e0 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  me;.    const ch
158f0 61 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b 0a 20  ar *zArg2 = 0;. 
15900 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
15910 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
15920 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
15930 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20  Tab, 0, zDb)){. 
15940 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
15950 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
15960 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20  .    if( isView 
15970 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  ){.      if( !OM
15980 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
15990 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
159a0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
159b0 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20  P_TEMP_VIEW;.   
159c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
159d0 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
159e0 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  DROP_VIEW;.     
159f0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
15a00 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
15a10 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  BLE.    }else if
15a20 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
15a30 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 20  ) ){.      code 
15a40 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54  = SQLITE_DROP_VT
15a50 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41 72 67  ABLE;.      zArg
15a60 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54  2 = sqlite3GetVT
15a70 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 2d 3e  able(db, pTab)->
15a80 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e  pMod->zName;.#en
15a90 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
15aa0 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
15ab0 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
15ac0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
15ad0 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
15ae0 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  MP_TABLE;.      
15af0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
15b00 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
15b10 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
15b20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
15b30 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
15b40 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54  pParse, code, pT
15b50 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67 32  ab->zName, zArg2
15b60 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
15b70 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
15b80 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  able;.    }.    
15b90 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
15ba0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
15bb0 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62  ITE_DELETE, pTab
15bc0 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  ->zName, 0, zDb)
15bd0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
15be0 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
15bf0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
15c00 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
15c10 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rNICmp(pTab->zNa
15c20 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
15c30 29 3d 3d 30 20 0a 20 20 20 20 26 26 20 73 71 6c  )==0 .    && sql
15c40 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61  ite3StrNICmp(pTa
15c50 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  b->zName, "sqlit
15c60 65 5f 73 74 61 74 22 2c 20 31 31 29 21 3d 30 20  e_stat", 11)!=0 
15c70 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
15c80 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
15c90 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
15ca0 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70 54   be dropped", pT
15cb0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
15cc0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
15cd0 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  able;.  }..#ifnd
15ce0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
15cf0 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20  IEW.  /* Ensure 
15d00 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20 6e 6f  DROP TABLE is no
15d10 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69 65 77  t used on a view
15d20 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45 57 20  , and DROP VIEW 
15d30 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a  is not used.  **
15d40 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a   on a table..  *
15d50 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 26  /.  if( isView &
15d60 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  & pTab->pSelect=
15d70 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
15d80 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15d90 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c  , "use DROP TABL
15da0 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c  E to delete tabl
15db0 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  e %s", pTab->zNa
15dc0 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
15dd0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
15de0 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65 77   }.  if( !isView
15df0 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
15e00 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
15e10 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
15e20 20 22 75 73 65 20 44 52 4f 50 20 56 49 45 57 20   "use DROP VIEW 
15e30 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20 25  to delete view %
15e40 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s", pTab->zName)
15e50 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
15e60 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
15e70 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
15e80 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
15e90 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 66  move the table f
15ea0 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
15eb0 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73  able.  ** on dis
15ec0 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  k..  */.  v = sq
15ed0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
15ee0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
15ef0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
15f00 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
15f10 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
15f20 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77  .    if( !isView
15f30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15f40 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73  3ClearStatTables
15f50 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74  (pParse, iDb, "t
15f60 62 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  bl", pTab->zName
15f70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15f80 46 6b 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72  FkDropTable(pPar
15f90 73 65 2c 20 70 4e 61 6d 65 2c 20 70 54 61 62 29  se, pName, pTab)
15fa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
15fb0 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65  te3CodeDropTable
15fc0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69  (pParse, pTab, i
15fd0 44 62 2c 20 69 73 56 69 65 77 29 3b 0a 20 20 7d  Db, isView);.  }
15fe0 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  ..exit_drop_tabl
15ff0 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  e:.  sqlite3SrcL
16000 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e  istDelete(db, pN
16010 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ame);.}../*.** T
16020 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
16030 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
16040 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65  a new foreign ke
16050 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a  y on the table.*
16060 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  * currently unde
16070 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
16080 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d   pFromCol determ
16090 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d  ines which colum
160a0 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72  ns.** in the cur
160b0 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74  rent table point
160c0 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20   to the foreign 
160d0 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f  key.  If pFromCo
160e0 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e  l==0 then.** con
160f0 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20  nect the key to 
16100 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
16110 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69  inserted.  pTo i
16120 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a  s the name of.**
16130 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65 72   the table refer
16140 72 65 64 20 74 6f 20 28 61 2e 6b 2e 61 20 74 68  red to (a.k.a th
16150 65 20 22 70 61 72 65 6e 74 22 20 74 61 62 6c 65  e "parent" table
16160 29 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20  ).  pToCol is a 
16170 6c 69 73 74 0a 2a 2a 20 6f 66 20 74 61 62 6c 65  list.** of table
16180 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20  s in the parent 
16190 70 54 6f 20 74 61 62 6c 65 2e 20 20 66 6c 61 67  pTo table.  flag
161a0 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a  s contains all.*
161b0 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * information ab
161c0 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74  out the conflict
161d0 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
161e0 72 69 74 68 6d 73 20 73 70 65 63 69 66 69 65 64  rithms specified
161f0 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44 45  .** in the ON DE
16200 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45 20  LETE, ON UPDATE 
16210 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c  and ON INSERT cl
16220 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  auses..**.** An 
16230 46 4b 65 79 20 73 74 72 75 63 74 75 72 65 20 69  FKey structure i
16240 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 64  s created and ad
16250 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ded to the table
16260 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e   currently.** un
16270 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
16280 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e   in the pParse->
16290 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64 2e  pNewTable field.
162a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69  .**.** The forei
162b0 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f  gn key is set fo
162c0 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63  r IMMEDIATE proc
162d0 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65  essing.  A subse
162e0 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f  quent call.** to
162f0 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72   sqlite3DeferFor
16300 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20  eignKey() might 
16310 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44  change this to D
16320 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64  EFERRED..*/.void
16330 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f   sqlite3CreateFo
16340 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73  reignKey(.  Pars
16350 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
16360 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
16370 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
16380 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a  t *pFromCol,  /*
16390 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73   Columns in this
163a0 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e   table that poin
163b0 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65  t to other table
163c0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f   */.  Token *pTo
163d0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ,          /* Na
163e0 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20  me of the other 
163f0 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  table */.  ExprL
16400 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20  ist *pToCol,    
16410 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  /* Columns in th
16420 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  e other table */
16430 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
16440 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c          /* Confl
16450 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
16460 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b  lgorithms. */.){
16470 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
16480 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66   pParse->db;.#if
16490 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
164a0 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46  _FOREIGN_KEY.  F
164b0 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a  Key *pFKey = 0;.
164c0 20 20 46 4b 65 79 20 2a 70 4e 65 78 74 54 6f 3b    FKey *pNextTo;
164d0 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70 50  .  Table *p = pP
164e0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
164f0 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
16500 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f  int i;.  int nCo
16510 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20  l;.  char *z;.. 
16520 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20   assert( pTo!=0 
16530 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  );.  if( p==0 ||
16540 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42   IN_DECLARE_VTAB
16550 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
16560 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d    if( pFromCol==
16570 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f  0 ){.    int iCo
16580 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  l = p->nCol-1;. 
16590 20 20 20 69 66 28 20 4e 45 56 45 52 28 69 43 6f     if( NEVER(iCo
165a0 6c 3c 30 29 20 29 20 67 6f 74 6f 20 66 6b 5f 65  l<0) ) goto fk_e
165b0 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43  nd;.    if( pToC
165c0 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45  ol && pToCol->nE
165d0 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr!=1 ){.      
165e0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
165f0 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e  pParse, "foreign
16600 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20   key on %s".    
16610 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65       " should re
16620 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65  ference only one
16630 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
16640 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70   %T",.         p
16650 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
16660 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20  me, pTo);.      
16670 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
16680 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b   }.    nCol = 1;
16690 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f  .  }else if( pTo
166a0 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e  Col && pToCol->n
166b0 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e  Expr!=pFromCol->
166c0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c  nExpr ){.    sql
166d0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
166e0 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75  rse,.        "nu
166f0 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
16700 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
16710 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
16720 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20  e number of ".  
16730 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69        "columns i
16740 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  n the referenced
16750 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f   table");.    go
16760 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c  to fk_end;.  }el
16770 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70  se{.    nCol = p
16780 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a  FromCol->nExpr;.
16790 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69    }.  nByte = si
167a0 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 28  zeof(*pFKey) + (
167b0 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 70  nCol-1)*sizeof(p
167c0 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b  FKey->aCol[0]) +
167d0 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69   pTo->n + 1;.  i
167e0 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20  f( pToCol ){.   
167f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43   for(i=0; i<pToC
16800 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ol->nExpr; i++){
16810 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  .      nByte += 
16820 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
16830 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
16840 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20  me) + 1;.    }. 
16850 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c   }.  pFKey = sql
16860 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
16870 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20  (db, nByte );.  
16880 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a  if( pFKey==0 ){.
16890 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
168a0 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46  .  }.  pFKey->pF
168b0 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79  rom = p;.  pFKey
168c0 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d  ->pNextFrom = p-
168d0 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63  >pFKey;.  z = (c
168e0 68 61 72 2a 29 26 70 46 4b 65 79 2d 3e 61 43 6f  har*)&pFKey->aCo
168f0 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79  l[nCol];.  pFKey
16900 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 69 66 28  ->zTo = z;.  if(
16910 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
16920 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T ){.    sqlite3
16930 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70  RenameTokenMap(p
16940 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 7a 2c  Parse, (void*)z,
16950 20 70 54 6f 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d   pTo);.  }.  mem
16960 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70  cpy(z, pTo->z, p
16970 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d  To->n);.  z[pTo-
16980 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  >n] = 0;.  sqlit
16990 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20  e3Dequote(z);.  
169a0 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20  z += pTo->n+1;. 
169b0 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e   pFKey->nCol = n
169c0 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  Col;.  if( pFrom
169d0 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  Col==0 ){.    pF
169e0 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72  Key->aCol[0].iFr
169f0 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  om = p->nCol-1;.
16a00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
16a10 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
16a20 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  +){.      int j;
16a30 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
16a40 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  j<p->nCol; j++){
16a50 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
16a60 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61  ite3StrICmp(p->a
16a70 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46  Col[j].zName, pF
16a80 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
16a90 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
16aa0 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
16ab0 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20  i].iFrom = j;.  
16ac0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16ad0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16ae0 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d  .      if( j>=p-
16af0 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  >nCol ){.       
16b00 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
16b10 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
16b20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c      "unknown col
16b30 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f  umn \"%s\" in fo
16b40 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
16b50 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  tion", .        
16b60 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d    pFromCol->a[i]
16b70 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
16b80 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
16b90 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
16ba0 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
16bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
16bc0 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65  te3RenameTokenRe
16bd0 6d 61 70 28 70 50 61 72 73 65 2c 20 26 70 46 4b  map(pParse, &pFK
16be0 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2c 20 70 46 72  ey->aCol[i], pFr
16bf0 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  omCol->a[i].zNam
16c00 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
16c10 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43  }.  }.  if( pToC
16c20 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
16c30 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
16c40 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
16c50 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
16c60 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
16c70 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  e);.      pFKey-
16c80 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20  >aCol[i].zCol = 
16c90 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 49 4e 5f  z;.      if( IN_
16ca0 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
16cb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16cc0 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70  RenameTokenRemap
16cd0 28 70 50 61 72 73 65 2c 20 7a 2c 20 70 54 6f 43  (pParse, z, pToC
16ce0 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ol->a[i].zName);
16cf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
16d00 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d  emcpy(z, pToCol-
16d10 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b  >a[i].zName, n);
16d20 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b  .      z[n] = 0;
16d30 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b  .      z += n+1;
16d40 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
16d50 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
16d60 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63   0;.  pFKey->aAc
16d70 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29 28 66  tion[0] = (u8)(f
16d80 6c 61 67 73 20 26 20 30 78 66 66 29 3b 20 20 20  lags & 0xff);   
16d90 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 44           /* ON D
16da0 45 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a  ELETE action */.
16db0 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e    pFKey->aAction
16dc0 5b 31 5d 20 3d 20 28 75 38 29 28 28 66 6c 61 67  [1] = (u8)((flag
16dd0 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66 29  s >> 8 ) & 0xff)
16de0 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54  ;    /* ON UPDAT
16df0 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61  E action */..  a
16e00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
16e10 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
16e20 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  , 0, p->pSchema)
16e30 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20 3d 20   );.  pNextTo = 
16e40 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65 33 48  (FKey *)sqlite3H
16e50 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 53  ashInsert(&p->pS
16e60 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68 2c  chema->fkeyHash,
16e70 20 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a   .      pFKey->z
16e80 54 6f 2c 20 28 76 6f 69 64 20 2a 29 70 46 4b 65  To, (void *)pFKe
16e90 79 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  y.  );.  if( pNe
16ea0 78 74 54 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a 20  xtTo==pFKey ){. 
16eb0 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
16ec0 6c 74 28 64 62 29 3b 0a 20 20 20 20 67 6f 74 6f  lt(db);.    goto
16ed0 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69   fk_end;.  }.  i
16ee0 66 28 20 70 4e 65 78 74 54 6f 20 29 7b 0a 20 20  f( pNextTo ){.  
16ef0 20 20 61 73 73 65 72 74 28 20 70 4e 65 78 74 54    assert( pNextT
16f00 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30 20 29 3b  o->pPrevTo==0 );
16f10 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78  .    pFKey->pNex
16f20 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f 3b 0a 20  tTo = pNextTo;. 
16f30 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65     pNextTo->pPre
16f40 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a 20 20 7d  vTo = pFKey;.  }
16f50 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
16f60 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74  foreign key to t
16f70 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65 20  he table as the 
16f80 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a  last step..  */.
16f90 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b    p->pFKey = pFK
16fa0 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b  ey;.  pFKey = 0;
16fb0 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69  ..fk_end:.  sqli
16fc0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 46  te3DbFree(db, pF
16fd0 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  Key);.#endif /* 
16fe0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
16ff0 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
17000 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78  ) */.  sqlite3Ex
17010 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
17020 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71   pFromCol);.  sq
17030 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
17040 65 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29 3b  ete(db, pToCol);
17050 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
17060 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
17070 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c   when an INITIAL
17080 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20  LY IMMEDIATE or 
17090 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
170a0 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20  ED.** clause is 
170b0 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20  seen as part of 
170c0 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  a foreign key de
170d0 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69  finition.  The i
170e0 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72  sDeferred.** par
170f0 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72 20  ameter is 1 for 
17100 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
17110 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49  ED and 0 for INI
17120 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
17130 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f  ..** The behavio
17140 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  r of the most re
17150 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66  cently created f
17160 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64  oreign key is ad
17170 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64  justed.** accord
17180 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ingly..*/.void s
17190 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69  qlite3DeferForei
171a0 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61  gnKey(Parse *pPa
171b0 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72  rse, int isDefer
171c0 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  red){.#ifndef SQ
171d0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
171e0 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70  N_KEY.  Table *p
171f0 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b  Tab;.  FKey *pFK
17200 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20  ey;.  if( (pTab 
17210 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
17220 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65  ble)==0 || (pFKe
17230 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29  y = pTab->pFKey)
17240 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
17250 61 73 73 65 72 74 28 20 69 73 44 65 66 65 72 72  assert( isDeferr
17260 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65 72  ed==0 || isDefer
17270 72 65 64 3d 3d 31 20 29 3b 20 2f 2a 20 45 56 3a  red==1 ); /* EV:
17280 20 52 2d 33 30 33 32 33 2d 32 31 39 31 37 20 2a   R-30323-21917 *
17290 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  /.  pFKey->isDef
172a0 65 72 72 65 64 20 3d 20 28 75 38 29 69 73 44 65  erred = (u8)isDe
172b0 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d  ferred;.#endif.}
172c0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
172d0 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
172e0 65 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c  erase and refill
172f0 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54   index *pIdx.  T
17300 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  his is.** used t
17310 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  o initialize a n
17320 65 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ewly created ind
17330 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75  ex or to recompu
17340 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  te the.** conten
17350 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e  t of an index in
17360 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52   response to a R
17370 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a  EINDEX command..
17380 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74  **.** if memRoot
17390 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61  Page is not nega
173a0 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  tive, it means t
173b0 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73  hat the index is
173c0 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65   newly.** create
173d0 64 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72  d.  The register
173e0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6d 65   specified by me
173f0 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69  mRootPage contai
17400 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  ns the.** root p
17410 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
17420 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d  e index.  If mem
17430 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61  RootPage is nega
17440 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  tive, then.** th
17450 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  e index already 
17460 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20  exists and must 
17470 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72  be cleared befor
17480 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64  e being refilled
17490 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74   and.** the root
174a0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
174b0 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b  the index is tak
174c0 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e  en from pIndex->
174d0 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tnum..*/.static 
174e0 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66 69  void sqlite3Refi
174f0 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  llIndex(Parse *p
17500 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
17510 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f  ndex, int memRoo
17520 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20  tPage){.  Table 
17530 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e  *pTab = pIndex->
17540 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20  pTable;  /* The 
17550 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e  table that is in
17560 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  dexed */.  int i
17570 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
17580 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72  ab++;     /* Btr
17590 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
175a0 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  or pTab */.  int
175b0 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e   iIdx = pParse->
175c0 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42  nTab++;     /* B
175d0 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64  tree cursor used
175e0 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20   for pIndex */. 
175f0 20 69 6e 74 20 69 53 6f 72 74 65 72 3b 20 20 20   int iSorter;   
17600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17610 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 65 64  /* Cursor opened
17620 20 62 79 20 4f 70 65 6e 53 6f 72 74 65 72 20 28   by OpenSorter (
17630 69 66 20 69 6e 20 75 73 65 29 20 2a 2f 0a 20 20  if in use) */.  
17640 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20  int addr1;      
17650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17660 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70  * Address of top
17670 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e   of loop */.  in
17680 74 20 61 64 64 72 32 3b 20 20 20 20 20 20 20 20  t addr2;        
17690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
176a0 41 64 64 72 65 73 73 20 74 6f 20 6a 75 6d 70 20  Address to jump 
176b0 74 6f 20 66 6f 72 20 6e 65 78 74 20 69 74 65 72  to for next iter
176c0 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 74  ation */.  int t
176d0 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  num;            
176e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
176f0 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20  t page of index 
17700 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 74 49 64  */.  int iPartId
17710 78 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20  xLabel;         
17720 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74      /* Jump to t
17730 68 69 73 20 6c 61 62 65 6c 20 74 6f 20 73 6b 69  his label to ski
17740 70 20 61 20 72 6f 77 20 2a 2f 0a 20 20 56 64 62  p a row */.  Vdb
17750 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
17760 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
17770 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
17780 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d  o this virtual m
17790 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49  achine */.  KeyI
177a0 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20 20  nfo *pKey;      
177b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65             /* Ke
177c0 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78 20  yInfo for index 
177d0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  */.  int regReco
177e0 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rd;             
177f0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
17800 68 6f 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c 65  holding assemble
17810 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a  d index record *
17820 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
17830 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
17840 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
17850 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
17860 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  .  int iDb = sql
17870 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
17880 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53  x(db, pIndex->pS
17890 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66  chema);..#ifndef
178a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
178b0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  HORIZATION.  if(
178c0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
178d0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
178e0 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78  _REINDEX, pIndex
178f0 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20  ->zName, 0,.    
17900 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
17910 44 62 53 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20  DbSName ) ){.   
17920 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
17930 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72  dif..  /* Requir
17940 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f  e a write-lock o
17950 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 70  n the table to p
17960 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70 65 72  erform this oper
17970 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ation */.  sqlit
17980 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
17990 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
179a0 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e  num, 1, pTab->zN
179b0 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  ame);..  v = sql
179c0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
179d0 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
179e0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
179f0 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29  memRootPage>=0 )
17a00 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d 65 6d  {.    tnum = mem
17a10 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65 6c 73  RootPage;.  }els
17a20 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49  e{.    tnum = pI
17a30 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 7d 0a  ndex->tnum;.  }.
17a40 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
17a50 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70  KeyInfoOfIndex(p
17a60 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a  Parse, pIndex);.
17a70 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 21 3d    assert( pKey!=
17a80 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
17a90 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
17aa0 3e 6e 45 72 72 20 29 3b 0a 0a 20 20 2f 2a 20 4f  >nErr );..  /* O
17ab0 70 65 6e 20 74 68 65 20 73 6f 72 74 65 72 20 63  pen the sorter c
17ac0 75 72 73 6f 72 20 69 66 20 77 65 20 61 72 65 20  ursor if we are 
17ad0 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20  to use one. */. 
17ae0 20 69 53 6f 72 74 65 72 20 3d 20 70 50 61 72 73   iSorter = pPars
17af0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c  e->nTab++;.  sql
17b00 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
17b10 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c  , OP_SorterOpen,
17b20 20 69 53 6f 72 74 65 72 2c 20 30 2c 20 70 49 6e   iSorter, 0, pIn
17b30 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 28 63  dex->nKeyCol, (c
17b40 68 61 72 2a 29 0a 20 20 20 20 20 20 20 20 20 20  har*).          
17b50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17b60 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79  3KeyInfoRef(pKey
17b70 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  ), P4_KEYINFO);.
17b80 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 74  .  /* Open the t
17b90 61 62 6c 65 2e 20 4c 6f 6f 70 20 74 68 72 6f 75  able. Loop throu
17ba0 67 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74  gh all rows of t
17bb0 68 65 20 74 61 62 6c 65 2c 20 69 6e 73 65 72 74  he table, insert
17bc0 69 6e 67 20 69 6e 64 65 78 0a 20 20 2a 2a 20 72  ing index.  ** r
17bd0 65 63 6f 72 64 73 20 69 6e 74 6f 20 74 68 65 20  ecords into the 
17be0 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 73 71 6c  sorter. */.  sql
17bf0 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
17c00 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c  arse, iTab, iDb,
17c10 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
17c20 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73  ad);.  addr1 = s
17c30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17c40 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
17c50 54 61 62 2c 20 30 29 3b 20 56 64 62 65 43 6f 76  Tab, 0); VdbeCov
17c60 65 72 61 67 65 28 76 29 3b 0a 20 20 72 65 67 52  erage(v);.  regR
17c70 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
17c80 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
17c90 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 75 6c 74  );.  sqlite3Mult
17ca0 69 57 72 69 74 65 28 70 50 61 72 73 65 29 3b 0a  iWrite(pParse);.
17cb0 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61  .  sqlite3Genera
17cc0 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73  teIndexKey(pPars
17cd0 65 2c 70 49 6e 64 65 78 2c 69 54 61 62 2c 72 65  e,pIndex,iTab,re
17ce0 67 52 65 63 6f 72 64 2c 30 2c 26 69 50 61 72 74  gRecord,0,&iPart
17cf0 49 64 78 4c 61 62 65 6c 2c 30 2c 30 29 3b 0a 20  IdxLabel,0,0);. 
17d00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17d10 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49  p2(v, OP_SorterI
17d20 6e 73 65 72 74 2c 20 69 53 6f 72 74 65 72 2c 20  nsert, iSorter, 
17d30 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
17d40 6c 69 74 65 33 52 65 73 6f 6c 76 65 50 61 72 74  lite3ResolvePart
17d50 49 64 78 4c 61 62 65 6c 28 70 50 61 72 73 65 2c  IdxLabel(pParse,
17d60 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c 29 3b   iPartIdxLabel);
17d70 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
17d80 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
17d90 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31 29 3b   iTab, addr1+1);
17da0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
17db0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
17dc0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
17dd0 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74  );.  if( memRoot
17de0 50 61 67 65 3c 30 20 29 20 73 71 6c 69 74 65 33  Page<0 ) sqlite3
17df0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17e00 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44  _Clear, tnum, iD
17e10 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  b);.  sqlite3Vdb
17e20 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
17e30 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74  enWrite, iIdx, t
17e40 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20 20 20  num, iDb, .     
17e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
17e60 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f  char *)pKey, P4_
17e70 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69  KEYINFO);.  sqli
17e80 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
17e90 76 2c 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53  v, OPFLAG_BULKCS
17ea0 52 7c 28 28 6d 65 6d 52 6f 6f 74 50 61 67 65 3e  R|((memRootPage>
17eb0 3d 30 29 3f 4f 50 46 4c 41 47 5f 50 32 49 53 52  =0)?OPFLAG_P2ISR
17ec0 45 47 3a 30 29 29 3b 0a 0a 20 20 61 64 64 72 31  EG:0));..  addr1
17ed0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
17ee0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
17ef0 72 53 6f 72 74 2c 20 69 53 6f 72 74 65 72 2c 20  rSort, iSorter, 
17f00 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  0); VdbeCoverage
17f10 28 76 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69  (v);.  if( IsUni
17f20 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29  queIndex(pIndex)
17f30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 32 20 3d   ){.    int j2 =
17f40 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
17f50 28 76 2c 20 31 29 3b 0a 20 20 20 20 61 64 64 72  (v, 1);.    addr
17f60 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
17f70 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
17f80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 56 65     sqlite3VdbeVe
17f90 72 69 66 79 41 62 6f 72 74 61 62 6c 65 28 76 2c  rifyAbortable(v,
17fa0 20 4f 45 5f 41 62 6f 72 74 29 3b 0a 20 20 20 20   OE_Abort);.    
17fb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17fc0 34 49 6e 74 28 76 2c 20 4f 50 5f 53 6f 72 74 65  4Int(v, OP_Sorte
17fd0 72 43 6f 6d 70 61 72 65 2c 20 69 53 6f 72 74 65  rCompare, iSorte
17fe0 72 2c 20 6a 32 2c 20 72 65 67 52 65 63 6f 72 64  r, j2, regRecord
17ff0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18000 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65             pInde
18010 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62  x->nKeyCol); Vdb
18020 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
18030 20 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65 43    sqlite3UniqueC
18040 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65  onstraint(pParse
18050 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 70 49 6e 64  , OE_Abort, pInd
18060 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ex);.    sqlite3
18070 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
18080 6a 32 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  j2);.  }else{.  
18090 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65    addr2 = sqlite
180a0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
180b0 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (v);.  }.  sqlit
180c0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
180d0 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69  OP_SorterData, i
180e0 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63 6f 72  Sorter, regRecor
180f0 64 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69  d, iIdx);.  sqli
18100 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
18110 20 4f 50 5f 53 65 65 6b 45 6e 64 2c 20 69 49 64   OP_SeekEnd, iId
18120 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  x);.  sqlite3Vdb
18130 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
18140 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 72  xInsert, iIdx, r
18150 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
18160 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
18170 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
18180 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c  EKRESULT);.  sql
18190 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
181a0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
181b0 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
181c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
181d0 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 53 6f  _SorterNext, iSo
181e0 72 74 65 72 2c 20 61 64 64 72 32 29 3b 20 56 64  rter, addr2); Vd
181f0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
18200 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
18210 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
18220 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
18230 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
18240 2c 20 69 54 61 62 29 3b 0a 20 20 73 71 6c 69 74  , iTab);.  sqlit
18250 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
18260 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 29 3b  OP_Close, iIdx);
18270 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
18280 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
18290 2c 20 69 53 6f 72 74 65 72 29 3b 0a 7d 0a 0a 2f  , iSorter);.}../
182a0 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 68 65  *.** Allocate he
182b0 61 70 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64  ap space to hold
182c0 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63 74   an Index object
182d0 20 77 69 74 68 20 6e 43 6f 6c 20 63 6f 6c 75 6d   with nCol colum
182e0 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65 61  ns..**.** Increa
182f0 73 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  se the allocatio
18300 6e 20 73 69 7a 65 20 74 6f 20 70 72 6f 76 69 64  n size to provid
18310 65 20 61 6e 20 65 78 74 72 61 20 6e 45 78 74 72  e an extra nExtr
18320 61 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 38 2d  a bytes.** of 8-
18330 62 79 74 65 20 61 6c 69 67 6e 65 64 20 73 70 61  byte aligned spa
18340 63 65 20 61 66 74 65 72 20 74 68 65 20 49 6e 64  ce after the Ind
18350 65 78 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65  ex object and re
18360 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65  turn a.** pointe
18370 72 20 74 6f 20 74 68 69 73 20 65 78 74 72 61 20  r to this extra 
18380 73 70 61 63 65 20 69 6e 20 2a 70 70 45 78 74 72  space in *ppExtr
18390 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c  a..*/.Index *sql
183a0 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65  ite3AllocateInde
183b0 78 4f 62 6a 65 63 74 28 0a 20 20 73 71 6c 69 74  xObject(.  sqlit
183c0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
183d0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
183e0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 31 36 20  ection */.  i16 
183f0 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  nCol,           
18400 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
18410 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
18420 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  he index */.  in
18430 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
18440 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18450 62 79 74 65 73 20 6f 66 20 65 78 74 72 61 20 73  bytes of extra s
18460 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 20 2a 2f  pace to alloc */
18470 0a 20 20 63 68 61 72 20 2a 2a 70 70 45 78 74 72  .  char **ppExtr
18480 61 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  a       /* Point
18490 65 72 20 74 6f 20 74 68 65 20 22 65 78 74 72 61  er to the "extra
184a0 22 20 73 70 61 63 65 20 2a 2f 0a 29 7b 0a 20 20  " space */.){.  
184b0 49 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20  Index *p;       
184c0 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
184d0 64 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a  d index object *
184e0 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
184f0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
18500 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 49  s of space for I
18510 6e 64 65 78 20 6f 62 6a 65 63 74 20 2b 20 61 72  ndex object + ar
18520 72 61 79 73 20 2a 2f 0a 0a 20 20 6e 42 79 74 65  rays */..  nByte
18530 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   = ROUND8(sizeof
18540 28 49 6e 64 65 78 29 29 20 2b 20 20 20 20 20 20  (Index)) +      
18550 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
18560 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20   structure  */. 
18570 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38 28           ROUND8(
18580 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43  sizeof(char*)*nC
18590 6f 6c 29 20 2b 20 20 20 20 20 20 20 20 20 2f 2a  ol) +         /*
185a0 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20   Index.azColl   
185b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52    */.          R
185c0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4c 6f 67  OUND8(sizeof(Log
185d0 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20  Est)*(nCol+1) + 
185e0 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52      /* Index.aiR
185f0 6f 77 4c 6f 67 45 73 74 20 20 20 2a 2f 0a 20 20  owLogEst   */.  
18600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
18610 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 20  izeof(i16)*nCol 
18620 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  +            /* 
18630 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20  Index.aiColumn  
18640 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
18650 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38 29 2a       sizeof(u8)*
18660 6e 43 6f 6c 29 3b 20 20 20 20 20 20 20 20 20 20  nCol);          
18670 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72     /* Index.aSor
18680 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 20 3d 20  tOrder */.  p = 
18690 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
186a0 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 2b 20  ero(db, nByte + 
186b0 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 70  nExtra);.  if( p
186c0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 45   ){.    char *pE
186d0 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29 70  xtra = ((char*)p
186e0 29 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  )+ROUND8(sizeof(
186f0 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 70 2d 3e  Index));.    p->
18700 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74 20  azColl = (const 
18710 63 68 61 72 2a 2a 29 70 45 78 74 72 61 3b 20 70  char**)pExtra; p
18720 45 78 74 72 61 20 2b 3d 20 52 4f 55 4e 44 38 28  Extra += ROUND8(
18730 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43  sizeof(char*)*nC
18740 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 69 52 6f  ol);.    p->aiRo
18750 77 4c 6f 67 45 73 74 20 3d 20 28 4c 6f 67 45 73  wLogEst = (LogEs
18760 74 2a 29 70 45 78 74 72 61 3b 20 70 45 78 74 72  t*)pExtra; pExtr
18770 61 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45  a += sizeof(LogE
18780 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 3b 0a 20 20  st)*(nCol+1);.  
18790 20 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20    p->aiColumn = 
187a0 28 69 31 36 2a 29 70 45 78 74 72 61 3b 20 20 20  (i16*)pExtra;   
187b0 20 20 20 20 70 45 78 74 72 61 20 2b 3d 20 73 69      pExtra += si
187c0 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 3b 0a  zeof(i16)*nCol;.
187d0 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65      p->aSortOrde
187e0 72 20 3d 20 28 75 38 2a 29 70 45 78 74 72 61 3b  r = (u8*)pExtra;
187f0 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20  .    p->nColumn 
18800 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 6e  = nCol;.    p->n
18810 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2d 20  KeyCol = nCol - 
18820 31 3b 0a 20 20 20 20 2a 70 70 45 78 74 72 61 20  1;.    *ppExtra 
18830 3d 20 28 28 63 68 61 72 2a 29 70 29 20 2b 20 6e  = ((char*)p) + n
18840 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Byte;.  }.  retu
18850 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn p;.}../*.** C
18860 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65  reate a new inde
18870 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62  x for an SQL tab
18880 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d  le.  pName1.pNam
18890 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  e2 is the name o
188a0 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20  f the index .** 
188b0 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20  and pTblList is 
188c0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
188d0 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
188e0 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f   be indexed.  Bo
188f0 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e  th will .** be N
18900 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72  ULL for a primar
18910 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65  y key or an inde
18920 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65  x that is create
18930 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a  d to satisfy a.*
18940 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  * UNIQUE constra
18950 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20  int.  If pTable 
18960 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e  and pIndex are N
18970 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d  ULL, use pParse-
18980 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73  >pNewTable.** as
18990 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
189a0 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73   indexed.  pPars
189b0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20  e->pNewTable is 
189c0 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a  a table that is.
189d0 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  ** currently bei
189e0 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ng constructed b
189f0 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  y a CREATE TABLE
18a00 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
18a10 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73  * pList is a lis
18a20 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
18a30 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69  be indexed.  pLi
18a40 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  st will be NULL 
18a50 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20  if this.** is a 
18a60 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75  primary key or u
18a70 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74  nique-constraint
18a80 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
18a90 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ent column added
18aa0 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65  .** to the table
18ab0 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
18ac0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
18ad0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18ae0 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50  CreateIndex(.  P
18af0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
18b00 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61    /* All informa
18b10 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20  tion about this 
18b20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  parse */.  Token
18b30 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a   *pName1,     /*
18b40 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 69   First part of i
18b50 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62  ndex name. May b
18b60 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  e NULL */.  Toke
18b70 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
18b80 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  * Second part of
18b90 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79   index name. May
18ba0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72   be NULL */.  Sr
18bb0 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c  cList *pTblName,
18bc0 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64   /* Table to ind
18bd0 65 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e  ex. Use pParse->
18be0 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a  pNewTable if 0 *
18bf0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
18c00 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74  ist,   /* A list
18c10 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
18c20 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  e indexed */.  i
18c30 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
18c40 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f    /* OE_Abort, O
18c50 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70  E_Ignore, OE_Rep
18c60 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65  lace, or OE_None
18c70 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74   */.  Token *pSt
18c80 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  art,     /* The 
18c90 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
18ca0 74 20 62 65 67 69 6e 73 20 74 68 69 73 20 73 74  t begins this st
18cb0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70  atement */.  Exp
18cc0 72 20 2a 70 50 49 57 68 65 72 65 2c 20 20 20 20  r *pPIWhere,    
18cd0 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
18ce0 66 6f 72 20 70 61 72 74 69 61 6c 20 69 6e 64 69  for partial indi
18cf0 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ces */.  int sor
18d00 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53  tOrder,     /* S
18d10 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69  ort order of pri
18d20 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c  mary key when pL
18d30 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69  ist==NULL */.  i
18d40 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 2c 20 20  nt ifNotExist,  
18d50 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20    /* Omit error 
18d60 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  if index already
18d70 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 75 38 20   exists */.  u8 
18d80 69 64 78 54 79 70 65 20 20 20 20 20 20 20 20 20  idxType         
18d90 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 79 70  /* The index typ
18da0 65 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  e */.){.  Table 
18db0 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f  *pTab = 0;     /
18dc0 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  * Table to be in
18dd0 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  dexed */.  Index
18de0 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20   *pIndex = 0;   
18df0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
18e00 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20  be created */.  
18e10 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
18e20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
18e30 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  the index */.  i
18e40 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
18e50 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
18e60 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a   characters in z
18e70 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  Name */.  int i,
18e80 20 6a 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46   j;.  DbFixer sF
18e90 69 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ix;        /* Fo
18ea0 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61  r assigning data
18eb0 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54  base names to pT
18ec0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  able */.  int so
18ed0 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f  rtOrderMask;   /
18ee0 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53  * 1 to honor DES
18ef0 43 20 69 6e 20 69 6e 64 65 78 2e 20 20 30 20 74  C in index.  0 t
18f00 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73  o ignore. */.  s
18f10 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
18f20 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70  rse->db;.  Db *p
18f30 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
18f40 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69 63 20  /* The specific 
18f50 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
18f60 20 74 68 65 20 69 6e 64 65 78 65 64 20 64 61 74   the indexed dat
18f70 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  abase */.  int i
18f80 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
18f90 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
18fa0 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73  database that is
18fb0 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a   being written *
18fc0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
18fd0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75   = 0;    /* Unqu
18fe0 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20  alified name of 
18ff0 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65  the index to cre
19000 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ate */.  struct 
19010 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
19020 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72  ListItem; /* For
19030 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c   looping over pL
19040 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ist */.  int nEx
19050 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tra = 0;        
19060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
19070 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
19080 20 7a 45 78 74 72 61 5b 5d 20 2a 2f 0a 20 20 69   zExtra[] */.  i
19090 6e 74 20 6e 45 78 74 72 61 43 6f 6c 3b 20 20 20  nt nExtraCol;   
190a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
190c0 72 61 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65  ra columns neede
190d0 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78  d */.  char *zEx
190e0 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tra = 0;        
190f0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
19100 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68 65   space after the
19110 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f   Index object */
19120 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20  .  Index *pPk = 
19130 30 3b 20 20 20 20 20 20 2f 2a 20 50 52 49 4d 41  0;      /* PRIMA
19140 52 59 20 4b 45 59 20 69 6e 64 65 78 20 66 6f 72  RY KEY index for
19150 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
19160 61 62 6c 65 73 20 2a 2f 0a 0a 20 20 69 66 28 20  ables */..  if( 
19170 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19180 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
19190 3e 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  >0 ){.    goto e
191a0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
191b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 4e 5f 44  ;.  }.  if( IN_D
191c0 45 43 4c 41 52 45 5f 56 54 41 42 20 26 26 20 69  ECLARE_VTAB && i
191d0 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49  dxType!=SQLITE_I
191e0 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45  DXTYPE_PRIMARYKE
191f0 59 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  Y ){.    goto ex
19200 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
19210 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54  .  }.  if( SQLIT
19220 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
19230 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
19240 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
19250 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
19260 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
19270 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  nd the table tha
19280 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
19290 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c  ed.  Return earl
192a0 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  y if not found..
192b0 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e    */.  if( pTblN
192c0 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f  ame!=0 ){..    /
192d0 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61  * Use the two-pa
192e0 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f  rt index name to
192f0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64   determine the d
19300 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20  atabase .    ** 
19310 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68  to search for th
19320 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74  e table. 'Fix' t
19330 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  he table name to
19340 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20   this db.    ** 
19350 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75  before looking u
19360 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  p the table..   
19370 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
19380 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32  pName1 && pName2
19390 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71   );.    iDb = sq
193a0 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
193b0 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
193c0 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
193d0 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
193e0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
193f0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73  te_index;.    as
19400 73 65 72 74 28 20 70 4e 61 6d 65 20 26 26 20 70  sert( pName && p
19410 4e 61 6d 65 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e  Name->z );..#ifn
19420 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19430 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49 66  TEMPDB.    /* If
19440 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20   the index name 
19450 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c  was unqualified,
19460 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 61   check if the ta
19470 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20  ble.    ** is a 
19480 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73  temp table. If s
19490 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  o, set the datab
194a0 61 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74  ase to 1. Do not
194b0 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   do this.    ** 
194c0 69 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67 20  if initialising 
194d0 61 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  a database schem
194e0 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  a..    */.    if
194f0 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
19500 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   ){.      pTab =
19510 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c   sqlite3SrcListL
19520 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54  ookup(pParse, pT
19530 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  blName);.      i
19540 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20  f( pName2->n==0 
19550 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d  && pTab && pTab-
19560 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44  >pSchema==db->aD
19570 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a  b[1].pSchema ){.
19580 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b          iDb = 1;
19590 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
195a0 65 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c 69 74  endif..    sqlit
195b0 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
195c0 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69   pParse, iDb, "i
195d0 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  ndex", pName);. 
195e0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
195f0 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20  xSrcList(&sFix, 
19600 70 54 62 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20  pTblName) ){.   
19610 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68     /* Because th
19620 65 20 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75  e parser constru
19630 63 74 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f  cts pTblName fro
19640 6d 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74  m a single ident
19650 69 66 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20  ifier,.      ** 
19660 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
19670 74 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c  t can never fail
19680 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
19690 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t(0);.    }.    
196a0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
196b0 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50  cateTableItem(pP
196c0 61 72 73 65 2c 20 30 2c 20 26 70 54 62 6c 4e 61  arse, 0, &pTblNa
196d0 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 20 20 61  me->a[0]);.    a
196e0 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
196f0 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20 70 54  cFailed==0 || pT
19700 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab==0 );.    if(
19710 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20   pTab==0 ) goto 
19720 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
19730 78 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d  x;.    if( iDb==
19740 31 20 26 26 20 64 62 2d 3e 61 44 62 5b 69 44 62  1 && db->aDb[iDb
19750 5d 2e 70 53 63 68 65 6d 61 21 3d 70 54 61 62 2d  ].pSchema!=pTab-
19760 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
19770 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
19780 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
19790 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 72        "cannot cr
197a0 65 61 74 65 20 61 20 54 45 4d 50 20 69 6e 64 65  eate a TEMP inde
197b0 78 20 6f 6e 20 6e 6f 6e 2d 54 45 4d 50 20 74 61  x on non-TEMP ta
197c0 62 6c 65 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20  ble \"%s\"",.   
197d0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
197e0 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
197f0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
19800 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
19810 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
19820 29 20 29 20 70 50 6b 20 3d 20 73 71 6c 69 74 65  ) ) pPk = sqlite
19830 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
19840 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pTab);.  }else{
19850 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
19860 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  me==0 );.    ass
19870 65 72 74 28 20 70 53 74 61 72 74 3d 3d 30 20 29  ert( pStart==0 )
19880 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50 61  ;.    pTab = pPa
19890 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
198a0 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20      if( !pTab ) 
198b0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
198c0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62 20  _index;.    iDb 
198d0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
198e0 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
198f0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20  >pSchema);.  }. 
19900 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
19910 69 44 62 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28  iDb];..  assert(
19920 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73   pTab!=0 );.  as
19930 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
19940 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  rr==0 );.  if( s
19950 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
19960 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c  Tab->zName, "sql
19970 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20  ite_", 7)==0 .  
19980 20 20 20 20 20 26 26 20 64 62 2d 3e 69 6e 69 74       && db->init
19990 2e 62 75 73 79 3d 3d 30 0a 23 69 66 20 53 51 4c  .busy==0.#if SQL
199a0 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
199b0 49 43 41 54 49 4f 4e 0a 20 20 20 20 20 20 20 26  ICATION.       &
199c0 26 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74  & sqlite3UserAut
199d0 68 54 61 62 6c 65 28 70 54 61 62 2d 3e 7a 4e 61  hTable(pTab->zNa
199e0 6d 65 29 3d 3d 30 0a 23 65 6e 64 69 66 0a 23 69  me)==0.#endif.#i
199f0 66 64 65 66 20 53 51 4c 49 54 45 5f 41 4c 4c 4f  fdef SQLITE_ALLO
19a00 57 5f 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 5f  W_SQLITE_MASTER_
19a10 49 4e 44 45 58 0a 20 20 20 20 20 20 20 26 26 20  INDEX.       && 
19a20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 26  sqlite3StrICmp(&
19a30 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22  pTab->zName[7],"
19a40 6d 61 73 74 65 72 22 29 21 3d 30 0a 23 65 6e 64  master")!=0.#end
19a50 69 66 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c  if.       && sql
19a60 69 74 65 33 53 74 72 4e 49 43 6d 70 28 26 70 54  ite3StrNICmp(&pT
19a70 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 61 6c  ab->zName[7],"al
19a80 74 65 72 74 61 62 5f 22 2c 39 29 21 3d 30 0a 20  tertab_",9)!=0. 
19a90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
19aa0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
19ab0 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
19ac0 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54   be indexed", pT
19ad0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
19ae0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
19af0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e  _index;.  }.#ifn
19b00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19b10 56 49 45 57 0a 20 20 69 66 28 20 70 54 61 62 2d  VIEW.  if( pTab-
19b20 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
19b30 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
19b40 70 50 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d  pParse, "views m
19b50 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
19b60 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d");.    goto ex
19b70 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
19b80 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e  .  }.#endif.#ifn
19b90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19ba0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
19bb0 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
19bc0 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
19bd0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
19be0 2c 20 22 76 69 72 74 75 61 6c 20 74 61 62 6c 65  , "virtual table
19bf0 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
19c00 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f  exed");.    goto
19c10 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
19c20 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ex;.  }.#endif..
19c30 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
19c40 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
19c50 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65  ndex.  Make sure
19c60 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c   there is not al
19c70 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20  ready another.  
19c80 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
19c90 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
19ca0 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  name.  .  **.  *
19cb0 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66  * Exception:  If
19cc0 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
19cd0 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72  the names of per
19ce0 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66  manent indices f
19cf0 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  rom the.  ** sql
19d00 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
19d10 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f   (because some o
19d20 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61  ther process cha
19d30 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29  nged the schema)
19d40 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66   and.  ** one of
19d50 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73   the index names
19d60 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74   collides with t
19d70 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d  he name of a tem
19d80 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a  porary table or.
19d90 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e    ** index, then
19da0 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   we will continu
19db0 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69  e to process thi
19dc0 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20  s index..  **.  
19dd0 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69  ** If pName==0 i
19de0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
19df0 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67  are.  ** dealing
19e00 20 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20   with a primary 
19e10 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f  key or UNIQUE co
19e20 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61  nstraint.  We ha
19e30 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72  ve to invent our
19e40 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a  .  ** own name..
19e50 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65    */.  if( pName
19e60 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
19e70 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
19e80 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
19e90 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  .    if( zName==
19ea0 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
19eb0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
19ec0 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 7a  assert( pName->z
19ed0 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 53  !=0 );.    if( S
19ee0 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
19ef0 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65  3CheckObjectName
19f00 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20  (pParse, zName) 
19f10 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
19f20 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
19f30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
19f40 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
19f50 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 64   ){.      if( !d
19f60 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
19f70 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
19f80 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
19f90 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b   zName, 0)!=0 ){
19fa0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
19fb0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
19fc0 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
19fd0 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d  eady a table nam
19fe0 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ed %s", zName);.
19ff0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
1a000 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1a010 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1a020 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71    }.      if( sq
1a030 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
1a040 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a  b, zName, pDb->z
1a050 44 62 53 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  DbSName)!=0 ){. 
1a060 20 20 20 20 20 20 20 69 66 28 20 21 69 66 4e 6f         if( !ifNo
1a070 74 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20  tExist ){.      
1a080 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1a090 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64  Msg(pParse, "ind
1a0a0 65 78 20 25 73 20 61 6c 72 65 61 64 79 20 65 78  ex %s already ex
1a0b0 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ists", zName);. 
1a0c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1a0d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1a0e0 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
1a0f0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1a100 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
1a110 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
1a120 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1a130 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1a140 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1a150 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
1a160 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  e{.    int n;.  
1a170 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a    Index *pLoop;.
1a180 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54      for(pLoop=pT
1a190 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b  ab->pIndex, n=1;
1a1a0 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
1a1b0 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29  oop->pNext, n++)
1a1c0 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  {}.    zName = s
1a1d0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
1a1e0 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e  , "sqlite_autoin
1a1f0 64 65 78 5f 25 73 5f 25 64 22 2c 20 70 54 61 62  dex_%s_%d", pTab
1a200 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ->zName, n);.   
1a210 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
1a220 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
1a230 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1a240 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 75 74     }..    /* Aut
1a250 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6e 61 6d  omatic index nam
1a260 65 73 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  es generated fro
1a270 6d 20 77 69 74 68 69 6e 20 73 71 6c 69 74 65 33  m within sqlite3
1a280 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 0a  _declare_vtab().
1a290 20 20 20 20 2a 2a 20 6d 75 73 74 20 68 61 76 65      ** must have
1a2a0 20 6e 61 6d 65 73 20 74 68 61 74 20 61 72 65 20   names that are 
1a2b0 64 69 73 74 69 6e 63 74 20 66 72 6f 6d 20 6e 6f  distinct from no
1a2c0 72 6d 61 6c 20 61 75 74 6f 6d 61 74 69 63 20 69  rmal automatic i
1a2d0 6e 64 65 78 20 6e 61 6d 65 73 2e 0a 20 20 20 20  ndex names..    
1a2e0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1a2f0 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e 76 65   statement conve
1a300 72 74 73 20 22 73 71 6c 69 74 65 33 5f 61 75 74  rts "sqlite3_aut
1a310 6f 69 6e 64 65 78 2e 2e 2e 22 20 69 6e 74 6f 0a  oindex..." into.
1a320 20 20 20 20 2a 2a 20 22 73 71 6c 69 74 65 33 5f      ** "sqlite3_
1a330 62 75 74 6f 69 6e 64 65 78 2e 2e 2e 22 20 69 6e  butoindex..." in
1a340 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 74   order to make t
1a350 68 65 20 6e 61 6d 65 73 20 64 69 73 74 69 6e 63  he names distinc
1a360 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 76  t..    ** The "v
1a370 74 61 62 5f 65 72 72 2e 74 65 73 74 22 20 74 65  tab_err.test" te
1a380 73 74 20 64 65 6d 6f 6e 73 74 72 61 74 65 73 20  st demonstrates 
1a390 74 68 65 20 6e 65 65 64 20 6f 66 20 74 68 69 73  the need of this
1a3a0 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20   statement. */. 
1a3b0 20 20 20 69 66 28 20 49 4e 5f 53 50 45 43 49 41     if( IN_SPECIA
1a3c0 4c 5f 50 41 52 53 45 20 29 20 7a 4e 61 6d 65 5b  L_PARSE ) zName[
1a3d0 37 5d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  7]++;.  }..  /* 
1a3e0 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72  Check for author
1a3f0 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74  ization to creat
1a400 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f  e an index..  */
1a410 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1a420 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
1a430 4f 4e 0a 20 20 69 66 28 20 21 49 4e 5f 52 45 4e  ON.  if( !IN_REN
1a440 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20  AME_OBJECT ){.  
1a450 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
1a460 62 20 3d 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d  b = pDb->zDbSNam
1a470 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
1a480 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1a490 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
1a4a0 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
1a4b0 69 44 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b  iDb), 0, zDb) ){
1a4c0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
1a4d0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1a4e0 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c     }.    i = SQL
1a4f0 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58  ITE_CREATE_INDEX
1a500 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  ;.    if( !OMIT_
1a510 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
1a520 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52   ) i = SQLITE_CR
1a530 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b  EATE_TEMP_INDEX;
1a540 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1a550 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1a560 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62  , i, zName, pTab
1a570 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b  ->zName, zDb) ){
1a580 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
1a590 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1a5a0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1a5b0 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d  .  /* If pList==
1a5c0 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  0, it means this
1a5d0 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
1a5e0 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72  led to make a pr
1a5f0 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f  imary.  ** key o
1a600 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63  ut of the last c
1a610 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74  olumn added to t
1a620 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
1a630 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a  onstruction..  *
1a640 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61  * So create a fa
1a650 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c  ke list to simul
1a660 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20  ate this..  */. 
1a670 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
1a680 0a 20 20 20 20 54 6f 6b 65 6e 20 70 72 65 76 43  .    Token prevC
1a690 6f 6c 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a  ol;.    Column *
1a6a0 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43  pCol = &pTab->aC
1a6b0 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d  ol[pTab->nCol-1]
1a6c0 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46  ;.    pCol->colF
1a6d0 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
1a6e0 55 4e 49 51 55 45 3b 0a 20 20 20 20 73 71 6c 69  UNIQUE;.    sqli
1a6f0 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 70 72  te3TokenInit(&pr
1a700 65 76 43 6f 6c 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  evCol, pCol->zNa
1a710 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  me);.    pList =
1a720 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1a730 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
1a740 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a750 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
1a760 28 64 62 2c 20 54 4b 5f 49 44 2c 20 26 70 72 65  (db, TK_ID, &pre
1a770 76 43 6f 6c 2c 20 30 29 29 3b 0a 20 20 20 20 69  vCol, 0));.    i
1a780 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f  f( pList==0 ) go
1a790 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1a7a0 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
1a7b0 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  ( pList->nExpr==
1a7c0 31 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 );.    sqlite3
1a7d0 45 78 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f  ExprListSetSortO
1a7e0 72 64 65 72 28 70 4c 69 73 74 2c 20 73 6f 72 74  rder(pList, sort
1a7f0 4f 72 64 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Order);.  }else{
1a800 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1a810 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28  ListCheckLength(
1a820 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 22  pParse, pList, "
1a830 69 6e 64 65 78 22 29 3b 0a 20 20 7d 0a 0a 20 20  index");.  }..  
1a840 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
1a850 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20  w many bytes of 
1a860 73 70 61 63 65 20 61 72 65 20 72 65 71 75 69 72  space are requir
1a870 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78 70 6c  ed to store expl
1a880 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63  icitly.  ** spec
1a890 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  ified collation 
1a8a0 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a  sequence names..
1a8b0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
1a8c0 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
1a8d0 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
1a8e0 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61  pExpr = pList->a
1a8f0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61  [i].pExpr;.    a
1a900 73 73 65 72 74 28 20 70 45 78 70 72 21 3d 30 20  ssert( pExpr!=0 
1a910 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  );.    if( pExpr
1a920 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
1a930 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61   ){.      nExtra
1a940 20 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74 65 33   += (1 + sqlite3
1a950 53 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e  Strlen30(pExpr->
1a960 75 2e 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20 20 20  u.zToken));.    
1a970 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a  }.  }..  /* .  *
1a980 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69  * Allocate the i
1a990 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20  ndex structure. 
1a9a0 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20  .  */.  nName = 
1a9b0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1a9c0 7a 4e 61 6d 65 29 3b 0a 20 20 6e 45 78 74 72 61  zName);.  nExtra
1a9d0 43 6f 6c 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d  Col = pPk ? pPk-
1a9e0 3e 6e 4b 65 79 43 6f 6c 20 3a 20 31 3b 0a 20 20  >nKeyCol : 1;.  
1a9f0 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
1aa00 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a  AllocateIndexObj
1aa10 65 63 74 28 64 62 2c 20 70 4c 69 73 74 2d 3e 6e  ect(db, pList->n
1aa20 45 78 70 72 20 2b 20 6e 45 78 74 72 61 43 6f 6c  Expr + nExtraCol
1aa30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1aa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa50 20 20 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20          nName + 
1aa60 6e 45 78 74 72 61 20 2b 20 31 2c 20 26 7a 45 78  nExtra + 1, &zEx
1aa70 74 72 61 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  tra);.  if( db->
1aa80 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
1aa90 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1aaa0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
1aab0 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
1aac0 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
1aad0 49 6e 64 65 78 2d 3e 61 69 52 6f 77 4c 6f 67 45  Index->aiRowLogE
1aae0 73 74 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  st) );.  assert(
1aaf0 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
1ab00 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 7a  NMENT(pIndex->az
1ab10 43 6f 6c 6c 29 20 29 3b 0a 20 20 70 49 6e 64 65  Coll) );.  pInde
1ab20 78 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 45 78 74 72  x->zName = zExtr
1ab30 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e  a;.  zExtra += n
1ab40 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 6d 65 6d 63  Name + 1;.  memc
1ab50 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  py(pIndex->zName
1ab60 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31  , zName, nName+1
1ab70 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61  );.  pIndex->pTa
1ab80 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49  ble = pTab;.  pI
1ab90 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20  ndex->onError = 
1aba0 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70  (u8)onError;.  p
1abb0 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75  Index->uniqNotNu
1abc0 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 21 3d 4f 45  ll = onError!=OE
1abd0 5f 4e 6f 6e 65 3b 0a 20 20 70 49 6e 64 65 78 2d  _None;.  pIndex-
1abe0 3e 69 64 78 54 79 70 65 20 3d 20 69 64 78 54 79  >idxType = idxTy
1abf0 70 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53  pe;.  pIndex->pS
1ac00 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
1ac10 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  iDb].pSchema;.  
1ac20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20  pIndex->nKeyCol 
1ac30 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
1ac40 20 20 69 66 28 20 70 50 49 57 68 65 72 65 20 29    if( pPIWhere )
1ac50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
1ac60 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63  olveSelfReferenc
1ac70 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
1ac80 4e 43 5f 50 61 72 74 49 64 78 2c 20 70 50 49 57  NC_PartIdx, pPIW
1ac90 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 70 49  here, 0);.    pI
1aca0 6e 64 65 78 2d 3e 70 50 61 72 74 49 64 78 57 68  ndex->pPartIdxWh
1acb0 65 72 65 20 3d 20 70 50 49 57 68 65 72 65 3b 0a  ere = pPIWhere;.
1acc0 20 20 20 20 70 50 49 57 68 65 72 65 20 3d 20 30      pPIWhere = 0
1acd0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1ace0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
1acf0 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
1ad00 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  0) );..  /* Chec
1ad10 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 73  k to see if we s
1ad20 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43  hould honor DESC
1ad30 20 72 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64   requests on ind
1ad40 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a  ex columns.  */.
1ad50 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
1ad60 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  ma->file_format>
1ad70 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72  =4 ){.    sortOr
1ad80 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20  derMask = -1;   
1ad90 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f  /* Honor DESC */
1ada0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f  .  }else{.    so
1adb0 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b  rtOrderMask = 0;
1adc0 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45      /* Ignore DE
1add0 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20  SC */.  }..  /* 
1ade0 41 6e 61 6c 79 7a 65 20 74 68 65 20 6c 69 73 74  Analyze the list
1adf0 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20   of expressions 
1ae00 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 74 65  that form the te
1ae10 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  rms of the index
1ae20 20 61 6e 64 0a 20 20 2a 2a 20 72 65 70 6f 72 74   and.  ** report
1ae30 20 61 6e 79 20 65 72 72 6f 72 73 2e 20 20 49 6e   any errors.  In
1ae40 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
1ae50 20 77 68 65 72 65 20 74 68 65 20 65 78 70 72 65   where the expre
1ae60 73 73 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79  ssion is exactly
1ae70 0a 20 20 2a 2a 20 61 20 74 61 62 6c 65 20 63 6f  .  ** a table co
1ae80 6c 75 6d 6e 2c 20 73 74 6f 72 65 20 74 68 61 74  lumn, store that
1ae90 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 69 43 6f 6c   column in aiCol
1aea0 75 6d 6e 5b 5d 2e 20 20 46 6f 72 20 67 65 6e 65  umn[].  For gene
1aeb0 72 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ral expressions,
1aec0 0a 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 20 70  .  ** populate p
1aed0 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20  Index->aColExpr 
1aee0 61 6e 64 20 73 74 6f 72 65 20 58 4e 5f 45 58 50  and store XN_EXP
1aef0 52 20 28 2d 32 29 20 69 6e 20 61 69 43 6f 6c 75  R (-2) in aiColu
1af00 6d 6e 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mn[]..  **.  ** 
1af10 54 4f 44 4f 3a 20 49 73 73 75 65 20 61 20 77 61  TODO: Issue a wa
1af20 72 6e 69 6e 67 20 69 66 20 74 77 6f 20 6f 72 20  rning if two or 
1af30 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  more columns of 
1af40 74 68 65 20 69 6e 64 65 78 20 61 72 65 20 69 64  the index are id
1af50 65 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a 20 54 4f  entical..  ** TO
1af60 44 4f 3a 20 49 73 73 75 65 20 61 20 77 61 72 6e  DO: Issue a warn
1af70 69 6e 67 20 69 66 20 74 68 65 20 74 61 62 6c 65  ing if the table
1af80 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20   primary key is 
1af90 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
1afa0 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6b  the.  ** index k
1afb0 65 79 2e 0a 20 20 2a 2f 0a 20 20 70 4c 69 73 74  ey..  */.  pList
1afc0 49 74 65 6d 20 3d 20 70 4c 69 73 74 2d 3e 61 3b  Item = pList->a;
1afd0 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45  .  if( IN_RENAME
1afe0 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 70  _OBJECT ){.    p
1aff0 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20  Index->aColExpr 
1b000 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 70 4c 69  = pList;.    pLi
1b010 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 6f  st = 0;.  }.  fo
1b020 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d  r(i=0; i<pIndex-
1b030 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 2c 20 70  >nKeyCol; i++, p
1b040 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  ListItem++){.   
1b050 20 45 78 70 72 20 2a 70 43 45 78 70 72 3b 20 20   Expr *pCExpr;  
1b060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b070 2f 2a 20 54 68 65 20 69 2d 74 68 20 69 6e 64 65  /* The i-th inde
1b080 78 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  x expression */.
1b090 20 20 20 20 69 6e 74 20 72 65 71 75 65 73 74 65      int requeste
1b0a0 64 53 6f 72 74 4f 72 64 65 72 3b 20 20 20 20 20  dSortOrder;     
1b0b0 20 20 20 2f 2a 20 41 53 43 20 6f 72 20 44 45 53     /* ASC or DES
1b0c0 43 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 65 78  C on the i-th ex
1b0d0 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
1b0e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
1b0f0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
1b100 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  * Collation sequ
1b110 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20  ence name */..  
1b120 20 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54    sqlite3StringT
1b130 6f 49 64 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70  oId(pListItem->p
1b140 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
1b150 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66  e3ResolveSelfRef
1b160 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70  erence(pParse, p
1b170 54 61 62 2c 20 4e 43 5f 49 64 78 45 78 70 72 2c  Tab, NC_IdxExpr,
1b180 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
1b190 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 0);.    if( p
1b1a0 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f  Parse->nErr ) go
1b1b0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1b1c0 6e 64 65 78 3b 0a 20 20 20 20 70 43 45 78 70 72  ndex;.    pCExpr
1b1d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
1b1e0 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 49  ipCollate(pListI
1b1f0 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
1b200 20 69 66 28 20 70 43 45 78 70 72 2d 3e 6f 70 21   if( pCExpr->op!
1b210 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
1b220 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50      if( pTab==pP
1b230 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
1b240 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1b250 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1b260 65 2c 20 22 65 78 70 72 65 73 73 69 6f 6e 73 20  e, "expressions 
1b270 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20 50 52  prohibited in PR
1b280 49 4d 41 52 59 20 4b 45 59 20 61 6e 64 20 22 0a  IMARY KEY and ".
1b290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2b0 22 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69  "UNIQUE constrai
1b2c0 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20 20 67  nts");.        g
1b2d0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1b2e0 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
1b2f0 20 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d       if( pIndex-
1b300 3e 61 43 6f 6c 45 78 70 72 3d 3d 30 20 29 7b 0a  >aColExpr==0 ){.
1b310 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
1b320 61 43 6f 6c 45 78 70 72 20 3d 20 70 4c 69 73 74  aColExpr = pList
1b330 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 20  ;.        pList 
1b340 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1b350 20 20 20 6a 20 3d 20 58 4e 5f 45 58 50 52 3b 0a     j = XN_EXPR;.
1b360 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69        pIndex->ai
1b370 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 45  Column[i] = XN_E
1b380 58 50 52 3b 0a 20 20 20 20 20 20 70 49 6e 64 65  XPR;.      pInde
1b390 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d  x->uniqNotNull =
1b3a0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1b3b0 20 20 20 20 20 6a 20 3d 20 70 43 45 78 70 72 2d       j = pCExpr-
1b3c0 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
1b3d0 61 73 73 65 72 74 28 20 6a 3c 3d 30 78 37 66 66  assert( j<=0x7ff
1b3e0 66 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  f );.      if( j
1b3f0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20  <0 ){.        j 
1b400 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
1b410 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1b420 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74  Tab->aCol[j].not
1b430 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Null==0 ){.     
1b440 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e     pIndex->uniqN
1b450 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  otNull = 0;.    
1b460 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78    }.      pIndex
1b470 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20  ->aiColumn[i] = 
1b480 28 69 31 36 29 6a 3b 0a 20 20 20 20 7d 0a 20 20  (i16)j;.    }.  
1b490 20 20 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20    zColl = 0;.   
1b4a0 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e   if( pListItem->
1b4b0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
1b4c0 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69  LLATE ){.      i
1b4d0 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  nt nColl;.      
1b4e0 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49 74 65  zColl = pListIte
1b4f0 6d 2d 3e 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  m->pExpr->u.zTok
1b500 65 6e 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 6c 20  en;.      nColl 
1b510 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1b520 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20  0(zColl) + 1;.  
1b530 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 74      assert( nExt
1b540 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20  ra>=nColl );.   
1b550 20 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61     memcpy(zExtra
1b560 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b  , zColl, nColl);
1b570 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a  .      zColl = z
1b580 45 78 74 72 61 3b 0a 20 20 20 20 20 20 7a 45 78  Extra;.      zEx
1b590 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20  tra += nColl;.  
1b5a0 20 20 20 20 6e 45 78 74 72 61 20 2d 3d 20 6e 43      nExtra -= nC
1b5b0 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  oll;.    }else i
1b5c0 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20 20  f( j>=0 ){.     
1b5d0 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61   zColl = pTab->a
1b5e0 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20  Col[j].zColl;.  
1b5f0 20 20 7d 0a 20 20 20 20 69 66 28 20 21 7a 43 6f    }.    if( !zCo
1b600 6c 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c  ll ) zColl = sql
1b610 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20  ite3StrBINARY;. 
1b620 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74     if( !db->init
1b630 2e 62 75 73 79 20 26 26 20 21 73 71 6c 69 74 65  .busy && !sqlite
1b640 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
1b650 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b  Parse, zColl) ){
1b660 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
1b670 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1b680 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
1b690 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f  >azColl[i] = zCo
1b6a0 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65  ll;.    requeste
1b6b0 64 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69  dSortOrder = pLi
1b6c0 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65  stItem->sortOrde
1b6d0 72 20 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73  r & sortOrderMas
1b6e0 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  k;.    pIndex->a
1b6f0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 28  SortOrder[i] = (
1b700 75 38 29 72 65 71 75 65 73 74 65 64 53 6f 72 74  u8)requestedSort
1b710 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Order;.  }..  /*
1b720 20 41 70 70 65 6e 64 20 74 68 65 20 74 61 62 6c   Append the tabl
1b730 65 20 6b 65 79 20 74 6f 20 74 68 65 20 65 6e 64  e key to the end
1b740 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
1b750 46 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  For WITHOUT ROWI
1b760 44 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20 28 77  D.  ** tables (w
1b770 68 65 6e 20 70 50 6b 21 3d 30 29 20 74 68 69 73  hen pPk!=0) this
1b780 20 77 69 6c 6c 20 62 65 20 74 68 65 20 64 65 63   will be the dec
1b790 6c 61 72 65 64 20 50 52 49 4d 41 52 59 20 4b 45  lared PRIMARY KE
1b7a0 59 2e 20 20 46 6f 72 0a 20 20 2a 2a 20 6e 6f 72  Y.  For.  ** nor
1b7b0 6d 61 6c 20 74 61 62 6c 65 73 20 28 77 68 65 6e  mal tables (when
1b7c0 20 70 50 6b 3d 3d 30 29 20 74 68 69 73 20 77 69   pPk==0) this wi
1b7d0 6c 6c 20 62 65 20 74 68 65 20 72 6f 77 69 64 2e  ll be the rowid.
1b7e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 6b 20  .  */.  if( pPk 
1b7f0 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ){.    for(j=0; 
1b800 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  j<pPk->nKeyCol; 
1b810 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  j++){.      int 
1b820 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  x = pPk->aiColum
1b830 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  n[j];.      asse
1b840 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20  rt( x>=0 );.    
1b850 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28    if( hasColumn(
1b860 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1b870 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  , pIndex->nKeyCo
1b880 6c 2c 20 78 29 20 29 7b 0a 20 20 20 20 20 20 20  l, x) ){.       
1b890 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
1b8a0 2d 2d 3b 20 0a 20 20 20 20 20 20 7d 65 6c 73 65  --; .      }else
1b8b0 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  {.        pIndex
1b8c0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20  ->aiColumn[i] = 
1b8d0 78 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  x;.        pInde
1b8e0 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 70  x->azColl[i] = p
1b8f0 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20  Pk->azColl[j];. 
1b900 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61         pIndex->a
1b910 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70  SortOrder[i] = p
1b920 50 6b 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  Pk->aSortOrder[j
1b930 5d 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  ];.        i++;.
1b940 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b950 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49 6e    assert( i==pIn
1b960 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  dex->nColumn );.
1b970 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e    }else{.    pIn
1b980 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
1b990 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20   = XN_ROWID;.   
1b9a0 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
1b9b0 69 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42  i] = sqlite3StrB
1b9c0 49 4e 41 52 59 3b 0a 20 20 7d 0a 20 20 73 71 6c  INARY;.  }.  sql
1b9d0 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73  ite3DefaultRowEs
1b9e0 74 28 70 49 6e 64 65 78 29 3b 0a 20 20 69 66 28  t(pIndex);.  if(
1b9f0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
1ba00 6c 65 3d 3d 30 20 29 20 65 73 74 69 6d 61 74 65  le==0 ) estimate
1ba10 49 6e 64 65 78 57 69 64 74 68 28 70 49 6e 64 65  IndexWidth(pInde
1ba20 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  x);..  /* If thi
1ba30 73 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e 73  s index contains
1ba40 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66   every column of
1ba50 20 69 74 73 20 74 61 62 6c 65 2c 20 74 68 65 6e   its table, then
1ba60 20 6d 61 72 6b 0a 20 20 2a 2a 20 69 74 20 61 73   mark.  ** it as
1ba70 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
1ba80 78 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 48  x */.  assert( H
1ba90 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 0a 20  asRowid(pTab) . 
1baa0 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 69 50       || pTab->iP
1bab0 4b 65 79 3c 30 20 7c 7c 20 73 71 6c 69 74 65 33  Key<0 || sqlite3
1bac0 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49  ColumnOfIndex(pI
1bad0 6e 64 65 78 2c 20 70 54 61 62 2d 3e 69 50 4b 65  ndex, pTab->iPKe
1bae0 79 29 3e 3d 30 20 29 3b 0a 20 20 72 65 63 6f 6d  y)>=0 );.  recom
1baf0 70 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74 49 6e  puteColumnsNotIn
1bb00 64 65 78 65 64 28 70 49 6e 64 65 78 29 3b 0a 20  dexed(pIndex);. 
1bb10 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
1bb20 20 26 26 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c   && pIndex->nCol
1bb30 75 6d 6e 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  umn>=pTab->nCol 
1bb40 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 69  ){.    pIndex->i
1bb50 73 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b 0a 20  sCovering = 1;. 
1bb60 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
1bb70 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
1bb80 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 54 61        if( j==pTa
1bb90 62 2d 3e 69 50 4b 65 79 20 29 20 63 6f 6e 74 69  b->iPKey ) conti
1bba0 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73  nue;.      if( s
1bbb0 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
1bbc0 64 65 78 28 70 49 6e 64 65 78 2c 6a 29 3e 3d 30  dex(pIndex,j)>=0
1bbd0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1bbe0 20 20 20 70 49 6e 64 65 78 2d 3e 69 73 43 6f 76     pIndex->isCov
1bbf0 65 72 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  ering = 0;.     
1bc00 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1bc10 7d 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 70  }..  if( pTab==p
1bc20 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
1bc30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
1bc40 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e  routine has been
1bc50 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
1bc60 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  e an automatic i
1bc70 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20 2a 2a  ndex as a.    **
1bc80 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50 52 49   result of a PRI
1bc90 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
1bca0 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61 20 63  UE clause on a c
1bcb0 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e  olumn definition
1bcc0 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50 52  , or.    ** a PR
1bcd0 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
1bce0 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f  QUE clause follo
1bcf0 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20  wing the column 
1bd00 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20  definitions..   
1bd10 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a   ** i.e. one of:
1bd20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
1bd30 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 20  REATE TABLE t(x 
1bd40 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b  PRIMARY KEY, y);
1bd50 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54  .    ** CREATE T
1bd60 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e 49  ABLE t(x, y, UNI
1bd70 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20  QUE(x, y));.    
1bd80 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68 65 72  **.    ** Either
1bd90 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f 20 73   way, check to s
1bda0 65 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ee if the table 
1bdb0 61 6c 72 65 61 64 79 20 68 61 73 20 73 75 63 68  already has such
1bdc0 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20 20   an index. If.  
1bdd0 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62    ** so, don't b
1bde0 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67 20 74  other creating t
1bdf0 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e  his one. This on
1be00 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a 20 20  ly applies to.  
1be10 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
1be20 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 69 63  ly created indic
1be30 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20 64 6f  es. Users can do
1be40 20 61 73 20 74 68 65 79 20 77 69 73 68 20 77 69   as they wish wi
1be50 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63  th.    ** explic
1be60 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20  it indices..    
1be70 2a 2a 0a 20 20 20 20 2a 2a 20 54 77 6f 20 55 4e  **.    ** Two UN
1be80 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20  IQUE or PRIMARY 
1be90 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  KEY constraints 
1bea0 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65  are considered e
1beb0 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 2a 2a  quivalent.    **
1bec0 20 28 61 6e 64 20 74 68 75 73 20 73 75 70 70 72   (and thus suppr
1bed0 65 73 73 69 6e 67 20 74 68 65 20 73 65 63 6f 6e  essing the secon
1bee0 64 20 6f 6e 65 29 20 65 76 65 6e 20 69 66 20 74  d one) even if t
1bef0 68 65 79 20 68 61 76 65 20 64 69 66 66 65 72 65  hey have differe
1bf00 6e 74 0a 20 20 20 20 2a 2a 20 73 6f 72 74 20 6f  nt.    ** sort o
1bf10 72 64 65 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20  rders..    **.  
1bf20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72    ** If there ar
1bf30 65 20 64 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c  e different coll
1bf40 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
1bf50 6f 72 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e  or if the column
1bf60 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  s of.    ** the 
1bf70 63 6f 6e 73 74 72 61 69 6e 74 20 6f 63 63 75 72  constraint occur
1bf80 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 6f 72   in different or
1bf90 64 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ders, then the c
1bfa0 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 0a 20  onstraints are. 
1bfb0 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64     ** considered
1bfc0 20 64 69 73 74 69 6e 63 74 20 61 6e 64 20 62 6f   distinct and bo
1bfd0 74 68 20 72 65 73 75 6c 74 20 69 6e 20 73 65 70  th result in sep
1bfe0 61 72 61 74 65 20 69 6e 64 69 63 65 73 2e 0a 20  arate indices.. 
1bff0 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20     */.    Index 
1c000 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70  *pIdx;.    for(p
1c010 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
1c020 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
1c030 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
1c040 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73   int k;.      as
1c050 73 65 72 74 28 20 49 73 55 6e 69 71 75 65 49 6e  sert( IsUniqueIn
1c060 64 65 78 28 70 49 64 78 29 20 29 3b 0a 20 20 20  dex(pIdx) );.   
1c070 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
1c080 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45  >idxType!=SQLITE
1c090 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 20  _IDXTYPE_APPDEF 
1c0a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1c0b0 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
1c0c0 49 6e 64 65 78 29 20 29 3b 0a 0a 20 20 20 20 20  Index) );..     
1c0d0 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43   if( pIdx->nKeyC
1c0e0 6f 6c 21 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79  ol!=pIndex->nKey
1c0f0 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Col ) continue;.
1c100 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
1c110 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
1c120 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  k++){.        co
1c130 6e 73 74 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20  nst char *z1;.  
1c140 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1c150 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 61 73   *z2;.        as
1c160 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f  sert( pIdx->aiCo
1c170 6c 75 6d 6e 5b 6b 5d 3e 3d 30 20 29 3b 0a 20 20  lumn[k]>=0 );.  
1c180 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
1c190 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e  aiColumn[k]!=pIn
1c1a0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d  dex->aiColumn[k]
1c1b0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1c1c0 20 20 7a 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43    z1 = pIdx->azC
1c1d0 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  oll[k];.        
1c1e0 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43  z2 = pIndex->azC
1c1f0 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  oll[k];.        
1c200 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1c210 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20 62 72 65  mp(z1, z2) ) bre
1c220 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1c230 20 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e    if( k==pIdx->n
1c240 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  KeyCol ){.      
1c250 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
1c260 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45  ror!=pIndex->onE
1c270 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rror ){.        
1c280 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72    /* This constr
1c290 61 69 6e 74 20 63 72 65 61 74 65 73 20 74 68 65  aint creates the
1c2a0 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61   same index as a
1c2b0 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
1c2c0 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
1c2d0 74 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65  t specified some
1c2e0 77 68 65 72 65 20 69 6e 20 74 68 65 20 43 52 45  where in the CRE
1c2f0 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
1c300 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ent..          *
1c310 2a 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e  * However the ON
1c320 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
1c330 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e  s are different.
1c340 20 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20   If both this . 
1c350 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
1c360 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70  traint and the p
1c370 72 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65  revious equivale
1c380 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61  nt constraint ha
1c390 76 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20  ve explicit.    
1c3a0 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46        ** ON CONF
1c3b0 4c 49 43 54 20 63 6c 61 75 73 65 73 20 74 68 69  LICT clauses thi
1c3c0 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f  s is an error. O
1c3d0 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68  therwise, use th
1c3e0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  e.          ** e
1c3f0 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  xplicitly specif
1c400 69 65 64 20 62 65 68 61 76 69 6f 72 20 66 6f 72  ied behavior for
1c410 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
1c420 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1c430 20 20 20 69 66 28 20 21 28 70 49 64 78 2d 3e 6f     if( !(pIdx->o
1c440 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
1c450 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e  lt || pIndex->on
1c460 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
1c470 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
1c480 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1c490 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
1c4a0 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66             "conf
1c4b0 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c  licting ON CONFL
1c4c0 49 43 54 20 63 6c 61 75 73 65 73 20 73 70 65 63  ICT clauses spec
1c4d0 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  ified", 0);.    
1c4e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c4f0 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
1c500 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror==OE_Default 
1c510 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1c520 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70  Idx->onError = p
1c530 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a  Index->onError;.
1c540 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1c550 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1c560 28 20 69 64 78 54 79 70 65 3d 3d 53 51 4c 49 54  ( idxType==SQLIT
1c570 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52  E_IDXTYPE_PRIMAR
1c580 59 4b 45 59 20 29 20 70 49 64 78 2d 3e 69 64 78  YKEY ) pIdx->idx
1c590 54 79 70 65 20 3d 20 69 64 78 54 79 70 65 3b 0a  Type = idxType;.
1c5a0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
1c5b0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1c5c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1c5d0 7d 0a 0a 20 20 69 66 28 20 21 49 4e 5f 52 45 4e  }..  if( !IN_REN
1c5e0 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 0a 20  AME_OBJECT ){.. 
1c5f0 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e     /* Link the n
1c600 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  ew Index structu
1c610 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20  re to its table 
1c620 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72  and to the other
1c630 0a 20 20 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  .    ** in-memor
1c640 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  y database struc
1c650 74 75 72 65 73 2e 20 0a 20 20 20 20 2a 2f 0a 20  tures. .    */. 
1c660 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
1c670 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20  e->nErr==0 );.  
1c680 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
1c690 75 73 79 20 29 7b 0a 20 20 20 20 20 20 49 6e 64  usy ){.      Ind
1c6a0 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 61 73 73  ex *p;.      ass
1c6b0 65 72 74 28 20 21 49 4e 5f 53 50 45 43 49 41 4c  ert( !IN_SPECIAL
1c6c0 5f 50 41 52 53 45 20 29 3b 0a 20 20 20 20 20 20  _PARSE );.      
1c6d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
1c6e0 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
1c6f0 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53  b, 0, pIndex->pS
1c700 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 20 20  chema) );.      
1c710 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  p = sqlite3HashI
1c720 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e 70  nsert(&pIndex->p
1c730 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c  Schema->idxHash,
1c740 20 0a 20 20 20 20 20 20 20 20 20 20 70 49 6e 64   .          pInd
1c750 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65  ex->zName, pInde
1c760 78 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 20  x);.      if( p 
1c770 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1c780 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20  t( p==pIndex ); 
1c790 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
1c7a0 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  have failed */. 
1c7b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f         sqlite3Oo
1c7c0 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
1c7d0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1c7e0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1c7f0 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6d 44    }.      db->mD
1c800 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47  bFlags |= DBFLAG
1c810 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20  _SchemaChange;. 
1c820 20 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d       if( pTblNam
1c830 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=0 ){.        
1c840 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64  pIndex->tnum = d
1c850 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
1c860 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1c870 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
1c880 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 43 52  s the initial CR
1c890 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
1c8a0 6d 65 6e 74 20 28 6f 72 20 43 52 45 41 54 45 20  ment (or CREATE 
1c8b0 54 41 42 4c 45 20 69 66 20 74 68 65 0a 20 20 20  TABLE if the.   
1c8c0 20 2a 2a 20 69 6e 64 65 78 20 69 73 20 61 6e 20   ** index is an 
1c8d0 69 6d 70 6c 69 65 64 20 69 6e 64 65 78 20 66 6f  implied index fo
1c8e0 72 20 61 20 55 4e 49 51 55 45 20 6f 72 20 50 52  r a UNIQUE or PR
1c8f0 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
1c900 61 69 6e 74 29 20 74 68 65 6e 0a 20 20 20 20 2a  aint) then.    *
1c910 2a 20 65 6d 69 74 20 63 6f 64 65 20 74 6f 20 61  * emit code to a
1c920 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65  llocate the inde
1c930 78 20 72 6f 6f 74 70 61 67 65 20 6f 6e 20 64 69  x rootpage on di
1c940 73 6b 20 61 6e 64 20 6d 61 6b 65 20 61 6e 20 65  sk and make an e
1c950 6e 74 72 79 20 66 6f 72 0a 20 20 20 20 2a 2a 20  ntry for.    ** 
1c960 74 68 65 20 69 6e 64 65 78 20 69 6e 20 74 68 65  the index in the
1c970 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
1c980 61 62 6c 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  able and populat
1c990 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68  e the index with
1c9a0 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e  .    ** content.
1c9b0 20 20 42 75 74 2c 20 64 6f 20 6e 6f 74 20 64 6f    But, do not do
1c9c0 20 74 68 69 73 20 69 66 20 77 65 20 61 72 65 20   this if we are 
1c9d0 73 69 6d 70 6c 79 20 72 65 61 64 69 6e 67 20 74  simply reading t
1c9e0 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
1c9f0 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f  .    ** table to
1ca00 20 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d   parse the schem
1ca10 61 2c 20 6f 72 20 69 66 20 74 68 69 73 20 69 6e  a, or if this in
1ca20 64 65 78 20 69 73 20 74 68 65 20 50 52 49 4d 41  dex is the PRIMA
1ca30 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20 20 20  RY KEY index.   
1ca40 20 2a 2a 20 6f 66 20 61 20 57 49 54 48 4f 55 54   ** of a WITHOUT
1ca50 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a 20 20   ROWID table..  
1ca60 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 70    **.    ** If p
1ca70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65  TblName==0 it me
1ca80 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20 69  ans this index i
1ca90 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20 61  s generated as a
1caa0 6e 20 69 6d 70 6c 69 65 64 20 50 52 49 4d 41 52  n implied PRIMAR
1cab0 59 20 4b 45 59 0a 20 20 20 20 2a 2a 20 6f 72 20  Y KEY.    ** or 
1cac0 55 4e 49 51 55 45 20 69 6e 64 65 78 20 69 6e 20  UNIQUE index in 
1cad0 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
1cae0 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65  tatement.  Since
1caf0 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a   the table.    *
1cb00 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  * has just been 
1cb10 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74  created, it cont
1cb20 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64  ains no data and
1cb30 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69   the index initi
1cb40 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a  alization.    **
1cb50 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69   step can be ski
1cb60 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  pped..    */.   
1cb70 20 65 6c 73 65 20 69 66 28 20 48 61 73 52 6f 77   else if( HasRow
1cb80 69 64 28 70 54 61 62 29 20 7c 7c 20 70 54 62 6c  id(pTab) || pTbl
1cb90 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  Name!=0 ){.     
1cba0 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 20 20   Vdbe *v;.      
1cbb0 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20  char *zStmt;.   
1cbc0 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b     int iMem = ++
1cbd0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20  pParse->nMem;.. 
1cbe0 20 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33       v = sqlite3
1cbf0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1cc00 0a 20 20 20 20 20 20 69 66 28 20 76 3d 3d 30 20  .      if( v==0 
1cc10 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
1cc20 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20 20  te_index;..     
1cc30 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
1cc40 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
1cc50 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 20 20  se, 1, iDb);..  
1cc60 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68      /* Create th
1cc70 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74  e rootpage for t
1cc80 68 65 20 69 6e 64 65 78 20 75 73 69 6e 67 20 43  he index using C
1cc90 72 65 61 74 65 49 6e 64 65 78 2e 20 42 75 74 20  reateIndex. But 
1cca0 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20  before.      ** 
1ccb0 64 6f 69 6e 67 20 73 6f 2c 20 63 6f 64 65 20 61  doing so, code a
1ccc0 20 4e 6f 6f 70 20 69 6e 73 74 72 75 63 74 69 6f   Noop instructio
1ccd0 6e 20 61 6e 64 20 73 74 6f 72 65 20 69 74 73 20  n and store its 
1cce0 61 64 64 72 65 73 73 20 69 6e 20 0a 20 20 20 20  address in .    
1ccf0 20 20 2a 2a 20 49 6e 64 65 78 2e 74 6e 75 6d 2e    ** Index.tnum.
1cd00 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
1cd10 64 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 69  d in case this i
1cd20 6e 64 65 78 20 69 73 20 61 63 74 75 61 6c 6c 79  ndex is actually
1cd30 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 50 52 49   a .      ** PRI
1cd40 4d 41 52 59 20 4b 45 59 20 61 6e 64 20 74 68 65  MARY KEY and the
1cd50 20 74 61 62 6c 65 20 69 73 20 61 63 74 75 61 6c   table is actual
1cd60 6c 79 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  ly a WITHOUT ROW
1cd70 49 44 20 74 61 62 6c 65 2e 20 49 6e 20 0a 20 20  ID table. In .  
1cd80 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65      ** that case
1cd90 20 74 68 65 20 63 6f 6e 76 65 72 74 54 6f 57 69   the convertToWi
1cda0 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28  thoutRowidTable(
1cdb0 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  ) routine will r
1cdc0 65 70 6c 61 63 65 0a 20 20 20 20 20 20 2a 2a 20  eplace.      ** 
1cdd0 74 68 65 20 4e 6f 6f 70 20 77 69 74 68 20 61 20  the Noop with a 
1cde0 47 6f 74 6f 20 74 6f 20 6a 75 6d 70 20 6f 76 65  Goto to jump ove
1cdf0 72 20 74 68 65 20 56 44 42 45 20 63 6f 64 65 20  r the VDBE code 
1ce00 67 65 6e 65 72 61 74 65 64 20 62 65 6c 6f 77 2e  generated below.
1ce10 20 2a 2f 0a 20 20 20 20 20 20 70 49 6e 64 65 78   */.      pIndex
1ce20 2d 3e 74 6e 75 6d 20 3d 20 73 71 6c 69 74 65 33  ->tnum = sqlite3
1ce30 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
1ce40 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71  _Noop);.      sq
1ce50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1ce60 76 2c 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65  v, OP_CreateBtre
1ce70 65 2c 20 69 44 62 2c 20 69 4d 65 6d 2c 20 42 54  e, iDb, iMem, BT
1ce80 52 45 45 5f 42 4c 4f 42 4b 45 59 29 3b 0a 0a 20  REE_BLOBKEY);.. 
1ce90 20 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74       /* Gather t
1cea0 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
1ceb0 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 49   of the CREATE I
1cec0 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69  NDEX statement i
1ced0 6e 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  nto.      ** the
1cee0 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a   zStmt variable.
1cef0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1cf00 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20  f( pStart ){.   
1cf10 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e       int n = (in
1cf20 74 29 28 70 50 61 72 73 65 2d 3e 73 4c 61 73 74  t)(pParse->sLast
1cf30 54 6f 6b 65 6e 2e 7a 20 2d 20 70 4e 61 6d 65 2d  Token.z - pName-
1cf40 3e 7a 29 20 2b 20 70 50 61 72 73 65 2d 3e 73 4c  >z) + pParse->sL
1cf50 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20  astToken.n;.    
1cf60 20 20 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e 7a      if( pName->z
1cf70 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29 20 6e 2d 2d  [n-1]==';' ) n--
1cf80 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e  ;.        /* A n
1cf90 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68 20  amed index with 
1cfa0 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45 41  an explicit CREA
1cfb0 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
1cfc0 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 53  nt */.        zS
1cfd0 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
1cfe0 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41 54 45  intf(db, "CREATE
1cff0 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a  %s INDEX %.*s",.
1d000 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 45 72              onEr
1d010 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22  ror==OE_None ? "
1d020 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 20 6e  " : " UNIQUE", n
1d030 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20  , pName->z);.   
1d040 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d050 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69    /* An automati
1d060 63 20 69 6e 64 65 78 20 63 72 65 61 74 65 64 20  c index created 
1d070 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  by a PRIMARY KEY
1d080 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
1d090 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20  raint */.       
1d0a0 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69   /* zStmt = sqli
1d0b0 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20  te3MPrintf(""); 
1d0c0 2a 2f 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74  */.        zStmt
1d0d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
1d0e0 20 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65       /* Add an e
1d0f0 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d  ntry in sqlite_m
1d100 61 73 74 65 72 20 66 6f 72 20 74 68 69 73 20 69  aster for this i
1d110 6e 64 65 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ndex.      */.  
1d120 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
1d130 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a  dParse(pParse, .
1d140 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45 52            "INSER
1d150 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c  T INTO %Q.%s VAL
1d160 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25  UES('index',%Q,%
1d170 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20  Q,#%d,%Q);",.   
1d180 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69         db->aDb[i
1d190 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41  Db].zDbSName, MA
1d1a0 53 54 45 52 5f 4e 41 4d 45 2c 0a 20 20 20 20 20  STER_NAME,.     
1d1b0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
1d1c0 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 70 54  me,.          pT
1d1d0 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
1d1e0 20 20 20 20 20 69 4d 65 6d 2c 0a 20 20 20 20 20       iMem,.     
1d1f0 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 20       zStmt.     
1d200 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71       );.      sq
1d210 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1d220 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 20 20 2f  zStmt);..      /
1d230 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78  * Fill the index
1d240 20 77 69 74 68 20 64 61 74 61 20 61 6e 64 20 72   with data and r
1d250 65 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d  eparse the schem
1d260 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78  a. Code an OP_Ex
1d270 70 69 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  pire.      ** to
1d280 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
1d290 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61  pre-compiled sta
1d2a0 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 20 20 2a  tements..      *
1d2b0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 54 62 6c  /.      if( pTbl
1d2c0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
1d2d0 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
1d2e0 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
1d2f0 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  x, iMem);.      
1d300 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
1d310 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
1d320 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
1d330 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53  te3VdbeAddParseS
1d340 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a  chemaOp(v, iDb,.
1d350 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1d360 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
1d370 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79  name='%q' AND ty
1d380 70 65 3d 27 69 6e 64 65 78 27 22 2c 20 70 49 6e  pe='index'", pIn
1d390 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  dex->zName));.  
1d3a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1d3b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45 78  eAddOp2(v, OP_Ex
1d3c0 70 69 72 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20  pire, 0, 1);.   
1d3d0 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69     }..      sqli
1d3e0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
1d3f0 76 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 29  v, pIndex->tnum)
1d400 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1d410 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e  * When adding an
1d420 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69   index to the li
1d430 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f  st of indices fo
1d440 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a  r a table, make.
1d450 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e    ** sure all in
1d460 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45  dices labeled OE
1d470 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66  _Replace come af
1d480 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61  ter all those la
1d490 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67  beled.  ** OE_Ig
1d4a0 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e  nore.  This is n
1d4b0 65 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65  ecessary for the
1d4c0 20 63 6f 72 72 65 63 74 20 63 6f 6e 73 74 72 61   correct constra
1d4d0 69 6e 74 20 63 68 65 63 6b 0a 20 20 2a 2a 20 70  int check.  ** p
1d4e0 72 6f 63 65 73 73 69 6e 67 20 28 69 6e 20 73 71  rocessing (in sq
1d4f0 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43 6f 6e  lite3GenerateCon
1d500 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28 29 29  straintChecks())
1d510 20 61 73 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a   as part of.  **
1d520 20 55 50 44 41 54 45 20 61 6e 64 20 49 4e 53 45   UPDATE and INSE
1d530 52 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  RT statements.  
1d540 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
1d550 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62  init.busy || pTb
1d560 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  lName==0 ){.    
1d570 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  if( onError!=OE_
1d580 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d  Replace || pTab-
1d590 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20  >pIndex==0.     
1d5a0 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e      || pTab->pIn
1d5b0 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  dex->onError==OE
1d5c0 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20  _Replace){.     
1d5d0 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
1d5e0 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
1d5f0 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65       pTab->pInde
1d600 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  x = pIndex;.    
1d610 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64  }else{.      Ind
1d620 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61  ex *pOther = pTa
1d630 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
1d640 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e   while( pOther->
1d650 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d  pNext && pOther-
1d660 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21  >pNext->onError!
1d670 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20  =OE_Replace ){. 
1d680 20 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20         pOther = 
1d690 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pOther->pNext;. 
1d6a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e       }.      pIn
1d6b0 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74  dex->pNext = pOt
1d6c0 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  her->pNext;.    
1d6d0 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20    pOther->pNext 
1d6e0 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  = pIndex;.    }.
1d6f0 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a      pIndex = 0;.
1d700 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 49    }.  else if( I
1d710 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
1d720 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1d730 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e 64 65 78  Parse->pNewIndex
1d740 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 72 73  ==0 );.    pPars
1d750 65 2d 3e 70 4e 65 77 49 6e 64 65 78 20 3d 20 70  e->pNewIndex = p
1d760 49 6e 64 65 78 3b 0a 20 20 20 20 70 49 6e 64 65  Index;.    pInde
1d770 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  x = 0;.  }..  /*
1d780 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65   Clean up before
1d790 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74   exiting */.exit
1d7a0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20  _create_index:. 
1d7b0 20 69 66 28 20 70 49 6e 64 65 78 20 29 20 73 71   if( pIndex ) sq
1d7c0 6c 69 74 65 33 46 72 65 65 49 6e 64 65 78 28 64  lite3FreeIndex(d
1d7d0 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 73 71  b, pIndex);.  sq
1d7e0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1d7f0 64 62 2c 20 70 50 49 57 68 65 72 65 29 3b 0a 20  db, pPIWhere);. 
1d800 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1d810 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
1d820 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  );.  sqlite3SrcL
1d830 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54  istDelete(db, pT
1d840 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  blName);.  sqlit
1d850 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
1d860 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  me);.}../*.** Fi
1d870 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e 61 69 52  ll the Index.aiR
1d880 6f 77 45 73 74 5b 5d 20 61 72 72 61 79 20 77 69  owEst[] array wi
1d890 74 68 20 64 65 66 61 75 6c 74 20 69 6e 66 6f 72  th default infor
1d8a0 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61  mation - informa
1d8b0 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73  tion.** to be us
1d8c0 65 64 20 77 68 65 6e 20 77 65 20 68 61 76 65 20  ed when we have 
1d8d0 6e 6f 74 20 72 75 6e 20 74 68 65 20 41 4e 41 4c  not run the ANAL
1d8e0 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  YZE command..**.
1d8f0 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d 20 69  ** aiRowEst[0] i
1d900 73 20 73 75 70 70 6f 73 65 64 20 74 6f 20 63 6f  s supposed to co
1d910 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ntain the number
1d920 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
1d930 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69  the index..** Si
1d940 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e  nce we do not kn
1d950 6f 77 2c 20 67 75 65 73 73 20 31 20 6d 69 6c 6c  ow, guess 1 mill
1d960 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b 31  ion.  aiRowEst[1
1d970 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65  ] is an estimate
1d980 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65   of the.** numbe
1d990 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
1d9a0 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63   table that matc
1d9b0 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72  h any particular
1d9c0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a   value of the.**
1d9d0 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66   first column of
1d9e0 20 74 68 65 20 69 6e 64 65 78 2e 20 20 61 69 52   the index.  aiR
1d9f0 6f 77 45 73 74 5b 32 5d 20 69 73 20 61 6e 20 65  owEst[2] is an e
1da00 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
1da10 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73  umber.** of rows
1da20 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20   that match any 
1da30 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69  particular combi
1da40 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69  nation of the fi
1da50 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  rst 2 columns.**
1da60 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
1da70 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49  And so forth.  I
1da80 74 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65  t must always be
1da90 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a   the case that.*
1daa0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69  .**           ai
1dab0 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77  RowEst[N]<=aiRow
1dac0 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20  Est[N-1].**     
1dad0 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e        aiRowEst[N
1dae0 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74  ]>=1.**.** Apart
1daf0 20 66 72 6f 6d 20 74 68 61 74 2c 20 77 65 20 68   from that, we h
1db00 61 76 65 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f  ave little to go
1db10 20 6f 6e 20 62 65 73 69 64 65 73 20 69 6e 74 75   on besides intu
1db20 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68  ition as to.** h
1db30 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d 20 73 68  ow aiRowEst[] sh
1db40 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 69  ould be initiali
1db50 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  zed.  The number
1db60 73 20 67 65 6e 65 72 61 74 65 64 20 68 65 72 65  s generated here
1db70 0a 2a 2a 20 61 72 65 20 62 61 73 65 64 20 6f 6e  .** are based on
1db80 20 74 79 70 69 63 61 6c 20 76 61 6c 75 65 73 20   typical values 
1db90 66 6f 75 6e 64 20 69 6e 20 61 63 74 75 61 6c 20  found in actual 
1dba0 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64  indices..*/.void
1dbb0 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52   sqlite3DefaultR
1dbc0 6f 77 45 73 74 28 49 6e 64 65 78 20 2a 70 49 64  owEst(Index *pId
1dbd0 78 29 7b 0a 20 20 2f 2a 20 20 20 20 20 20 20 20  x){.  /*        
1dbe0 20 20 20 20 20 20 20 20 31 30 2c 20 20 39 2c 20          10,  9, 
1dbf0 20 38 2c 20 20 37 2c 20 20 36 20 2a 2f 0a 20 20   8,  7,  6 */.  
1dc00 4c 6f 67 45 73 74 20 61 56 61 6c 5b 5d 20 3d 20  LogEst aVal[] = 
1dc10 7b 20 33 33 2c 20 33 32 2c 20 33 30 2c 20 32 38  { 33, 32, 30, 28
1dc20 2c 20 32 36 20 7d 3b 0a 20 20 4c 6f 67 45 73 74  , 26 };.  LogEst
1dc30 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f   *a = pIdx->aiRo
1dc40 77 4c 6f 67 45 73 74 3b 0a 20 20 69 6e 74 20 6e  wLogEst;.  int n
1dc50 43 6f 70 79 20 3d 20 4d 49 4e 28 41 72 72 61 79  Copy = MIN(Array
1dc60 53 69 7a 65 28 61 56 61 6c 29 2c 20 70 49 64 78  Size(aVal), pIdx
1dc70 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 69 6e  ->nKeyCol);.  in
1dc80 74 20 69 3b 0a 0a 20 20 2f 2a 20 49 6e 64 65 78  t i;..  /* Index
1dc90 65 73 20 77 69 74 68 20 64 65 66 61 75 6c 74 20  es with default 
1dca0 72 6f 77 20 65 73 74 69 6d 61 74 65 73 20 73 68  row estimates sh
1dcb0 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 73 74  ould not have st
1dcc0 61 74 31 20 64 61 74 61 20 2a 2f 0a 20 20 61 73  at1 data */.  as
1dcd0 73 65 72 74 28 20 21 70 49 64 78 2d 3e 68 61 73  sert( !pIdx->has
1dce0 53 74 61 74 31 20 29 3b 0a 0a 20 20 2f 2a 20 53  Stat1 );..  /* S
1dcf0 65 74 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  et the first ent
1dd00 72 79 20 28 6e 75 6d 62 65 72 20 6f 66 20 72 6f  ry (number of ro
1dd10 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 29  ws in the index)
1dd20 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65   to the estimate
1dd30 64 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  d .  ** number o
1dd40 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
1dd50 62 6c 65 2c 20 6f 72 20 68 61 6c 66 20 74 68 65  ble, or half the
1dd60 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1dd70 69 6e 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a  in the table.  *
1dd80 2a 20 66 6f 72 20 61 20 70 61 72 74 69 61 6c 20  * for a partial 
1dd90 69 6e 64 65 78 2e 20 20 20 42 75 74 20 64 6f 20  index.   But do 
1dda0 6e 6f 74 20 6c 65 74 20 74 68 65 20 65 73 74 69  not let the esti
1ddb0 6d 61 74 65 20 64 72 6f 70 20 62 65 6c 6f 77 20  mate drop below 
1ddc0 31 30 2e 20 2a 2f 0a 20 20 61 5b 30 5d 20 3d 20  10. */.  a[0] = 
1ddd0 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52  pIdx->pTable->nR
1dde0 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69 66 28 20  owLogEst;.  if( 
1ddf0 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68  pIdx->pPartIdxWh
1de00 65 72 65 21 3d 30 20 29 20 61 5b 30 5d 20 2d 3d  ere!=0 ) a[0] -=
1de10 20 31 30 3b 20 20 61 73 73 65 72 74 28 20 31 30   10;  assert( 10
1de20 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
1de30 32 29 20 29 3b 0a 20 20 69 66 28 20 61 5b 30 5d  2) );.  if( a[0]
1de40 3c 33 33 20 29 20 61 5b 30 5d 20 3d 20 33 33 3b  <33 ) a[0] = 33;
1de50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de60 20 20 61 73 73 65 72 74 28 20 33 33 3d 3d 73 71    assert( 33==sq
1de70 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 29 20  lite3LogEst(10) 
1de80 29 3b 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74  );..  /* Estimat
1de90 65 20 74 68 61 74 20 61 5b 31 5d 20 69 73 20 31  e that a[1] is 1
1dea0 30 2c 20 61 5b 32 5d 20 69 73 20 39 2c 20 61 5b  0, a[2] is 9, a[
1deb0 33 5d 20 69 73 20 38 2c 20 61 5b 34 5d 20 69 73  3] is 8, a[4] is
1dec0 20 37 2c 20 61 5b 35 5d 20 69 73 0a 20 20 2a 2a   7, a[5] is.  **
1ded0 20 36 20 61 6e 64 20 65 61 63 68 20 73 75 62 73   6 and each subs
1dee0 65 71 75 65 6e 74 20 76 61 6c 75 65 20 28 69 66  equent value (if
1def0 20 61 6e 79 29 20 69 73 20 35 2e 20 20 2a 2f 0a   any) is 5.  */.
1df00 20 20 6d 65 6d 63 70 79 28 26 61 5b 31 5d 2c 20    memcpy(&a[1], 
1df10 61 56 61 6c 2c 20 6e 43 6f 70 79 2a 73 69 7a 65  aVal, nCopy*size
1df20 6f 66 28 4c 6f 67 45 73 74 29 29 3b 0a 20 20 66  of(LogEst));.  f
1df30 6f 72 28 69 3d 6e 43 6f 70 79 2b 31 3b 20 69 3c  or(i=nCopy+1; i<
1df40 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  =pIdx->nKeyCol; 
1df50 69 2b 2b 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d  i++){.    a[i] =
1df60 20 32 33 3b 20 20 20 20 20 20 20 20 20 20 20 20   23;            
1df70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1df80 32 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  23==sqlite3LogEs
1df90 74 28 35 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 61  t(5) );.  }..  a
1dfa0 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65  ssert( 0==sqlite
1dfb0 33 4c 6f 67 45 73 74 28 31 29 20 29 3b 0a 20 20  3LogEst(1) );.  
1dfc0 69 66 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65  if( IsUniqueInde
1dfd0 78 28 70 49 64 78 29 20 29 20 61 5b 70 49 64 78  x(pIdx) ) a[pIdx
1dfe0 2d 3e 6e 4b 65 79 43 6f 6c 5d 20 3d 20 30 3b 0a  ->nKeyCol] = 0;.
1dff0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1e000 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20  utine will drop 
1e010 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65  an existing name
1e020 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72  d index.  This r
1e030 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d  outine.** implem
1e040 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e  ents the DROP IN
1e050 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  DEX statement..*
1e060 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72  /.void sqlite3Dr
1e070 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  opIndex(Parse *p
1e080 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
1e090 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45 78 69  pName, int ifExi
1e0a0 73 74 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  sts){.  Index *p
1e0b0 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76  Index;.  Vdbe *v
1e0c0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1e0d0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1e0e0 69 6e 74 20 69 44 62 3b 0a 0a 20 20 61 73 73 65  int iDb;..  asse
1e0f0 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  rt( pParse->nErr
1e100 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 4e 65 76 65  ==0 );   /* Neve
1e110 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 72  r called with pr
1e120 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ior errors */.  
1e130 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1e140 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
1e150 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1e160 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1e170 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29  pName->nSrc==1 )
1e180 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
1e190 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
1e1a0 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
1e1b0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
1e1c0 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
1e1d0 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
1e1e0 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e  FindIndex(db, pN
1e1f0 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  ame->a[0].zName,
1e200 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61   pName->a[0].zDa
1e210 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  tabase);.  if( p
1e220 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Index==0 ){.    
1e230 69 66 28 20 21 69 66 45 78 69 73 74 73 20 29 7b  if( !ifExists ){
1e240 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
1e250 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1e260 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25  no such index: %
1e270 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20  S", pName, 0);. 
1e280 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e290 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
1e2a0 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61  yNamedSchema(pPa
1e2b0 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  rse, pName->a[0]
1e2c0 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  .zDatabase);.   
1e2d0 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63   }.    pParse->c
1e2e0 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
1e2f0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
1e300 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
1e310 69 66 28 20 70 49 6e 64 65 78 2d 3e 69 64 78 54  if( pIndex->idxT
1e320 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54  ype!=SQLITE_IDXT
1e330 59 50 45 5f 41 50 50 44 45 46 20 29 7b 0a 20 20  YPE_APPDEF ){.  
1e340 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1e350 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78  g(pParse, "index
1e360 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1e370 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20   UNIQUE ".      
1e380 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20  "or PRIMARY KEY 
1e390 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f  constraint canno
1e3a0 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30  t be dropped", 0
1e3b0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
1e3c0 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
1e3d0 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
1e3e0 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
1e3f0 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  , pIndex->pSchem
1e400 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  a);.#ifndef SQLI
1e410 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
1e420 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
1e430 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  t code = SQLITE_
1e440 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  DROP_INDEX;.    
1e450 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
1e460 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20  ndex->pTable;.  
1e470 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
1e480 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
1e490 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63  .zDbSName;.    c
1e4a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
1e4b0 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  = SCHEMA_TABLE(i
1e4c0 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  Db);.    if( sql
1e4d0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1e4e0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
1e4f0 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44  ETE, zTab, 0, zD
1e500 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
1e510 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1e520 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1e530 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
1e540 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c  iDb ) code = SQL
1e550 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
1e560 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
1e570 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1e580 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64  arse, code, pInd
1e590 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  ex->zName, pTab-
1e5a0 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a  >zName, zDb) ){.
1e5b0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1e5c0 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
1e5d0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
1e5e0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1e5f0 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69   to remove the i
1e600 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68  ndex and from th
1e610 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a  e master table *
1e620 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
1e630 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
1e640 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
1e650 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
1e660 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
1e670 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 1, iDb);.    s
1e680 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
1e690 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
1e6a0 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
1e6b0 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25  .%s WHERE name=%
1e6c0 51 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65  Q AND type='inde
1e6d0 78 27 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e  x'",.       db->
1e6e0 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
1e6f0 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20  e, MASTER_NAME, 
1e700 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20  pIndex->zName.  
1e710 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
1e720 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28  ClearStatTables(
1e730 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69 64  pParse, iDb, "id
1e740 78 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  x", pIndex->zNam
1e750 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  e);.    sqlite3C
1e760 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
1e770 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 64 65  se, iDb);.    de
1e780 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
1e790 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e  arse, pIndex->tn
1e7a0 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  um, iDb);.    sq
1e7b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1e7c0 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c  v, OP_DropIndex,
1e7d0 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64   iDb, 0, 0, pInd
1e7e0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ex->zName, 0);. 
1e7f0 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e   }..exit_drop_in
1e800 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72  dex:.  sqlite3Sr
1e810 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  cListDelete(db, 
1e820 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pName);.}../*.**
1e830 20 70 41 72 72 61 79 20 69 73 20 61 20 70 6f 69   pArray is a poi
1e840 6e 74 65 72 20 74 6f 20 61 6e 20 61 72 72 61 79  nter to an array
1e850 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 45 61 63   of objects. Eac
1e860 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a  h object in the.
1e870 2a 2a 20 61 72 72 61 79 20 69 73 20 73 7a 45 6e  ** array is szEn
1e880 74 72 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a  try bytes in siz
1e890 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  e. This routine 
1e8a0 75 73 65 73 20 73 71 6c 69 74 65 33 44 62 52 65  uses sqlite3DbRe
1e8b0 61 6c 6c 6f 63 28 29 0a 2a 2a 20 74 6f 20 65 78  alloc().** to ex
1e8c0 74 65 6e 64 20 74 68 65 20 61 72 72 61 79 20 73  tend the array s
1e8d0 6f 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  o that there is 
1e8e0 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20  space for a new 
1e8f0 6f 62 6a 65 63 74 20 61 74 20 74 68 65 20 65 6e  object at the en
1e900 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  d..**.** When th
1e910 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1e920 61 6c 6c 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20  alled, *pnEntry 
1e930 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 75 72  contains the cur
1e940 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 2a 2a 20  rent size of.** 
1e950 74 68 65 20 61 72 72 61 79 20 28 69 6e 20 65 6e  the array (in en
1e960 74 72 69 65 73 20 2d 20 73 6f 20 74 68 65 20 61  tries - so the a
1e970 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 28 28 2a  llocation is ((*
1e980 70 6e 45 6e 74 72 79 29 20 2a 20 73 7a 45 6e 74  pnEntry) * szEnt
1e990 72 79 29 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20  ry) bytes.** in 
1e9a0 74 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  total)..**.** If
1e9b0 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 69   the realloc() i
1e9c0 73 20 73 75 63 63 65 73 73 66 75 6c 20 28 69 2e  s successful (i.
1e9d0 65 2e 20 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f 6e  e. if no OOM con
1e9e0 64 69 74 69 6f 6e 20 6f 63 63 75 72 73 29 2c 20  dition occurs), 
1e9f0 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 61 6c 6c  the.** space all
1ea00 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 6e  ocated for the n
1ea10 65 77 20 6f 62 6a 65 63 74 20 69 73 20 7a 65 72  ew object is zer
1ea20 6f 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 75 70  oed, *pnEntry up
1ea30 64 61 74 65 64 20 74 6f 0a 2a 2a 20 72 65 66 6c  dated to.** refl
1ea40 65 63 74 20 74 68 65 20 6e 65 77 20 73 69 7a 65  ect the new size
1ea50 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 61 6e   of the array an
1ea60 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  d a pointer to t
1ea70 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f  he new allocatio
1ea80 6e 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 2a  n.** returned. *
1ea90 70 49 64 78 20 69 73 20 73 65 74 20 74 6f 20 74  pIdx is set to t
1eaa0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
1eab0 6e 65 77 20 61 72 72 61 79 20 65 6e 74 72 79 20  new array entry 
1eac0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
1ead0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
1eae0 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20  f the realloc() 
1eaf0 66 61 69 6c 73 2c 20 2a 70 49 64 78 20 69 73 20  fails, *pIdx is 
1eb00 73 65 74 20 74 6f 20 2d 31 2c 20 2a 70 6e 45 6e  set to -1, *pnEn
1eb10 74 72 79 20 72 65 6d 61 69 6e 73 0a 2a 2a 20 75  try remains.** u
1eb20 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 63  nchanged and a c
1eb30 6f 70 79 20 6f 66 20 70 41 72 72 61 79 20 72 65  opy of pArray re
1eb40 74 75 72 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  turned..*/.void 
1eb50 2a 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c  *sqlite3ArrayAll
1eb60 6f 63 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33  ocate(.  sqlite3
1eb70 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f   *db,      /* Co
1eb80 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69  nnection to noti
1eb90 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69  fy of malloc fai
1eba0 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20  lures */.  void 
1ebb0 2a 70 41 72 72 61 79 2c 20 20 20 20 20 2f 2a 20  *pArray,     /* 
1ebc0 41 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73  Array of objects
1ebd0 2e 20 20 4d 69 67 68 74 20 62 65 20 72 65 61 6c  .  Might be real
1ebe0 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74  located */.  int
1ebf0 20 73 7a 45 6e 74 72 79 2c 20 20 20 20 20 20 2f   szEntry,      /
1ec00 2a 20 53 69 7a 65 20 6f 66 20 65 61 63 68 20 6f  * Size of each o
1ec10 62 6a 65 63 74 20 69 6e 20 74 68 65 20 61 72 72  bject in the arr
1ec20 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45  ay */.  int *pnE
1ec30 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d  ntry,     /* Num
1ec40 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 63  ber of objects c
1ec50 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20  urrently in use 
1ec60 2a 2f 0a 20 20 69 6e 74 20 2a 70 49 64 78 20 20  */.  int *pIdx  
1ec70 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1ec80 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 6e  the index of a n
1ec90 65 77 20 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a  ew slot here */.
1eca0 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
1ecb0 69 6e 74 20 6e 20 3d 20 2a 70 6e 45 6e 74 72 79  int n = *pnEntry
1ecc0 3b 0a 20 20 69 66 28 20 28 6e 20 26 20 28 6e 2d  ;.  if( (n & (n-
1ecd0 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  1))==0 ){.    in
1ece0 74 20 73 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f 20  t sz = (n==0) ? 
1ecf0 31 20 3a 20 32 2a 6e 3b 0a 20 20 20 20 76 6f 69  1 : 2*n;.    voi
1ed00 64 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  d *pNew = sqlite
1ed10 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
1ed20 41 72 72 61 79 2c 20 73 7a 2a 73 7a 45 6e 74 72  Array, sz*szEntr
1ed30 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  y);.    if( pNew
1ed40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 49  ==0 ){.      *pI
1ed50 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72  dx = -1;.      r
1ed60 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 20 20  eturn pArray;.  
1ed70 20 20 7d 0a 20 20 20 20 70 41 72 72 61 79 20 3d    }.    pArray =
1ed80 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d   pNew;.  }.  z =
1ed90 20 28 63 68 61 72 2a 29 70 41 72 72 61 79 3b 0a   (char*)pArray;.
1eda0 20 20 6d 65 6d 73 65 74 28 26 7a 5b 6e 20 2a 20    memset(&z[n * 
1edb0 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45  szEntry], 0, szE
1edc0 6e 74 72 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d  ntry);.  *pIdx =
1edd0 20 6e 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79   n;.  ++*pnEntry
1ede0 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72 72 61  ;.  return pArra
1edf0 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  y;.}../*.** Appe
1ee00 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  nd a new element
1ee10 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64   to the given Id
1ee20 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20  List.  Create a 
1ee30 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a  new IdList if.**
1ee40 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20   need be..**.** 
1ee50 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20  A new IdList is 
1ee60 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c  returned, or NUL
1ee70 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61  L if malloc() fa
1ee80 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a  ils..*/.IdList *
1ee90 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70  sqlite3IdListApp
1eea0 65 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73  end(Parse *pPars
1eeb0 65 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  e, IdList *pList
1eec0 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
1eed0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
1eee0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1eef0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
1ef00 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
1ef10 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
1ef20 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
1ef30 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20  eof(IdList) );. 
1ef40 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
1ef50 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
1ef60 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c    pList->a = sql
1ef70 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
1ef80 65 28 0a 20 20 20 20 20 20 64 62 2c 0a 20 20 20  e(.      db,.   
1ef90 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20     pList->a,.   
1efa0 20 20 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d     sizeof(pList-
1efb0 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20 26 70  >a[0]),.      &p
1efc0 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20 20  List->nId,.     
1efd0 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28 20 69   &i.  );.  if( i
1efe0 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
1eff0 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
1f000 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65  , pList);.    re
1f010 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c  turn 0;.  }.  pL
1f020 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
1f030 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1f040 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65  mToken(db, pToke
1f050 6e 29 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e  n);.  if( IN_REN
1f060 41 4d 45 5f 4f 42 4a 45 43 54 20 26 26 20 70 4c  AME_OBJECT && pL
1f070 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
1f080 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
1f090 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61  nameTokenMap(pPa
1f0a0 72 73 65 2c 20 28 76 6f 69 64 2a 29 70 4c 69 73  rse, (void*)pLis
1f0b0 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70  t->a[i].zName, p
1f0c0 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65  Token);.  }.  re
1f0d0 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
1f0e0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49  *.** Delete an I
1f0f0 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dList..*/.void s
1f100 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
1f110 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
1f120 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  IdList *pList){.
1f130 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1f140 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1f150 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1f160 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
1f170 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1f180 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  ee(db, pList->a[
1f190 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  i].zName);.  }. 
1f1a0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1f1b0 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  b, pList->a);.  
1f1c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
1f1d0 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  db, pList);.}../
1f1e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1f1f0 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f  index in pList o
1f200 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  f the identifier
1f210 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74   named zId.  Ret
1f220 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74  urn -1.** if not
1f230 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73   found..*/.int s
1f240 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
1f250 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  x(IdList *pList,
1f260 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1f270 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
1f280 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1f290 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28  eturn -1;.  for(
1f2a0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
1f2b0 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  d; i++){.    if(
1f2c0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1f2d0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1f2e0 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72  e, zName)==0 ) r
1f2f0 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
1f300 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
1f310 2a 2a 20 45 78 70 61 6e 64 20 74 68 65 20 73 70  ** Expand the sp
1f320 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
1f330 72 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c  r the given SrcL
1f340 69 73 74 20 6f 62 6a 65 63 74 20 62 79 0a 2a 2a  ist object by.**
1f350 20 63 72 65 61 74 69 6e 67 20 6e 45 78 74 72 61   creating nExtra
1f360 20 6e 65 77 20 73 6c 6f 74 73 20 62 65 67 69 6e   new slots begin
1f370 6e 69 6e 67 20 61 74 20 69 53 74 61 72 74 2e 20  ning at iStart. 
1f380 20 69 53 74 61 72 74 20 69 73 20 7a 65 72 6f 20   iStart is zero 
1f390 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c  based..** New sl
1f3a0 6f 74 73 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a  ots are zeroed..
1f3b0 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1f3c0 65 2c 20 73 75 70 70 6f 73 65 20 61 20 53 72 63  e, suppose a Src
1f3d0 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 63  List initially c
1f3e0 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65 6e 74 72  ontains two entr
1f3f0 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20  ies: A,B..** To 
1f400 61 70 70 65 6e 64 20 33 20 6e 65 77 20 65 6e 74  append 3 new ent
1f410 72 69 65 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e  ries onto the en
1f420 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a  d, do this:.**.*
1f430 2a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  *    sqlite3SrcL
1f440 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70  istEnlarge(db, p
1f450 53 72 63 6c 69 73 74 2c 20 33 2c 20 32 29 3b 0a  Srclist, 3, 2);.
1f460 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  **.** After the 
1f470 63 61 6c 6c 20 61 62 6f 76 65 20 69 74 20 77 6f  call above it wo
1f480 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20 20 41 2c  uld contain:  A,
1f490 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69   B, nil, nil, ni
1f4a0 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 53 74  l..** If the iSt
1f4b0 61 72 74 20 61 72 67 75 6d 65 6e 74 20 68 61 64  art argument had
1f4c0 20 62 65 65 6e 20 31 20 69 6e 73 74 65 61 64 20   been 1 instead 
1f4d0 6f 66 20 32 2c 20 74 68 65 6e 20 74 68 65 20 72  of 2, then the r
1f4e0 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20 68  esult.** would h
1f4f0 61 76 65 20 62 65 65 6e 3a 20 20 41 2c 20 6e 69  ave been:  A, ni
1f500 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20  l, nil, nil, B. 
1f510 20 54 6f 20 70 72 65 70 65 6e 64 20 74 68 65 20   To prepend the 
1f520 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68  new slots,.** th
1f530 65 20 69 53 74 61 72 74 20 76 61 6c 75 65 20 77  e iStart value w
1f540 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20  ould be 0.  The 
1f550 72 65 73 75 6c 74 20 74 68 65 6e 20 77 6f 75 6c  result then woul
1f560 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e 69  d.** be: nil, ni
1f570 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a  l, nil, A, B..**
1f580 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
1f590 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
1f5a0 20 74 68 65 20 53 72 63 4c 69 73 74 20 69 73 20   the SrcList is 
1f5b0 75 6e 63 68 61 6e 67 65 64 2e 20 20 54 68 65 0a  unchanged.  The.
1f5c0 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ** db->mallocFai
1f5d0 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c 20 62 65  led flag will be
1f5e0 20 73 65 74 20 74 6f 20 74 72 75 65 2e 0a 2a 2f   set to true..*/
1f5f0 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
1f600 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28  3SrcListEnlarge(
1f610 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
1f620 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1f630 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
1f640 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d 20 65 72  notify of OOM er
1f650 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73  rors */.  SrcLis
1f660 74 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20  t *pSrc,     /* 
1f670 54 68 65 20 53 72 63 4c 69 73 74 20 74 6f 20 62  The SrcList to b
1f680 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20  e enlarged */.  
1f690 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
1f6a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1f6b0 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20 61 64 64  new slots to add
1f6c0 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f   to pSrc->a[] */
1f6d0 0a 20 20 69 6e 74 20 69 53 74 61 72 74 20 20 20  .  int iStart   
1f6e0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
1f6f0 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66  n pSrc->a[] of f
1f700 69 72 73 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f  irst new slot */
1f710 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  .){.  int i;..  
1f720 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
1f730 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61  ng on calling pa
1f740 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61 73  rameters */.  as
1f750 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d 30 20  sert( iStart>=0 
1f760 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78  );.  assert( nEx
1f770 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  tra>=1 );.  asse
1f780 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20  rt( pSrc!=0 );. 
1f790 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3c   assert( iStart<
1f7a0 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a  =pSrc->nSrc );..
1f7b0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 64    /* Allocate ad
1f7c0 64 69 74 69 6f 6e 61 6c 20 73 70 61 63 65 20 69  ditional space i
1f7d0 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69 66  f needed */.  if
1f7e0 28 20 28 75 33 32 29 70 53 72 63 2d 3e 6e 53 72  ( (u32)pSrc->nSr
1f7f0 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e  c+nExtra>pSrc->n
1f800 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63  Alloc ){.    Src
1f810 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  List *pNew;.    
1f820 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72  int nAlloc = pSr
1f830 63 2d 3e 6e 53 72 63 2a 32 2b 6e 45 78 74 72 61  c->nSrc*2+nExtra
1f840 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a  ;.    int nGot;.
1f850 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
1f860 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
1f870 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20  pSrc,.          
1f880 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53 72       sizeof(*pSr
1f890 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a  c) + (nAlloc-1)*
1f8a0 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
1f8b0 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ]) );.    if( pN
1f8c0 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ew==0 ){.      a
1f8d0 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
1f8e0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
1f8f0 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 20 20   return pSrc;.  
1f900 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d 20 70    }.    pSrc = p
1f910 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20  New;.    nGot = 
1f920 28 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  (sqlite3DbMalloc
1f930 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29 20 2d  Size(db, pNew) -
1f940 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f   sizeof(*pSrc))/
1f950 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
1f960 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e  ])+1;.    pSrc->
1f970 6e 41 6c 6c 6f 63 20 3d 20 6e 47 6f 74 3b 0a 20  nAlloc = nGot;. 
1f980 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 65 78   }..  /* Move ex
1f990 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74 68 61  isting slots tha
1f9a0 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74 68 65  t come after the
1f9b0 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65 64 20   newly inserted 
1f9c0 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74 20 6f  slots.  ** out o
1f9d0 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20 20 66  f the way */.  f
1f9e0 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d  or(i=pSrc->nSrc-
1f9f0 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20 69 2d  1; i>=iStart; i-
1fa00 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b  -){.    pSrc->a[
1fa10 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53 72 63  i+nExtra] = pSrc
1fa20 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70 53  ->a[i];.  }.  pS
1fa30 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 6e 45 78 74  rc->nSrc += nExt
1fa40 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74  ra;..  /* Zero t
1fa50 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  he newly allocat
1fa60 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65  ed slots */.  me
1fa70 6d 73 65 74 28 26 70 53 72 63 2d 3e 61 5b 69 53  mset(&pSrc->a[iS
1fa80 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  tart], 0, sizeof
1fa90 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78  (pSrc->a[0])*nEx
1faa0 74 72 61 29 3b 0a 20 20 66 6f 72 28 69 3d 69 53  tra);.  for(i=iS
1fab0 74 61 72 74 3b 20 69 3c 69 53 74 61 72 74 2b 6e  tart; i<iStart+n
1fac0 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a 20 20 20  Extra; i++){.   
1fad0 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72   pSrc->a[i].iCur
1fae0 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  sor = -1;.  }.. 
1faf0 20 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69   /* Return a poi
1fb00 6e 74 65 72 20 74 6f 20 74 68 65 20 65 6e 6c 61  nter to the enla
1fb10 72 67 65 64 20 53 72 63 4c 69 73 74 20 2a 2f 0a  rged SrcList */.
1fb20 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d    return pSrc;.}
1fb30 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  .../*.** Append 
1fb40 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65  a new table name
1fb50 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72   to the given Sr
1fb60 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61  cList.  Create a
1fb70 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a   new SrcList if.
1fb80 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e  ** need be.  A n
1fb90 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65 61  ew entry is crea
1fba0 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69  ted in the SrcLi
1fbb0 73 74 20 65 76 65 6e 20 69 66 20 70 54 61 62 6c  st even if pTabl
1fbc0 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  e is NULL..**.**
1fbd0 20 41 20 53 72 63 4c 69 73 74 20 69 73 20 72 65   A SrcList is re
1fbe0 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  turned, or NULL 
1fbf0 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  if there is an O
1fc00 4f 4d 20 65 72 72 6f 72 2e 20 20 54 68 65 20 72  OM error.  The r
1fc10 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72 63 4c 69  eturned.** SrcLi
1fc20 73 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20  st might be the 
1fc30 73 61 6d 65 20 61 73 20 74 68 65 20 53 72 63 4c  same as the SrcL
1fc40 69 73 74 20 74 68 61 74 20 77 61 73 20 69 6e 70  ist that was inp
1fc50 75 74 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62  ut or it might b
1fc60 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 2e 20  e.** a new one. 
1fc70 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
1fc80 20 64 6f 65 73 20 6f 63 63 75 72 73 2c 20 74 68   does occurs, th
1fc90 65 6e 20 74 68 65 20 70 72 69 6f 72 20 76 61 6c  en the prior val
1fca0 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a 2a 20 74  ue of pList.** t
1fcb0 68 61 74 20 69 73 20 69 6e 70 75 74 20 74 6f 20  hat is input to 
1fcc0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1fcd0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66 72  automatically fr
1fce0 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44  eed..**.** If pD
1fcf0 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e  atabase is not n
1fd00 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ull, it means th
1fd10 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  at the table has
1fd20 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20   an optional.** 
1fd30 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72  database name pr
1fd40 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73  efix.  Like this
1fd50 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61 62  :  "database.tab
1fd60 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61 62  le".  The pDatab
1fd70 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  ase.** points to
1fd80 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
1fd90 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20 70  and the pTable p
1fda0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74  oints to the dat
1fdb0 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54  abase name..** T
1fdc0 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  he SrcList.a[].z
1fdd0 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69  Name field is fi
1fde0 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 61  lled with the ta
1fdf0 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d  ble name which m
1fe00 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f  ight.** come fro
1fe10 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44 61  m pTable (if pDa
1fe20 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20  tabase is NULL) 
1fe30 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73  or from pDatabas
1fe40 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e  e.  .** SrcList.
1fe50 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73  a[].zDatabase is
1fe60 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
1fe70 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66   database name f
1fe80 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f  rom pTable,.** o
1fe90 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e  r with NULL if n
1fea0 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73 70  o database is sp
1feb0 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ecified..**.** I
1fec0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
1fed0 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73  f call like this
1fee0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1fef0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1ff00 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a  pend(D,A,B,0);.*
1ff10 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61  *.** Then B is a
1ff20 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
1ff30 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1ff40 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65 64  e is unspecified
1ff50 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20  .  If called.** 
1ff60 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
1ff70 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1ff80 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c  SrcListAppend(D,
1ff90 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,C);.**.** Th
1ffa0 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c  en C is the tabl
1ffb0 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20  e name and B is 
1ffc0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1ffd0 65 2e 20 20 49 66 20 43 20 69 73 20 64 65 66 69  e.  If C is defi
1ffe0 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73 6f 20 69  ned.** then so i
1fff0 73 20 42 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  s B.  In other w
20000 6f 72 64 73 2c 20 77 65 20 6e 65 76 65 72 20 68  ords, we never h
20010 61 76 65 20 61 20 63 61 73 65 20 77 68 65 72 65  ave a case where
20020 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
20030 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
20040 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29 3b 0a 2a  pend(D,A,0,C);.*
20050 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61 62 6c 65  *.** Both pTable
20060 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 20 61   and pDatabase a
20070 72 65 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65  re assumed to be
20080 20 71 75 6f 74 65 64 2e 20 20 54 68 65 79 20 61   quoted.  They a
20090 72 65 20 64 65 71 75 6f 74 65 64 0a 2a 2a 20 62  re dequoted.** b
200a0 65 66 6f 72 65 20 62 65 69 6e 67 20 61 64 64 65  efore being adde
200b0 64 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74  d to the SrcList
200c0 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
200d0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
200e0 6e 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  nd(.  sqlite3 *d
200f0 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  b,        /* Con
20100 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66  nection to notif
20110 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  y of malloc fail
20120 75 72 65 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73  ures */.  SrcLis
20130 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a  t *pList,     /*
20140 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20   Append to this 
20150 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72  SrcList. NULL cr
20160 65 61 74 65 73 20 61 20 6e 65 77 20 53 72 63 4c  eates a new SrcL
20170 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ist */.  Token *
20180 70 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20  pTable,      /* 
20190 54 61 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20  Table to append 
201a0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74  */.  Token *pDat
201b0 61 62 61 73 65 20 20 20 20 2f 2a 20 44 61 74 61  abase    /* Data
201c0 62 61 73 65 20 6f 66 20 74 68 65 20 74 61 62 6c  base of the tabl
201d0 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  e */.){.  struct
201e0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
201f0 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 20  Item;.  assert( 
20200 70 44 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20  pDatabase==0 || 
20210 70 54 61 62 6c 65 21 3d 30 20 29 3b 20 20 2f 2a  pTable!=0 );  /*
20220 20 43 61 6e 6e 6f 74 20 68 61 76 65 20 43 20 77   Cannot have C w
20230 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20 20 61 73  ithout B */.  as
20240 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
20250 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
20260 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
20270 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
20280 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 53 72 63  N(db, sizeof(Src
20290 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
202a0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
202b0 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d  rn 0;.    pList-
202c0 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 20  >nAlloc = 1;.   
202d0 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20 3d 20 31   pList->nSrc = 1
202e0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4c  ;.    memset(&pL
202f0 69 73 74 2d 3e 61 5b 30 5d 2c 20 30 2c 20 73 69  ist->a[0], 0, si
20300 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
20310 29 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  ));.    pList->a
20320 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31  [0].iCursor = -1
20330 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
20340 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 53 72  List = sqlite3Sr
20350 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c  cListEnlarge(db,
20360 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c 69 73 74   pList, 1, pList
20370 2d 3e 6e 53 72 63 29 3b 0a 20 20 7d 0a 20 20 69  ->nSrc);.  }.  i
20380 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
20390 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  led ){.    sqlit
203a0 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
203b0 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  db, pList);.    
203c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
203d0 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
203e0 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d  a[pList->nSrc-1]
203f0 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73  ;.  if( pDatabas
20400 65 20 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e  e && pDatabase->
20410 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74  z==0 ){.    pDat
20420 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  abase = 0;.  }. 
20430 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20 29   if( pDatabase )
20440 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61  {.    pItem->zNa
20450 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
20460 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 44  FromToken(db, pD
20470 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 49  atabase);.    pI
20480 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
20490 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
204a0 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65  Token(db, pTable
204b0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
204c0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
204d0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
204e0 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  ken(db, pTable);
204f0 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74  .    pItem->zDat
20500 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  abase = 0;.  }. 
20510 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
20520 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 56  ../*.** Assign V
20530 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78 20  dbeCursor index 
20540 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20 74  numbers to all t
20550 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69  ables in a SrcLi
20560 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  st.*/.void sqlit
20570 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
20580 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50  ursors(Parse *pP
20590 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
205a0 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
205b0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
205c0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
205d0 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c 20  assert(pList || 
205e0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
205f0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
20600 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
20610 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(i=0, pItem=pL
20620 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d  ist->a; i<pList-
20630 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
20640 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  m++){.      if( 
20650 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d  pItem->iCursor>=
20660 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
20670 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20   pItem->iCursor 
20680 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
20690 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
206a0 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  m->pSelect ){.  
206b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
206c0 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
206d0 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  s(pParse, pItem-
206e0 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b  >pSelect->pSrc);
206f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20700 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
20710 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63  te an entire Src
20720 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61  List including a
20730 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74  ll its substruct
20740 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ure..*/.void sql
20750 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
20760 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  e(sqlite3 *db, S
20770 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
20780 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
20790 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
207a0 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69  pItem;.  if( pLi
207b0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
207c0 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
207d0 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69  t->a, i=0; i<pLi
207e0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
207f0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
20800 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
20810 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  Item->zDatabase)
20820 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
20830 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
20840 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
20850 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
20860 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
20870 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69   if( pItem->fg.i
20880 73 49 6e 64 65 78 65 64 42 79 20 29 20 73 71 6c  sIndexedBy ) sql
20890 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
208a0 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65  Item->u1.zIndexe
208b0 64 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49  dBy);.    if( pI
208c0 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  tem->fg.isTabFun
208d0 63 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 4c  c ) sqlite3ExprL
208e0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49  istDelete(db, pI
208f0 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67  tem->u1.pFuncArg
20900 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
20910 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 49  leteTable(db, pI
20920 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20  tem->pTab);.    
20930 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
20940 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
20950 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c  Select);.    sql
20960 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
20970 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a  b, pItem->pOn);.
20980 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
20990 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  tDelete(db, pIte
209a0 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a  m->pUsing);.  }.
209b0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
209c0 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  N(db, pList);.}.
209d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
209e0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
209f0 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 61   the parser to a
20a00 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f  dd a new term to
20a10 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61   the.** end of a
20a20 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c   growing FROM cl
20a30 61 75 73 65 2e 20 20 54 68 65 20 22 70 22 20 70  ause.  The "p" p
20a40 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
20a50 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46  part of.** the F
20a60 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74 20  ROM clause that 
20a70 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
20a80 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20 22   constructed.  "
20a90 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66  p" is NULL.** if
20aa0 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
20ab0 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46  st term of the F
20ac0 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54 61  ROM clause.  pTa
20ad0 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73  ble and pDatabas
20ae0 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d  e.** are the nam
20af0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61  e of the table a
20b00 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  nd database name
20b10 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  d in the FROM cl
20b20 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44  ause term..** pD
20b30 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 20  atabase is NULL 
20b40 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
20b50 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20 69  name qualifier i
20b60 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65 0a  s missing - the.
20b70 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20 20  ** usual case.  
20b80 49 66 20 74 68 65 20 74 65 72 6d 20 68 61 73 20  If the term has 
20b90 61 6e 20 61 6c 69 61 73 2c 20 74 68 65 6e 20 70  an alias, then p
20ba0 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f 20  Alias points to 
20bb0 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b  the.** alias tok
20bc0 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d  en.  If the term
20bd0 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2c 20   is a subquery, 
20be0 74 68 65 6e 20 70 53 75 62 71 75 65 72 79 20 69  then pSubquery i
20bf0 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20  s the.** SELECT 
20c00 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 74  statement that t
20c10 68 65 20 73 75 62 71 75 65 72 79 20 65 6e 63 6f  he subquery enco
20c20 64 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c 65  des.  The pTable
20c30 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61 73   and.** pDatabas
20c40 65 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65  e parameters are
20c50 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75 65   NULL for subque
20c60 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20 61  ries.  The pOn a
20c70 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72  nd pUsing.** par
20c80 61 6d 65 74 65 72 73 20 61 72 65 20 74 68 65 20  ameters are the 
20c90 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 4f  content of the O
20ca0 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
20cb0 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ses..**.** Retur
20cc0 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  n a new SrcList 
20cd0 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69 73  which encodes is
20ce0 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20 74   the FROM with t
20cf0 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61  he new.** term a
20d00 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74  dded..*/.SrcList
20d10 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
20d20 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a  AppendFromTerm(.
20d30 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
20d40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
20d50 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
20d60 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20 20    SrcList *p,   
20d70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
20d80 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74 68   left part of th
20d90 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c  e FROM clause al
20da0 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20  ready seen */.  
20db0 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20  Token *pTable,  
20dc0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
20dd0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
20de0 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d 20  add to the FROM 
20df0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65  clause */.  Toke
20e00 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20 20  n *pDatabase,   
20e10 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
20e20 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
20e30 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f  aining pTable */
20e40 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73  .  Token *pAlias
20e50 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
20e60 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
20e70 65 20 6f 66 20 74 68 65 20 41 53 20 73 75 62 65  e of the AS sube
20e80 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53  xpression */.  S
20e90 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72 79  elect *pSubquery
20ea0 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 71  ,      /* A subq
20eb0 75 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c 61  uery used in pla
20ec0 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61  ce of a table na
20ed0 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f  me */.  Expr *pO
20ee0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
20ef0 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75 73 65  /* The ON clause
20f00 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20   of a join */.  
20f10 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 20 20  IdList *pUsing  
20f20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55          /* The U
20f30 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61  SING clause of a
20f40 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74   join */.){.  st
20f50 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
20f60 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69  m *pItem;.  sqli
20f70 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
20f80 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21 70 20 26  ->db;.  if( !p &
20f90 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69 6e 67  & (pOn || pUsing
20fa0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
20fb0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
20fc0 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65 20   "a JOIN clause 
20fd0 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  is required befo
20fe0 72 65 20 25 73 22 2c 20 0a 20 20 20 20 20 20 28  re %s", .      (
20ff0 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22 55 53  pOn ? "ON" : "US
21000 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20 20 20  ING").    );.   
21010 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f   goto append_fro
21020 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  m_error;.  }.  p
21030 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
21040 74 41 70 70 65 6e 64 28 64 62 2c 20 70 2c 20 70  tAppend(db, p, p
21050 54 61 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65  Table, pDatabase
21060 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
21070 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64  .    goto append
21080 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d  _from_error;.  }
21090 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53  .  assert( p->nS
210a0 72 63 3e 30 20 29 3b 0a 20 20 70 49 74 65 6d 20  rc>0 );.  pItem 
210b0 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d  = &p->a[p->nSrc-
210c0 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  1];.  assert( (p
210d0 54 61 62 6c 65 3d 3d 30 29 3d 3d 28 70 44 61 74  Table==0)==(pDat
210e0 61 62 61 73 65 3d 3d 30 29 20 29 3b 0a 20 20 61  abase==0) );.  a
210f0 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e  ssert( pItem->zN
21100 61 6d 65 3d 3d 30 20 7c 7c 20 70 44 61 74 61 62  ame==0 || pDatab
21110 61 73 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ase!=0 );.  if( 
21120 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
21130 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65   && pItem->zName
21140 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70   ){.    Token *p
21150 54 6f 6b 65 6e 20 3d 20 28 41 4c 57 41 59 53 28  Token = (ALWAYS(
21160 70 44 61 74 61 62 61 73 65 29 20 26 26 20 70 44  pDatabase) && pD
21170 61 74 61 62 61 73 65 2d 3e 7a 29 20 3f 20 70 44  atabase->z) ? pD
21180 61 74 61 62 61 73 65 20 3a 20 70 54 61 62 6c 65  atabase : pTable
21190 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e  ;.    sqlite3Ren
211a0 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72  ameTokenMap(pPar
211b0 73 65 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  se, pItem->zName
211c0 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20  , pToken);.  }. 
211d0 20 61 73 73 65 72 74 28 20 70 41 6c 69 61 73 21   assert( pAlias!
211e0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 41 6c 69  =0 );.  if( pAli
211f0 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74  as->n ){.    pIt
21200 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c  em->zAlias = sql
21210 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
21220 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20  n(db, pAlias);. 
21230 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c   }.  pItem->pSel
21240 65 63 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b  ect = pSubquery;
21250 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20  .  pItem->pOn = 
21260 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55  pOn;.  pItem->pU
21270 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20  sing = pUsing;. 
21280 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61 70 70   return p;.. app
21290 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a  end_from_error:.
212a0 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29    assert( p==0 )
212b0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
212c0 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a  elete(db, pOn);.
212d0 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
212e0 65 6c 65 74 65 28 64 62 2c 20 70 55 73 69 6e 67  elete(db, pUsing
212f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
21300 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75  ctDelete(db, pSu
21310 62 71 75 65 72 79 29 3b 0a 20 20 72 65 74 75 72  bquery);.  retur
21320 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n 0;.}../*.** Ad
21330 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  d an INDEXED BY 
21340 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63  or NOT INDEXED c
21350 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d 6f 73  lause to the mos
21360 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
21370 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20   .** element of 
21380 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20  the source-list 
21390 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
213a0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
213b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
213c0 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28 50  cListIndexedBy(P
213d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
213e0 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20  cList *p, Token 
213f0 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a 20 20  *pIndexedBy){.  
21400 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 65 64  assert( pIndexed
21410 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  By!=0 );.  if( p
21420 20 26 26 20 70 49 6e 64 65 78 65 64 42 79 2d 3e   && pIndexedBy->
21430 6e 3e 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63  n>0 ){.    struc
21440 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
21450 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73 65 72  pItem;.    asser
21460 74 28 20 70 2d 3e 6e 53 72 63 3e 30 20 29 3b 0a  t( p->nSrc>0 );.
21470 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e      pItem = &p->
21480 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20  a[p->nSrc-1];.  
21490 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
214a0 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d  >fg.notIndexed==
214b0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
214c0 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64   pItem->fg.isInd
214d0 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20  exedBy==0 );.   
214e0 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
214f0 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20  fg.isTabFunc==0 
21500 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  );.    if( pInde
21510 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21  xedBy->n==1 && !
21520 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b  pIndexedBy->z ){
21530 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54  .      /* A "NOT
21540 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75 73 65   INDEXED" clause
21550 20 77 61 73 20 73 75 70 70 6c 69 65 64 2e 20 53   was supplied. S
21560 65 65 20 70 61 72 73 65 2e 79 20 0a 20 20 20 20  ee parse.y .    
21570 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 22    ** construct "
21580 69 6e 64 65 78 65 64 5f 6f 70 74 22 20 66 6f 72  indexed_opt" for
21590 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20   details. */.   
215a0 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74     pItem->fg.not
215b0 49 6e 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20  Indexed = 1;.   
215c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
215d0 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64  tem->u1.zIndexed
215e0 42 79 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  By = sqlite3Name
215f0 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
21600 2d 3e 64 62 2c 20 70 49 6e 64 65 78 65 64 42 79  ->db, pIndexedBy
21610 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
21620 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 3d  fg.isIndexedBy =
21630 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   1;.    }.  }.}.
21640 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 6c  ./*.** Add the l
21650 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ist of function 
21660 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65  arguments to the
21670 20 53 72 63 4c 69 73 74 20 65 6e 74 72 79 20 66   SrcList entry f
21680 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 2d 76 61  or a.** table-va
21690 6c 75 65 64 2d 66 75 6e 63 74 69 6f 6e 2e 0a 2a  lued-function..*
216a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
216b0 63 4c 69 73 74 46 75 6e 63 41 72 67 73 28 50 61  cListFuncArgs(Pa
216c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
216d0 4c 69 73 74 20 2a 70 2c 20 45 78 70 72 4c 69 73  List *p, ExprLis
216e0 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28  t *pList){.  if(
216f0 20 70 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74   p ){.    struct
21700 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
21710 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e  Item = &p->a[p->
21720 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73  nSrc-1];.    ass
21730 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6e  ert( pItem->fg.n
21740 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a  otIndexed==0 );.
21750 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
21760 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
21770 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  y==0 );.    asse
21780 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  rt( pItem->fg.is
21790 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20  TabFunc==0 );.  
217a0 20 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e    pItem->u1.pFun
217b0 63 41 72 67 20 3d 20 70 4c 69 73 74 3b 0a 20 20  cArg = pList;.  
217c0 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61    pItem->fg.isTa
217d0 62 46 75 6e 63 20 3d 20 31 3b 0a 20 20 7d 65 6c  bFunc = 1;.  }el
217e0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
217f0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
21800 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29  arse->db, pList)
21810 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  ;.  }.}../*.** W
21820 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20  hen building up 
21830 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e  a FROM clause in
21840 20 74 68 65 20 70 61 72 73 65 72 2c 20 74 68 65   the parser, the
21850 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a   join operator.*
21860 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61  * is initially a
21870 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c  ttached to the l
21880 65 66 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75  eft operand.  Bu
21890 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  t the code gener
218a0 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20  ator.** expects 
218b0 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
218c0 72 20 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72  r to be on the r
218d0 69 67 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54  ight operand.  T
218e0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53  his routine.** S
218f0 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f  hifts all join o
21900 70 65 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65  perators from le
21910 66 74 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20  ft to right for 
21920 61 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a  an entire FROM.*
21930 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  * clause..**.** 
21940 45 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65  Example: Suppose
21950 20 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b   the join is lik
21960 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
21970 20 20 20 20 20 20 20 20 41 20 6e 61 74 75 72 61          A natura
21980 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a  l cross join B.*
21990 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f  *.** The operato
219a0 72 20 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72  r is "natural cr
219b0 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20  oss join".  The 
219c0 41 20 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73  A and B operands
219d0 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69   are stored.** i
219e0 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d  n p->a[0] and p-
219f0 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76  >a[1], respectiv
21a00 65 6c 79 2e 20 20 54 68 65 20 70 61 72 73 65 72  ely.  The parser
21a10 20 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65   initially store
21a20 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f  s the.** operato
21a30 72 20 77 69 74 68 20 41 2e 20 20 54 68 69 73 20  r with A.  This 
21a40 72 6f 75 74 69 6e 65 20 73 68 69 66 74 73 20 74  routine shifts t
21a50 68 61 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65  hat operator ove
21a60 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20  r to B..*/.void 
21a70 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68  sqlite3SrcListSh
21a80 69 66 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c  iftJoinType(SrcL
21a90 69 73 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ist *p){.  if( p
21aa0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
21ab0 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63     for(i=p->nSrc
21ac0 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20  -1; i>0; i--){. 
21ad0 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 66 67 2e       p->a[i].fg.
21ae0 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b  jointype = p->a[
21af0 69 2d 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65  i-1].fg.jointype
21b00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61  ;.    }.    p->a
21b10 5b 30 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  [0].fg.jointype 
21b20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
21b30 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20  * Generate VDBE 
21b40 63 6f 64 65 20 66 6f 72 20 61 20 42 45 47 49 4e  code for a BEGIN
21b50 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
21b60 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
21b70 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
21b80 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74  e *pParse, int t
21b90 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  ype){.  sqlite3 
21ba0 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
21bb0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65    int i;..  asse
21bc0 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b  rt( pParse!=0 );
21bd0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
21be0 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  db;.  assert( db
21bf0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  !=0 );.  if( sql
21c00 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
21c10 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
21c20 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e  NSACTION, "BEGIN
21c30 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  ", 0, 0) ){.    
21c40 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20  return;.  }.  v 
21c50 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
21c60 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
21c70 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  !v ) return;.  i
21c80 66 28 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45  f( type!=TK_DEFE
21c90 52 52 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28  RRED ){.    for(
21ca0 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
21cb0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
21cc0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21cd0 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c   OP_Transaction,
21ce0 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58   i, (type==TK_EX
21cf0 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20  CLUSIVE)+1);.   
21d00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
21d10 65 73 42 74 72 65 65 28 76 2c 20 69 29 3b 0a 20  esBtree(v, i);. 
21d20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
21d30 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
21d40 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 29 3b 0a  OP_AutoCommit);.
21d50 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
21d60 65 20 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20  e VDBE code for 
21d70 61 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c  a COMMIT or ROLL
21d80 42 41 43 4b 20 73 74 61 74 65 6d 65 6e 74 2e 0a  BACK statement..
21d90 2a 2a 20 43 6f 64 65 20 66 6f 72 20 52 4f 4c 4c  ** Code for ROLL
21da0 42 41 43 4b 20 69 73 20 67 65 6e 65 72 61 74 65  BACK is generate
21db0 64 20 69 66 20 65 54 79 70 65 3d 3d 54 4b 5f 52  d if eType==TK_R
21dc0 4f 4c 4c 42 41 43 4b 2e 20 20 4f 74 68 65 72 77  OLLBACK.  Otherw
21dd0 69 73 65 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67  ise.** code is g
21de0 65 6e 65 72 61 74 65 64 20 66 6f 72 20 61 20 43  enerated for a C
21df0 4f 4d 4d 49 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73  OMMIT..*/.void s
21e00 71 6c 69 74 65 33 45 6e 64 54 72 61 6e 73 61 63  qlite3EndTransac
21e10 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
21e20 73 65 2c 20 69 6e 74 20 65 54 79 70 65 29 7b 0a  se, int eType){.
21e30 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
21e40 20 69 73 52 6f 6c 6c 62 61 63 6b 3b 0a 0a 20 20   isRollback;..  
21e50 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d  assert( pParse!=
21e60 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
21e70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a  Parse->db!=0 );.
21e80 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
21e90 3d 54 4b 5f 43 4f 4d 4d 49 54 20 7c 7c 20 65 54  =TK_COMMIT || eT
21ea0 79 70 65 3d 3d 54 4b 5f 45 4e 44 20 7c 7c 20 65  ype==TK_END || e
21eb0 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43  Type==TK_ROLLBAC
21ec0 4b 20 29 3b 0a 20 20 69 73 52 6f 6c 6c 62 61 63  K );.  isRollbac
21ed0 6b 20 3d 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f  k = eType==TK_RO
21ee0 4c 4c 42 41 43 4b 3b 0a 20 20 69 66 28 20 73 71  LLBACK;.  if( sq
21ef0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
21f00 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
21f10 41 4e 53 41 43 54 49 4f 4e 2c 20 0a 20 20 20 20  ANSACTION, .    
21f20 20 20 20 69 73 52 6f 6c 6c 62 61 63 6b 20 3f 20     isRollback ? 
21f30 22 52 4f 4c 4c 42 41 43 4b 22 20 3a 20 22 43 4f  "ROLLBACK" : "CO
21f40 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 7b 0a  MMIT", 0, 0) ){.
21f50 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
21f60 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
21f70 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
21f80 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
21f90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
21fa0 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c  , OP_AutoCommit,
21fb0 20 31 2c 20 69 73 52 6f 6c 6c 62 61 63 6b 29 3b   1, isRollback);
21fc0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
21fd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
21fe0 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
21ff0 73 65 72 20 77 68 65 6e 20 69 74 20 70 61 72 73  ser when it pars
22000 65 73 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  es a command to 
22010 63 72 65 61 74 65 2c 0a 2a 2a 20 72 65 6c 65 61  create,.** relea
22020 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61  se or rollback a
22030 6e 20 53 51 4c 20 73 61 76 65 70 6f 69 6e 74 2e  n SQL savepoint.
22040 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
22050 33 53 61 76 65 70 6f 69 6e 74 28 50 61 72 73 65  3Savepoint(Parse
22060 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 70   *pParse, int op
22070 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
22080 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
22090 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
220a0 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62  Token(pParse->db
220b0 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , pName);.  if( 
220c0 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62  zName ){.    Vdb
220d0 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
220e0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 23  tVdbe(pParse);.#
220f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22100 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
22110 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
22120 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61  t char * const a
22130 7a 5b 5d 20 3d 20 7b 20 22 42 45 47 49 4e 22 2c  z[] = { "BEGIN",
22140 20 22 52 45 4c 45 41 53 45 22 2c 20 22 52 4f 4c   "RELEASE", "ROL
22150 4c 42 41 43 4b 22 20 7d 3b 0a 20 20 20 20 61 73  LBACK" };.    as
22160 73 65 72 74 28 20 21 53 41 56 45 50 4f 49 4e 54  sert( !SAVEPOINT
22170 5f 42 45 47 49 4e 20 26 26 20 53 41 56 45 50 4f  _BEGIN && SAVEPO
22180 49 4e 54 5f 52 45 4c 45 41 53 45 3d 3d 31 20 26  INT_RELEASE==1 &
22190 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  & SAVEPOINT_ROLL
221a0 42 41 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64 69  BACK==2 );.#endi
221b0 66 0a 20 20 20 20 69 66 28 20 21 76 20 7c 7c 20  f.    if( !v || 
221c0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
221d0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
221e0 53 41 56 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70  SAVEPOINT, az[op
221f0 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a  ], zName, 0) ){.
22200 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
22210 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
22220 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  zName);.      re
22230 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
22240 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22250 34 28 76 2c 20 4f 50 5f 53 61 76 65 70 6f 69 6e  4(v, OP_Savepoin
22260 74 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e 61  t, op, 0, 0, zNa
22270 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  me, P4_DYNAMIC);
22280 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
22290 6b 65 20 73 75 72 65 20 74 68 65 20 54 45 4d 50  ke sure the TEMP
222a0 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
222b0 6e 20 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20  n and available 
222c0 66 6f 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e  for use.  Return
222d0 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
222e0 66 20 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65  f errors.  Leave
222f0 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
22300 67 65 73 20 69 6e 20 74 68 65 20 70 50 61 72 73  ges in the pPars
22310 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
22320 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54  int sqlite3OpenT
22330 65 6d 70 44 61 74 61 62 61 73 65 28 50 61 72 73  empDatabase(Pars
22340 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
22350 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
22360 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62  se->db;.  if( db
22370 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20  ->aDb[1].pBt==0 
22380 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  && !pParse->expl
22390 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ain ){.    int r
223a0 63 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  c;.    Btree *pB
223b0 74 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  t;.    static co
223c0 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
223d0 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
223e0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
223f0 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c   |.          SQL
22400 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
22410 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
22420 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
22430 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  E |.          SQ
22440 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
22450 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20  ONCLOSE |.      
22460 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
22470 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63  TEMP_DB;..    rc
22480 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f   = sqlite3BtreeO
22490 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c  pen(db->pVfs, 0,
224a0 20 64 62 2c 20 26 70 42 74 2c 20 30 2c 20 66 6c   db, &pBt, 0, fl
224b0 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ags);.    if( rc
224c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
224d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
224e0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
224f0 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74  able to open a t
22500 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
22510 65 20 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c  e ".        "fil
22520 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65  e for storing te
22530 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29  mporary tables")
22540 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
22550 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72  rc = rc;.      r
22560 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
22570 20 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42     db->aDb[1].pB
22580 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 61 73 73  t = pBt;.    ass
22590 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  ert( db->aDb[1].
225a0 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69  pSchema );.    i
225b0 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d  f( SQLITE_NOMEM=
225c0 3d 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74  =sqlite3BtreeSet
225d0 50 61 67 65 53 69 7a 65 28 70 42 74 2c 20 64 62  PageSize(pBt, db
225e0 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 2c 20  ->nextPagesize, 
225f0 2d 31 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  -1, 0) ){.      
22600 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
22610 64 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  db);.      retur
22620 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
22630 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
22640 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66  .** Record the f
22650 61 63 74 20 74 68 61 74 20 74 68 65 20 73 63 68  act that the sch
22660 65 6d 61 20 63 6f 6f 6b 69 65 20 77 69 6c 6c 20  ema cookie will 
22670 6e 65 65 64 20 74 6f 20 62 65 20 76 65 72 69 66  need to be verif
22680 69 65 64 0a 2a 2a 20 66 6f 72 20 64 61 74 61 62  ied.** for datab
22690 61 73 65 20 69 44 62 2e 20 20 54 68 65 20 63 6f  ase iDb.  The co
226a0 64 65 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 76  de to actually v
226b0 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61  erify the schema
226c0 20 63 6f 6f 6b 69 65 0a 2a 2a 20 77 69 6c 6c 20   cookie.** will 
226d0 6f 63 63 75 72 20 61 74 20 74 68 65 20 65 6e 64  occur at the end
226e0 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65   of the top-leve
226f0 6c 20 56 44 42 45 20 61 6e 64 20 77 69 6c 6c 20  l VDBE and will 
22700 62 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  be generated.** 
22710 6c 61 74 65 72 2c 20 62 79 20 73 71 6c 69 74 65  later, by sqlite
22720 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
22730 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22740 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
22750 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
22760 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73  int iDb){.  Pars
22770 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
22780 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
22790 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  vel(pParse);..  
227a0 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
227b0 26 20 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62  & iDb<pParse->db
227c0 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
227d0 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  t( pParse->db->a
227e0 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c  Db[iDb].pBt!=0 |
227f0 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 61 73  | iDb==1 );.  as
22800 73 65 72 74 28 20 69 44 62 3c 53 51 4c 49 54 45  sert( iDb<SQLITE
22810 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2b 32 20  _MAX_ATTACHED+2 
22820 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
22830 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
22840 65 6c 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  eld(pParse->db, 
22850 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 69 66 28  iDb, 0) );.  if(
22860 20 44 62 4d 61 73 6b 54 65 73 74 28 70 54 6f 70   DbMaskTest(pTop
22870 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73  level->cookieMas
22880 6b 2c 20 69 44 62 29 3d 3d 30 20 29 7b 0a 20 20  k, iDb)==0 ){.  
22890 20 20 44 62 4d 61 73 6b 53 65 74 28 70 54 6f 70    DbMaskSet(pTop
228a0 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73  level->cookieMas
228b0 6b 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 66 28  k, iDb);.    if(
228c0 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
228d0 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
228e0 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70   sqlite3OpenTemp
228f0 44 61 74 61 62 61 73 65 28 70 54 6f 70 6c 65 76  Database(pToplev
22900 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  el);.    }.  }.}
22910 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ../*.** If argum
22920 65 6e 74 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c  ent zDb is NULL,
22930 20 74 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74   then call sqlit
22940 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
22950 6d 61 28 29 20 66 6f 72 20 65 61 63 68 20 0a 2a  ma() for each .*
22960 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  * attached datab
22970 61 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ase. Otherwise, 
22980 69 6e 76 6f 6b 65 20 69 74 20 66 6f 72 20 74 68  invoke it for th
22990 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64  e database named
229a0 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f   zDb only..*/.vo
229b0 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  id sqlite3CodeVe
229c0 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28  rifyNamedSchema(
229d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
229e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b  onst char *zDb){
229f0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
22a00 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
22a10 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
22a20 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
22a30 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20  {.    Db *pDb = 
22a40 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
22a50 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 26 26   if( pDb->pBt &&
22a60 20 28 21 7a 44 62 20 7c 7c 20 30 3d 3d 73 71 6c   (!zDb || 0==sql
22a70 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c  ite3StrICmp(zDb,
22a80 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 29   pDb->zDbSName))
22a90 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
22aa0 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
22ab0 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20 20  a(pParse, i);.  
22ac0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
22ad0 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
22ae0 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72 65  ode that prepare
22af0 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f  s for doing an o
22b00 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  peration that.**
22b10 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
22b20 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
22b30 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
22b40 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e  tarts a new tran
22b50 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72  saction if we ar
22b60 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69  e not already wi
22b70 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61  thin.** a transa
22b80 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72  ction.  If we ar
22b90 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e  e already within
22ba0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
22bb0 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e  then a checkpoin
22bc0 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74  t.** is set if t
22bd0 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20  he setStatement 
22be0 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75  parameter is tru
22bf0 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74  e.  A checkpoint
22c00 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65   should.** be se
22c10 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73  t for operations
22c20 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c   that might fail
22c30 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74   (due to a const
22c40 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a  raint) part of.*
22c50 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75 67  * the way throug
22c60 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c  h and which will
22c70 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f   need to undo so
22c80 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f 75  me writes withou
22c90 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72  t having to.** r
22ca0 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c  ollback the whol
22cb0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  e transaction.  
22cc0 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77  For operations w
22cd0 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61  here all constra
22ce0 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63  ints.** can be c
22cf0 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e  hecked before an
22d00 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  y changes are ma
22d10 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  de to the databa
22d20 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a  se, it is never.
22d30 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ** necessary to 
22d40 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64  undo a write and
22d50 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
22d60 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65  should not be se
22d70 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
22d80 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
22d90 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ation(Parse *pPa
22da0 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74 61 74  rse, int setStat
22db0 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b  ement, int iDb){
22dc0 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65  .  Parse *pTople
22dd0 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72  vel = sqlite3Par
22de0 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
22df0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64  e);.  sqlite3Cod
22e00 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
22e10 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 44 62  arse, iDb);.  Db
22e20 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c 65 76 65  MaskSet(pTopleve
22e30 6c 2d 3e 77 72 69 74 65 4d 61 73 6b 2c 20 69 44  l->writeMask, iD
22e40 62 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d  b);.  pToplevel-
22e50 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 7c 3d  >isMultiWrite |=
22e60 20 73 65 74 53 74 61 74 65 6d 65 6e 74 3b 0a 7d   setStatement;.}
22e70 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65  ../*.** Indicate
22e80 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d   that the statem
22e90 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ent currently un
22ea0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
22eb0 20 6d 69 67 68 74 20 77 72 69 74 65 0a 2a 2a 20   might write.** 
22ec0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6e  more than one en
22ed0 74 72 79 20 28 65 78 61 6d 70 6c 65 3a 20 64 65  try (example: de
22ee0 6c 65 74 69 6e 67 20 6f 6e 65 20 72 6f 77 20 74  leting one row t
22ef0 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 61 6e  hen inserting an
22f00 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e 73 65 72 74  other,.** insert
22f10 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77  ing multiple row
22f20 73 20 69 6e 20 61 20 74 61 62 6c 65 2c 20 6f 72  s in a table, or
22f30 20 69 6e 73 65 72 74 69 6e 67 20 61 20 72 6f 77   inserting a row
22f40 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69   and index entri
22f50 65 73 2e 29 0a 2a 2a 20 49 66 20 61 6e 20 61 62  es.).** If an ab
22f60 6f 72 74 20 6f 63 63 75 72 73 20 61 66 74 65 72  ort occurs after
22f70 20 73 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 77   some of these w
22f80 72 69 74 65 73 20 68 61 76 65 20 63 6f 6d 70 6c  rites have compl
22f90 65 74 65 64 2c 20 74 68 65 6e 20 69 74 20 77 69  eted, then it wi
22fa0 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61  ll.** be necessa
22fb0 72 79 20 74 6f 20 75 6e 64 6f 20 74 68 65 20 63  ry to undo the c
22fc0 6f 6d 70 6c 65 74 65 64 20 77 72 69 74 65 73 2e  ompleted writes.
22fd0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22fe0 4d 75 6c 74 69 57 72 69 74 65 28 50 61 72 73 65  MultiWrite(Parse
22ff0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72   *pParse){.  Par
23000 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
23010 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
23020 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
23030 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c  pToplevel->isMul
23040 74 69 57 72 69 74 65 20 3d 20 31 3b 0a 7d 0a 0a  tiWrite = 1;.}..
23050 2f 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  /* .** The code 
23060 67 65 6e 65 72 61 74 6f 72 20 63 61 6c 6c 73 20  generator calls 
23070 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 66 20  this routine if 
23080 69 73 20 64 69 73 63 6f 76 65 72 73 20 74 68 61  is discovers tha
23090 74 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73 73 69  t it is.** possi
230a0 62 6c 65 20 74 6f 20 61 62 6f 72 74 20 61 20 73  ble to abort a s
230b0 74 61 74 65 6d 65 6e 74 20 70 72 69 6f 72 20 74  tatement prior t
230c0 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 49  o completion.  I
230d0 6e 20 6f 72 64 65 72 20 74 6f 20 0a 2a 2a 20 70  n order to .** p
230e0 65 72 66 6f 72 6d 20 74 68 69 73 20 61 62 6f 72  erform this abor
230f0 74 20 77 69 74 68 6f 75 74 20 63 6f 72 72 75 70  t without corrup
23100 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
23110 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61  e, we need to ma
23120 6b 65 0a 2a 2a 20 73 75 72 65 20 74 68 61 74 20  ke.** sure that 
23130 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
23140 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 61 20   protected by a 
23150 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
23160 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65 63  ction..**.** Tec
23170 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6f 6e 6c  hnically, we onl
23180 79 20 6e 65 65 64 20 74 6f 20 73 65 74 20 74 68  y need to set th
23190 65 20 6d 61 79 41 62 6f 72 74 20 66 6c 61 67 20  e mayAbort flag 
231a0 69 66 20 74 68 65 0a 2a 2a 20 69 73 4d 75 6c 74  if the.** isMult
231b0 69 57 72 69 74 65 20 66 6c 61 67 20 77 61 73 20  iWrite flag was 
231c0 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 2e 20  previously set. 
231d0 20 54 68 65 72 65 20 69 73 20 61 20 74 69 6d 65   There is a time
231e0 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 73   dependency.** s
231f0 75 63 68 20 74 68 61 74 20 74 68 65 20 61 62 6f  uch that the abo
23200 72 74 20 6d 75 73 74 20 6f 63 63 75 72 20 61 66  rt must occur af
23210 74 65 72 20 74 68 65 20 6d 75 6c 74 69 77 72 69  ter the multiwri
23220 74 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 0a  te.  This makes.
23230 2a 2a 20 73 6f 6d 65 20 73 74 61 74 65 6d 65 6e  ** some statemen
23240 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 74 68 65  ts involving the
23250 20 52 45 50 4c 41 43 45 20 63 6f 6e 66 6c 69 63   REPLACE conflic
23260 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
23270 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f 20 61 20 6c  orithm.** go a l
23280 69 74 74 6c 65 20 66 61 73 74 65 72 2e 20 20 42  ittle faster.  B
23290 75 74 20 74 61 6b 69 6e 67 20 61 64 76 61 6e 74  ut taking advant
232a0 61 67 65 20 6f 66 20 74 68 69 73 20 74 69 6d 65  age of this time
232b0 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 6d   dependency.** m
232c0 61 6b 65 73 20 69 74 20 6d 6f 72 65 20 64 69 66  akes it more dif
232d0 66 69 63 75 6c 74 20 74 6f 20 70 72 6f 76 65 20  ficult to prove 
232e0 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 69 73  that the code is
232f0 20 63 6f 72 72 65 63 74 20 28 69 6e 20 0a 2a 2a   correct (in .**
23300 20 70 61 72 74 69 63 75 6c 61 72 2c 20 69 74 20   particular, it 
23310 70 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d  prevents us from
23320 20 77 72 69 74 69 6e 67 20 61 6e 20 65 66 66 65   writing an effe
23330 63 74 69 76 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ctive.** impleme
23340 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74  ntation of sqlit
23350 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74  e3AssertMayAbort
23360 28 29 29 20 61 6e 64 20 73 6f 20 77 65 20 68 61  ()) and so we ha
23370 76 65 20 63 68 6f 73 65 6e 0a 2a 2a 20 74 6f 20  ve chosen.** to 
23380 74 61 6b 65 20 74 68 65 20 73 61 66 65 20 72 6f  take the safe ro
23390 75 74 65 20 61 6e 64 20 73 6b 69 70 20 74 68 65  ute and skip the
233a0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
233b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 61  /.void sqlite3Ma
233c0 79 41 62 6f 72 74 28 50 61 72 73 65 20 2a 70 50  yAbort(Parse *pP
233d0 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20 2a  arse){.  Parse *
233e0 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
233f0 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
23400 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f 70  (pParse);.  pTop
23410 6c 65 76 65 6c 2d 3e 6d 61 79 41 62 6f 72 74 20  level->mayAbort 
23420 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  = 1;.}../*.** Co
23430 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 74 68  de an OP_Halt th
23440 61 74 20 63 61 75 73 65 73 20 74 68 65 20 76 64  at causes the vd
23450 62 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  be to return an 
23460 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
23470 54 0a 2a 2a 20 65 72 72 6f 72 2e 20 54 68 65 20  T.** error. The 
23480 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d 65 74 65  onError paramete
23490 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69  r determines whi
234a0 63 68 20 28 69 66 20 61 6e 79 29 20 6f 66 20 74  ch (if any) of t
234b0 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  he statement.** 
234c0 61 6e 64 2f 6f 72 20 63 75 72 72 65 6e 74 20 74  and/or current t
234d0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
234e0 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 76 6f  lled back..*/.vo
234f0 69 64 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f  id sqlite3HaltCo
23500 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
23510 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
23520 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
23530 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f 64   */.  int errCod
23540 65 2c 20 20 20 20 20 20 2f 2a 20 65 78 74 65 6e  e,      /* exten
23550 64 65 64 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  ded error code *
23560 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
23570 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61        /* Constra
23580 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20 63 68  int type */.  ch
23590 61 72 20 2a 70 34 2c 20 20 20 20 20 20 20 20 20  ar *p4,         
235a0 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65  /* Error message
235b0 20 2a 2f 0a 20 20 69 38 20 70 34 74 79 70 65 2c   */.  i8 p4type,
235c0 20 20 20 20 20 20 20 20 2f 2a 20 50 34 5f 53 54          /* P4_ST
235d0 41 54 49 43 20 6f 72 20 50 34 5f 54 52 41 4e 53  ATIC or P4_TRANS
235e0 49 45 4e 54 20 2a 2f 0a 20 20 75 38 20 70 35 45  IENT */.  u8 p5E
235f0 72 72 6d 73 67 20 20 20 20 20 20 20 2f 2a 20 50  rrmsg       /* P
23600 35 5f 45 72 72 4d 73 67 20 74 79 70 65 20 2a 2f  5_ErrMsg type */
23610 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
23620 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
23630 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
23640 28 20 28 65 72 72 43 6f 64 65 26 30 78 66 66 29  ( (errCode&0xff)
23650 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ==SQLITE_CONSTRA
23660 49 4e 54 20 29 3b 0a 20 20 69 66 28 20 6f 6e 45  INT );.  if( onE
23670 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  rror==OE_Abort )
23680 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79  {.    sqlite3May
23690 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20  Abort(pParse);. 
236a0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
236b0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c  AddOp4(v, OP_Hal
236c0 74 2c 20 65 72 72 43 6f 64 65 2c 20 6f 6e 45 72  t, errCode, onEr
236d0 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70 34 74 79  ror, 0, p4, p4ty
236e0 70 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  pe);.  sqlite3Vd
236f0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35  beChangeP5(v, p5
23700 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Errmsg);.}../*.*
23710 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c  * Code an OP_Hal
23720 74 20 64 75 65 20 74 6f 20 55 4e 49 51 55 45 20  t due to UNIQUE 
23730 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
23740 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74  onstraint violat
23750 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
23760 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74 72  ite3UniqueConstr
23770 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  aint(.  Parse *p
23780 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
23790 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
237a0 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
237b0 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e      /* Constrain
237c0 74 20 74 79 70 65 20 2a 2f 0a 20 20 49 6e 64 65  t type */.  Inde
237d0 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 2f 2a  x *pIdx       /*
237e0 20 54 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   The index that 
237f0 74 72 69 67 67 65 72 73 20 74 68 65 20 63 6f 6e  triggers the con
23800 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20  straint */.){.  
23810 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 69 6e  char *zErr;.  in
23820 74 20 6a 3b 0a 20 20 53 74 72 41 63 63 75 6d 20  t j;.  StrAccum 
23830 65 72 72 4d 73 67 3b 0a 20 20 54 61 62 6c 65 20  errMsg;.  Table 
23840 2a 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54  *pTab = pIdx->pT
23850 61 62 6c 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33  able;..  sqlite3
23860 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 65 72  StrAccumInit(&er
23870 72 4d 73 67 2c 20 70 50 61 72 73 65 2d 3e 64 62  rMsg, pParse->db
23880 2c 20 30 2c 20 30 2c 20 32 30 30 29 3b 0a 20 20  , 0, 0, 200);.  
23890 69 66 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78  if( pIdx->aColEx
238a0 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  pr ){.    sqlite
238b0 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 65  3_str_appendf(&e
238c0 72 72 4d 73 67 2c 20 22 69 6e 64 65 78 20 27 25  rrMsg, "index '%
238d0 71 27 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  q'", pIdx->zName
238e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
238f0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d  for(j=0; j<pIdx-
23900 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  >nKeyCol; j++){.
23910 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
23920 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
23930 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
23940 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 7a 43  ]>=0 );.      zC
23950 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol = pTab->aCol[
23960 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
23970 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  ]].zName;.      
23980 69 66 28 20 6a 20 29 20 73 71 6c 69 74 65 33 5f  if( j ) sqlite3_
23990 73 74 72 5f 61 70 70 65 6e 64 28 26 65 72 72 4d  str_append(&errM
239a0 73 67 2c 20 22 2c 20 22 2c 20 32 29 3b 0a 20 20  sg, ", ", 2);.  
239b0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
239c0 61 70 70 65 6e 64 61 6c 6c 28 26 65 72 72 4d 73  appendall(&errMs
239d0 67 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  g, pTab->zName);
239e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
239f0 74 72 5f 61 70 70 65 6e 64 28 26 65 72 72 4d 73  tr_append(&errMs
23a00 67 2c 20 22 2e 22 2c 20 31 29 3b 0a 20 20 20 20  g, ".", 1);.    
23a10 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
23a20 70 65 6e 64 61 6c 6c 28 26 65 72 72 4d 73 67 2c  pendall(&errMsg,
23a30 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   zCol);.    }.  
23a40 7d 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74  }.  zErr = sqlit
23a50 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68  e3StrAccumFinish
23a60 28 26 65 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c  (&errMsg);.  sql
23a70 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69  ite3HaltConstrai
23a80 6e 74 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  nt(pParse, .    
23a90 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
23aa0 78 28 70 49 64 78 29 20 3f 20 53 51 4c 49 54 45  x(pIdx) ? SQLITE
23ab0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d  _CONSTRAINT_PRIM
23ac0 41 52 59 4b 45 59 20 0a 20 20 20 20 20 20 20 20  ARYKEY .        
23ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ae0 20 20 20 20 3a 20 53 51 4c 49 54 45 5f 43 4f 4e      : SQLITE_CON
23af0 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 2c 0a  STRAINT_UNIQUE,.
23b00 20 20 20 20 6f 6e 45 72 72 6f 72 2c 20 7a 45 72      onError, zEr
23b10 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 20 50  r, P4_DYNAMIC, P
23b20 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71  5_ConstraintUniq
23b30 75 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  ue);.}.../*.** C
23b40 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64  ode an OP_Halt d
23b50 75 65 20 74 6f 20 6e 6f 6e 2d 75 6e 69 71 75 65  ue to non-unique
23b60 20 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f 69 64 20   rowid..*/.void 
23b70 73 71 6c 69 74 65 33 52 6f 77 69 64 43 6f 6e 73  sqlite3RowidCons
23b80 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20  traint(.  Parse 
23b90 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
23ba0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
23bb0 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
23bc0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63        /* Conflic
23bd0 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
23be0 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 54 61 62 6c  orithm */.  Tabl
23bf0 65 20 2a 70 54 61 62 20 20 20 20 20 20 20 2f 2a  e *pTab       /*
23c00 20 54 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   The table with 
23c10 74 68 65 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72  the non-unique r
23c20 6f 77 69 64 20 2a 2f 20 0a 29 7b 0a 20 20 63 68  owid */ .){.  ch
23c30 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 69 6e 74 20  ar *zMsg;.  int 
23c40 72 63 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  rc;.  if( pTab->
23c50 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20  iPKey>=0 ){.    
23c60 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
23c70 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62  rintf(pParse->db
23c80 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d  , "%s.%s", pTab-
23c90 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
23ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23cb0 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61    pTab->aCol[pTa
23cc0 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29  b->iPKey].zName)
23cd0 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
23ce0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49  E_CONSTRAINT_PRI
23cf0 4d 41 52 59 4b 45 59 3b 0a 20 20 7d 65 6c 73 65  MARYKEY;.  }else
23d00 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c  {.    zMsg = sql
23d10 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
23d20 73 65 2d 3e 64 62 2c 20 22 25 73 2e 72 6f 77 69  se->db, "%s.rowi
23d30 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
23d40 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
23d50 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57  E_CONSTRAINT_ROW
23d60 49 44 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ID;.  }.  sqlite
23d70 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
23d80 70 50 61 72 73 65 2c 20 72 63 2c 20 6f 6e 45 72  pParse, rc, onEr
23d90 72 6f 72 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59  ror, zMsg, P4_DY
23da0 4e 41 4d 49 43 2c 0a 20 20 20 20 20 20 20 20 20  NAMIC,.         
23db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
23dc0 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71  5_ConstraintUniq
23dd0 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ue);.}../*.** Ch
23de0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49  eck to see if pI
23df0 6e 64 65 78 20 75 73 65 73 20 74 68 65 20 63 6f  ndex uses the co
23e00 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
23e10 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a   pColl.  Return.
23e20 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20 64 6f  ** true if it do
23e30 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  es and false if 
23e40 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a  it does not..*/.
23e50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
23e60 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
23e70 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e  ic int collation
23e80 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72  Match(const char
23e90 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a   *zColl, Index *
23ea0 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 69  pIndex){.  int i
23eb0 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c  ;.  assert( zCol
23ec0 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  l!=0 );.  for(i=
23ed0 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f  0; i<pIndex->nCo
23ee0 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
23ef0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
23f00 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
23f10 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  ];.    assert( z
23f20 21 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 61  !=0 || pIndex->a
23f30 69 43 6f 6c 75 6d 6e 5b 69 5d 3c 30 20 29 3b 0a  iColumn[i]<0 );.
23f40 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
23f50 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 26  aiColumn[i]>=0 &
23f60 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  & 0==sqlite3StrI
23f70 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b  Cmp(z, zColl) ){
23f80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
23f90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
23fa0 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
23fb0 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65  ./*.** Recompute
23fc0 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
23fd0 70 54 61 62 20 74 68 61 74 20 75 73 65 20 74 68  pTab that use th
23fe0 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
23ff0 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49  ence pColl..** I
24000 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20  f pColl==0 then 
24010 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  recompute all in
24020 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a  dices of pTab..*
24030 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
24040 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74  _OMIT_REINDEX.st
24050 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65  atic void reinde
24060 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  xTable(Parse *pP
24070 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
24080 62 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  b, char const *z
24090 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a  Coll){.  Index *
240a0 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20  pIndex;         
240b0 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
240c0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
240d0 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28   pTab */..  for(
240e0 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e  pIndex=pTab->pIn
240f0 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e  dex; pIndex; pIn
24100 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78  dex=pIndex->pNex
24110 74 29 7b 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c  t){.    if( zCol
24120 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f  l==0 || collatio
24130 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49  nMatch(zColl, pI
24140 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20 69  ndex) ){.      i
24150 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
24160 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
24170 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
24180 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
24190 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
241a0 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
241b0 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 0, iDb);.    
241c0 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
241d0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
241e0 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a  dex, -1);.    }.
241f0 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
24200 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c  .** Recompute al
24210 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c  l indices of all
24220 20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64   tables in all d
24230 61 74 61 62 61 73 65 73 20 77 68 65 72 65 20 74  atabases where t
24240 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75 73  he.** indices us
24250 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  e the collating 
24260 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20  sequence pColl. 
24270 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65   If pColl==0 the
24280 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61  n recompute.** a
24290 6c 6c 20 69 6e 64 69 63 65 73 20 65 76 65 72 79  ll indices every
242a0 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  where..*/.#ifnde
242b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
242c0 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69  INDEX.static voi
242d0 64 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73  d reindexDatabas
242e0 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  es(Parse *pParse
242f0 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43  , char const *zC
24300 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b  oll){.  Db *pDb;
24310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24320 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
24330 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
24340 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
24350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
24360 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
24370 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69  number */.  sqli
24380 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
24390 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64  ->db;   /* The d
243a0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
243b0 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d  on */.  HashElem
243c0 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20   *k;            
243d0 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
243e0 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69  ng over tables i
243f0 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65  n pDb */.  Table
24400 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
24410 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c         /* A tabl
24420 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
24430 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
24440 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
24450 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20  sAllMutexes(db) 
24460 29 3b 20 20 2f 2a 20 4e 65 65 64 65 64 20 66 6f  );  /* Needed fo
24470 72 20 73 63 68 65 6d 61 20 61 63 63 65 73 73 20  r schema access 
24480 2a 2f 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c 20  */.  for(iDb=0, 
24490 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62  pDb=db->aDb; iDb
244a0 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c  <db->nDb; iDb++,
244b0 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73   pDb++){.    ass
244c0 65 72 74 28 20 70 44 62 21 3d 30 20 29 3b 0a 20  ert( pDb!=0 );. 
244d0 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48     for(k=sqliteH
244e0 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70  ashFirst(&pDb->p
244f0 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29  Schema->tblHash)
24500 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61  ;  k; k=sqliteHa
24510 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20  shNext(k)){.    
24520 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a    pTab = (Table*
24530 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
24540 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65  k);.      reinde
24550 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  xTable(pParse, p
24560 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  Tab, zColl);.   
24570 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
24580 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
24590 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45 49  code for the REI
245a0 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  NDEX command..**
245b0 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
245c0 45 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EX              
245d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
245e0 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   1.**        REI
245f0 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e  NDEX  <collation
24600 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >               
24610 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 2.**        R
24620 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61  EINDEX  ?<databa
24630 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e  se>.?<tablename>
24640 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20    -- 3.**       
24650 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61   REINDEX  ?<data
24660 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d  base>.?<indexnam
24670 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46  e>  -- 4.**.** F
24680 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c  orm 1 causes all
24690 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20   indices in all 
246a0 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
246b0 65 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74  es to be rebuilt
246c0 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75  ..** Form 2 rebu
246d0 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73  ilds all indices
246e0 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65   in all database
246f0 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20 6e  s that use the n
24700 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e  amed.** collatin
24710 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72  g function.  For
24720 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62 75 69  ms 3 and 4 rebui
24730 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64  ld the named ind
24740 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64  ex or all.** ind
24750 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
24760 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74  with the named t
24770 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  able..*/.#ifndef
24780 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
24790 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65  NDEX.void sqlite
247a0 33 52 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a  3Reindex(Parse *
247b0 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
247c0 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Name1, Token *pN
247d0 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  ame2){.  CollSeq
247e0 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *pColl;        
247f0 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e       /* Collatin
24800 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65  g sequence to be
24810 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e   reindexed, or N
24820 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ULL */.  char *z
24830 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24840 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
24850 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  a table or index
24860 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
24870 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20   *zDb;          
24880 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
24890 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54   database */.  T
248a0 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
248b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
248c0 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
248d0 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78  abase */.  Index
248e0 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
248f0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
24900 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
24910 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  th pTab */.  int
24920 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
24930 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
24940 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e  database index n
24950 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  umber */.  sqlit
24960 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
24970 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  >db;   /* The da
24980 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
24990 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f  n */.  Token *pO
249a0 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  bjName;         
249b0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
249c0 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
249d0 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64   to be reindexed
249e0 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74   */..  /* Read t
249f0 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
24a00 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ma. If an error 
24a10 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e  occurs, leave an
24a20 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
24a30 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20   ** and code in 
24a40 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
24a50 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28  n NULL. */.  if(
24a60 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
24a70 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
24a80 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74  arse) ){.    ret
24a90 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  urn;.  }..  if( 
24aa0 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20  pName1==0 ){.   
24ab0 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65   reindexDatabase
24ac0 73 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20  s(pParse, 0);.  
24ad0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73    return;.  }els
24ae0 65 20 69 66 28 20 4e 45 56 45 52 28 70 4e 61 6d  e if( NEVER(pNam
24af0 65 32 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d 65 32  e2==0) || pName2
24b00 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68  ->z==0 ){.    ch
24b10 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61  ar *zColl;.    a
24b20 73 73 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a  ssert( pName1->z
24b30 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20   );.    zColl = 
24b40 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
24b50 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
24b60 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66   pName1);.    if
24b70 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72  ( !zColl ) retur
24b80 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  n;.    pColl = s
24b90 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
24ba0 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a  q(db, ENC(db), z
24bb0 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66  Coll, 0);.    if
24bc0 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
24bd0 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65   reindexDatabase
24be0 73 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29  s(pParse, zColl)
24bf0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
24c00 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29  bFree(db, zColl)
24c10 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
24c20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
24c30 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c  3DbFree(db, zCol
24c40 6c 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  l);.  }.  iDb = 
24c50 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
24c60 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
24c70 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a  1, pName2, &pObj
24c80 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62  Name);.  if( iDb
24c90 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  <0 ) return;.  z
24ca0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
24cb0 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a  omToken(db, pObj
24cc0 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  Name);.  if( z==
24cd0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44  0 ) return;.  zD
24ce0 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
24cf0 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 70 54 61  .zDbSName;.  pTa
24d00 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  b = sqlite3FindT
24d10 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29  able(db, z, zDb)
24d20 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a  ;.  if( pTab ){.
24d30 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65      reindexTable
24d40 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30  (pParse, pTab, 0
24d50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
24d60 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20  Free(db, z);.   
24d70 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
24d80 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46  Index = sqlite3F
24d90 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20  indIndex(db, z, 
24da0 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  zDb);.  sqlite3D
24db0 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20  bFree(db, z);.  
24dc0 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20  if( pIndex ){.  
24dd0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
24de0 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
24df0 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20  rse, 0, iDb);.  
24e00 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
24e10 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
24e20 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65  dex, -1);.    re
24e30 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
24e40 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
24e50 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 69  se, "unable to i
24e60 64 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a 65  dentify the obje
24e70 63 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78  ct to be reindex
24e80 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ed");.}.#endif..
24e90 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 4b  /*.** Return a K
24ea0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
24eb0 20 74 68 61 74 20 69 73 20 61 70 70 72 6f 70 72   that is appropr
24ec0 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76  iate for the giv
24ed0 65 6e 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  en Index..**.** 
24ee0 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  The caller shoul
24ef0 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  d invoke sqlite3
24f00 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 29 20 6f  KeyInfoUnref() o
24f10 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f  n the returned o
24f20 62 6a 65 63 74 0a 2a 2a 20 77 68 65 6e 20 69 74  bject.** when it
24f30 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 75 73   has finished us
24f40 69 6e 67 20 69 74 2e 0a 2a 2f 0a 4b 65 79 49 6e  ing it..*/.KeyIn
24f50 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e  fo *sqlite3KeyIn
24f60 66 6f 4f 66 49 6e 64 65 78 28 50 61 72 73 65 20  foOfIndex(Parse 
24f70 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a  *pParse, Index *
24f80 70 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  pIdx){.  int i;.
24f90 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64    int nCol = pId
24fa0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e  x->nColumn;.  in
24fb0 74 20 6e 4b 65 79 20 3d 20 70 49 64 78 2d 3e 6e  t nKey = pIdx->n
24fc0 4b 65 79 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e 66  KeyCol;.  KeyInf
24fd0 6f 20 2a 70 4b 65 79 3b 0a 20 20 69 66 28 20 70  o *pKey;.  if( p
24fe0 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
24ff0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49  turn 0;.  if( pI
25000 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20  dx->uniqNotNull 
25010 29 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71  ){.    pKey = sq
25020 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
25030 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b  c(pParse->db, nK
25040 65 79 2c 20 6e 43 6f 6c 2d 6e 4b 65 79 29 3b 0a  ey, nCol-nKey);.
25050 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65    }else{.    pKe
25060 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  y = sqlite3KeyIn
25070 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  foAlloc(pParse->
25080 64 62 2c 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20  db, nCol, 0);.  
25090 7d 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a  }.  if( pKey ){.
250a0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
250b0 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
250c0 65 61 62 6c 65 28 70 4b 65 79 29 20 29 3b 0a 20  eable(pKey) );. 
250d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
250e0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
250f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
25100 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  l = pIdx->azColl
25110 5b 69 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d  [i];.      pKey-
25120 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c  >aColl[i] = zCol
25130 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72 42 49 4e  l==sqlite3StrBIN
25140 41 52 59 20 3f 20 30 20 3a 0a 20 20 20 20 20 20  ARY ? 0 :.      
25150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25160 20 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43    sqlite3LocateC
25170 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a  ollSeq(pParse, z
25180 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 70 4b 65  Coll);.      pKe
25190 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  y->aSortOrder[i]
251a0 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72   = pIdx->aSortOr
251b0 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  der[i];.    }.  
251c0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
251d0 72 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  rr ){.      asse
251e0 72 74 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d  rt( pParse->rc==
251f0 53 51 4c 49 54 45 5f 45 52 52 4f 52 5f 4d 49 53  SQLITE_ERROR_MIS
25200 53 49 4e 47 5f 43 4f 4c 4c 53 45 51 20 29 3b 0a  SING_COLLSEQ );.
25210 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
25220 62 4e 6f 51 75 65 72 79 3d 3d 30 20 29 7b 0a 20  bNoQuery==0 ){. 
25230 20 20 20 20 20 20 20 2f 2a 20 44 65 61 63 74 69         /* Deacti
25240 76 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 62  vate the index b
25250 65 63 61 75 73 65 20 69 74 20 63 6f 6e 74 61 69  ecause it contai
25260 6e 73 20 61 6e 20 75 6e 6b 6e 6f 77 6e 20 63 6f  ns an unknown co
25270 6c 6c 61 74 69 6e 67 0a 20 20 20 20 20 20 20 20  llating.        
25280 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68  ** sequence.  Th
25290 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 72 65  e only way to re
252a0 61 63 74 69 76 65 20 74 68 65 20 69 6e 64 65 78  active the index
252b0 20 69 73 20 74 6f 20 72 65 6c 6f 61 64 20 74 68   is to reload th
252c0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 63 68  e.        ** sch
252d0 65 6d 61 2e 20 20 41 64 64 69 6e 67 20 74 68 65  ema.  Adding the
252e0 20 6d 69 73 73 69 6e 67 20 63 6f 6c 6c 61 74 69   missing collati
252f0 6e 67 20 73 65 71 75 65 6e 63 65 20 6c 61 74 65  ng sequence late
25300 72 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20  r does not.     
25310 20 20 20 2a 2a 20 72 65 61 63 74 69 76 65 20 74     ** reactive t
25320 68 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20 61  he index.  The a
25330 70 70 6c 69 63 61 74 69 6f 6e 20 68 61 64 20 74  pplication had t
25340 68 65 20 63 68 61 6e 63 65 20 74 6f 20 72 65 67  he chance to reg
25350 69 73 74 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  ister.        **
25360 20 74 68 65 20 6d 69 73 73 69 6e 67 20 69 6e 64   the missing ind
25370 65 78 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c  ex using the col
25380 6c 61 74 69 6f 6e 2d 6e 65 65 64 65 64 20 63 61  lation-needed ca
25390 6c 6c 62 61 63 6b 2e 20 20 46 6f 72 0a 20 20 20  llback.  For.   
253a0 20 20 20 20 20 2a 2a 20 73 69 6d 70 6c 69 63 69       ** simplici
253b0 74 79 2c 20 53 51 4c 69 74 65 20 77 69 6c 6c 20  ty, SQLite will 
253c0 6e 6f 74 20 67 69 76 65 20 74 68 65 20 61 70 70  not give the app
253d0 6c 69 63 61 74 69 6f 6e 20 61 20 73 65 63 6f 6e  lication a secon
253e0 64 20 63 68 61 6e 63 65 2e 0a 20 20 20 20 20 20  d chance..      
253f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 49 64    */.        pId
25400 78 2d 3e 62 4e 6f 51 75 65 72 79 20 3d 20 31 3b  x->bNoQuery = 1;
25410 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
25420 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52  >rc = SQLITE_ERR
25430 4f 52 5f 52 45 54 52 59 3b 0a 20 20 20 20 20 20  OR_RETRY;.      
25440 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b  }.      sqlite3K
25450 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
25460 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 20 3d 20  );.      pKey = 
25470 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
25480 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a 0a 23  eturn pKey;.}..#
25490 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
254a0 49 54 5f 43 54 45 0a 2f 2a 20 0a 2a 2a 20 54 68  IT_CTE./* .** Th
254b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e  is routine is in
254c0 76 6f 6b 65 64 20 6f 6e 63 65 20 70 65 72 20 43  voked once per C
254d0 54 45 20 62 79 20 74 68 65 20 70 61 72 73 65 72  TE by the parser
254e0 20 77 68 69 6c 65 20 70 61 72 73 69 6e 67 20 61   while parsing a
254f0 20 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65   .** WITH clause
25500 2e 20 0a 2a 2f 0a 57 69 74 68 20 2a 73 71 6c 69  . .*/.With *sqli
25510 74 65 33 57 69 74 68 41 64 64 28 0a 20 20 50 61  te3WithAdd(.  Pa
25520 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
25530 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
25540 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 69   context */.  Wi
25550 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20  th *pWith,      
25560 20 20 20 20 20 20 2f 2a 20 45 78 69 73 74 69 6e        /* Existin
25570 67 20 57 49 54 48 20 63 6c 61 75 73 65 2c 20 6f  g WITH clause, o
25580 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  r NULL */.  Toke
25590 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20  n *pName,       
255a0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
255b0 68 65 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 20  he common-table 
255c0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
255d0 41 72 67 6c 69 73 74 2c 20 20 20 20 20 2f 2a 20  Arglist,     /* 
255e0 4f 70 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20  Optional column 
255f0 6e 61 6d 65 20 6c 69 73 74 20 66 6f 72 20 74 68  name list for th
25600 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c  e table */.  Sel
25610 65 63 74 20 2a 70 51 75 65 72 79 20 20 20 20 20  ect *pQuery     
25620 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 75 73       /* Query us
25630 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ed to initialize
25640 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b   the table */.){
25650 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
25660 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 57   pParse->db;.  W
25670 69 74 68 20 2a 70 4e 65 77 3b 0a 20 20 63 68 61  ith *pNew;.  cha
25680 72 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 2f 2a 20  r *zName;..  /* 
25690 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 43  Check that the C
256a0 54 45 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75  TE name is uniqu
256b0 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 57 49  e within this WI
256c0 54 48 20 63 6c 61 75 73 65 2e 20 49 66 0a 20 20  TH clause. If.  
256d0 2a 2a 20 6e 6f 74 2c 20 73 74 6f 72 65 20 61 6e  ** not, store an
256e0 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 50 61   error in the Pa
256f0 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a  rse structure. *
25700 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  /.  zName = sqli
25710 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
25720 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
25730 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
25740 20 26 26 20 70 57 69 74 68 20 29 7b 0a 20 20 20   && pWith ){.   
25750 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
25760 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43  i=0; i<pWith->nC
25770 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  te; i++){.      
25780 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
25790 6d 70 28 7a 4e 61 6d 65 2c 20 70 57 69 74 68 2d  mp(zName, pWith-
257a0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  >a[i].zName)==0 
257b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
257c0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
257d0 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20 57 49  e, "duplicate WI
257e0 54 48 20 74 61 62 6c 65 20 6e 61 6d 65 3a 20 25  TH table name: %
257f0 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
25800 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
25810 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20   if( pWith ){.  
25820 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69    int nByte = si
25830 7a 65 6f 66 28 2a 70 57 69 74 68 29 20 2b 20 28  zeof(*pWith) + (
25840 73 69 7a 65 6f 66 28 70 57 69 74 68 2d 3e 61 5b  sizeof(pWith->a[
25850 31 5d 29 20 2a 20 70 57 69 74 68 2d 3e 6e 43 74  1]) * pWith->nCt
25860 65 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73  e);.    pNew = s
25870 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
25880 64 62 2c 20 70 57 69 74 68 2c 20 6e 42 79 74 65  db, pWith, nByte
25890 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
258a0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
258b0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
258c0 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 29 3b 0a  izeof(*pWith));.
258d0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 70    }.  assert( (p
258e0 4e 65 77 21 3d 30 20 26 26 20 7a 4e 61 6d 65 21  New!=0 && zName!
258f0 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  =0) || db->mallo
25900 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 69 66  cFailed );..  if
25910 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
25920 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
25930 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
25940 64 62 2c 20 70 41 72 67 6c 69 73 74 29 3b 0a 20  db, pArglist);. 
25950 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
25960 44 65 6c 65 74 65 28 64 62 2c 20 70 51 75 65 72  Delete(db, pQuer
25970 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  y);.    sqlite3D
25980 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
25990 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 70 57 69  ;.    pNew = pWi
259a0 74 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  th;.  }else{.   
259b0 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
259c0 43 74 65 5d 2e 70 53 65 6c 65 63 74 20 3d 20 70  Cte].pSelect = p
259d0 51 75 65 72 79 3b 0a 20 20 20 20 70 4e 65 77 2d  Query;.    pNew-
259e0 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70  >a[pNew->nCte].p
259f0 43 6f 6c 73 20 3d 20 70 41 72 67 6c 69 73 74 3b  Cols = pArglist;
25a00 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65  .    pNew->a[pNe
25a10 77 2d 3e 6e 43 74 65 5d 2e 7a 4e 61 6d 65 20 3d  w->nCte].zName =
25a20 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 70 4e 65 77   zName;.    pNew
25a30 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e  ->a[pNew->nCte].
25a40 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a 20 20 20  zCteErr = 0;.   
25a50 20 70 4e 65 77 2d 3e 6e 43 74 65 2b 2b 3b 0a 20   pNew->nCte++;. 
25a60 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4e 65   }..  return pNe
25a70 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  w;.}../*.** Free
25a80 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
25a90 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74   the With object
25aa0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
25ab0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
25ac0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
25ad0 69 74 68 44 65 6c 65 74 65 28 73 71 6c 69 74 65  ithDelete(sqlite
25ae0 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 57 69  3 *db, With *pWi
25af0 74 68 29 7b 0a 20 20 69 66 28 20 70 57 69 74 68  th){.  if( pWith
25b00 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
25b10 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57     for(i=0; i<pW
25b20 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b  ith->nCte; i++){
25b30 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 43 74  .      struct Ct
25b40 65 20 2a 70 43 74 65 20 3d 20 26 70 57 69 74 68  e *pCte = &pWith
25b50 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71  ->a[i];.      sq
25b60 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
25b70 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70 43  ete(db, pCte->pC
25b80 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ols);.      sqli
25b90 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
25ba0 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63  db, pCte->pSelec
25bb0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
25bc0 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 74 65  3DbFree(db, pCte
25bd0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
25be0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
25bf0 65 28 64 62 2c 20 70 57 69 74 68 29 3b 0a 20 20  e(db, pWith);.  
25c00 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  }.}.#endif /* !d
25c10 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
25c20 49 54 5f 43 54 45 29 20 2a 2f 0a                 IT_CTE) */.