/ Hex Artifact Content
Login

Artifact 3fd46781483b527ee18508e7854e87e60a259211bb9bbf16b6fafaf08a043a64:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
03a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
03b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
03c0: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
03d0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20  */.  int iTab;  
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03f0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
0400: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0410: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0420: 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20 20 20 20  sWriteLock;     
0430: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 77     /* True for w
0440: 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c 73  rite lock.  Fals
0450: 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f 63  e for a read loc
0460: 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  k */.  const cha
0470: 72 20 2a 7a 4c 6f 63 6b 4e 61 6d 65 3b 20 2f 2a  r *zLockName; /*
0480: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
0490: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
04a0: 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
04b0: 74 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20  that we want to 
04c0: 6c 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20  lock a table at 
04d0: 72 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a  run-time.  .**.*
04e0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
04f0: 65 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f  e locked has roo
0500: 74 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20  t page iTab and 
0510: 69 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61  is found in data
0520: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72  base iDb..** A r
0530: 65 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c  ead or a write l
0540: 6f 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e  ock can be taken
0550: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73   depending on is
0560: 57 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  Writelock..**.**
0570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
0580: 73 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66  st records the f
0590: 61 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63  act that the loc
05a0: 6b 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54  k is desired.  T
05b0: 68 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61  he.** code to ma
05c0: 6b 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75  ke the lock occu
05d0: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  r is generated b
05e0: 79 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74  y a later call t
05f0: 6f 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f  o.** codeTableLo
0600: 63 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75  cks() which occu
0610: 72 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  rs during sqlite
0620: 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
0630: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0640: 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72  TableLock(.  Par
0650: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0660: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0670: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
0680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
0690: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
06a0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
06b0: 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  he table to lock
06c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
06d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
06e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
06f0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0700: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0710: 73 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f  sWriteLock,    /
0720: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69  * True for a wri
0730: 74 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e  te lock */.  con
0740: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
0750: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0760: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0770: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
0780: 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
0790: 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
07a0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  l(pParse);.  int
07b0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   i;.  int nBytes
07c0: 3b 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70  ;.  TableLock *p
07d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
07e0: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62  =0 );..  if( iDb
07f0: 3d 3d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==1 ) return;.  
0800: 69 66 28 20 21 73 71 6c 69 74 65 33 42 74 72 65  if( !sqlite3Btre
0810: 65 53 68 61 72 61 62 6c 65 28 70 50 61 72 73 65  eSharable(pParse
0820: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ->db->aDb[iDb].p
0830: 42 74 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Bt) ) return;.  
0840: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 70 6c  for(i=0; i<pTopl
0850: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0860: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
0870: 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62  &pToplevel->aTab
0880: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0890: 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20 26  f( p->iDb==iDb &
08a0: 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62 20  & p->iTab==iTab 
08b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57 72  ){.      p->isWr
08c0: 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69 73  iteLock = (p->is
08d0: 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73 57  WriteLock || isW
08e0: 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  riteLock);.     
08f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
0900: 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20 73   }..  nBytes = s
0910: 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b 29  izeof(TableLock)
0920: 20 2a 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e   * (pToplevel->n
0930: 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20  TableLock+1);.  
0940: 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c  pToplevel->aTabl
0950: 65 4c 6f 63 6b 20 3d 0a 20 20 20 20 20 20 73 71  eLock =.      sq
0960: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
0970: 46 72 65 65 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  Free(pToplevel->
0980: 64 62 2c 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61  db, pToplevel->a
0990: 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74 65  TableLock, nByte
09a0: 73 29 3b 0a 20 20 69 66 28 20 70 54 6f 70 6c 65  s);.  if( pTople
09b0: 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20  vel->aTableLock 
09c0: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 54 6f 70  ){.    p = &pTop
09d0: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
09e0: 6b 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61  k[pToplevel->nTa
09f0: 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20  bleLock++];.    
0a00: 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  p->iDb = iDb;.  
0a10: 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62    p->iTab = iTab
0a20: 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65  ;.    p->isWrite
0a30: 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f  Lock = isWriteLo
0a40: 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4c 6f 63 6b  ck;.    p->zLock
0a50: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
0a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 70 6c  }else{.    pTopl
0a70: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0a80: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
0a90: 33 4f 6f 6d 46 61 75 6c 74 28 70 54 6f 70 6c 65  3OomFault(pTople
0aa0: 76 65 6c 2d 3e 64 62 29 3b 0a 20 20 7d 0a 7d 0a  vel->db);.  }.}.
0ab0: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
0ac0: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74  P_TableLock inst
0ad0: 72 75 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68  ruction for each
0ae0: 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79   table locked by
0af0: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
0b00: 74 20 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79  t (configured by
0b10: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
0b20: 33 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a  3TableLock())..*
0b30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
0b40: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72  deTableLocks(Par
0b50: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
0b60: 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56  nt i;.  Vdbe *pV
0b70: 64 62 65 3b 20 0a 0a 20 20 70 56 64 62 65 20 3d  dbe; ..  pVdbe =
0b80: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
0b90: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
0ba0: 74 28 20 70 56 64 62 65 21 3d 30 20 29 3b 20 2f  t( pVdbe!=0 ); /
0bb0: 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  * sqlite3GetVdbe
0bc0: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 3a 20 56 44   cannot fail: VD
0bd0: 42 45 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  BE already alloc
0be0: 61 74 65 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  ated */..  for(i
0bf0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54  =0; i<pParse->nT
0c00: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0c10: 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70      TableLock *p
0c20: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62   = &pParse->aTab
0c30: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0c40: 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a  nt p1 = p->iDb;.
0c50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
0c60: 64 64 4f 70 34 28 70 56 64 62 65 2c 20 4f 50 5f  ddOp4(pVdbe, OP_
0c70: 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70  TableLock, p1, p
0c80: 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73 57 72 69  ->iTab, p->isWri
0c90: 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  teLock,.        
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
0cb0: 3e 7a 4c 6f 63 6b 4e 61 6d 65 2c 20 50 34 5f 53  >zLockName, P4_S
0cc0: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  TATIC);.  }.}.#e
0cd0: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f  lse.  #define co
0ce0: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a  deTableLocks(x).
0cf0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0d00: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0d10: 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20 6f   given yDbMask o
0d20: 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20 2d  bject is empty -
0d30: 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 20   if it contains 
0d40: 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20 54  no.** 1 bits.  T
0d50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0d60: 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61 73  sed by the DbMas
0d70: 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20 44  kAllZero() and D
0d80: 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a 2a  bMaskNotZero().*
0d90: 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53 51  * macros when SQ
0da0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0db0: 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  D is greater tha
0dc0: 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  n 30..*/.#if SQL
0dd0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
0de0: 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33 44  >30.int sqlite3D
0df0: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44 62  bMaskAllZero(yDb
0e00: 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20 69  Mask m){.  int i
0e10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
0e20: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b 20  izeof(yDbMask); 
0e30: 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29 20  i++) if( m[i] ) 
0e40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
0e50: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
0e60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0e70: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
0e80: 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  er a single SQL 
0e90: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ea0: 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64  en.** parsed and
0eb0: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20   a VDBE program 
0ec0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20  to execute that 
0ed0: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ee0: 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e 20  en.** prepared. 
0ef0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
0f00: 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e 67  ts the finishing
0f10: 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65 0a   touches on the.
0f20: 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  ** VDBE program 
0f30: 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 70  and resets the p
0f40: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20  Parse structure 
0f50: 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20  for the next.** 
0f60: 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  parse..**.** Not
0f70: 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72 72  e that if an err
0f80: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20  or occurred, it 
0f90: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
0fa0: 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42  e that.** no VDB
0fb0: 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72  E code was gener
0fc0: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
0fd0: 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
0fe0: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
0ff0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1000: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
1010: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
1020: 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a 20  Toplevel==0 );. 
1030: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1040: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1050: 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b  nested ) return;
1060: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1070: 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
1080: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 69  e->nErr ){.    i
1090: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
10a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 72 73  QLITE_OK ) pPars
10b0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
10c0: 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
10d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
10e0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
10f0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
1100: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
1110: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
1120: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
1130: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1140: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
1150: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
1160: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20  isMultiWrite .  
1170: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
1180: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
1190: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  t(v, pParse->may
11a0: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76  Abort));.  if( v
11b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11c0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
11d0: 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53 51 4c 49  Halt);..#if SQLI
11e0: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
11f0: 43 41 54 49 4f 4e 0a 20 20 20 20 69 66 28 20 70  CATION.    if( p
1200: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
1210: 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  k>0 && db->init.
1220: 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  busy==0 ){.     
1230: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
1240: 49 6e 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20  Init(db);.      
1250: 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74  if( db->auth.aut
1260: 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55 73 65  hLevel<UAUTH_Use
1270: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
1280: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1290: 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20 61  rse, "user not a
12a0: 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b 0a  uthenticated");.
12b0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
12c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 48  rc = SQLITE_AUTH
12d0: 5f 55 53 45 52 3b 0a 20 20 20 20 20 20 20 20 72  _USER;.        r
12e0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
12f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1300: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
1310: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
1320: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
1330: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
1340: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
1350: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
1360: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
1370: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
1380: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
1390: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
13a0: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
13b0: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
13c0: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
13d0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
13e0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
13f0: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
1400: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
1410: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
1420: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
1430: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1440: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1450: 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 26 26  iled==0 .     &&
1460: 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72 6f 28   (DbMaskNonZero(
1470: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1480: 73 6b 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70  sk) || pParse->p
1490: 43 6f 6e 73 74 45 78 70 72 29 0a 20 20 20 20 29  ConstExpr).    )
14a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 2c  {.      int iDb,
14b0: 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   i;.      assert
14c0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
14d0: 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f 64 65  Op(v, 0)->opcode
14e0: 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20 20 20  ==OP_Init );.   
14f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1500: 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a 20 20  mpHere(v, 0);.  
1510: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69      for(iDb=0; i
1520: 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
1530: 2b 29 7b 0a 20 20 20 20 20 20 20 20 53 63 68 65  +){.        Sche
1540: 6d 61 20 2a 70 53 63 68 65 6d 61 3b 0a 20 20 20  ma *pSchema;.   
1550: 20 20 20 20 20 69 66 28 20 44 62 4d 61 73 6b 54       if( DbMaskT
1560: 65 73 74 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  est(pParse->cook
1570: 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
1580: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
15a0: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
15b0: 3b 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d  ;.        pSchem
15c0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
15d0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  .pSchema;.      
15e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f0: 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20 20 20  Op4Int(v,.      
1600: 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63 74 69      OP_Transacti
1610: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
1620: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
1630: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 44   */.          iD
1640: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20 20   /* P1 */.      
1670: 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74 28 70      DbMaskTest(p
1680: 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
1690: 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a 2f 0a  ,iDb), /* P2 */.
16a0: 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d            pSchem
16b0: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
16c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
16d0: 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  P3 */.          
16e0: 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
16f0: 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
1700: 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20     /* P4 */.    
1710: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1720: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1730: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
1740: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b  eChangeP5(v, 1);
1750: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
1760: 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20 20 20  ment((v,.       
1770: 20 20 20 20 20 20 20 22 75 73 65 73 53 74 6d 74         "usesStmt
1780: 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70 50 61  Journal=%d", pPa
1790: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20 26 26  rse->mayAbort &&
17a0: 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69   pParse->isMulti
17b0: 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20 20 7d  Write));.      }
17c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
17e0: 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  E.      for(i=0;
17f0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61 62   i<pParse->nVtab
1800: 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Lock; i++){.    
1810: 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20 3d      char *vtab =
1820: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1830: 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 50  GetVTable(db, pP
1840: 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63 6b  arse->apVtabLock
1850: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [i]);.        sq
1860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1870: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c  v, OP_VBegin, 0,
1880: 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f   0, 0, vtab, P4_
1890: 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a 20  VTAB);.      }. 
18a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 74       pParse->nVt
18b0: 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e 64  abLock = 0;.#end
18c0: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 63  if..      /* Onc
18d0: 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69 65  e all the cookie
18e0: 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72 69  s have been veri
18f0: 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61 63  fied and transac
1900: 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a 20  tions opened, . 
1910: 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 74       ** obtain t
1920: 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
1930: 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69 73  e-locks. This is
1940: 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
1950: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 68  the .      ** sh
1960: 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75  ared-cache featu
1970: 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20  re is enabled.. 
1980: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
1990: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50 61  deTableLocks(pPa
19a0: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  rse);..      /* 
19b0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20 41  Initialize any A
19c0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61 74  UTOINCREMENT dat
19d0: 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65 71  a structures req
19e0: 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  uired..      */.
19f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74        sqlite3Aut
1a00: 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e 28  oincrementBegin(
1a10: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1a20: 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e 74  /* Code constant
1a30: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1a40: 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65 64  t where factored
1a50: 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c 6f   out of inner lo
1a60: 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ops */.      if(
1a70: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1a80: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45  xpr ){.        E
1a90: 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20 70  xprList *pEL = p
1aa0: 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
1ab0: 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  r;.        pPars
1ac0: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
1ad0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
1ae0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e 45  r(i=0; i<pEL->nE
1af0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1b00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b10: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
1b20: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  ->a[i].pExpr, pE
1b30: 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73 74  L->a[i].u.iConst
1b40: 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20 20  ExprReg);.      
1b50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
1b60: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a     /* Finally, j
1b70: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1b80: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1b90: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65   executable code
1ba0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1bb0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31 29  e3VdbeGoto(v, 1)
1bc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
1bd0: 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20  /* Get the VDBE 
1be0: 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f  program ready fo
1bf0: 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f  r execution.  */
1c00: 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72  .  if( v && pPar
1c10: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21  se->nErr==0 && !
1c20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c30: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1c40: 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1c50: 76 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 44 69  vel==0 );  /* Di
1c60: 73 61 62 6c 65 73 20 61 6e 64 20 72 65 2d 65 6e  sables and re-en
1c70: 61 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f 0a 20  ables match */. 
1c80: 20 20 20 2f 2a 20 41 20 6d 69 6e 69 6d 75 6d 20     /* A minimum 
1c90: 6f 66 20 6f 6e 65 20 63 75 72 73 6f 72 20 69 73  of one cursor is
1ca0: 20 72 65 71 75 69 72 65 64 20 69 66 20 61 75 74   required if aut
1cb0: 6f 69 6e 63 72 65 6d 65 6e 74 20 69 73 20 75 73  oincrement is us
1cc0: 65 64 0a 20 20 20 20 2a 20 20 53 65 65 20 74 69  ed.    *  See ti
1cd0: 63 6b 65 74 20 5b 61 36 39 36 33 37 39 63 31 66  cket [a696379c1f
1ce0: 30 38 38 36 36 5d 20 2a 2f 0a 20 20 20 20 69 66  08866] */.    if
1cf0: 28 20 70 50 61 72 73 65 2d 3e 70 41 69 6e 63 21  ( pParse->pAinc!
1d00: 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54  =0 && pParse->nT
1d10: 61 62 3d 3d 30 20 29 20 70 50 61 72 73 65 2d 3e  ab==0 ) pParse->
1d20: 6e 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 73 71  nTab = 1;.    sq
1d30: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
1d40: 64 79 28 76 2c 20 70 50 61 72 73 65 29 3b 0a 20  dy(v, pParse);. 
1d50: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
1d60: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
1d70: 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73 65  else{.    pParse
1d80: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
1d90: 52 4f 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ROR;.  }.}../*.*
1da0: 2a 20 52 75 6e 20 74 68 65 20 70 61 72 73 65 72  * Run the parser
1db0: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
1dc0: 74 6f 72 20 72 65 63 75 72 73 69 76 65 6c 79 20  tor recursively 
1dd0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65  in order to gene
1de0: 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72  rate.** code for
1df0: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
1e00: 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68  nt given onto th
1e10: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61  e end of the pPa
1e20: 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63  rse context.** c
1e30: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
1e40: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68  onstruction.  Wh
1e50: 65 6e 20 74 68 65 20 70 61 72 73 65 72 20 69 73  en the parser is
1e60: 20 72 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79   run recursively
1e70: 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68  .** this way, th
1e80: 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20  e final OP_Halt 
1e90: 69 73 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20  is not appended 
1ea0: 61 6e 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61  and other initia
1eb0: 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  lization.** and 
1ec0: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65  finalization ste
1ed0: 70 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62  ps are omitted b
1ee0: 65 63 61 75 73 65 20 74 68 6f 73 65 20 61 72 65  ecause those are
1ef0: 20 68 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65   handling by the
1f00: 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61  .** outermost pa
1f10: 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20  rser..**.** Not 
1f20: 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65  everything is ne
1f30: 73 74 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61  stable.  This fa
1f40: 63 69 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e  cility is design
1f50: 65 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20  ed to permit.** 
1f60: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20  INSERT, UPDATE, 
1f70: 61 6e 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61  and DELETE opera
1f80: 74 69 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51  tions against SQ
1f90: 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73  LITE_MASTER.  Us
1fa0: 65 0a 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75  e.** care if you
1fb0: 20 64 65 63 69 64 65 20 74 6f 20 74 72 79 20 74   decide to try t
1fc0: 6f 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69  o use this routi
1fd0: 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  ne for some othe
1fe0: 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76  r purposes..*/.v
1ff0: 6f 69 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65  oid sqlite3Neste
2000: 64 50 61 72 73 65 28 50 61 72 73 65 20 2a 70 50  dParse(Parse *pP
2010: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
2020: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
2030: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
2040: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63   char *zSql;.  c
2050: 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
2060: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2070: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
2080: 63 68 61 72 20 73 61 76 65 42 75 66 5b 50 41 52  char saveBuf[PAR
2090: 53 45 5f 54 41 49 4c 5f 53 5a 5d 3b 0a 0a 20 20  SE_TAIL_SZ];..  
20a0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
20b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
20c0: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73  ert( pParse->nes
20d0: 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65  ted<10 );  /* Ne
20e0: 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c  sting should onl
20f0: 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20  y be of limited 
2100: 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74  depth */.  va_st
2110: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
2120: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
2130: 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a  e3VMPrintf(db, z
2140: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
2150: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
2160: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
2170: 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d  return;   /* A m
2180: 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
2190: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20  failed */.  }.  
21a0: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b  pParse->nested++
21b0: 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42  ;.  memcpy(saveB
21c0: 75 66 2c 20 50 41 52 53 45 5f 54 41 49 4c 28 70  uf, PARSE_TAIL(p
21d0: 50 61 72 73 65 29 2c 20 50 41 52 53 45 5f 54 41  Parse), PARSE_TA
21e0: 49 4c 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74  IL_SZ);.  memset
21f0: 28 50 41 52 53 45 5f 54 41 49 4c 28 70 50 61 72  (PARSE_TAIL(pPar
2200: 73 65 29 2c 20 30 2c 20 50 41 52 53 45 5f 54 41  se), 0, PARSE_TA
2210: 49 4c 5f 53 5a 29 3b 0a 20 20 73 71 6c 69 74 65  IL_SZ);.  sqlite
2220: 33 52 75 6e 50 61 72 73 65 72 28 70 50 61 72 73  3RunParser(pPars
2230: 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72 4d 73  e, zSql, &zErrMs
2240: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
2250: 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
2260: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
2270: 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 6d  e(db, zSql);.  m
2280: 65 6d 63 70 79 28 50 41 52 53 45 5f 54 41 49 4c  emcpy(PARSE_TAIL
2290: 28 70 50 61 72 73 65 29 2c 20 73 61 76 65 42 75  (pParse), saveBu
22a0: 66 2c 20 50 41 52 53 45 5f 54 41 49 4c 5f 53 5a  f, PARSE_TAIL_SZ
22b0: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73  );.  pParse->nes
22c0: 74 65 64 2d 2d 3b 0a 7d 0a 0a 23 69 66 20 53 51  ted--;.}..#if SQ
22d0: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
22e0: 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 52  TICATION./*.** R
22f0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 7a 54  eturn TRUE if zT
2300: 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65  able is the name
2310: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 74   of the system t
2320: 61 62 6c 65 20 74 68 61 74 20 73 74 6f 72 65 73  able that stores
2330: 20 74 68 65 0a 2a 2a 20 6c 69 73 74 20 6f 66 20   the.** list of 
2340: 75 73 65 72 73 20 61 6e 64 20 74 68 65 69 72 20  users and their 
2350: 61 63 63 65 73 73 20 63 72 65 64 65 6e 74 69 61  access credentia
2360: 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ls..*/.int sqlit
2370: 65 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28  e3UserAuthTable(
2380: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
2390: 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  le){.  return sq
23a0: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54  lite3_stricmp(zT
23b0: 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 75 73  able, "sqlite_us
23c0: 65 72 22 29 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69  er")==0;.}.#endi
23d0: 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  f../*.** Locate 
23e0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
23f0: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
2400: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
2410: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
2420: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
2430: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
2440: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
2450: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
2460: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
2470: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
2480: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
2490: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
24a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
24b0: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
24c0: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
24d0: 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62  ched for the tab
24e0: 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69  le and the.** fi
24f0: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62  rst matching tab
2500: 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  le is returned. 
2510: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f   (No checking fo
2520: 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c  r duplicate tabl
2530: 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f  e.** names is do
2540: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
2550: 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66   order is TEMP f
2560: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
2570: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78   then any.** aux
2580: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
2590: 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65   added using the
25a0: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
25b0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
25c0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
25d0: 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  le()..*/.Table *
25e0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
25f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
2600: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
2610: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
2620: 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  tabase){.  Table
2630: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
2640: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65  ;..  /* All mute
2650: 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  xes are required
2660: 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65   for schema acce
2670: 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77  ss.  Make sure w
2680: 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a  e hold them. */.
2690: 20 20 61 73 73 65 72 74 28 20 7a 44 61 74 61 62    assert( zDatab
26a0: 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase!=0 || sqlite
26b0: 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
26c0: 74 65 78 65 73 28 64 62 29 20 29 3b 0a 23 69 66  texes(db) );.#if
26d0: 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
26e0: 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 2f 2a  HENTICATION.  /*
26f0: 20 4f 6e 6c 79 20 74 68 65 20 61 64 6d 69 6e 20   Only the admin 
2700: 75 73 65 72 20 69 73 20 61 6c 6c 6f 77 65 64 20  user is allowed 
2710: 74 6f 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  to know that the
2720: 20 73 71 6c 69 74 65 5f 75 73 65 72 20 74 61 62   sqlite_user tab
2730: 6c 65 0a 20 20 2a 2a 20 65 78 69 73 74 73 20 2a  le.  ** exists *
2740: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68  /.  if( db->auth
2750: 2e 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48  .authLevel<UAUTH
2760: 5f 41 64 6d 69 6e 20 26 26 20 73 71 6c 69 74 65  _Admin && sqlite
2770: 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 7a  3UserAuthTable(z
2780: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
2790: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
27a0: 6e 64 69 66 0a 20 20 77 68 69 6c 65 28 31 29 7b  ndif.  while(1){
27b0: 0a 20 20 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f  .    for(i=OMIT_
27c0: 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44  TEMPDB; i<db->nD
27d0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
27e0: 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69  nt j = (i<2) ? i
27f0: 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61  ^1 : i;   /* Sea
2800: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
2810: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 20 20 69 66  MAIN */.      if
2820: 28 20 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 7c  ( zDatabase==0 |
2830: 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  | sqlite3StrICmp
2840: 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e  (zDatabase, db->
2850: 61 44 62 5b 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29  aDb[j].zDbSName)
2860: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
2870: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
2880: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
2890: 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 20  , j, 0) );.     
28a0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
28b0: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b  shFind(&db->aDb[
28c0: 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  j].pSchema->tblH
28d0: 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ash, zName);.   
28e0: 20 20 20 20 20 69 66 28 20 70 20 29 20 72 65 74       if( p ) ret
28f0: 75 72 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20  urn p;.      }. 
2900: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4e 6f 74 20     }.    /* Not 
2910: 66 6f 75 6e 64 2e 20 20 49 66 20 74 68 65 20 6e  found.  If the n
2920: 61 6d 65 20 77 65 20 77 65 72 65 20 6c 6f 6f 6b  ame we were look
2930: 69 6e 67 20 66 6f 72 20 77 61 73 20 74 65 6d 70  ing for was temp
2940: 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20  .sqlite_master. 
2950: 20 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67     ** then chang
2960: 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 73 71  e the name to sq
2970: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
2980: 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20   and try again. 
2990: 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
29a0: 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c  e3StrICmp(zName,
29b0: 20 4d 41 53 54 45 52 5f 4e 41 4d 45 29 21 3d 30   MASTER_NAME)!=0
29c0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
29d0: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
29e0: 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d  p(zDatabase, db-
29f0: 3e 61 44 62 5b 31 5d 2e 7a 44 62 53 4e 61 6d 65  >aDb[1].zDbSName
2a00: 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )!=0 ) break;.  
2a10: 20 20 7a 4e 61 6d 65 20 3d 20 54 45 4d 50 5f 4d    zName = TEMP_M
2a20: 41 53 54 45 52 5f 4e 41 4d 45 3b 0a 20 20 7d 0a  ASTER_NAME;.  }.
2a30: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2a40: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
2a50: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
2a60: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
2a70: 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
2a80: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c  database.** tabl
2a90: 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  e given the name
2aa0: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61   of that table a
2ab0: 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
2ac0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
2ad0: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  ** database cont
2ae0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
2af0: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
2b00: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c  f not found.  Al
2b10: 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65  so leave an.** e
2b20: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
2b30: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
2b40: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
2b50: 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
2b60: 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73  is routine and s
2b70: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2b80: 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a  ) is that this.*
2b90: 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73  * routine leaves
2ba0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2bb0: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
2bc0: 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71  rMsg where.** sq
2bd0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29  lite3FindTable()
2be0: 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61   does not..*/.Ta
2bf0: 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61  ble *sqlite3Loca
2c00: 74 65 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  teTable(.  Parse
2c10: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2c20: 20 20 2f 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20    /* context in 
2c30: 77 68 69 63 68 20 74 6f 20 72 65 70 6f 72 74 20  which to report 
2c40: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75 33 32 20  errors */.  u32 
2c50: 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
2c60: 20 20 20 2f 2a 20 4c 4f 43 41 54 45 5f 56 49 45     /* LOCATE_VIE
2c70: 57 20 6f 72 20 4c 4f 43 41 54 45 5f 4e 4f 45 52  W or LOCATE_NOER
2c80: 52 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  R */.  const cha
2c90: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a  r *zName,     /*
2ca0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
2cb0: 6c 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e  le we are lookin
2cc0: 67 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  g for */.  const
2cd0: 20 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20   char *zDbase   
2ce0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2cf0: 20 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68   database.  Migh
2d00: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
2d10: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f    Table *p;..  /
2d20: 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
2d30: 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
2d40: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2d50: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
2d60: 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
2d70: 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
2d80: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
2d90: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
2da0: 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
2db0: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
2dc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2dd0: 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   }..  p = sqlite
2de0: 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  3FindTable(pPars
2df0: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44  e->db, zName, zD
2e00: 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d  base);.  if( p==
2e10: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
2e20: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 66 6c 61 67  har *zMsg = flag
2e30: 73 20 26 20 4c 4f 43 41 54 45 5f 56 49 45 57 20  s & LOCATE_VIEW 
2e40: 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65 77 22  ? "no such view"
2e50: 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c   : "no such tabl
2e60: 65 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e";.#ifndef SQLI
2e70: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2e80: 41 42 4c 45 0a 20 20 20 20 69 66 28 20 73 71 6c  ABLE.    if( sql
2e90: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 70  ite3FindDbName(p
2ea0: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 44 62 61 73  Parse->db, zDbas
2eb0: 65 29 3c 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  e)<1 ){.      /*
2ec0: 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 74 68 65   If zName is the
2ed0: 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   not the name of
2ee0: 20 61 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   a table in the 
2ef0: 73 63 68 65 6d 61 20 63 72 65 61 74 65 64 20 75  schema created u
2f00: 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 43 52  sing.      ** CR
2f10: 45 41 54 45 2c 20 74 68 65 6e 20 63 68 65 63 6b  EATE, then check
2f20: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 69 73   to see if it is
2f30: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20   the name of an 
2f40: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
2f50: 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20  at.      ** can 
2f60: 62 65 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20  be an eponymous 
2f70: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 2a  virtual table. *
2f80: 2f 0a 20 20 20 20 20 20 4d 6f 64 75 6c 65 20 2a  /.      Module *
2f90: 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 2a 29  pMod = (Module*)
2fa0: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
2fb0: 26 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4d 6f  &pParse->db->aMo
2fc0: 64 75 6c 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  dule, zName);.  
2fd0: 20 20 20 20 69 66 28 20 70 4d 6f 64 3d 3d 30 20      if( pMod==0 
2fe0: 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  && sqlite3_strni
2ff0: 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67  cmp(zName, "prag
3000: 6d 61 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20  ma_", 7)==0 ){. 
3010: 20 20 20 20 20 20 20 70 4d 6f 64 20 3d 20 73 71         pMod = sq
3020: 6c 69 74 65 33 50 72 61 67 6d 61 56 74 61 62 52  lite3PragmaVtabR
3030: 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2d 3e  egister(pParse->
3040: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
3050: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4d    }.      if( pM
3060: 6f 64 20 26 26 20 73 71 6c 69 74 65 33 56 74 61  od && sqlite3Vta
3070: 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 49  bEponymousTableI
3080: 6e 69 74 28 70 50 61 72 73 65 2c 20 70 4d 6f 64  nit(pParse, pMod
3090: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
30a0: 75 72 6e 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61  urn pMod->pEpoTa
30b0: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  b;.      }.    }
30c0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
30d0: 28 66 6c 61 67 73 20 26 20 4c 4f 43 41 54 45 5f  (flags & LOCATE_
30e0: 4e 4f 45 52 52 29 3d 3d 30 20 29 7b 0a 20 20 20  NOERR)==0 ){.   
30f0: 20 20 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b     if( zDbase ){
3100: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3110: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3120: 20 22 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a 4d   "%s: %s.%s", zM
3130: 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d  sg, zDbase, zNam
3140: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
3150: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3160: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3170: 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c   "%s: %s", zMsg,
3180: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   zName);.      }
3190: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63  .      pParse->c
31a0: 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
31b0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
31c0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
31d0: 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65  Locate the table
31e0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 2a   identified by *
31f0: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  p..**.** This is
3200: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
3210: 64 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  d sqlite3LocateT
3220: 61 62 6c 65 28 29 2e 20 54 68 65 20 64 69 66 66  able(). The diff
3230: 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 0a 2a  erence between.*
3240: 2a 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  * sqlite3LocateT
3250: 61 62 6c 65 28 29 20 61 6e 64 20 74 68 69 73 20  able() and this 
3260: 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 61 74  function is that
3270: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
3280: 65 73 74 72 69 63 74 73 0a 2a 2a 20 74 68 65 20  estricts.** the 
3290: 73 65 61 72 63 68 20 74 6f 20 73 63 68 65 6d 61  search to schema
32a0: 20 28 70 2d 3e 70 53 63 68 65 6d 61 29 20 69 66   (p->pSchema) if
32b0: 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e   it is not NULL.
32c0: 20 70 2d 3e 70 53 63 68 65 6d 61 20 6d 61 79 20   p->pSchema may 
32d0: 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20 69  be.** non-NULL i
32e0: 66 20 69 74 20 69 73 20 70 61 72 74 20 6f 66 20  f it is part of 
32f0: 61 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65  a view or trigge
3300: 72 20 70 72 6f 67 72 61 6d 20 64 65 66 69 6e 69  r program defini
3310: 74 69 6f 6e 2e 20 53 65 65 0a 2a 2a 20 73 71 6c  tion. See.** sql
3320: 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 29  ite3FixSrcList()
3330: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
3340: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c  .Table *sqlite3L
3350: 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 0a  ocateTableItem(.
3360: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3370: 20 0a 20 20 75 33 32 20 66 6c 61 67 73 2c 0a 20   .  u32 flags,. 
3380: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
3390: 69 74 65 6d 20 2a 70 0a 29 7b 0a 20 20 63 6f 6e  item *p.){.  con
33a0: 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20  st char *zDb;.  
33b0: 61 73 73 65 72 74 28 20 70 2d 3e 70 53 63 68 65  assert( p->pSche
33c0: 6d 61 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 61 74  ma==0 || p->zDat
33d0: 61 62 61 73 65 3d 3d 30 20 29 3b 0a 20 20 69 66  abase==0 );.  if
33e0: 28 20 70 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  ( p->pSchema ){.
33f0: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
3400: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
3410: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
3420: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
3430: 7a 44 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  zDb = pParse->db
3440: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
3450: 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ame;.  }else{.  
3460: 20 20 7a 44 62 20 3d 20 70 2d 3e 7a 44 61 74 61    zDb = p->zData
3470: 62 61 73 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  base;.  }.  retu
3480: 72 6e 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  rn sqlite3Locate
3490: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 66 6c  Table(pParse, fl
34a0: 61 67 73 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a  ags, p->zName, z
34b0: 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  Db);.}../*.** Lo
34c0: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
34d0: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
34e0: 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20  t describes .** 
34f0: 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
3500: 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  ex given the nam
3510: 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a  e of that index.
3520: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20  ** and the name 
3530: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
3540: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
3550: 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75  e index..** Retu
3560: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
3570: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
3580: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
3590: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
35a0: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
35b0: 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74  e.** table and t
35c0: 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  he first matchin
35d0: 67 20 69 6e 64 65 78 20 69 73 20 72 65 74 75 72  g index is retur
35e0: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
35f0: 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63  ng.** for duplic
3600: 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  ate index names 
3610: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
3620: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a  earch order is.*
3630: 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68  * TEMP first, th
3640: 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e  en MAIN, then an
3650: 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  y auxiliary data
3660: 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75  bases added.** u
3670: 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20  sing the ATTACH 
3680: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65  command..*/.Inde
3690: 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  x *sqlite3FindIn
36a0: 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dex(sqlite3 *db,
36b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
36c0: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
36d0: 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  zDb){.  Index *p
36e0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
36f0: 20 2f 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20   /* All mutexes 
3700: 61 72 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  are required for
3710: 20 73 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20   schema access. 
3720: 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f   Make sure we ho
3730: 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73  ld them. */.  as
3740: 73 65 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20  sert( zDb!=0 || 
3750: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
3760: 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20  sAllMutexes(db) 
3770: 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f  );.  for(i=OMIT_
3780: 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44  TEMPDB; i<db->nD
3790: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  b; i++){.    int
37a0: 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31   j = (i<2) ? i^1
37b0: 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68   : i;  /* Search
37c0: 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49   TEMP before MAI
37d0: 4e 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20  N */.    Schema 
37e0: 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  *pSchema = db->a
37f0: 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  Db[j].pSchema;. 
3800: 20 20 20 61 73 73 65 72 74 28 20 70 53 63 68 65     assert( pSche
3810: 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44  ma );.    if( zD
3820: 62 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  b && sqlite3StrI
3830: 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62  Cmp(zDb, db->aDb
3840: 5b 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29 20 29 20  [j].zDbSName) ) 
3850: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
3860: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
3870: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
3880: 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 20   j, 0) );.    p 
3890: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
38a0: 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  d(&pSchema->idxH
38b0: 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ash, zName);.   
38c0: 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a   if( p ) break;.
38d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
38e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d  }../*.** Reclaim
38f0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64   the memory used
3900: 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a   by an index.*/.
3910: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
3920: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64  Index(sqlite3 *d
3930: 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 23 69  b, Index *p){.#i
3940: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3950: 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71 6c 69  T_ANALYZE.  sqli
3960: 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78 53 61  te3DeleteIndexSa
3970: 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a 23 65  mples(db, p);.#e
3980: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 45 78  ndif.  sqlite3Ex
3990: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
39a0: 70 50 61 72 74 49 64 78 57 68 65 72 65 29 3b 0a  pPartIdxWhere);.
39b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
39c0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 61  tDelete(db, p->a
39d0: 43 6f 6c 45 78 70 72 29 3b 0a 20 20 73 71 6c 69  ColExpr);.  sqli
39e0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
39f0: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 69 66 28  >zColAff);.  if(
3a00: 20 70 2d 3e 69 73 52 65 73 69 7a 65 64 20 29 20   p->isResized ) 
3a10: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3a20: 2c 20 28 76 6f 69 64 20 2a 29 70 2d 3e 61 7a 43  , (void *)p->azC
3a30: 6f 6c 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  oll);.#ifdef SQL
3a40: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
3a50: 5f 4f 52 5f 53 54 41 54 34 0a 20 20 73 71 6c 69  _OR_STAT4.  sqli
3a60: 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 69 52 6f  te3_free(p->aiRo
3a70: 77 45 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  wEst);.#endif.  
3a80: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3a90: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  , p);.}../*.** F
3aa0: 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c  or the index cal
3ab0: 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69  led zIdxName whi
3ac0: 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74  ch is found in t
3ad0: 68 65 20 64 61 74 61 62 61 73 65 20 69 44 62 2c  he database iDb,
3ae0: 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20  .** unlike that 
3af0: 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54  index from its T
3b00: 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65  able then remove
3b10: 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a   the index from.
3b20: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61 73  ** the index has
3b30: 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65  h table and free
3b40: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75   all memory stru
3b50: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65  ctures associate
3b60: 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e  d.** with the in
3b70: 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  dex..*/.void sql
3b80: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
3b90: 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33  eteIndex(sqlite3
3ba0: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
3bb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e  onst char *zIdxN
3bc0: 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ame){.  Index *p
3bd0: 49 6e 64 65 78 3b 0a 20 20 48 61 73 68 20 2a 70  Index;.  Hash *p
3be0: 48 61 73 68 3b 0a 0a 20 20 61 73 73 65 72 74 28  Hash;..  assert(
3bf0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
3c00: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
3c10: 20 30 29 20 29 3b 0a 20 20 70 48 61 73 68 20 3d   0) );.  pHash =
3c20: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70   &db->aDb[iDb].p
3c30: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b  Schema->idxHash;
3c40: 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
3c50: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 70 48  te3HashInsert(pH
3c60: 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 30  ash, zIdxName, 0
3c70: 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
3c80: 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69  pIndex) ){.    i
3c90: 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  f( pIndex->pTabl
3ca0: 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65  e->pIndex==pInde
3cb0: 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  x ){.      pInde
3cc0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
3cd0: 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  x = pIndex->pNex
3ce0: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
3cf0: 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
3d00: 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61      /* Justifica
3d10: 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28 29  tion of ALWAYS()
3d20: 3b 20 20 54 68 65 20 69 6e 64 65 78 20 6d 75 73  ;  The index mus
3d30: 74 20 62 65 20 6f 6e 20 74 68 65 20 6c 69 73 74  t be on the list
3d40: 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64   of.      ** ind
3d50: 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70  ices. */.      p
3d60: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
3d70: 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  e->pIndex;.     
3d80: 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70   while( ALWAYS(p
3d90: 29 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70  ) && p->pNext!=p
3da0: 49 6e 64 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e  Index ){ p = p->
3db0: 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 20 20 69  pNext; }.      i
3dc0: 66 28 20 41 4c 57 41 59 53 28 70 20 26 26 20 70  f( ALWAYS(p && p
3dd0: 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29  ->pNext==pIndex)
3de0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70   ){.        p->p
3df0: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70  Next = pIndex->p
3e00: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
3e10: 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65    }.    freeInde
3e20: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
3e30: 20 7d 0a 20 20 64 62 2d 3e 62 49 6e 74 65 72 6e   }.  db->bIntern
3e40: 43 68 61 6e 67 65 73 20 3d 20 31 3b 0a 7d 0a 0a  Changes = 1;.}..
3e50: 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75  /*.** Look throu
3e60: 67 68 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6f  gh the list of o
3e70: 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
3e80: 65 73 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20  es in db->aDb[] 
3e90: 61 6e 64 20 69 66 0a 2a 2a 20 61 6e 79 20 68 61  and if.** any ha
3ea0: 76 65 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 20  ve been closed, 
3eb0: 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d  remove them from
3ec0: 20 74 68 65 20 6c 69 73 74 2e 20 20 52 65 61 6c   the list.  Real
3ed0: 6c 6f 63 61 74 65 20 74 68 65 0a 2a 2a 20 64 62  locate the.** db
3ee0: 2d 3e 61 44 62 5b 5d 20 73 74 72 75 63 74 75 72  ->aDb[] structur
3ef0: 65 20 74 6f 20 61 20 73 6d 61 6c 6c 65 72 20 73  e to a smaller s
3f00: 69 7a 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65  ize, if possible
3f10: 2e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 79 20 30 20  ..**.** Entry 0 
3f20: 28 74 68 65 20 22 6d 61 69 6e 22 20 64 61 74 61  (the "main" data
3f30: 62 61 73 65 29 20 61 6e 64 20 65 6e 74 72 79 20  base) and entry 
3f40: 31 20 28 74 68 65 20 22 74 65 6d 70 22 20 64 61  1 (the "temp" da
3f50: 74 61 62 61 73 65 29 0a 2a 2a 20 61 72 65 20 6e  tabase).** are n
3f60: 65 76 65 72 20 63 61 6e 64 69 64 61 74 65 73 20  ever candidates 
3f70: 66 6f 72 20 62 65 69 6e 67 20 63 6f 6c 6c 61 70  for being collap
3f80: 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  sed..*/.void sql
3f90: 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61  ite3CollapseData
3fa0: 62 61 73 65 41 72 72 61 79 28 73 71 6c 69 74 65  baseArray(sqlite
3fb0: 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 2c  3 *db){.  int i,
3fc0: 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b   j;.  for(i=j=2;
3fd0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
3fe0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20  {.    struct Db 
3ff0: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
4000: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  i];.    if( pDb-
4010: 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >pBt==0 ){.     
4020: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4030: 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65  b, pDb->zDbSName
4040: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 44  );.      pDb->zD
4050: 62 53 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  bSName = 0;.    
4060: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
4070: 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b  }.    if( j<i ){
4080: 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a  .      db->aDb[j
4090: 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a  ] = db->aDb[i];.
40a0: 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20      }.    j++;. 
40b0: 20 7d 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a   }.  db->nDb = j
40c0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c  ;.  if( db->nDb<
40d0: 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64  =2 && db->aDb!=d
40e0: 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a  b->aDbStatic ){.
40f0: 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61      memcpy(db->a
4100: 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44  DbStatic, db->aD
4110: 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e  b, 2*sizeof(db->
4120: 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71  aDb[0]));.    sq
4130: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4140: 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64 62  db->aDb);.    db
4150: 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53  ->aDb = db->aDbS
4160: 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  tatic;.  }.}../*
4170: 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 73 63  .** Reset the sc
4180: 68 65 6d 61 20 66 6f 72 20 74 68 65 20 64 61 74  hema for the dat
4190: 61 62 61 73 65 20 61 74 20 69 6e 64 65 78 20 69  abase at index i
41a0: 44 62 2e 20 20 41 6c 73 6f 20 72 65 73 65 74 20  Db.  Also reset 
41b0: 74 68 65 0a 2a 2a 20 54 45 4d 50 20 73 63 68 65  the.** TEMP sche
41c0: 6d 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ma..*/.void sqli
41d0: 74 65 33 52 65 73 65 74 4f 6e 65 53 63 68 65 6d  te3ResetOneSchem
41e0: 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  a(sqlite3 *db, i
41f0: 6e 74 20 69 44 62 29 7b 0a 20 20 44 62 20 2a 70  nt iDb){.  Db *p
4200: 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  Db;.  assert( iD
4210: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20  b<db->nDb );..  
4220: 2f 2a 20 43 61 73 65 20 31 3a 20 20 52 65 73 65  /* Case 1:  Rese
4230: 74 20 74 68 65 20 73 69 6e 67 6c 65 20 73 63 68  t the single sch
4240: 65 6d 61 20 69 64 65 6e 74 69 66 69 65 64 20 62  ema identified b
4250: 79 20 69 44 62 20 2a 2f 0a 20 20 70 44 62 20 3d  y iDb */.  pDb =
4260: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
4270: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
4280: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
4290: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
42a0: 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70    assert( pDb->p
42b0: 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20 73  Schema!=0 );.  s
42c0: 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61  qlite3SchemaClea
42d0: 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b  r(pDb->pSchema);
42e0: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 64 61  ..  /* If any da
42f0: 74 61 62 61 73 65 20 6f 74 68 65 72 20 74 68 61  tabase other tha
4300: 6e 20 54 45 4d 50 20 69 73 20 72 65 73 65 74 2c  n TEMP is reset,
4310: 20 74 68 65 6e 20 61 6c 73 6f 20 72 65 73 65 74   then also reset
4320: 20 54 45 4d 50 0a 20 20 2a 2a 20 73 69 6e 63 65   TEMP.  ** since
4330: 20 54 45 4d 50 20 6d 69 67 68 74 20 62 65 20 68   TEMP might be h
4340: 6f 6c 64 69 6e 67 20 74 72 69 67 67 65 72 73 20  olding triggers 
4350: 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74  that reference t
4360: 61 62 6c 65 73 20 69 6e 20 74 68 65 0a 20 20 2a  ables in the.  *
4370: 2a 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  * other database
4380: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 44 62  ..  */.  if( iDb
4390: 21 3d 31 20 29 7b 0a 20 20 20 20 70 44 62 20 3d  !=1 ){.    pDb =
43a0: 20 26 64 62 2d 3e 61 44 62 5b 31 5d 3b 0a 20 20   &db->aDb[1];.  
43b0: 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70    assert( pDb->p
43c0: 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20 20  Schema!=0 );.   
43d0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c   sqlite3SchemaCl
43e0: 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61  ear(pDb->pSchema
43f0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b  );.  }.  return;
4400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
4410: 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72  all schema infor
4420: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 6c 6c 20  mation from all 
4430: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
4440: 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a  es (including.**
4450: 20 22 6d 61 69 6e 22 20 61 6e 64 20 22 74 65 6d   "main" and "tem
4460: 70 22 29 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  p") for a single
4470: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
4480: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
4490: 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
44a0: 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
44b0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
44c0: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
44d0: 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64  3BtreeEnterAll(d
44e0: 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  b);.  for(i=0; i
44f0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
4500: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
4510: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
4520: 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20  f( pDb->pSchema 
4530: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4540: 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d  SchemaClear(pDb-
4550: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d  >pSchema);.    }
4560: 0a 20 20 7d 0a 20 20 64 62 2d 3e 62 49 6e 74 65  .  }.  db->bInte
4570: 72 6e 43 68 61 6e 67 65 73 20 3d 20 30 3b 0a 20  rnChanges = 0;. 
4580: 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f   sqlite3VtabUnlo
4590: 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20 20 73 71  ckList(db);.  sq
45a0: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
45b0: 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  ll(db);.  sqlite
45c0: 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73  3CollapseDatabas
45d0: 65 41 72 72 61 79 28 64 62 29 3b 0a 7d 0a 0a 2f  eArray(db);.}../
45e0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
45f0: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
4600: 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73   a commit occurs
4610: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4620: 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43  3CommitInternalC
4630: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
4640: 64 62 29 7b 0a 20 20 64 62 2d 3e 62 49 6e 74 65  db){.  db->bInte
4650: 72 6e 43 68 61 6e 67 65 73 20 3d 20 30 3b 0a 7d  rnChanges = 0;.}
4660: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 6d  ../*.** Delete m
4670: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20  emory allocated 
4680: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  for the column n
4690: 61 6d 65 73 20 6f 66 20 61 20 74 61 62 6c 65 20  ames of a table 
46a0: 6f 72 20 76 69 65 77 20 28 74 68 65 0a 2a 2a 20  or view (the.** 
46b0: 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20 61 72 72  Table.aCol[] arr
46c0: 61 79 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ay)..*/.void sql
46d0: 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e  ite3DeleteColumn
46e0: 4e 61 6d 65 73 28 73 71 6c 69 74 65 33 20 2a 64  Names(sqlite3 *d
46f0: 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  b, Table *pTable
4700: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f  ){.  int i;.  Co
4710: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73  lumn *pCol;.  as
4720: 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20  sert( pTable!=0 
4730: 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d  );.  if( (pCol =
4740: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d   pTable->aCol)!=
4750: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
4760: 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ; i<pTable->nCol
4770: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
4780: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
4790: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e  ree(db, pCol->zN
47a0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
47b0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
47c0: 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a  , pCol->pDflt);.
47d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
47e0: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 43  ree(db, pCol->zC
47f0: 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  oll);.    }.    
4800: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4810: 2c 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b  , pTable->aCol);
4820: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
4830: 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  move the memory 
4840: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
4850: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
4860: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62  the given.** Tab
4870: 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73 20  le.  No changes 
4880: 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73 6b  are made to disk
4890: 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
48a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
48b0: 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74 65  tine just delete
48c0: 73 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63  s the data struc
48d0: 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20 6e  ture.  It does n
48e0: 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65  ot unlink.** the
48f0: 20 74 61 62 6c 65 20 64 61 74 61 20 73 74 72 75   table data stru
4900: 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 68  cture from the h
4910: 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74 20  ash table.  But 
4920: 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79 0a  it does destroy.
4930: 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  ** memory struct
4940: 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64 69  ures of the indi
4950: 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20  ces and foreign 
4960: 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20  keys associated 
4970: 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61 62  with .** the tab
4980: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 62  le..**.** The db
4990: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f 70   parameter is op
49a0: 74 69 6f 6e 61 6c 2e 20 20 49 74 20 69 73 20 6e  tional.  It is n
49b0: 65 65 64 65 64 20 69 66 20 74 68 65 20 54 61 62  eeded if the Tab
49c0: 6c 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f  le object .** co
49d0: 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61 73 69 64 65  ntains lookaside
49e0: 20 6d 65 6d 6f 72 79 2e 20 20 28 54 61 62 6c 65   memory.  (Table
49f0: 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20   objects in the 
4a00: 73 63 68 65 6d 61 20 64 6f 20 6e 6f 74 20 75 73  schema do not us
4a10: 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 20 6d  e.** lookaside m
4a20: 65 6d 6f 72 79 2c 20 62 75 74 20 73 6f 6d 65 20  emory, but some 
4a30: 65 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20  ephemeral Table 
4a40: 6f 62 6a 65 63 74 73 20 64 6f 2e 29 20 20 4f 72  objects do.)  Or
4a50: 20 74 68 65 0a 2a 2a 20 64 62 20 70 61 72 61 6d   the.** db param
4a60: 65 74 65 72 20 63 61 6e 20 62 65 20 75 73 65 64  eter can be used
4a70: 20 77 69 74 68 20 64 62 2d 3e 70 6e 42 79 74 65   with db->pnByte
4a80: 73 46 72 65 65 64 20 74 6f 20 6d 65 61 73 75 72  sFreed to measur
4a90: 65 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  e the memory.** 
4aa0: 75 73 65 64 20 62 79 20 74 68 65 20 54 61 62 6c  used by the Tabl
4ab0: 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  e object..*/.sta
4ac0: 74 69 63 20 76 6f 69 64 20 53 51 4c 49 54 45 5f  tic void SQLITE_
4ad0: 4e 4f 49 4e 4c 49 4e 45 20 64 65 6c 65 74 65 54  NOINLINE deleteT
4ae0: 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62  able(sqlite3 *db
4af0: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
4b00: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
4b10: 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 54 45 53  x, *pNext;.  TES
4b20: 54 4f 4e 4c 59 28 20 69 6e 74 20 6e 4c 6f 6f 6b  TONLY( int nLook
4b30: 61 73 69 64 65 3b 20 29 20 2f 2a 20 55 73 65 64  aside; ) /* Used
4b40: 20 74 6f 20 76 65 72 69 66 79 20 6c 6f 6f 6b 61   to verify looka
4b50: 73 69 64 65 20 6e 6f 74 20 75 73 65 64 20 66 6f  side not used fo
4b60: 72 20 73 63 68 65 6d 61 20 2a 2f 0a 0a 20 20 2f  r schema */..  /
4b70: 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  * Record the num
4b80: 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69  ber of outstandi
4b90: 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20 61 6c 6c  ng lookaside all
4ba0: 6f 63 61 74 69 6f 6e 73 20 69 6e 20 73 63 68 65  ocations in sche
4bb0: 6d 61 20 54 61 62 6c 65 73 0a 20 20 2a 2a 20 70  ma Tables.  ** p
4bc0: 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61 6e  rior to doing an
4bd0: 79 20 66 72 65 65 28 29 20 6f 70 65 72 61 74 69  y free() operati
4be0: 6f 6e 73 2e 20 20 53 69 6e 63 65 20 73 63 68 65  ons.  Since sche
4bf0: 6d 61 20 54 61 62 6c 65 73 20 64 6f 20 6e 6f 74  ma Tables do not
4c00: 20 75 73 65 0a 20 20 2a 2a 20 6c 6f 6f 6b 61 73   use.  ** lookas
4c10: 69 64 65 2c 20 74 68 69 73 20 6e 75 6d 62 65 72  ide, this number
4c20: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63 68 61 6e   should not chan
4c30: 67 65 2e 20 2a 2f 0a 20 20 54 45 53 54 4f 4e 4c  ge. */.  TESTONL
4c40: 59 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20  Y( nLookaside = 
4c50: 28 64 62 20 26 26 20 28 70 54 61 62 6c 65 2d 3e  (db && (pTable->
4c60: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
4c70: 68 65 6d 65 72 61 6c 29 3d 3d 30 29 20 3f 0a 20  hemeral)==0) ?. 
4c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c90: 20 20 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b          db->look
4ca0: 61 73 69 64 65 2e 6e 4f 75 74 20 3a 20 30 20 29  aside.nOut : 0 )
4cb0: 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61  ;..  /* Delete a
4cc0: 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63  ll indices assoc
4cd0: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
4ce0: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28  table. */.  for(
4cf0: 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d  pIndex = pTable-
4d00: 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b  >pIndex; pIndex;
4d10: 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a   pIndex=pNext){.
4d20: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64      pNext = pInd
4d30: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61  ex->pNext;.    a
4d40: 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 70  ssert( pIndex->p
4d50: 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e  Schema==pTable->
4d60: 70 53 63 68 65 6d 61 0a 20 20 20 20 20 20 20 20  pSchema.        
4d70: 20 7c 7c 20 28 49 73 56 69 72 74 75 61 6c 28 70   || (IsVirtual(p
4d80: 54 61 62 6c 65 29 20 26 26 20 70 49 6e 64 65 78  Table) && pIndex
4d90: 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54  ->idxType!=SQLIT
4da0: 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46  E_IDXTYPE_APPDEF
4db0: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 28 64 62  ) );.    if( (db
4dc0: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74  ==0 || db->pnByt
4dd0: 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26 20 21  esFreed==0) && !
4de0: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65  IsVirtual(pTable
4df0: 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ) ){.      char 
4e00: 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e 64 65 78 2d  *zName = pIndex-
4e10: 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20 20 20 20 54  >zName; .      T
4e20: 45 53 54 4f 4e 4c 59 20 28 20 49 6e 64 65 78 20  ESTONLY ( Index 
4e30: 2a 70 4f 6c 64 20 3d 20 29 20 73 71 6c 69 74 65  *pOld = ) sqlite
4e40: 33 48 61 73 68 49 6e 73 65 72 74 28 0a 20 20 20  3HashInsert(.   
4e50: 20 20 20 20 20 20 26 70 49 6e 64 65 78 2d 3e 70        &pIndex->p
4e60: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c  Schema->idxHash,
4e70: 20 7a 4e 61 6d 65 2c 20 30 0a 20 20 20 20 20 20   zName, 0.      
4e80: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
4e90: 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65   db==0 || sqlite
4ea0: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
4eb0: 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e  (db, 0, pIndex->
4ec0: 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20  pSchema) );.    
4ed0: 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d    assert( pOld==
4ee0: 70 49 6e 64 65 78 20 7c 7c 20 70 4f 6c 64 3d 3d  pIndex || pOld==
4ef0: 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  0 );.    }.    f
4f00: 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  reeIndex(db, pIn
4f10: 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  dex);.  }..  /* 
4f20: 44 65 6c 65 74 65 20 61 6e 79 20 66 6f 72 65 69  Delete any forei
4f30: 67 6e 20 6b 65 79 73 20 61 74 74 61 63 68 65 64  gn keys attached
4f40: 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 2e 20   to this table. 
4f50: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46 6b 44 65  */.  sqlite3FkDe
4f60: 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65 29  lete(db, pTable)
4f70: 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  ;..  /* Delete t
4f80: 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
4f90: 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a  re itself..  */.
4fa0: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 43    sqlite3DeleteC
4fb0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70  olumnNames(db, p
4fc0: 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65  Table);.  sqlite
4fd0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62  3DbFree(db, pTab
4fe0: 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  le->zName);.  sq
4ff0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5000: 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29  pTable->zColAff)
5010: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
5020: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62  tDelete(db, pTab
5030: 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  le->pSelect);.  
5040: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
5050: 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65  elete(db, pTable
5060: 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 69 66 6e 64  ->pCheck);.#ifnd
5070: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
5080: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71  IRTUALTABLE.  sq
5090: 6c 69 74 65 33 56 74 61 62 43 6c 65 61 72 28 64  lite3VtabClear(d
50a0: 62 2c 20 70 54 61 62 6c 65 29 3b 0a 23 65 6e 64  b, pTable);.#end
50b0: 69 66 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  if.  sqlite3DbFr
50c0: 65 65 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  ee(db, pTable);.
50d0: 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .  /* Verify tha
50e0: 74 20 6e 6f 20 6c 6f 6f 6b 61 73 69 64 65 20 6d  t no lookaside m
50f0: 65 6d 6f 72 79 20 77 61 73 20 75 73 65 64 20 62  emory was used b
5100: 79 20 73 63 68 65 6d 61 20 74 61 62 6c 65 73 20  y schema tables 
5110: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f  */.  assert( nLo
5120: 6f 6b 61 73 69 64 65 3d 3d 30 20 7c 7c 20 6e 4c  okaside==0 || nL
5130: 6f 6f 6b 61 73 69 64 65 3d 3d 64 62 2d 3e 6c 6f  ookaside==db->lo
5140: 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20 29 3b 0a  okaside.nOut );.
5150: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  }.void sqlite3De
5160: 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65  leteTable(sqlite
5170: 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54  3 *db, Table *pT
5180: 61 62 6c 65 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e  able){.  /* Do n
5190: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 74 61  ot delete the ta
51a0: 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65  ble until the re
51b0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65  ference count re
51c0: 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20  aches zero. */. 
51d0: 20 69 66 28 20 21 70 54 61 62 6c 65 20 29 20 72   if( !pTable ) r
51e0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 28 21  eturn;.  if( ((!
51f0: 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65  db || db->pnByte
5200: 73 46 72 65 65 64 3d 3d 30 29 20 26 26 20 28 2d  sFreed==0) && (-
5210: 2d 70 54 61 62 6c 65 2d 3e 6e 54 61 62 52 65 66  -pTable->nTabRef
5220: 29 3e 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  )>0) ) return;. 
5230: 20 64 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c   deleteTable(db,
5240: 20 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f 2a   pTable);.}.../*
5250: 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67  .** Unlink the g
5260: 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20  iven table from 
5270: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 73 20  the hash tables 
5280: 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65 20 74  and the delete t
5290: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75  he.** table stru
52a0: 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69  cture with all i
52b0: 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66  ts indices and f
52c0: 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a  oreign keys..*/.
52d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69  void sqlite3Unli
52e0: 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65  nkAndDeleteTable
52f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
5300: 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61  t iDb, const cha
5310: 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20  r *zTabName){.  
5320: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20 2a  Table *p;.  Db *
5330: 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pDb;..  assert( 
5340: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
5350: 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
5360: 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  <db->nDb );.  as
5370: 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 29  sert( zTabName )
5380: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
5390: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
53a0: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
53b0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 7a 54  ;.  testcase( zT
53c0: 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20  abName[0]==0 ); 
53d0: 20 2f 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68 20   /* Zero-length 
53e0: 74 61 62 6c 65 20 6e 61 6d 65 73 20 61 72 65 20  table names are 
53f0: 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44 62  allowed */.  pDb
5400: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
5410: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48  ;.  p = sqlite3H
5420: 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e  ashInsert(&pDb->
5430: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
5440: 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 30 29 3b 0a  , zTabName, 0);.
5450: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
5460: 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64  able(db, p);.  d
5470: 62 2d 3e 62 49 6e 74 65 72 6e 43 68 61 6e 67 65  b->bInternChange
5480: 73 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  s = 1;.}../*.** 
5490: 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72  Given a token, r
54a0: 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74  eturn a string t
54b0: 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  hat consists of 
54c0: 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 61 74  the text of that
54d0: 0a 2a 2a 20 74 6f 6b 65 6e 2e 20 20 53 70 61 63  .** token.  Spac
54e0: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
54f0: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a  turned string.**
5500: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
5510: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
5520: 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
5530: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
5540: 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  g.** function..*
5550: 2a 0a 2a 2a 20 41 6e 79 20 71 75 6f 74 61 74 69  *.** Any quotati
5560: 6f 6e 20 6d 61 72 6b 73 20 28 65 78 3a 20 20 22  on marks (ex:  "
5570: 6e 61 6d 65 22 2c 20 27 6e 61 6d 65 27 2c 20 5b  name", 'name', [
5580: 6e 61 6d 65 5d 2c 20 6f 72 20 60 6e 61 6d 65 60  name], or `name`
5590: 29 20 74 68 61 74 0a 2a 2a 20 73 75 72 72 6f 75  ) that.** surrou
55a0: 6e 64 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74  nd the body of t
55b0: 68 65 20 74 6f 6b 65 6e 20 61 72 65 20 72 65 6d  he token are rem
55c0: 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65  oved..**.** Toke
55d0: 6e 73 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73  ns are often jus
55e0: 74 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20  t pointers into 
55f0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
5600: 20 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20   text and so.** 
5610: 61 72 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72  are not \000 ter
5620: 6d 69 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20  minated and are 
5630: 6e 6f 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20  not persistent. 
5640: 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   The returned st
5650: 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20  ring.** is \000 
5660: 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69  terminated and i
5670: 73 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f  s persistent..*/
5680: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61  .char *sqlite3Na
5690: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69  meFromToken(sqli
56a0: 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a  te3 *db, Token *
56b0: 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a  pName){.  char *
56c0: 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61  zName;.  if( pNa
56d0: 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  me ){.    zName 
56e0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
56f0: 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 4e  up(db, (char*)pN
5700: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
5710: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
5720: 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  quote(zName);.  
5730: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65  }else{.    zName
5740: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
5750: 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zName;.}../*.
5760: 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69  ** Open the sqli
5770: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
5780: 73 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61  stored in databa
5790: 73 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f  se number iDb fo
57a0: 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68  r.** writing. Th
57b0: 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65  e table is opene
57c0: 64 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30  d using cursor 0
57d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
57e0: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
57f0: 28 50 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69  (Parse *p, int i
5800: 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Db){.  Vdbe *v =
5810: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
5820: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62  p);.  sqlite3Tab
5830: 6c 65 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d  leLock(p, iDb, M
5840: 41 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 4d  ASTER_ROOT, 1, M
5850: 41 53 54 45 52 5f 4e 41 4d 45 29 3b 0a 20 20 73  ASTER_NAME);.  s
5860: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
5870: 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  Int(v, OP_OpenWr
5880: 69 74 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52  ite, 0, MASTER_R
5890: 4f 4f 54 2c 20 69 44 62 2c 20 35 29 3b 0a 20 20  OOT, iDb, 5);.  
58a0: 69 66 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29  if( p->nTab==0 )
58b0: 7b 0a 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20  {.    p->nTab = 
58c0: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
58d0: 50 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20  Parameter zName 
58e0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d  points to a nul-
58f0: 74 65 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65  terminated buffe
5900: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
5910: 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61   name.** of a da
5920: 74 61 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20  tabase ("main", 
5930: 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61  "temp" or the na
5940: 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65  me of an attache
5950: 64 20 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66  d db). This.** f
5960: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
5970: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
5980: 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20   named database 
5990: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72  in db->aDb[], or
59a0: 0a 2a 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61  .** -1 if the na
59b0: 6d 65 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65  med db cannot be
59c0: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73   found..*/.int s
59d0: 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
59e0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
59f0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
5a00: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20  {.  int i = -1; 
5a10: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
5a20: 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ase number */.  
5a30: 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
5a40: 20 44 62 20 2a 70 44 62 3b 0a 20 20 20 20 66 6f   Db *pDb;.    fo
5a50: 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c  r(i=(db->nDb-1),
5a60: 20 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d   pDb=&db->aDb[i]
5a70: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62  ; i>=0; i--, pDb
5a80: 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30  --){.      if( 0
5a90: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ==sqlite3_stricm
5aa0: 70 28 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c  p(pDb->zDbSName,
5ab0: 20 7a 4e 61 6d 65 29 20 29 20 62 72 65 61 6b 3b   zName) ) break;
5ac0: 0a 20 20 20 20 20 20 2f 2a 20 22 6d 61 69 6e 22  .      /* "main"
5ad0: 20 69 73 20 61 6c 77 61 79 73 20 61 6e 20 61 63   is always an ac
5ae0: 63 65 70 74 61 62 6c 65 20 61 6c 69 61 73 20 66  ceptable alias f
5af0: 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20 64  or the primary d
5b00: 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
5b10: 20 65 76 65 6e 20 69 66 20 69 74 20 68 61 73 20   even if it has 
5b20: 62 65 65 6e 20 72 65 6e 61 6d 65 64 20 75 73 69  been renamed usi
5b30: 6e 67 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46  ng SQLITE_DBCONF
5b40: 49 47 5f 4d 41 49 4e 44 42 4e 41 4d 45 2e 20 2a  IG_MAINDBNAME. *
5b50: 2f 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30  /.      if( i==0
5b60: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73   && 0==sqlite3_s
5b70: 74 72 69 63 6d 70 28 22 6d 61 69 6e 22 2c 20 7a  tricmp("main", z
5b80: 4e 61 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a 20  Name) ) break;. 
5b90: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5ba0: 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n i;.}../*.** Th
5bb0: 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63  e token *pName c
5bc0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65  ontains the name
5bd0: 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28   of a database (
5be0: 65 69 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72  either "main" or
5bf0: 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68  .** "temp" or th
5c00: 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74  e name of an att
5c10: 61 63 68 65 64 20 64 62 29 2e 20 54 68 69 73 20  ached db). This 
5c20: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
5c30: 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20  the.** index of 
5c40: 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61  the named databa
5c50: 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c  se in db->aDb[],
5c60: 20 6f 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61   or -1 if the na
5c70: 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20  med db .** does 
5c80: 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e  not exist..*/.in
5c90: 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28  t sqlite3FindDb(
5ca0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b  sqlite3 *db, Tok
5cb0: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e  en *pName){.  in
5cc0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
5cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ce0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
5cf0: 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20  umber */.  char 
5d00: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
5d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d20: 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73  /* Name we are s
5d30: 65 61 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a  earching for */.
5d40: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
5d50: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
5d60: 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d  b, pName);.  i =
5d70: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
5d80: 6d 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  me(db, zName);. 
5d90: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5da0: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  b, zName);.  ret
5db0: 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  urn i;.}../* The
5dc0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f   table or view o
5dd0: 72 20 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69  r trigger name i
5de0: 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  s passed to this
5df0: 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b   routine via tok
5e00: 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e  ens.** pName1 an
5e10: 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65  d pName2. If the
5e20: 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20   table name was 
5e30: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
5e40: 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   for example:.**
5e50: 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45  .** CREATE TABLE
5e60: 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a   xxx.yyy (...);.
5e70: 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d  ** .** Then pNam
5e80: 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78  e1 is set to "xx
5e90: 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79  x" and pName2 "y
5ea0: 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  yy". On the othe
5eb0: 72 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65  r hand if.** the
5ec0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e   table name is n
5ed0: 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  ot fully qualifi
5ee0: 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20  ed, i.e.:.**.** 
5ef0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79  CREATE TABLE yyy
5f00: 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  (...);.**.** The
5f10: 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20  n pName1 is set 
5f20: 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61  to "yyy" and pNa
5f30: 6d 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a  me2 is ""..**.**
5f40: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
5f50: 74 73 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c  ts the *ppUnqual
5f60: 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e   pointer to poin
5f70: 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28  t at the token (
5f80: 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61  pName1 or.** pNa
5f90: 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73  me2) that stores
5fa0: 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64   the unqualified
5fb0: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68   table name.  Th
5fc0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a  e index of the.*
5fd0: 2a 20 64 61 74 61 62 61 73 65 20 22 78 78 78 22  * database "xxx"
5fe0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
5ff0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50  .int sqlite3TwoP
6000: 61 72 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65  artName(.  Parse
6010: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
6020: 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
6030: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
6040: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
6050: 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f   *pName1,      /
6060: 2a 20 54 68 65 20 22 78 78 78 22 20 69 6e 20 74  * The "xxx" in t
6070: 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79  he name "xxx.yyy
6080: 22 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20  " or "xxx" */.  
6090: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
60a0: 20 20 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22      /* The "yyy"
60b0: 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78   in the name "xx
60c0: 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65  x.yyy" */.  Toke
60d0: 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20  n **pUnqual     
60e0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 75 6e 71  /* Write the unq
60f0: 75 61 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20  ualified object 
6100: 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  name here */.){.
6110: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
6120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6130: 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   Database holdin
6140: 67 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  g the object */.
6150: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
6160: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61  pParse->db;..  a
6170: 73 73 65 72 74 28 20 70 4e 61 6d 65 32 21 3d 30  ssert( pName2!=0
6180: 20 29 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 32   );.  if( pName2
6190: 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  ->n>0 ){.    if(
61a0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
61b0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
61c0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
61d0: 20 22 63 6f 72 72 75 70 74 20 64 61 74 61 62 61   "corrupt databa
61e0: 73 65 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  se");.      retu
61f0: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn -1;.    }.   
6200: 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d   *pUnqual = pNam
6210: 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  e2;.    iDb = sq
6220: 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20  lite3FindDb(db, 
6230: 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28  pName1);.    if(
6240: 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20   iDb<0 ){.      
6250: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
6260: 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
6270: 20 64 61 74 61 62 61 73 65 20 25 54 22 2c 20 70   database %T", p
6280: 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 72 65  Name1);.      re
6290: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
62a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
62b0: 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  rt( db->init.iDb
62c0: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e  ==0 || db->init.
62d0: 62 75 73 79 20 7c 7c 20 28 64 62 2d 3e 66 6c 61  busy || (db->fla
62e0: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 61 63 75  gs & SQLITE_Vacu
62f0: 75 6d 29 21 3d 30 29 3b 0a 20 20 20 20 69 44 62  um)!=0);.    iDb
6300: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b   = db->init.iDb;
6310: 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20  .    *pUnqual = 
6320: 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65  pName1;.  }.  re
6330: 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a  turn iDb;.}../*.
6340: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6350: 69 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b  is used to check
6360: 20 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 74   if the UTF-8 st
6370: 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20  ring zName is a 
6380: 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69  legal.** unquali
6390: 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20  fied name for a 
63a0: 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63  new schema objec
63b0: 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c  t (table, index,
63c0: 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67   view or.** trig
63d0: 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20  ger). All names 
63e0: 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74  are legal except
63f0: 20 74 68 6f 73 65 20 74 68 61 74 20 62 65 67 69   those that begi
6400: 6e 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e  n with the strin
6410: 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28  g.** "sqlite_" (
6420: 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20  in upper, lower 
6430: 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20  or mixed case). 
6440: 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20  This portion of 
6450: 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a  the namespace.**
6460: 20 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72   is reserved for
6470: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a   internal use..*
6480: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65  /.int sqlite3Che
6490: 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72  ckObjectName(Par
64a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
64b0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
64c0: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64    if( !pParse->d
64d0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
64e0: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d  pParse->nested==
64f0: 30 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  0 .          && 
6500: 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61  (pParse->db->fla
6510: 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74  gs & SQLITE_Writ
6520: 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20  eSchema)==0.    
6530: 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69        && 0==sqli
6540: 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d  te3StrNICmp(zNam
6550: 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29  e, "sqlite_", 7)
6560: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
6570: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
6580: 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73  "object name res
6590: 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e  erved for intern
65a0: 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61  al use: %s", zNa
65b0: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
65c0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
65d0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
65e0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
65f0: 65 74 75 72 6e 20 74 68 65 20 50 52 49 4d 41 52  eturn the PRIMAR
6600: 59 20 4b 45 59 20 69 6e 64 65 78 20 6f 66 20 61  Y KEY index of a
6610: 20 74 61 62 6c 65 0a 2a 2f 0a 49 6e 64 65 78 20   table.*/.Index 
6620: 2a 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b  *sqlite3PrimaryK
6630: 65 79 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70  eyIndex(Table *p
6640: 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  Tab){.  Index *p
6650: 3b 0a 20 20 66 6f 72 28 70 3d 70 54 61 62 2d 3e  ;.  for(p=pTab->
6660: 70 49 6e 64 65 78 3b 20 70 20 26 26 20 21 49 73  pIndex; p && !Is
6670: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
6680: 70 29 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b  p); p=p->pNext){
6690: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
66a0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
66b0: 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65  e column of inde
66c0: 78 20 70 49 64 78 20 74 68 61 74 20 63 6f 72 72  x pIdx that corr
66d0: 65 73 70 6f 6e 64 73 20 74 6f 20 74 61 62 6c 65  esponds to table
66e0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2e  .** column iCol.
66f0: 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 6e    Return -1 if n
6700: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 31 36  ot found..*/.i16
6710: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
6720: 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64  Index(Index *pId
6730: 78 2c 20 69 31 36 20 69 43 6f 6c 29 7b 0a 20 20  x, i16 iCol){.  
6740: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
6750: 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; i<pIdx->nColum
6760: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  n; i++){.    if(
6770: 20 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61 69 43   iCol==pIdx->aiC
6780: 6f 6c 75 6d 6e 5b 69 5d 20 29 20 72 65 74 75 72  olumn[i] ) retur
6790: 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
67a0: 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  n -1;.}../*.** B
67b0: 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e  egin constructin
67c0: 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65  g a new table re
67d0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20  presentation in 
67e0: 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73  memory.  This is
67f0: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66  .** the first of
6800: 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20   several action 
6810: 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65  routines that ge
6820: 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70  t called in resp
6830: 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45  onse.** to a CRE
6840: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
6850: 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75  ent.  In particu
6860: 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  lar, this routin
6870: 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61  e is called.** a
6880: 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65  fter seeing toke
6890: 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e 64 20  ns "CREATE" and 
68a0: 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20  "TABLE" and the 
68b0: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20  table name. The 
68c0: 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69  isTemp.** flag i
68d0: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74 61  s true if the ta
68e0: 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74  ble should be st
68f0: 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75 78 69  ored in the auxi
6900: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a  liary database.*
6910: 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  * file instead o
6920: 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  f in the main da
6930: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
6940: 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74  is is normally t
6950: 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20  he case.** when 
6960: 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54  the "TEMP" or "T
6970: 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72  EMPORARY" keywor
6980: 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77  d occurs in betw
6990: 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e  een.** CREATE an
69a0: 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54  d TABLE..**.** T
69b0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63  he new table rec
69c0: 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ord is initializ
69d0: 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50  ed and put in pP
69e0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e  arse->pNewTable.
69f0: 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74  .** As more of t
6a00: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
6a10: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
6a20: 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  sed, additional 
6a30: 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e  action.** routin
6a40: 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  es will be calle
6a50: 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e  d to add more in
6a60: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69  formation to thi
6a70: 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20  s record..** At 
6a80: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43  the end of the C
6a90: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
6aa0: 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74  ement, the sqlit
6ab0: 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75  e3EndTable() rou
6ac0: 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
6ad0: 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68  d to complete th
6ae0: 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f  e construction o
6af0: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
6b00: 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20  record..*/.void 
6b10: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
6b20: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
6b30: 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20  se,   /* Parser 
6b40: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
6b50: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a  en *pName1,   /*
6b60: 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 74   First part of t
6b70: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
6b80: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a  able or view */.
6b90: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
6ba0: 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72     /* Second par
6bb0: 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  t of the name of
6bc0: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
6bd0: 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  ew */.  int isTe
6be0: 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65  mp,      /* True
6bf0: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 54 45   if this is a TE
6c00: 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  MP table */.  in
6c10: 74 20 69 73 56 69 65 77 2c 20 20 20 20 20 20 2f  t isView,      /
6c20: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
6c30: 73 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e  s a VIEW */.  in
6c40: 74 20 69 73 56 69 72 74 75 61 6c 2c 20 20 20 2f  t isVirtual,   /
6c50: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
6c60: 73 20 61 20 56 49 52 54 55 41 4c 20 74 61 62 6c  s a VIRTUAL tabl
6c70: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72  e */.  int noErr
6c80: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
6c90: 74 68 69 6e 67 20 69 66 20 74 61 62 6c 65 20 61  thing if table a
6ca0: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
6cb0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
6cc0: 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  ble;.  char *zNa
6cd0: 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e  me = 0; /* The n
6ce0: 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ame of the new t
6cf0: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
6d00: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
6d10: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  db;.  Vdbe *v;. 
6d20: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
6d30: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75    /* Database nu
6d40: 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65 20 74  mber to create t
6d50: 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20  he table in */. 
6d60: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20   Token *pName;  
6d70: 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64    /* Unqualified
6d80: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
6d90: 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a  le to create */.
6da0: 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
6db0: 62 75 73 79 20 26 26 20 64 62 2d 3e 69 6e 69 74  busy && db->init
6dc0: 2e 6e 65 77 54 6e 75 6d 3d 3d 31 20 29 7b 0a 20  .newTnum==1 ){. 
6dd0: 20 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61     /* Special ca
6de0: 73 65 3a 20 20 50 61 72 73 69 6e 67 20 74 68 65  se:  Parsing the
6df0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 6f   sqlite_master o
6e00: 72 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61  r sqlite_temp_ma
6e10: 73 74 65 72 20 73 63 68 65 6d 61 20 2a 2f 0a 20  ster schema */. 
6e20: 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69     iDb = db->ini
6e30: 74 2e 69 44 62 3b 0a 20 20 20 20 7a 4e 61 6d 65  t.iDb;.    zName
6e40: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
6e50: 75 70 28 64 62 2c 20 53 43 48 45 4d 41 5f 54 41  up(db, SCHEMA_TA
6e60: 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 20 20 70  BLE(iDb));.    p
6e70: 4e 61 6d 65 20 3d 20 70 4e 61 6d 65 31 3b 0a 20  Name = pName1;. 
6e80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
6e90: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a  he common case *
6ea0: 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  /.    iDb = sqli
6eb0: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
6ec0: 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
6ed0: 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
6ee0: 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 20      if( iDb<0 ) 
6ef0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20  return;.    if( 
6f00: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
6f10: 69 73 54 65 6d 70 20 26 26 20 70 4e 61 6d 65 32  isTemp && pName2
6f20: 2d 3e 6e 3e 30 20 26 26 20 69 44 62 21 3d 31 20  ->n>0 && iDb!=1 
6f30: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 63  ){.      /* If c
6f40: 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74  reating a temp t
6f50: 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d  able, the name m
6f60: 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66  ay not be qualif
6f70: 69 65 64 2e 20 55 6e 6c 65 73 73 20 0a 20 20 20  ied. Unless .   
6f80: 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
6f90: 73 65 20 6e 61 6d 65 20 69 73 20 22 74 65 6d 70  se name is "temp
6fa0: 22 20 61 6e 79 77 61 79 2e 20 20 2a 2f 0a 20 20  " anyway.  */.  
6fb0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6fc0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 65 6d  Msg(pParse, "tem
6fd0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e 61 6d  porary table nam
6fe0: 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75 61 6c  e must be unqual
6ff0: 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 72  ified");.      r
7000: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
7010: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
7020: 42 20 26 26 20 69 73 54 65 6d 70 20 29 20 69 44  B && isTemp ) iD
7030: 62 20 3d 20 31 3b 0a 20 20 20 20 7a 4e 61 6d 65  b = 1;.    zName
7040: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
7050: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d  omToken(db, pNam
7060: 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65  e);.  }.  pParse
7070: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a  ->sNameToken = *
7080: 70 4e 61 6d 65 3b 0a 20 20 69 66 28 20 7a 4e 61  pName;.  if( zNa
7090: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
70a0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
70b0: 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
70c0: 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
70d0: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f  zName) ){.    go
70e0: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
70f0: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rror;.  }.  if( 
7100: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20  db->init.iDb==1 
7110: 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69  ) isTemp = 1;.#i
7120: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7130: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
7140: 20 20 61 73 73 65 72 74 28 20 69 73 54 65 6d 70    assert( isTemp
7150: 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 3d 3d 31  ==0 || isTemp==1
7160: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
7170: 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69 65  View==0 || isVie
7180: 77 3d 3d 31 20 29 3b 0a 20 20 7b 0a 20 20 20 20  w==1 );.  {.    
7190: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
71a0: 61 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  aCode[] = {.    
71b0: 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45     SQLITE_CREATE
71c0: 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 53  _TABLE,.       S
71d0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
71e0: 50 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20  P_TABLE,.       
71f0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49  SQLITE_CREATE_VI
7200: 45 57 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54  EW,.       SQLIT
7210: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49  E_CREATE_TEMP_VI
7220: 45 57 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 68  EW.    };.    ch
7230: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
7240: 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b  b[iDb].zDbSName;
7250: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
7260: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
7270: 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
7280: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73   SCHEMA_TABLE(is
7290: 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29  Temp), 0, zDb) )
72a0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  {.      goto beg
72b0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
72c0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69      }.    if( !i
72d0: 73 56 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69  sVirtual && sqli
72e0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
72f0: 72 73 65 2c 20 28 69 6e 74 29 61 43 6f 64 65 5b  rse, (int)aCode[
7300: 69 73 54 65 6d 70 2b 32 2a 69 73 56 69 65 77 5d  isTemp+2*isView]
7310: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
7320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7330: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20           zName, 
7340: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
7350: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
7360: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
7370: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
7380: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65  Make sure the ne
7390: 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65  w table name doe
73a0: 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69  s not collide wi
73b0: 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  th an existing. 
73c0: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
73d0: 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  le name in the s
73e0: 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ame database.  I
73f0: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ssue an error me
7400: 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74  ssage if.  ** it
7410: 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70   does. The excep
7420: 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73  tion is if the s
7430: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70  tatement being p
7440: 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65 64  arsed was passed
7450: 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69  .  ** to an sqli
7460: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
7470: 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74  () call. In that
7480: 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63   case only the c
7490: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a  olumn names.  **
74a0: 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20   and types will 
74b0: 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72  be used, so ther
74c0: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
74d0: 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61  test for namespa
74e0: 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f  ce.  ** collisio
74f0: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
7500: 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
7510: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62  ){.    char *zDb
7520: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
7530: 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69 66  zDbSName;.    if
7540: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
7550: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
7560: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20  Parse) ){.      
7570: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
7580: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
7590: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
75a0: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
75b0: 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20  zName, zDb);.   
75c0: 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20   if( pTable ){. 
75d0: 20 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20       if( !noErr 
75e0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
75f0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7600: 65 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72  e, "table %T alr
7610: 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e  eady exists", pN
7620: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
7630: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
7640: 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
7650: 79 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  y || CORRUPT_DB 
7660: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7670: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
7680: 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
7690: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
76a0: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
76b0: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
76c0: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
76d0: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
76e0: 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20   zDb)!=0 ){.    
76f0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
7700: 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
7710: 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69   is already an i
7720: 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20  ndex named %s", 
7730: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f  zName);.      go
7740: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7750: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rror;.    }.  }.
7760: 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  .  pTable = sqli
7770: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
7780: 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
7790: 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65  ));.  if( pTable
77a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
77b0: 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
77c0: 6c 65 64 20 29 3b 0a 20 20 20 20 70 50 61 72 73  led );.    pPars
77d0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  e->rc = SQLITE_N
77e0: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 70  OMEM_BKPT;.    p
77f0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
7800: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
7810: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  ble_error;.  }. 
7820: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d   pTable->zName =
7830: 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65   zName;.  pTable
7840: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
7850: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20  pTable->pSchema 
7860: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
7870: 53 63 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65  Schema;.  pTable
7880: 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20  ->nTabRef = 1;. 
7890: 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67   pTable->nRowLog
78a0: 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72  Est = 200; asser
78b0: 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c  t( 200==sqlite3L
78c0: 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29  ogEst(1048576) )
78d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
78e0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30  se->pNewTable==0
78f0: 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e   );.  pParse->pN
7900: 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65  ewTable = pTable
7910: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
7920: 69 73 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c  is the magic sql
7930: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
7940: 6c 65 20 75 73 65 64 20 62 79 20 61 75 74 6f 69  le used by autoi
7950: 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74  ncrement,.  ** t
7960: 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69  hen record a poi
7970: 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74 61 62  nter to this tab
7980: 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64  le in the main d
7990: 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
79a0: 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49  e.  ** so that I
79b0: 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74  NSERT can find t
79c0: 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e  he table easily.
79d0: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
79e0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
79f0: 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70  CREMENT.  if( !p
7a00: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26  Parse->nested &&
7a10: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22   strcmp(zName, "
7a20: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22  sqlite_sequence"
7a30: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  )==0 ){.    asse
7a40: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
7a50: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
7a60: 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 54  Db, 0) );.    pT
7a70: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70  able->pSchema->p
7a80: 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b  SeqTab = pTable;
7a90: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
7aa0: 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69  * Begin generati
7ab0: 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  ng the code that
7ac0: 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65   will insert the
7ad0: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e   table record in
7ae0: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49  to.  ** the SQLI
7af0: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e  TE_MASTER table.
7b00: 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63    Note in partic
7b10: 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75 73  ular that we mus
7b20: 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20  t go ahead.  ** 
7b30: 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65  and allocate the
7b40: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
7b50: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74  or the table ent
7b60: 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20  ry now.  Before 
7b70: 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59  any.  ** PRIMARY
7b80: 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b   KEY or UNIQUE k
7b90: 65 79 77 6f 72 64 73 20 61 72 65 20 70 61 72 73  eywords are pars
7ba0: 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f  ed.  Those keywo
7bb0: 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20  rds will cause. 
7bc0: 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62   ** indices to b
7bd0: 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 74 68  e created and th
7be0: 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d  e table record m
7bf0: 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20  ust come before 
7c00: 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65  the .  ** indice
7c10: 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72  s.  Hence, the r
7c20: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72  ecord number for
7c30: 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20   the table must 
7c40: 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a  be allocated.  *
7c50: 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  * now..  */.  if
7c60: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
7c70: 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33   && (v = sqlite3
7c80: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 29  GetVdbe(pParse))
7c90: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  !=0 ){.    int a
7ca0: 64 64 72 31 3b 0a 20 20 20 20 69 6e 74 20 66 69  ddr1;.    int fi
7cb0: 6c 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20 69 6e  leFormat;.    in
7cc0: 74 20 72 65 67 31 2c 20 72 65 67 32 2c 20 72 65  t reg1, reg2, re
7cd0: 67 33 3b 0a 20 20 20 20 2f 2a 20 6e 75 6c 6c 52  g3;.    /* nullR
7ce0: 6f 77 5b 5d 20 69 73 20 61 6e 20 4f 50 5f 52 65  ow[] is an OP_Re
7cf0: 63 6f 72 64 20 65 6e 63 6f 64 69 6e 67 20 6f 66  cord encoding of
7d00: 20 61 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e   a row containin
7d10: 67 20 35 20 4e 55 4c 4c 73 20 2a 2f 0a 20 20 20  g 5 NULLs */.   
7d20: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
7d30: 61 72 20 6e 75 6c 6c 52 6f 77 5b 5d 20 3d 20 7b  ar nullRow[] = {
7d40: 20 36 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   6, 0, 0, 0, 0, 
7d50: 30 20 7d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 };.    sqlite3
7d60: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
7d70: 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
7d80: 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  Db);..#ifndef SQ
7d90: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
7da0: 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 69  LTABLE.    if( i
7db0: 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20  sVirtual ){.    
7dc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7dd0: 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e  Op0(v, OP_VBegin
7de0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
7df0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
7e00: 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 65  ile format and e
7e10: 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68 65 20 64  ncoding in the d
7e20: 61 74 61 62 61 73 65 20 68 61 76 65 20 6e 6f 74  atabase have not
7e30: 20 62 65 65 6e 20 73 65 74 2c 20 0a 20 20 20 20   been set, .    
7e40: 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e  ** set them now.
7e50: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 31  .    */.    reg1
7e60: 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f   = pParse->regRo
7e70: 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  wid = ++pParse->
7e80: 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 32 20 3d  nMem;.    reg2 =
7e90: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
7ea0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
7eb0: 6d 3b 0a 20 20 20 20 72 65 67 33 20 3d 20 2b 2b  m;.    reg3 = ++
7ec0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
7ed0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7ee0: 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f  Op3(v, OP_ReadCo
7ef0: 6f 6b 69 65 2c 20 69 44 62 2c 20 72 65 67 33 2c  okie, iDb, reg3,
7f00: 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d   BTREE_FILE_FORM
7f10: 41 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  AT);.    sqlite3
7f20: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
7f30: 20 69 44 62 29 3b 0a 20 20 20 20 61 64 64 72 31   iDb);.    addr1
7f40: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
7f50: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp1(v, OP_If, r
7f60: 65 67 33 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eg3); VdbeCovera
7f70: 67 65 28 76 29 3b 0a 20 20 20 20 66 69 6c 65 46  ge(v);.    fileF
7f80: 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61  ormat = (db->fla
7f90: 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 65 67 61  gs & SQLITE_Lega
7fa0: 63 79 46 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a  cyFileFmt)!=0 ?.
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fc0: 20 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d 41 58    1 : SQLITE_MAX
7fd0: 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20 20  _FILE_FORMAT;.  
7fe0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7ff0: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  Op3(v, OP_SetCoo
8000: 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f  kie, iDb, BTREE_
8010: 46 49 4c 45 5f 46 4f 52 4d 41 54 2c 20 66 69 6c  FILE_FORMAT, fil
8020: 65 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71  eFormat);.    sq
8030: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
8040: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
8050: 20 69 44 62 2c 20 42 54 52 45 45 5f 54 45 58 54   iDb, BTREE_TEXT
8060: 5f 45 4e 43 4f 44 49 4e 47 2c 20 45 4e 43 28 64  _ENCODING, ENC(d
8070: 62 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  b));.    sqlite3
8080: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
8090: 61 64 64 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  addr1);..    /* 
80a0: 54 68 69 73 20 6a 75 73 74 20 63 72 65 61 74 65  This just create
80b0: 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72  s a place-holder
80c0: 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 73   record in the s
80d0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
80e0: 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72  le..    ** The r
80f0: 65 63 6f 72 64 20 63 72 65 61 74 65 64 20 64 6f  ecord created do
8100: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
8110: 6e 79 74 68 69 6e 67 20 79 65 74 2e 20 20 49 74  nything yet.  It
8120: 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61 63 65   will be replace
8130: 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  d.    ** by the 
8140: 72 65 61 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f  real entry in co
8150: 64 65 20 67 65 6e 65 72 61 74 65 64 20 61 74 20  de generated at 
8160: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
8170: 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
8180: 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74   The rowid for t
8190: 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20  he new entry is 
81a0: 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74 65 72  left in register
81b0: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69   pParse->regRowi
81c0: 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  d..    ** The ro
81d0: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
81e0: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
81f0: 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 20 70  is left in reg p
8200: 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a  Parse->regRoot..
8210: 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64      ** The rowid
8220: 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 6e   and root page n
8230: 75 6d 62 65 72 20 76 61 6c 75 65 73 20 61 72 65  umber values are
8240: 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 63   needed by the c
8250: 6f 64 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ode that.    ** 
8260: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 20  sqlite3EndTable 
8270: 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20  will generate.. 
8280: 20 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e     */.#if !defin
8290: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
82a0: 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
82b0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
82c0: 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 69  TUALTABLE).    i
82d0: 66 28 20 69 73 56 69 65 77 20 7c 7c 20 69 73 56  f( isView || isV
82e0: 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20  irtual ){.      
82f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8300: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
8310: 20 30 2c 20 72 65 67 32 29 3b 0a 20 20 20 20 7d   0, reg2);.    }
8320: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
8330: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
8340: 61 64 64 72 43 72 54 61 62 20 3d 20 73 71 6c 69  addrCrTab = sqli
8350: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8360: 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c   OP_CreateTable,
8370: 20 69 44 62 2c 20 72 65 67 32 29 3b 0a 20 20 20   iDb, reg2);.   
8380: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70   }.    sqlite3Op
8390: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50  enMasterTable(pP
83a0: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
83b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
83c0: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
83d0: 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20 20 20 20  , 0, reg1);.    
83e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
83f0: 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 36 2c  4(v, OP_Blob, 6,
8400: 20 72 65 67 33 2c 20 30 2c 20 6e 75 6c 6c 52 6f   reg3, 0, nullRo
8410: 77 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20  w, P4_STATIC);. 
8420: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8430: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
8440: 74 2c 20 30 2c 20 72 65 67 33 2c 20 72 65 67 31  t, 0, reg3, reg1
8450: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8460: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
8470: 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
8480: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8490: 4f 70 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29  Op0(v, OP_Close)
84a0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d  ;.  }..  /* Norm
84b0: 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72  al (non-error) r
84c0: 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75  eturn. */.  retu
84d0: 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20  rn;..  /* If an 
84e0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65  error occurs, we
84f0: 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65   jump here */.be
8500: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a  gin_table_error:
8510: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
8520: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72  (db, zName);.  r
8530: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 74  eturn;.}../* Set
8540: 20 70 72 6f 70 65 72 74 69 65 73 20 6f 66 20 61   properties of a
8550: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 62 61   table column ba
8560: 73 65 64 20 6f 6e 20 74 68 65 20 28 6d 61 67 69  sed on the (magi
8570: 63 61 6c 29 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20  cal).** name of 
8580: 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 23  the column..*/.#
8590: 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
85a0: 5f 48 49 44 44 45 4e 5f 43 4f 4c 55 4d 4e 53 0a  _HIDDEN_COLUMNS.
85b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 75  void sqlite3Colu
85c0: 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d  mnPropertiesFrom
85d0: 4e 61 6d 65 28 54 61 62 6c 65 20 2a 70 54 61 62  Name(Table *pTab
85e0: 2c 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b  , Column *pCol){
85f0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
8600: 74 72 6e 69 63 6d 70 28 70 43 6f 6c 2d 3e 7a 4e  trnicmp(pCol->zN
8610: 61 6d 65 2c 20 22 5f 5f 68 69 64 64 65 6e 5f 5f  ame, "__hidden__
8620: 22 2c 20 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 10)==0 ){.   
8630: 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
8640: 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45  |= COLFLAG_HIDDE
8650: 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  N;.  }else if( p
8660: 54 61 62 20 26 26 20 70 43 6f 6c 21 3d 70 54 61  Tab && pCol!=pTa
8670: 62 2d 3e 61 43 6f 6c 20 26 26 20 28 70 43 6f 6c  b->aCol && (pCol
8680: 5b 2d 31 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20  [-1].colFlags & 
8690: 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e 29 20  COLFLAG_HIDDEN) 
86a0: 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62  ){.    pTab->tab
86b0: 46 6c 61 67 73 20 7c 3d 20 54 46 5f 4f 4f 4f 48  Flags |= TF_OOOH
86c0: 69 64 64 65 6e 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  idden;.  }.}.#en
86d0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  dif.../*.** Add 
86e0: 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20  a new column to 
86f0: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
8700: 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
8710: 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ucted..**.** The
8720: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
8730: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20  is routine once 
8740: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
8750: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69  declaration.** i
8760: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
8770: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c   statement.  sql
8780: 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29  ite3StartTable()
8790: 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20   gets called.** 
87a0: 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69  first to get thi
87b0: 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e  ngs going.  Then
87c0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
87d0: 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68   called for each
87e0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76  .** column..*/.v
87f0: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
8800: 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72  lumn(Parse *pPar
8810: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
8820: 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b  , Token *pType){
8830: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
8840: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nt i;.  char *z;
8850: 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a  .  char *zType;.
8860: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
8870: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8880: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
8890: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
88a0: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
88b0: 65 74 75 72 6e 3b 0a 23 69 66 20 53 51 4c 49 54  eturn;.#if SQLIT
88c0: 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69  E_MAX_COLUMN.  i
88d0: 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d  f( p->nCol+1>db-
88e0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
88f0: 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a  IMIT_COLUMN] ){.
8900: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8910: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
8920: 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e   many columns on
8930: 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b   %s", p->zName);
8940: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8950: 0a 23 65 6e 64 69 66 0a 20 20 7a 20 3d 20 73 71  .#endif.  z = sq
8960: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
8970: 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 6e 20 2b 20  (db, pName->n + 
8980: 70 54 79 70 65 2d 3e 6e 20 2b 20 32 29 3b 0a 20  pType->n + 2);. 
8990: 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
89a0: 72 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20  rn;.  memcpy(z, 
89b0: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
89c0: 3e 6e 29 3b 0a 20 20 7a 5b 70 4e 61 6d 65 2d 3e  >n);.  z[pName->
89d0: 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  n] = 0;.  sqlite
89e0: 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 66  3Dequote(z);.  f
89f0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
8a00: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
8a10: 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
8a20: 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (z, p->aCol[i].z
8a30: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
8a40: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8a50: 67 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69  g(pParse, "dupli
8a60: 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  cate column name
8a70: 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20  : %s", z);.     
8a80: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8a90: 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74  b, z);.      ret
8aa0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  urn;.    }.  }. 
8ab0: 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20   if( (p->nCol & 
8ac0: 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43  0x7)==0 ){.    C
8ad0: 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20  olumn *aNew;.   
8ae0: 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   aNew = sqlite3D
8af0: 62 52 65 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61  bRealloc(db,p->a
8b00: 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a  Col,(p->nCol+8)*
8b10: 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30  sizeof(p->aCol[0
8b20: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65  ]));.    if( aNe
8b30: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  w==0 ){.      sq
8b40: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
8b50: 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  z);.      return
8b60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61  ;.    }.    p->a
8b70: 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a  Col = aNew;.  }.
8b80: 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f    pCol = &p->aCo
8b90: 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65  l[p->nCol];.  me
8ba0: 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69  mset(pCol, 0, si
8bb0: 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29  zeof(p->aCol[0])
8bc0: 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  );.  pCol->zName
8bd0: 20 3d 20 7a 3b 0a 20 20 73 71 6c 69 74 65 33 43   = z;.  sqlite3C
8be0: 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46  olumnPropertiesF
8bf0: 72 6f 6d 4e 61 6d 65 28 70 2c 20 70 43 6f 6c 29  romName(p, pCol)
8c00: 3b 0a 20 0a 20 20 69 66 28 20 70 54 79 70 65 2d  ;. .  if( pType-
8c10: 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  >n==0 ){.    /* 
8c20: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74  If there is no t
8c30: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 63  ype specified, c
8c40: 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20  olumns have the 
8c50: 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79  default affinity
8c60: 0a 20 20 20 20 2a 2a 20 27 42 4c 4f 42 27 2e 20  .    ** 'BLOB'. 
8c70: 2a 2f 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66  */.    pCol->aff
8c80: 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
8c90: 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 70 43 6f  FF_BLOB;.    pCo
8ca0: 6c 2d 3e 73 7a 45 73 74 20 3d 20 31 3b 0a 20 20  l->szEst = 1;.  
8cb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54 79 70 65  }else{.    zType
8cc0: 20 3d 20 7a 20 2b 20 73 71 6c 69 74 65 33 53 74   = z + sqlite3St
8cd0: 72 6c 65 6e 33 30 28 7a 29 20 2b 20 31 3b 0a 20  rlen30(z) + 1;. 
8ce0: 20 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c     memcpy(zType,
8cf0: 20 70 54 79 70 65 2d 3e 7a 2c 20 70 54 79 70 65   pType->z, pType
8d00: 2d 3e 6e 29 3b 0a 20 20 20 20 7a 54 79 70 65 5b  ->n);.    zType[
8d10: 70 54 79 70 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  pType->n] = 0;. 
8d20: 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
8d30: 65 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 70 43  e(zType);.    pC
8d40: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
8d50: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
8d60: 70 65 28 7a 54 79 70 65 2c 20 26 70 43 6f 6c 2d  pe(zType, &pCol-
8d70: 3e 73 7a 45 73 74 29 3b 0a 20 20 20 20 70 43 6f  >szEst);.    pCo
8d80: 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l->colFlags |= C
8d90: 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a  OLFLAG_HASTYPE;.
8da0: 20 20 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b    }.  p->nCol++;
8db0: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74  .  pParse->const
8dc0: 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 3d 20 30 3b  raintName.n = 0;
8dd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
8de0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8df0: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
8e00: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
8e10: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
8e20: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
8e30: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e  statement.  A "N
8e40: 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61  OT NULL" constra
8e50: 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20  int has.** been 
8e60: 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  seen on a column
8e70: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
8e80: 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c  sets the notNull
8e90: 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20   flag on.** the 
8ea0: 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79  column currently
8eb0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
8ec0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
8ed0: 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50  ite3AddNotNull(P
8ee0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
8ef0: 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61  t onError){.  Ta
8f00: 62 6c 65 20 2a 70 3b 0a 20 20 70 20 3d 20 70 50  ble *p;.  p = pP
8f10: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
8f20: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e  .  if( p==0 || N
8f30: 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20  EVER(p->nCol<1) 
8f40: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 61  ) return;.  p->a
8f50: 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 2e 6e  Col[p->nCol-1].n
8f60: 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45  otNull = (u8)onE
8f70: 72 72 6f 72 3b 0a 20 20 70 2d 3e 74 61 62 46 6c  rror;.  p->tabFl
8f80: 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 4e 6f 74  ags |= TF_HasNot
8f90: 4e 75 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Null;.}../*.** S
8fa0: 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74  can the column t
8fb0: 79 70 65 20 6e 61 6d 65 20 7a 54 79 70 65 20 28  ype name zType (
8fc0: 6c 65 6e 67 74 68 20 6e 54 79 70 65 29 20 61 6e  length nType) an
8fd0: 64 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20  d return the.** 
8fe0: 61 73 73 6f 63 69 61 74 65 64 20 61 66 66 69 6e  associated affin
8ff0: 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20  ity type..**.** 
9000: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
9010: 73 20 61 20 63 61 73 65 2d 69 6e 64 65 70 65 6e  s a case-indepen
9020: 64 65 6e 74 20 73 65 61 72 63 68 20 6f 66 20 7a  dent search of z
9030: 54 79 70 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a  Type for the .**
9040: 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74   substrings in t
9050: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62  he following tab
9060: 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74 68  le. If one of th
9070: 65 20 73 75 62 73 74 72 69 6e 67 73 20 69 73 0a  e substrings is.
9080: 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f  ** found, the co
9090: 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 66 66 69  rresponding affi
90a0: 6e 69 74 79 20 69 73 20 72 65 74 75 72 6e 65 64  nity is returned
90b0: 2e 20 49 66 20 7a 54 79 70 65 20 63 6f 6e 74 61  . If zType conta
90c0: 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e  ins.** more than
90d0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73   one of the subs
90e0: 74 72 69 6e 67 73 2c 20 65 6e 74 72 69 65 73 20  trings, entries 
90f0: 74 6f 77 61 72 64 20 74 68 65 20 74 6f 70 20 6f  toward the top o
9100: 66 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  f .** the table 
9110: 74 61 6b 65 20 70 72 69 6f 72 69 74 79 2e 20 46  take priority. F
9120: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a  or example, if z
9130: 54 79 70 65 20 69 73 20 27 42 4c 4f 42 49 4e 54  Type is 'BLOBINT
9140: 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46  ', .** SQLITE_AF
9150: 46 5f 49 4e 54 45 47 45 52 20 69 73 20 72 65 74  F_INTEGER is ret
9160: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62  urned..**.** Sub
9170: 73 74 72 69 6e 67 20 20 20 20 20 7c 20 41 66 66  string     | Aff
9180: 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  inity.** -------
9190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e  ---------.** 'IN
91b0: 54 27 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c  T'         | SQL
91c0: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a  ITE_AFF_INTEGER.
91d0: 2a 2a 20 27 43 48 41 52 27 20 20 20 20 20 20 20  ** 'CHAR'       
91e0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   | SQLITE_AFF_TE
91f0: 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20  XT.** 'CLOB'    
9200: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
9210: 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58 54 27 20  _TEXT.** 'TEXT' 
9220: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
9230: 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f  AFF_TEXT.** 'BLO
9240: 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  B'        | SQLI
9250: 54 45 5f 41 46 46 5f 42 4c 4f 42 0a 2a 2a 20 27  TE_AFF_BLOB.** '
9260: 52 45 41 4c 27 20 20 20 20 20 20 20 20 7c 20 53  REAL'        | S
9270: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a  QLITE_AFF_REAL.*
9280: 2a 20 27 46 4c 4f 41 27 20 20 20 20 20 20 20 20  * 'FLOA'        
9290: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  | SQLITE_AFF_REA
92a0: 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20 20 20  L.** 'DOUB'     
92b0: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
92c0: 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  REAL.**.** If no
92d0: 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72  ne of the substr
92e0: 69 6e 67 73 20 69 6e 20 74 68 65 20 61 62 6f 76  ings in the abov
92f0: 65 20 74 61 62 6c 65 20 61 72 65 20 66 6f 75 6e  e table are foun
9300: 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  d,.** SQLITE_AFF
9310: 5f 4e 55 4d 45 52 49 43 20 69 73 20 72 65 74 75  _NUMERIC is retu
9320: 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71  rned..*/.char sq
9330: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
9340: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49  e(const char *zI
9350: 6e 2c 20 75 38 20 2a 70 73 7a 45 73 74 29 7b 0a  n, u8 *pszEst){.
9360: 20 20 75 33 32 20 68 20 3d 20 30 3b 0a 20 20 63    u32 h = 0;.  c
9370: 68 61 72 20 61 66 66 20 3d 20 53 51 4c 49 54 45  har aff = SQLITE
9380: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
9390: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 61  const char *zCha
93a0: 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  r = 0;..  assert
93b0: 28 20 7a 49 6e 21 3d 30 20 29 3b 0a 20 20 77 68  ( zIn!=0 );.  wh
93c0: 69 6c 65 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a 20  ile( zIn[0] ){. 
93d0: 20 20 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20     h = (h<<8) + 
93e0: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
93f0: 77 65 72 5b 28 2a 7a 49 6e 29 26 30 78 66 66 5d  wer[(*zIn)&0xff]
9400: 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20  ;.    zIn++;.   
9410: 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32   if( h==(('c'<<2
9420: 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28 27 61  4)+('h'<<16)+('a
9430: 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20 20 20  '<<8)+'r') ){   
9440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 48 41            /* CHA
9450: 52 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  R */.      aff =
9460: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
9470: 3b 0a 20 20 20 20 20 20 7a 43 68 61 72 20 3d 20  ;.      zChar = 
9480: 7a 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  zIn;.    }else i
9490: 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29  f( h==(('c'<<24)
94a0: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
94b0: 3c 38 29 2b 27 62 27 29 20 29 7b 20 20 20 20 20  <8)+'b') ){     
94c0: 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20    /* CLOB */.   
94d0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
94e0: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65  AFF_TEXT;.    }e
94f0: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 74 27  lse if( h==(('t'
9500: 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b  <<24)+('e'<<16)+
9510: 28 27 78 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b  ('x'<<8)+'t') ){
9520: 20 20 20 20 20 20 20 2f 2a 20 54 45 58 54 20 2a         /* TEXT *
9530: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
9540: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
9550: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
9560: 28 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c  (('b'<<24)+('l'<
9570: 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62  <16)+('o'<<8)+'b
9580: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ')          /* B
9590: 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  LOB */.        &
95a0: 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  & (aff==SQLITE_A
95b0: 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66  FF_NUMERIC || af
95c0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  f==SQLITE_AFF_RE
95d0: 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 61 66 66  AL) ){.      aff
95e0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
95f0: 4f 42 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 49  OB;.      if( zI
9600: 6e 5b 30 5d 3d 3d 27 28 27 20 29 20 7a 43 68 61  n[0]=='(' ) zCha
9610: 72 20 3d 20 7a 49 6e 3b 0a 23 69 66 6e 64 65 66  r = zIn;.#ifndef
9620: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
9630: 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
9640: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
9650: 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36  r'<<24)+('e'<<16
9660: 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20  )+('a'<<8)+'l') 
9670: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45 41 4c           /* REAL
9680: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61   */.        && a
9690: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
96a0: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
96b0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
96c0: 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _REAL;.    }else
96d0: 20 69 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32   if( h==(('f'<<2
96e0: 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f  4)+('l'<<16)+('o
96f0: 27 3c 3c 38 29 2b 27 61 27 29 20 20 20 20 20 20  '<<8)+'a')      
9700: 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20      /* FLOA */. 
9710: 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53         && aff==S
9720: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
9730: 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  C ){.      aff =
9740: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
9750: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9760: 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28 27  h==(('d'<<24)+('
9770: 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29  o'<<16)+('u'<<8)
9780: 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'b')          /
9790: 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20  * DOUB */.      
97a0: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
97b0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
97c0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
97d0: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e  TE_AFF_REAL;.#en
97e0: 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  dif.    }else if
97f0: 28 20 28 68 26 30 78 30 30 46 46 46 46 46 46 29  ( (h&0x00FFFFFF)
9800: 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e  ==(('i'<<16)+('n
9810: 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20  '<<8)+'t') ){   
9820: 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20   /* INT */.     
9830: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9840: 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20  F_INTEGER;.     
9850: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9860: 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 73 7a 45 73  }..  /* If pszEs
9870: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73  t is not NULL, s
9880: 74 6f 72 65 20 61 6e 20 65 73 74 69 6d 61 74 65  tore an estimate
9890: 20 6f 66 20 74 68 65 20 66 69 65 6c 64 20 73 69   of the field si
98a0: 7a 65 2e 20 20 54 68 65 0a 20 20 2a 2a 20 65 73  ze.  The.  ** es
98b0: 74 69 6d 61 74 65 20 69 73 20 73 63 61 6c 65 64  timate is scaled
98c0: 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 69 7a   so that the siz
98d0: 65 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20  e of an integer 
98e0: 69 73 20 31 2e 20 20 2a 2f 0a 20 20 69 66 28 20  is 1.  */.  if( 
98f0: 70 73 7a 45 73 74 20 29 7b 0a 20 20 20 20 2a 70  pszEst ){.    *p
9900: 73 7a 45 73 74 20 3d 20 31 3b 20 20 20 2f 2a 20  szEst = 1;   /* 
9910: 64 65 66 61 75 6c 74 20 73 69 7a 65 20 69 73 20  default size is 
9920: 61 70 70 72 6f 78 20 34 20 62 79 74 65 73 20 2a  approx 4 bytes *
9930: 2f 0a 20 20 20 20 69 66 28 20 61 66 66 3c 53 51  /.    if( aff<SQ
9940: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
9950: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 43   ){.      if( zC
9960: 68 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 77  har ){.        w
9970: 68 69 6c 65 28 20 7a 43 68 61 72 5b 30 5d 20 29  hile( zChar[0] )
9980: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
9990: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a  sqlite3Isdigit(z
99a0: 43 68 61 72 5b 30 5d 29 20 29 7b 0a 20 20 20 20  Char[0]) ){.    
99b0: 20 20 20 20 20 20 20 20 69 6e 74 20 76 20 3d 20          int v = 
99c0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  0;.            s
99d0: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a  qlite3GetInt32(z
99e0: 43 68 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20  Char, &v);.     
99f0: 20 20 20 20 20 20 20 76 20 3d 20 76 2f 34 20 2b         v = v/4 +
9a00: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
9a10: 69 66 28 20 76 3e 32 35 35 20 29 20 76 20 3d 20  if( v>255 ) v = 
9a20: 32 35 35 3b 0a 20 20 20 20 20 20 20 20 20 20 20  255;.           
9a30: 20 2a 70 73 7a 45 73 74 20 3d 20 76 3b 20 2f 2a   *pszEst = v; /*
9a40: 20 42 4c 4f 42 28 6b 29 2c 20 56 41 52 43 48 41   BLOB(k), VARCHA
9a50: 52 28 6b 29 2c 20 43 48 41 52 28 6b 29 20 2d 3e  R(k), CHAR(k) ->
9a60: 20 72 3d 28 6b 2f 34 2b 31 29 20 2a 2f 0a 20 20   r=(k/4+1) */.  
9a70: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9a80: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
9a90: 20 20 20 20 20 20 20 7a 43 68 61 72 2b 2b 3b 0a         zChar++;.
9aa0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9ab0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a  }else{.        *
9ac0: 70 73 7a 45 73 74 20 3d 20 35 3b 20 20 20 2f 2a  pszEst = 5;   /*
9ad0: 20 42 4c 4f 42 2c 20 54 45 58 54 2c 20 43 4c 4f   BLOB, TEXT, CLO
9ae0: 42 20 2d 3e 20 72 3d 35 20 20 28 61 70 70 72 6f  B -> r=5  (appro
9af0: 78 20 32 30 20 62 79 74 65 73 29 2a 2f 0a 20 20  x 20 bytes)*/.  
9b00: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9b10: 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a    return aff;.}.
9b20: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65  ./*.** The expre
9b30: 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66  ssion is the def
9b40: 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
9b50: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
9b60: 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a   added column.**
9b70: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 75   of the table cu
9b80: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
9b90: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
9ba0: 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20  * Default value 
9bb0: 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74  expressions must
9bc0: 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52   be constant.  R
9bd0: 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f  aise an exceptio
9be0: 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  n if this.** is 
9bf0: 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a  not the case..**
9c00: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9c10: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
9c20: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
9c30: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
9c40: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
9c50: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
9c60: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
9c70: 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61  ite3AddDefaultVa
9c80: 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lue(Parse *pPars
9c90: 65 2c 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70  e, ExprSpan *pSp
9ca0: 61 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  an){.  Table *p;
9cb0: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
9cc0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
9cd0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
9ce0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
9cf0: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 21 3d 30  able;.  if( p!=0
9d00: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26   ){.    pCol = &
9d10: 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c  (p->aCol[p->nCol
9d20: 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73  -1]);.    if( !s
9d30: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
9d40: 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70  tantOrFunction(p
9d50: 53 70 61 6e 2d 3e 70 45 78 70 72 2c 20 64 62 2d  Span->pExpr, db-
9d60: 3e 69 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a 20  >init.busy) ){. 
9d70: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
9d80: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 65  rMsg(pParse, "de
9d90: 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 63  fault value of c
9da0: 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f  olumn [%s] is no
9db0: 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20  t constant",.   
9dc0: 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61         pCol->zNa
9dd0: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
9de0: 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20        /* A copy 
9df0: 6f 66 20 70 45 78 70 72 20 69 73 20 75 73 65 64  of pExpr is used
9e00: 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
9e10: 6f 72 69 67 69 6e 61 6c 2c 20 61 73 20 70 45 78  original, as pEx
9e20: 70 72 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  pr contains.    
9e30: 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 74 68 61 74    ** tokens that
9e40: 20 70 6f 69 6e 74 20 74 6f 20 76 6f 6c 61 74 69   point to volati
9e50: 6c 65 20 6d 65 6d 6f 72 79 2e 20 54 68 65 20 27  le memory. The '
9e60: 73 70 61 6e 27 20 6f 66 20 74 68 65 20 65 78 70  span' of the exp
9e70: 72 65 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ression.      **
9e80: 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20   is required by 
9e90: 70 72 61 67 6d 61 20 74 61 62 6c 65 5f 69 6e 66  pragma table_inf
9ea0: 6f 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  o..      */.    
9eb0: 20 20 45 78 70 72 20 78 3b 0a 20 20 20 20 20 20    Expr x;.      
9ec0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
9ed0: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c  e(db, pCol->pDfl
9ee0: 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  t);.      memset
9ef0: 28 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78  (&x, 0, sizeof(x
9f00: 29 29 3b 0a 20 20 20 20 20 20 78 2e 6f 70 20 3d  ));.      x.op =
9f10: 20 54 4b 5f 53 50 41 4e 3b 0a 20 20 20 20 20 20   TK_SPAN;.      
9f20: 78 2e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 73 71 6c  x.u.zToken = sql
9f30: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
9f40: 2c 20 28 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e  , (char*)pSpan->
9f50: 7a 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20 20  zStart,.        
9f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f70: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
9f80: 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20  )(pSpan->zEnd - 
9f90: 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b  pSpan->zStart));
9fa0: 0a 20 20 20 20 20 20 78 2e 70 4c 65 66 74 20 3d  .      x.pLeft =
9fb0: 20 70 53 70 61 6e 2d 3e 70 45 78 70 72 3b 0a 20   pSpan->pExpr;. 
9fc0: 20 20 20 20 20 78 2e 66 6c 61 67 73 20 3d 20 45       x.flags = E
9fd0: 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20 20 70 43  P_Skip;.      pC
9fe0: 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69  ol->pDflt = sqli
9ff0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 26  te3ExprDup(db, &
a000: 78 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  x, EXPRDUP_REDUC
a010: 45 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  E);.      sqlite
a020: 33 44 62 46 72 65 65 28 64 62 2c 20 78 2e 75 2e  3DbFree(db, x.u.
a030: 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20  zToken);.    }. 
a040: 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
a050: 44 65 6c 65 74 65 28 64 62 2c 20 70 53 70 61 6e  Delete(db, pSpan
a060: 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a  ->pExpr);.}../*.
a070: 2a 2a 20 42 61 63 6b 77 61 72 64 73 20 43 6f 6d  ** Backwards Com
a080: 70 61 74 69 62 69 6c 69 74 79 20 48 61 63 6b 3a  patibility Hack:
a090: 0a 2a 2a 20 0a 2a 2a 20 48 69 73 74 6f 72 69 63  .** .** Historic
a0a0: 61 6c 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  al versions of S
a0b0: 51 4c 69 74 65 20 61 63 63 65 70 74 65 64 20 73  QLite accepted s
a0c0: 74 72 69 6e 67 73 20 61 73 20 63 6f 6c 75 6d 6e  trings as column
a0d0: 20 6e 61 6d 65 73 20 69 6e 0a 2a 2a 20 69 6e 64   names in.** ind
a0e0: 65 78 65 73 20 61 6e 64 20 50 52 49 4d 41 52 59  exes and PRIMARY
a0f0: 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 73   KEY constraints
a100: 20 61 6e 64 20 69 6e 20 55 4e 49 51 55 45 20 63   and in UNIQUE c
a110: 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 45 78 61  onstraints.  Exa
a120: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
a130: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 79 7a  CREATE TABLE xyz
a140: 28 61 2c 62 2c 63 2c 64 2c 65 2c 50 52 49 4d 41  (a,b,c,d,e,PRIMA
a150: 52 59 20 4b 45 59 28 27 61 27 29 2c 55 4e 49 51  RY KEY('a'),UNIQ
a160: 55 45 28 27 62 27 2c 27 63 27 20 43 4f 4c 4c 41  UE('b','c' COLLA
a170: 54 45 20 74 72 69 6d 29 0a 2a 2a 20 20 20 20 20  TE trim).**     
a180: 43 52 45 41 54 45 20 49 4e 44 45 58 20 61 62 63  CREATE INDEX abc
a190: 20 4f 4e 20 78 79 7a 28 27 63 27 2c 27 64 27 20   ON xyz('c','d' 
a1a0: 44 45 53 43 2c 27 65 27 20 43 4f 4c 4c 41 54 45  DESC,'e' COLLATE
a1b0: 20 6e 6f 63 61 73 65 20 44 45 53 43 29 3b 0a 2a   nocase DESC);.*
a1c0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 67 6f 6f  *.** This is goo
a1d0: 66 79 2e 20 20 42 75 74 20 74 6f 20 70 72 65 73  fy.  But to pres
a1e0: 65 72 76 65 20 62 61 63 6b 77 61 72 64 73 20 63  erve backwards c
a1f0: 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 65 20  ompatibility we 
a200: 63 6f 6e 74 69 6e 75 65 20 74 6f 0a 2a 2a 20 61  continue to.** a
a210: 63 63 65 70 74 20 69 74 2e 20 20 54 68 69 73 20  ccept it.  This 
a220: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
a230: 20 6e 65 63 65 73 73 61 72 79 20 63 6f 6e 76 65   necessary conve
a240: 72 73 69 6f 6e 2e 20 20 49 74 20 63 6f 6e 76 65  rsion.  It conve
a250: 72 74 73 0a 2a 2a 20 74 68 65 20 65 78 70 72 65  rts.** the expre
a260: 73 73 69 6f 6e 20 67 69 76 65 6e 20 69 6e 20 69  ssion given in i
a270: 74 73 20 61 72 67 75 6d 65 6e 74 20 66 72 6f 6d  ts argument from
a280: 20 61 20 54 4b 5f 53 54 52 49 4e 47 20 69 6e 74   a TK_STRING int
a290: 6f 20 61 20 54 4b 5f 49 44 0a 2a 2a 20 69 66 20  o a TK_ID.** if 
a2a0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
a2b0: 73 20 6a 75 73 74 20 61 20 54 4b 5f 53 54 52 49  s just a TK_STRI
a2c0: 4e 47 20 77 69 74 68 20 61 6e 20 6f 70 74 69 6f  NG with an optio
a2d0: 6e 61 6c 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75  nal COLLATE clau
a2e0: 73 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65 70  se..** If the ep
a2f0: 78 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 79 74  xression is anyt
a300: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
a310: 54 4b 5f 53 54 52 49 4e 47 2c 20 74 68 65 20 65  TK_STRING, the e
a320: 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20  xpression is.** 
a330: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74  unchanged..*/.st
a340: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
a350: 33 53 74 72 69 6e 67 54 6f 49 64 28 45 78 70 72  3StringToId(Expr
a360: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6f   *p){.  if( p->o
a370: 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a  p==TK_STRING ){.
a380: 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49      p->op = TK_I
a390: 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  D;.  }else if( p
a3a0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
a3b0: 20 26 26 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70   && p->pLeft->op
a3c0: 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20  ==TK_STRING ){. 
a3d0: 20 20 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 20     p->pLeft->op 
a3e0: 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 0a 7d 0a 0a  = TK_ID;.  }.}..
a3f0: 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20  /*.** Designate 
a400: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
a410: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20  for the table.  
a420: 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
a430: 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20  of names .** of 
a440: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72  columns that for
a450: 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  m the primary ke
a460: 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20  y.  If pList is 
a470: 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a  NULL, then the.*
a480: 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  * most recently 
a490: 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20  added column of 
a4a0: 74 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65  the table is the
a4b0: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a   primary key..**
a4c0: 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20  .** A table can 
a4d0: 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65  have at most one
a4e0: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49   primary key.  I
a4f0: 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65  f the table alre
a500: 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69  ady has.** a pri
a510: 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68  mary key (and th
a520: 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  is is the second
a530: 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68   primary key) th
a540: 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20  en create an.** 
a550: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  error..**.** If 
a560: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
a570: 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63  is on a single c
a580: 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61  olumn whose data
a590: 74 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c  type is INTEGER,
a5a0: 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  .** then we will
a5b0: 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74   try to use that
a5c0: 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72   column as the r
a5d0: 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65 20 54  owid.  Set the T
a5e0: 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69  able.iPKey.** fi
a5f0: 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65  eld of the table
a600: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
a610: 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e  ion to be the in
a620: 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e  dex of the.** IN
a630: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
a640: 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65  Y column.  Table
a650: 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f  .iPKey is set to
a660: 20 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a   -1 if there is.
a670: 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52  ** no INTEGER PR
a680: 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a  IMARY KEY..**.**
a690: 20 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e   If the key is n
a6a0: 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ot an INTEGER PR
a6b0: 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20  IMARY KEY, then 
a6c0: 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a  create a unique.
a6d0: 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65  ** index for the
a6e0: 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20   key.  No index 
a6f0: 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49  is created for I
a700: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
a710: 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  EYs..*/.void sql
a720: 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65  ite3AddPrimaryKe
a730: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
a740: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
a750: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
a760: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
a770: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c   /* List of fiel
a780: 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e  d names to be in
a790: 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  dexed */.  int o
a7a0: 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20  nError,      /* 
a7b0: 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
a7c0: 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e  a uniqueness con
a7d0: 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61  flict */.  int a
a7e0: 75 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20  utoInc,      /* 
a7f0: 54 72 75 65 20 69 66 20 74 68 65 20 41 55 54 4f  True if the AUTO
a800: 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72  INCREMENT keywor
a810: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
a820: 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20    int sortOrder 
a830: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f      /* SQLITE_SO
a840: 5f 41 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53  _ASC or SQLITE_S
a850: 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54  O_DESC */.){.  T
a860: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61  able *pTab = pPa
a870: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
a880: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d    Column *pCol =
a890: 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d   0;.  int iCol =
a8a0: 20 2d 31 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 54   -1, i;.  int nT
a8b0: 65 72 6d 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  erm;.  if( pTab=
a8c0: 3d 30 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72  =0 ) goto primar
a8d0: 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66  y_key_exit;.  if
a8e0: 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73  ( pTab->tabFlags
a8f0: 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79   & TF_HasPrimary
a900: 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Key ){.    sqlit
a910: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
a920: 65 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65  e, .      "table
a930: 20 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65   \"%s\" has more
a940: 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72   than one primar
a950: 79 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e  y key", pTab->zN
a960: 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70  ame);.    goto p
a970: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b  rimary_key_exit;
a980: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 74 61 62  .  }.  pTab->tab
a990: 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 50  Flags |= TF_HasP
a9a0: 72 69 6d 61 72 79 4b 65 79 3b 0a 20 20 69 66 28  rimaryKey;.  if(
a9b0: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
a9c0: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43   iCol = pTab->nC
a9d0: 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 43 6f 6c  ol - 1;.    pCol
a9e0: 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69   = &pTab->aCol[i
a9f0: 43 6f 6c 5d 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  Col];.    pCol->
aa00: 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46  colFlags |= COLF
aa10: 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20  LAG_PRIMKEY;.   
aa20: 20 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 7d 65   nTerm = 1;.  }e
aa30: 6c 73 65 7b 0a 20 20 20 20 6e 54 65 72 6d 20 3d  lse{.    nTerm =
aa40: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
aa50: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54     for(i=0; i<nT
aa60: 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  erm; i++){.     
aa70: 20 45 78 70 72 20 2a 70 43 45 78 70 72 20 3d 20   Expr *pCExpr = 
aa80: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
aa90: 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b  ollate(pList->a[
aaa0: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
aab0: 20 61 73 73 65 72 74 28 20 70 43 45 78 70 72 21   assert( pCExpr!
aac0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
aad0: 74 65 33 53 74 72 69 6e 67 54 6f 49 64 28 70 43  te3StringToId(pC
aae0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
aaf0: 20 70 43 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f   pCExpr->op==TK_
ab00: 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  ID ){.        co
ab10: 6e 73 74 20 63 68 61 72 20 2a 7a 43 4e 61 6d 65  nst char *zCName
ab20: 20 3d 20 70 43 45 78 70 72 2d 3e 75 2e 7a 54 6f   = pCExpr->u.zTo
ab30: 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ken;.        for
ab40: 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54  (iCol=0; iCol<pT
ab50: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  ab->nCol; iCol++
ab60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
ab70: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
ab80: 7a 43 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43  zCName, pTab->aC
ab90: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d  ol[iCol].zName)=
aba0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
abb0: 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e    pCol = &pTab->
abc0: 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  aCol[iCol];.    
abd0: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f          pCol->co
abe0: 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41  lFlags |= COLFLA
abf0: 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 20  G_PRIMKEY;.     
ac00: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ac10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ac20: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
ac30: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 54 65 72  }.  }.  if( nTer
ac40: 6d 3d 3d 31 0a 20 20 20 26 26 20 70 43 6f 6c 0a  m==1.   && pCol.
ac50: 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72     && sqlite3Str
ac60: 49 43 6d 70 28 73 71 6c 69 74 65 33 43 6f 6c 75  ICmp(sqlite3Colu
ac70: 6d 6e 54 79 70 65 28 70 43 6f 6c 2c 22 22 29 2c  mnType(pCol,""),
ac80: 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20   "INTEGER")==0. 
ac90: 20 20 26 26 20 73 6f 72 74 4f 72 64 65 72 21 3d    && sortOrder!=
aca0: 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 0a 20  SQLITE_SO_DESC. 
acb0: 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50   ){.    pTab->iP
acc0: 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  Key = iCol;.    
acd0: 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20  pTab->keyConf = 
ace0: 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20  (u8)onError;.   
acf0: 20 61 73 73 65 72 74 28 20 61 75 74 6f 49 6e 63   assert( autoInc
ad00: 3d 3d 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d  ==0 || autoInc==
ad10: 31 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74  1 );.    pTab->t
ad20: 61 62 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49  abFlags |= autoI
ad30: 6e 63 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d  nc*TF_Autoincrem
ad40: 65 6e 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ent;.    if( pLi
ad50: 73 74 20 29 20 70 50 61 72 73 65 2d 3e 69 50 6b  st ) pParse->iPk
ad60: 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73  SortOrder = pLis
ad70: 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  t->a[0].sortOrde
ad80: 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61  r;.  }else if( a
ad90: 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65  utoInc ){.#ifnde
ada0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
adb0: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
adc0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
add0: 70 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43  pParse, "AUTOINC
ade0: 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61  REMENT is only a
adf0: 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20  llowed on an ". 
ae00: 20 20 20 20 20 20 22 49 4e 54 45 47 45 52 20 50        "INTEGER P
ae10: 52 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65  RIMARY KEY");.#e
ae20: 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
ae30: 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49    sqlite3CreateI
ae40: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20  ndex(pParse, 0, 
ae50: 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45  0, 0, pList, onE
ae60: 72 72 6f 72 2c 20 30 2c 0a 20 20 20 20 20 20 20  rror, 0,.       
ae70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae80: 20 20 20 20 30 2c 20 73 6f 72 74 4f 72 64 65 72      0, sortOrder
ae90: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 49 44 58 54  , 0, SQLITE_IDXT
aea0: 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 29 3b  YPE_PRIMARYKEY);
aeb0: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a  .    pList = 0;.
aec0: 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79    }..primary_key
aed0: 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33  _exit:.  sqlite3
aee0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
aef0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74  Parse->db, pList
af00: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
af10: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
af20: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
af30: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
af40: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
af50: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
af60: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 68  oid sqlite3AddCh
af70: 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20  eckConstraint(. 
af80: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
af90: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
afa0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
afb0: 2a 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20  *pCheckExpr  /* 
afc0: 54 68 65 20 63 68 65 63 6b 20 65 78 70 72 65 73  The check expres
afd0: 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64  sion */.){.#ifnd
afe0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
aff0: 48 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54  HECK.  Table *pT
b000: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
b010: 77 54 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74 65  wTable;.  sqlite
b020: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
b030: 64 62 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26  db;.  if( pTab &
b040: 26 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  & !IN_DECLARE_VT
b050: 41 42 0a 20 20 20 26 26 20 21 73 71 6c 69 74 65  AB.   && !sqlite
b060: 33 42 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79  3BtreeIsReadonly
b070: 28 64 62 2d 3e 61 44 62 5b 64 62 2d 3e 69 6e 69  (db->aDb[db->ini
b080: 74 2e 69 44 62 5d 2e 70 42 74 29 0a 20 20 29 7b  t.iDb].pBt).  ){
b090: 0a 20 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63  .    pTab->pChec
b0a0: 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  k = sqlite3ExprL
b0b0: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
b0c0: 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20  , pTab->pCheck, 
b0d0: 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 20  pCheckExpr);.   
b0e0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6e   if( pParse->con
b0f0: 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b  straintName.n ){
b100: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
b110: 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50  prListSetName(pP
b120: 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65  arse, pTab->pChe
b130: 63 6b 2c 20 26 70 50 61 72 73 65 2d 3e 63 6f 6e  ck, &pParse->con
b140: 73 74 72 61 69 6e 74 4e 61 6d 65 2c 20 31 29 3b  straintName, 1);
b150: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23  .    }.  }else.#
b160: 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71  endif.  {.    sq
b170: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
b180: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 43 68 65  pParse->db, pChe
b190: 63 6b 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  ckExpr);.  }.}..
b1a0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
b1b0: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
b1c0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
b1d0: 65 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62  ently parsed tab
b1e0: 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20  le column.** to 
b1f0: 74 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65  the CollSeq give
b200: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
b210: 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65  e3AddCollateType
b220: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
b230: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
b240: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
b250: 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f  t i;.  char *zCo
b260: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
b270: 20 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61 6d   /* Dequoted nam
b280: 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  e of collation s
b290: 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c  equence */.  sql
b2a0: 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
b2b0: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
b2c0: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
b2d0: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
b2e0: 43 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50  Col-1;.  db = pP
b2f0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c  arse->db;.  zCol
b300: 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
b310: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f  romToken(db, pTo
b320: 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f  ken);.  if( !zCo
b330: 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  ll ) return;..  
b340: 69 66 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  if( sqlite3Locat
b350: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
b360: 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 49   zColl) ){.    I
b370: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
b380: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
b390: 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  , p->aCol[i].zCo
b3a0: 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c  ll);.    p->aCol
b3b0: 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c  [i].zColl = zCol
b3c0: 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  l;.  .    /* If 
b3d0: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65  the column is de
b3e0: 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65  clared as "<name
b3f0: 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f  > PRIMARY KEY CO
b400: 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20  LLATE <type>",. 
b410: 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e     ** then an in
b420: 64 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65  dex may have bee
b430: 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69  n created on thi
b440: 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20  s column before 
b450: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61  the.    ** colla
b460: 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64  tion type was ad
b470: 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69  ded. Correct thi
b480: 73 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63  s if it is the c
b490: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
b4a0: 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64  for(pIdx=p->pInd
b4b0: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
b4c0: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
b4d0: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
b4e0: 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b 0a 20  >nKeyCol==1 );. 
b4f0: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
b500: 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b  iColumn[0]==i ){
b510: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
b520: 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43  zColl[0] = p->aC
b530: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20  ol[i].zColl;.   
b540: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
b550: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  se{.    sqlite3D
b560: 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29  bFree(db, zColl)
b570: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
b580: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
b590: 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  urns the collati
b5a0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  on sequence for 
b5b0: 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20  database native 
b5c0: 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67  text.** encoding
b5d0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
b5e0: 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c  he string zName,
b5f0: 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a   length nName..*
b600: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75  *.** If the requ
b610: 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  ested collation 
b620: 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20  sequence is not 
b630: 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f  available, or no
b640: 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69  t available.** i
b650: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  n the database n
b660: 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20  ative encoding, 
b670: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
b680: 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64  ctory is invoked
b690: 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69   to.** request i
b6a0: 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74  t. If the collat
b6b0: 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73  ion factory does
b6c0: 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68   not supply such
b6d0: 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20   a sequence,.** 
b6e0: 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65  and the sequence
b6f0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e   is available in
b700: 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e   another text en
b710: 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61  coding, then tha
b720: 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  t is.** returned
b730: 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
b740: 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f  If no versions o
b750: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
b760: 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65  collations seque
b770: 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c  nce are availabl
b780: 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72  e, or.** another
b790: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e   error occurs, N
b7a0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
b7b0: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  and an error mes
b7c0: 73 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74  sage written int
b7d0: 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a  o.** pParse..**.
b7e0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
b7f0: 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f  is a wrapper aro
b800: 75 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43  und sqlite3FindC
b810: 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20  ollSeq().  This 
b820: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b  routine.** invok
b830: 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  es the collation
b840: 20 66 61 63 74 6f 72 79 20 69 66 20 74 68 65 20   factory if the 
b850: 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  named collation 
b860: 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a  cannot be found.
b870: 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73  ** and generates
b880: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
b890: 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
b8a0: 6f 3a 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f  o: sqlite3FindCo
b8b0: 6c 6c 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33  llSeq(), sqlite3
b8c0: 47 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a  GetCollSeq().*/.
b8d0: 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33  CollSeq *sqlite3
b8e0: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61  LocateCollSeq(Pa
b8f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
b900: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
b910: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
b920: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75   pParse->db;.  u
b930: 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  8 enc = ENC(db);
b940: 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d  .  u8 initbusy =
b950: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a   db->init.busy;.
b960: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
b970: 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  ;..  pColl = sql
b980: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
b990: 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20  db, enc, zName, 
b9a0: 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28  initbusy);.  if(
b9b0: 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21   !initbusy && (!
b9c0: 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d  pColl || !pColl-
b9d0: 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43  >xCmp) ){.    pC
b9e0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
b9f0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
ba00: 65 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d  enc, pColl, zNam
ba10: 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  e);.  }..  retur
ba20: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a  n pColl;.}.../*.
ba30: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
ba40: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65   that will incre
ba50: 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20  ment the schema 
ba60: 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  cookie..**.** Th
ba70: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
ba80: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
ba90: 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63  mine when the sc
baa0: 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20  hema for the.** 
bab0: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
bac0: 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63  .  After each sc
bad0: 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65  hema change, the
bae0: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a   cookie value.**
baf0: 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20   changes.  When 
bb00: 61 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20  a process first 
bb10: 72 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61  reads the schema
bb20: 20 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a   it records the.
bb30: 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72  ** cookie.  Ther
bb40: 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72  eafter, whenever
bb50: 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65   it goes to acce
bb60: 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ss the database,
bb70: 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68  .** it checks th
bb80: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65  e cookie to make
bb90: 20 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61   sure the schema
bba0: 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64   has not changed
bbb0: 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73  .** since it was
bbc0: 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a   last read..**.*
bbd0: 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e  * This plan is n
bbe0: 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75  ot completely bu
bbf0: 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20  llet-proof.  It 
bc00: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a  is possible for.
bc10: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f  ** the schema to
bc20: 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65   change multiple
bc30: 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74   times and for t
bc40: 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a  he cookie to be.
bc50: 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70  ** set back to p
bc60: 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74  rior value.  But
bc70: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
bc80: 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a  are infrequent.*
bc90: 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62  * and the probab
bca0: 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67  ility of hitting
bcb0: 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65   the same cookie
bcc0: 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a   value is only.*
bcd0: 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e  * 1 chance in 2^
bce0: 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61  32.  So we're sa
bcf0: 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a  fe enough..**.**
bd00: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
bd10: 4f 46 3a 20 52 2d 33 34 32 33 30 2d 35 36 30 34  OF: R-34230-5604
bd20: 39 20 53 51 4c 69 74 65 20 61 75 74 6f 6d 61 74  9 SQLite automat
bd30: 69 63 61 6c 6c 79 20 69 6e 63 72 65 6d 65 6e 74  ically increment
bd40: 73 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 2d  s.** the schema-
bd50: 76 65 72 73 69 6f 6e 20 77 68 65 6e 65 76 65 72  version whenever
bd60: 20 74 68 65 20 73 63 68 65 6d 61 20 63 68 61 6e   the schema chan
bd70: 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ges..*/.void sql
bd80: 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
bd90: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
bda0: 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69  int iDb){.  sqli
bdb0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
bdc0: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20  ->db;.  Vdbe *v 
bdd0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
bde0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
bdf0: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
be00: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
be10: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
be20: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f  dOp3(v, OP_SetCo
be30: 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45  okie, iDb, BTREE
be40: 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c  _SCHEMA_VERSION,
be50: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
be60: 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
be70: 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  b].pSchema->sche
be80: 6d 61 5f 63 6f 6f 6b 69 65 2b 31 29 3b 0a 7d 0a  ma_cookie+1);.}.
be90: 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74  ./*.** Measure t
bea0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
beb0: 72 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74  racters needed t
bec0: 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76  o output the giv
bed0: 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72  en.** identifier
bee0: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65  .  The number re
bef0: 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20  turned includes 
bf00: 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a  any quotes used.
bf10: 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20  ** but does not 
bf20: 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c  include the null
bf30: 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a   terminator..**.
bf40: 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 20  ** The estimate 
bf50: 69 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e  is conservative.
bf60: 20 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61    It might be la
bf70: 72 67 65 72 20 74 68 61 74 20 77 68 61 74 20 69  rger that what i
bf80: 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64  s.** really need
bf90: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
bfa0: 74 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f  t identLength(co
bfb0: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
bfc0: 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30  int n;.  for(n=0
bfd0: 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b  ; *z; n++, z++){
bfe0: 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27  .    if( *z=='"'
bff0: 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20   ){ n++; }.  }. 
c000: 20 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d   return n + 2;.}
c010: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ../*.** The firs
c020: 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  t parameter is a
c030: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
c040: 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68  utput buffer. Th
c050: 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72  e second .** par
c060: 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
c070: 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  ter to an intege
c080: 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  r that contains 
c090: 74 68 65 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a  the offset at.**
c0a0: 20 77 68 69 63 68 20 74 6f 20 77 72 69 74 65 20   which to write 
c0b0: 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  into the output 
c0c0: 62 75 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e  buffer. This fun
c0d0: 63 74 69 6f 6e 20 63 6f 70 69 65 73 20 74 68 65  ction copies the
c0e0: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
c0f0: 65 64 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65  ed string pointe
c100: 64 20 74 6f 20 62 79 20 74 68 65 20 74 68 69 72  d to by the thir
c110: 64 20 70 61 72 61 6d 65 74 65 72 2c 20 7a 53 69  d parameter, zSi
c120: 67 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f  gnedIdent,.** to
c130: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f   the specified o
c140: 66 66 73 65 74 20 69 6e 20 74 68 65 20 62 75 66  ffset in the buf
c150: 66 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 20  fer and updates 
c160: 2a 70 49 64 78 20 74 6f 20 72 65 66 65 72 0a 2a  *pIdx to refer.*
c170: 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62  * to the first b
c180: 79 74 65 20 61 66 74 65 72 20 74 68 65 20 6c 61  yte after the la
c190: 73 74 20 62 79 74 65 20 77 72 69 74 74 65 6e 20  st byte written 
c1a0: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
c1b0: 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
c1c0: 73 74 72 69 6e 67 20 7a 53 69 67 6e 65 64 49 64  string zSignedId
c1d0: 65 6e 74 20 63 6f 6e 73 69 73 74 73 20 65 6e 74  ent consists ent
c1e0: 69 72 65 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e  irely of alpha-n
c1f0: 75 6d 65 72 69 63 0a 2a 2a 20 63 68 61 72 61 63  umeric.** charac
c200: 74 65 72 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62  ters, does not b
c210: 65 67 69 6e 20 77 69 74 68 20 61 20 64 69 67 69  egin with a digi
c220: 74 20 61 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20  t and is not an 
c230: 53 51 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20  SQL keyword,.** 
c240: 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65  then it is copie
c250: 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  d to the output 
c260: 62 75 66 66 65 72 20 65 78 61 63 74 6c 79 20 61  buffer exactly a
c270: 73 20 69 74 20 69 73 2e 20 4f 74 68 65 72 77 69  s it is. Otherwi
c280: 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f  se,.** it is quo
c290: 74 65 64 20 75 73 69 6e 67 20 64 6f 75 62 6c 65  ted using double
c2a0: 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  -quotes..*/.stat
c2b0: 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74  ic void identPut
c2c0: 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70  (char *z, int *p
c2d0: 49 64 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e  Idx, char *zSign
c2e0: 65 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69  edIdent){.  unsi
c2f0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e  gned char *zIden
c300: 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  t = (unsigned ch
c310: 61 72 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74  ar*)zSignedIdent
c320: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65  ;.  int i, j, ne
c330: 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a  edQuote;.  i = *
c340: 70 49 64 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30  pIdx;..  for(j=0
c350: 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b  ; zIdent[j]; j++
c360: 29 7b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  ){.    if( !sqli
c370: 74 65 33 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e  te3Isalnum(zIden
c380: 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b  t[j]) && zIdent[
c390: 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b  j]!='_' ) break;
c3a0: 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65  .  }.  needQuote
c3b0: 20 3d 20 73 71 6c 69 74 65 33 49 73 64 69 67 69   = sqlite3Isdigi
c3c0: 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20  t(zIdent[0]).   
c3d0: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
c3e0: 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a  te3KeywordCode(z
c3f0: 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44  Ident, j)!=TK_ID
c400: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
c410: 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20  zIdent[j]!=0.   
c420: 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3d 3d 30           || j==0
c430: 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f  ;..  if( needQuo
c440: 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22  te ) z[i++] = '"
c450: 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49  ';.  for(j=0; zI
c460: 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  dent[j]; j++){. 
c470: 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65     z[i++] = zIde
c480: 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a  nt[j];.    if( z
c490: 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20  Ident[j]=='"' ) 
c4a0: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
c4b0: 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  }.  if( needQuot
c4c0: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  e ) z[i++] = '"'
c4d0: 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20  ;.  z[i] = 0;.  
c4e0: 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a  *pIdx = i;.}../*
c4f0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43  .** Generate a C
c500: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
c510: 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74  ement appropriat
c520: 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
c530: 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72  ** table.  Memor
c540: 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65  y to hold the te
c550: 78 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  xt of the statem
c560: 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a  ent is obtained.
c570: 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ** from sqliteMa
c580: 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20  lloc() and must 
c590: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
c5a0: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
c5b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
c5c0: 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d   *createTableStm
c5d0: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  t(sqlite3 *db, T
c5e0: 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  able *p){.  int 
c5f0: 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20  i, k, n;.  char 
c600: 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a  *zStmt;.  char *
c610: 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a  zSep, *zSep2, *z
c620: 45 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  End;.  Column *p
c630: 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  Col;.  n = 0;.  
c640: 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43  for(pCol = p->aC
c650: 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  ol, i=0; i<p->nC
c660: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
c670: 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74  {.    n += ident
c680: 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61  Length(pCol->zNa
c690: 6d 65 29 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e  me) + 5;.  }.  n
c6a0: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
c6b0: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  p->zName);.  if(
c6c0: 20 6e 3c 35 30 20 29 7b 20 0a 20 20 20 20 7a 53   n<50 ){ .    zS
c6d0: 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65  ep = "";.    zSe
c6e0: 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45  p2 = ",";.    zE
c6f0: 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73  nd = ")";.  }els
c700: 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c  e{.    zSep = "\
c710: 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20  n  ";.    zSep2 
c720: 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a  = ",\n  ";.    z
c730: 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d  End = "\n)";.  }
c740: 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70  .  n += 35 + 6*p
c750: 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20  ->nCol;.  zStmt 
c760: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
c770: 63 52 61 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66  cRaw(0, n);.  if
c780: 28 20 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  ( zStmt==0 ){.  
c790: 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
c7a0: 74 28 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72  t(db);.    retur
c7b0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n 0;.  }.  sqlit
c7c0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a  e3_snprintf(n, z
c7d0: 53 74 6d 74 2c 20 22 43 52 45 41 54 45 20 54 41  Stmt, "CREATE TA
c7e0: 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71  BLE ");.  k = sq
c7f0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53  lite3Strlen30(zS
c800: 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74  tmt);.  identPut
c810: 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a  (zStmt, &k, p->z
c820: 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b  Name);.  zStmt[k
c830: 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72  ++] = '(';.  for
c840: 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69  (pCol=p->aCol, i
c850: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
c860: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
c870: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
c880: 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70  ar * const azTyp
c890: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  e[] = {.        
c8a0: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  /* SQLITE_AFF_BL
c8b0: 4f 42 20 20 20 20 2a 2f 20 22 22 2c 0a 20 20 20  OB    */ "",.   
c8c0: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
c8d0: 46 46 5f 54 45 58 54 20 20 20 20 2a 2f 20 22 20  FF_TEXT    */ " 
c8e0: 54 45 58 54 22 2c 0a 20 20 20 20 20 20 20 20 2f  TEXT",.        /
c8f0: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  * SQLITE_AFF_NUM
c900: 45 52 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a  ERIC */ " NUM",.
c910: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
c920: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f  E_AFF_INTEGER */
c930: 20 22 20 49 4e 54 22 2c 0a 20 20 20 20 20 20 20   " INT",.       
c940: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52   /* SQLITE_AFF_R
c950: 45 41 4c 20 20 20 20 2a 2f 20 22 20 52 45 41 4c  EAL    */ " REAL
c960: 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74  ".    };.    int
c970: 20 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20   len;.    const 
c980: 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20  char *zType;..  
c990: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
c9a0: 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b  tf(n-k, &zStmt[k
c9b0: 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20  ], zSep);.    k 
c9c0: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
c9d0: 33 30 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20  30(&zStmt[k]);. 
c9e0: 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b     zSep = zSep2;
c9f0: 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53  .    identPut(zS
ca00: 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a  tmt, &k, pCol->z
ca10: 4e 61 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72  Name);.    asser
ca20: 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  t( pCol->affinit
ca30: 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  y-SQLITE_AFF_BLO
ca40: 42 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73  B >= 0 );.    as
ca50: 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69  sert( pCol->affi
ca60: 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f  nity-SQLITE_AFF_
ca70: 42 4c 4f 42 20 3c 20 41 72 72 61 79 53 69 7a 65  BLOB < ArraySize
ca80: 28 61 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20  (azType) );.    
ca90: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e  testcase( pCol->
caa0: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
cab0: 5f 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20  _AFF_BLOB );.   
cac0: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
cad0: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
cae0: 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20  E_AFF_TEXT );.  
caf0: 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c    testcase( pCol
cb00: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
cb10: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
cb20: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
cb30: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
cb40: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
cb50: 45 52 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ER );.    testca
cb60: 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  se( pCol->affini
cb70: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ty==SQLITE_AFF_R
cb80: 45 41 4c 20 29 3b 0a 20 20 20 20 0a 20 20 20 20  EAL );.    .    
cb90: 7a 54 79 70 65 20 3d 20 61 7a 54 79 70 65 5b 70  zType = azType[p
cba0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20  Col->affinity - 
cbb0: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d  SQLITE_AFF_BLOB]
cbc0: 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69  ;.    len = sqli
cbd0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70  te3Strlen30(zTyp
cbe0: 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
cbf0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
cc00: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
cc10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
cc20: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
cc30: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
cc40: 79 70 65 28 7a 54 79 70 65 2c 20 30 29 20 29 3b  ype(zType, 0) );
cc50: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 53 74  .    memcpy(&zSt
cc60: 6d 74 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c 65  mt[k], zType, le
cc70: 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c 65 6e  n);.    k += len
cc80: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c  ;.    assert( k<
cc90: 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  =n );.  }.  sqli
cca0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b  te3_snprintf(n-k
ccb0: 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73  , &zStmt[k], "%s
ccc0: 22 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75  ", zEnd);.  retu
ccd0: 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a  rn zStmt;.}../*.
cce0: 2a 2a 20 52 65 73 69 7a 65 20 61 6e 20 49 6e 64  ** Resize an Ind
ccf0: 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 68 6f 6c  ex object to hol
cd00: 64 20 4e 20 63 6f 6c 75 6d 6e 73 20 74 6f 74 61  d N columns tota
cd10: 6c 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  l.  Return SQLIT
cd20: 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
cd30: 73 73 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f  ss and SQLITE_NO
cd40: 4d 45 4d 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72  MEM on an OOM er
cd50: 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ror..*/.static i
cd60: 6e 74 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62  nt resizeIndexOb
cd70: 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  ject(sqlite3 *db
cd80: 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69  , Index *pIdx, i
cd90: 6e 74 20 4e 29 7b 0a 20 20 63 68 61 72 20 2a 7a  nt N){.  char *z
cda0: 45 78 74 72 61 3b 0a 20 20 69 6e 74 20 6e 42 79  Extra;.  int nBy
cdb0: 74 65 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e  te;.  if( pIdx->
cdc0: 6e 43 6f 6c 75 6d 6e 3e 3d 4e 20 29 20 72 65 74  nColumn>=N ) ret
cdd0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
cde0: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69   assert( pIdx->i
cdf0: 73 52 65 73 69 7a 65 64 3d 3d 30 20 29 3b 0a 20  sResized==0 );. 
ce00: 20 6e 42 79 74 65 20 3d 20 28 73 69 7a 65 6f 66   nByte = (sizeof
ce10: 28 63 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f 66  (char*) + sizeof
ce20: 28 69 31 36 29 20 2b 20 31 29 2a 4e 3b 0a 20 20  (i16) + 1)*N;.  
ce30: 7a 45 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33  zExtra = sqlite3
ce40: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
ce50: 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 7a   nByte);.  if( z
ce60: 45 78 74 72 61 3d 3d 30 20 29 20 72 65 74 75 72  Extra==0 ) retur
ce70: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
ce80: 4b 50 54 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45  KPT;.  memcpy(zE
ce90: 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 7a 43 6f  xtra, pIdx->azCo
cea0: 6c 6c 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a  ll, sizeof(char*
ceb0: 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  )*pIdx->nColumn)
cec0: 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  ;.  pIdx->azColl
ced0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a   = (const char**
cee0: 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72  )zExtra;.  zExtr
cef0: 61 20 2b 3d 20 73 69 7a 65 6f 66 28 63 68 61 72  a += sizeof(char
cf00: 2a 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a  *)*N;.  memcpy(z
cf10: 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 69 43  Extra, pIdx->aiC
cf20: 6f 6c 75 6d 6e 2c 20 73 69 7a 65 6f 66 28 69 31  olumn, sizeof(i1
cf30: 36 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  6)*pIdx->nColumn
cf40: 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c  );.  pIdx->aiCol
cf50: 75 6d 6e 20 3d 20 28 69 31 36 2a 29 7a 45 78 74  umn = (i16*)zExt
cf60: 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20  ra;.  zExtra += 
cf70: 73 69 7a 65 6f 66 28 69 31 36 29 2a 4e 3b 0a 20  sizeof(i16)*N;. 
cf80: 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20   memcpy(zExtra, 
cf90: 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
cfa0: 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  , pIdx->nColumn)
cfb0: 3b 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  ;.  pIdx->aSortO
cfc0: 72 64 65 72 20 3d 20 28 75 38 2a 29 7a 45 78 74  rder = (u8*)zExt
cfd0: 72 61 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c  ra;.  pIdx->nCol
cfe0: 75 6d 6e 20 3d 20 4e 3b 0a 20 20 70 49 64 78 2d  umn = N;.  pIdx-
cff0: 3e 69 73 52 65 73 69 7a 65 64 20 3d 20 31 3b 0a  >isResized = 1;.
d000: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d010: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74  OK;.}../*.** Est
d020: 69 6d 61 74 65 20 74 68 65 20 74 6f 74 61 6c 20  imate the total 
d030: 72 6f 77 20 77 69 64 74 68 20 66 6f 72 20 61 20  row width for a 
d040: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
d050: 20 76 6f 69 64 20 65 73 74 69 6d 61 74 65 54 61   void estimateTa
d060: 62 6c 65 57 69 64 74 68 28 54 61 62 6c 65 20 2a  bleWidth(Table *
d070: 70 54 61 62 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pTab){.  unsigne
d080: 64 20 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  d wTable = 0;.  
d090: 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 70 54  const Column *pT
d0a0: 61 62 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  abCol;.  int i;.
d0b0: 20 20 66 6f 72 28 69 3d 70 54 61 62 2d 3e 6e 43    for(i=pTab->nC
d0c0: 6f 6c 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62  ol, pTabCol=pTab
d0d0: 2d 3e 61 43 6f 6c 3b 20 69 3e 30 3b 20 69 2d 2d  ->aCol; i>0; i--
d0e0: 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20  , pTabCol++){.  
d0f0: 20 20 77 54 61 62 6c 65 20 2b 3d 20 70 54 61 62    wTable += pTab
d100: 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 7d 0a  Col->szEst;.  }.
d110: 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65    if( pTab->iPKe
d120: 79 3c 30 20 29 20 77 54 61 62 6c 65 2b 2b 3b 0a  y<0 ) wTable++;.
d130: 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77    pTab->szTabRow
d140: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
d150: 28 77 54 61 62 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f  (wTable*4);.}../
d160: 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
d170: 65 20 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f  e average size o
d180: 66 20 61 20 72 6f 77 20 66 6f 72 20 61 6e 20 69  f a row for an i
d190: 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
d1a0: 76 6f 69 64 20 65 73 74 69 6d 61 74 65 49 6e 64  void estimateInd
d1b0: 65 78 57 69 64 74 68 28 49 6e 64 65 78 20 2a 70  exWidth(Index *p
d1c0: 49 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Idx){.  unsigned
d1d0: 20 77 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 69   wIndex = 0;.  i
d1e0: 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 43 6f  nt i;.  const Co
d1f0: 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 49 64  lumn *aCol = pId
d200: 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b  x->pTable->aCol;
d210: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
d220: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  dx->nColumn; i++
d230: 29 7b 0a 20 20 20 20 69 31 36 20 78 20 3d 20 70  ){.    i16 x = p
d240: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
d250: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 78 3c  ;.    assert( x<
d260: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43  pIdx->pTable->nC
d270: 6f 6c 20 29 3b 0a 20 20 20 20 77 49 6e 64 65 78  ol );.    wIndex
d280: 20 2b 3d 20 78 3c 30 20 3f 20 31 20 3a 20 61 43   += x<0 ? 1 : aC
d290: 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  ol[pIdx->aiColum
d2a0: 6e 5b 69 5d 5d 2e 73 7a 45 73 74 3b 0a 20 20 7d  n[i]].szEst;.  }
d2b0: 0a 20 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f  .  pIdx->szIdxRo
d2c0: 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
d2d0: 74 28 77 49 6e 64 65 78 2a 34 29 3b 0a 7d 0a 0a  t(wIndex*4);.}..
d2e0: 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  /* Return true i
d2f0: 66 20 76 61 6c 75 65 20 78 20 69 73 20 66 6f 75  f value x is fou
d300: 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 20 66 69  nd any of the fi
d310: 72 73 74 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73  rst nCol entries
d320: 20 6f 66 20 61 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73   of aiCol[].*/.s
d330: 74 61 74 69 63 20 69 6e 74 20 68 61 73 43 6f 6c  tatic int hasCol
d340: 75 6d 6e 28 63 6f 6e 73 74 20 69 31 36 20 2a 61  umn(const i16 *a
d350: 69 43 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20  iCol, int nCol, 
d360: 69 6e 74 20 78 29 7b 0a 20 20 77 68 69 6c 65 28  int x){.  while(
d370: 20 6e 43 6f 6c 2d 2d 20 3e 20 30 20 29 20 69 66   nCol-- > 0 ) if
d380: 28 20 78 3d 3d 2a 28 61 69 43 6f 6c 2b 2b 29 20  ( x==*(aiCol++) 
d390: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
d3a0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
d3b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   This routine ru
d3c0: 6e 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ns at the end of
d3d0: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
d3e0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
d3f0: 74 20 74 68 61 74 0a 2a 2a 20 68 61 73 20 61 20  t that.** has a 
d400: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 63 6c  WITHOUT ROWID cl
d410: 61 75 73 65 2e 20 20 54 68 65 20 6a 6f 62 20 6f  ause.  The job o
d420: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
d430: 73 20 74 6f 20 63 6f 6e 76 65 72 74 20 62 6f 74  s to convert bot
d440: 68 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 73 63  h.** internal sc
d450: 68 65 6d 61 20 64 61 74 61 20 73 74 72 75 63 74  hema data struct
d460: 75 72 65 73 20 61 6e 64 20 74 68 65 20 67 65 6e  ures and the gen
d470: 65 72 61 74 65 64 20 56 44 42 45 20 63 6f 64 65  erated VDBE code
d480: 20 73 6f 20 74 68 61 74 20 74 68 65 79 0a 2a 2a   so that they.**
d490: 20 61 72 65 20 61 70 70 72 6f 70 72 69 61 74 65   are appropriate
d4a0: 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52   for a WITHOUT R
d4b0: 4f 57 49 44 20 74 61 62 6c 65 20 69 6e 73 74 65  OWID table inste
d4c0: 61 64 20 6f 66 20 61 20 72 6f 77 69 64 20 74 61  ad of a rowid ta
d4d0: 62 6c 65 2e 0a 2a 2a 20 43 68 61 6e 67 65 73 20  ble..** Changes 
d4e0: 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20  include:.**.**  
d4f0: 20 20 20 28 31 29 20 20 53 65 74 20 61 6c 6c 20     (1)  Set all 
d500: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 50  columns of the P
d510: 52 49 4d 41 52 59 20 4b 45 59 20 73 63 68 65 6d  RIMARY KEY schem
d520: 61 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 4e  a object to be N
d530: 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a 20 20 20 20 20  OT NULL..**     
d540: 28 32 29 20 20 43 6f 6e 76 65 72 74 20 74 68 65  (2)  Convert the
d550: 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20   OP_CreateTable 
d560: 69 6e 74 6f 20 61 6e 20 4f 50 5f 43 72 65 61 74  into an OP_Creat
d570: 65 49 6e 64 65 78 2e 20 20 54 68 65 72 65 20 69  eIndex.  There i
d580: 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 6e 6f  s.**          no
d590: 20 72 6f 77 69 64 20 62 74 72 65 65 20 66 6f 72   rowid btree for
d5a0: 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
d5b0: 2e 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20  .  Instead, the 
d5c0: 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 20 20 20  canonical.**    
d5d0: 20 20 20 20 20 20 64 61 74 61 20 73 74 6f 72 61        data stora
d5e0: 67 65 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67  ge is a covering
d5f0: 20 69 6e 64 65 78 20 62 74 72 65 65 2e 0a 2a 2a   index btree..**
d600: 20 20 20 20 20 28 33 29 20 20 42 79 70 61 73 73       (3)  Bypass
d610: 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66   the creation of
d620: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
d630: 65 72 20 74 61 62 6c 65 20 65 6e 74 72 79 0a 2a  er table entry.*
d640: 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74  *          for t
d650: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61  he PRIMARY KEY a
d660: 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  s the primary ke
d670: 79 20 69 6e 64 65 78 20 69 73 20 6e 6f 77 0a 2a  y index is now.*
d680: 2a 20 20 20 20 20 20 20 20 20 20 69 64 65 6e 74  *          ident
d690: 69 66 69 65 64 20 62 79 20 74 68 65 20 73 71 6c  ified by the sql
d6a0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
d6b0: 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61   entry of the ta
d6c0: 62 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 20  ble itself..**  
d6d0: 20 20 20 28 34 29 20 20 53 65 74 20 74 68 65 20     (4)  Set the 
d6e0: 49 6e 64 65 78 2e 74 6e 75 6d 20 6f 66 20 74 68  Index.tnum of th
d6f0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e  e PRIMARY KEY In
d700: 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 74 68  dex object in th
d710: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63  e.**          sc
d720: 68 65 6d 61 20 74 6f 20 74 68 65 20 72 6f 6f 74  hema to the root
d730: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6d 61  page from the ma
d740: 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  in table..**    
d750: 20 28 35 29 20 20 41 64 64 20 61 6c 6c 20 74 61   (5)  Add all ta
d760: 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74  ble columns to t
d770: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 49  he PRIMARY KEY I
d780: 6e 64 65 78 20 6f 62 6a 65 63 74 0a 2a 2a 20 20  ndex object.**  
d790: 20 20 20 20 20 20 20 20 73 6f 20 74 68 61 74 20          so that 
d7a0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
d7b0: 69 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  is a covering in
d7c0: 64 65 78 2e 20 20 54 68 65 20 73 75 72 70 6c 75  dex.  The surplu
d7d0: 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f  s.**          co
d7e0: 6c 75 6d 6e 73 20 61 72 65 20 70 61 72 74 20 6f  lumns are part o
d7f0: 66 20 4b 65 79 49 6e 66 6f 2e 6e 58 46 69 65 6c  f KeyInfo.nXFiel
d800: 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 75 73  d and are not us
d810: 65 64 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ed for.**       
d820: 20 20 20 73 6f 72 74 69 6e 67 20 6f 72 20 6c 6f     sorting or lo
d830: 6f 6b 75 70 20 6f 72 20 75 6e 69 71 75 65 6e 65  okup or uniquene
d840: 73 73 20 63 68 65 63 6b 73 2e 0a 2a 2a 20 20 20  ss checks..**   
d850: 20 20 28 36 29 20 20 52 65 70 6c 61 63 65 20 74    (6)  Replace t
d860: 68 65 20 72 6f 77 69 64 20 74 61 69 6c 20 6f 6e  he rowid tail on
d870: 20 61 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c   all automatical
d880: 6c 79 20 67 65 6e 65 72 61 74 65 64 20 55 4e 49  ly generated UNI
d890: 51 55 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  QUE.**          
d8a0: 69 6e 64 69 63 65 73 20 77 69 74 68 20 74 68 65  indices with the
d8b0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
d8c0: 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  umns..**.** For 
d8d0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2c 20  virtual tables, 
d8e0: 6f 6e 6c 79 20 28 31 29 20 69 73 20 70 65 72 66  only (1) is perf
d8f0: 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ormed..*/.static
d900: 20 76 6f 69 64 20 63 6f 6e 76 65 72 74 54 6f 57   void convertToW
d910: 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65  ithoutRowidTable
d920: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
d930: 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20  Table *pTab){.  
d940: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 49  Index *pIdx;.  I
d950: 6e 64 65 78 20 2a 70 50 6b 3b 0a 20 20 69 6e 74  ndex *pPk;.  int
d960: 20 6e 50 6b 3b 0a 20 20 69 6e 74 20 69 2c 20 6a   nPk;.  int i, j
d970: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
d980: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
d990: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
d9a0: 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 2f 2a 20 4d  ->pVdbe;..  /* M
d9b0: 61 72 6b 20 65 76 65 72 79 20 50 52 49 4d 41 52  ark every PRIMAR
d9c0: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 61 73 20  Y KEY column as 
d9d0: 4e 4f 54 20 4e 55 4c 4c 20 28 65 78 63 65 70 74  NOT NULL (except
d9e0: 20 66 6f 72 20 69 6d 70 6f 73 74 65 72 20 74 61   for imposter ta
d9f0: 62 6c 65 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28  bles).  */.  if(
da00: 20 21 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73   !db->init.impos
da10: 74 65 72 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  terTable ){.    
da20: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d  for(i=0; i<pTab-
da30: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
da40: 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 61 43     if( (pTab->aC
da50: 6f 6c 5b 69 5d 2e 63 6f 6c 46 6c 61 67 73 20 26  ol[i].colFlags &
da60: 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59   COLFLAG_PRIMKEY
da70: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
da80: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f  pTab->aCol[i].no
da90: 74 4e 75 6c 6c 20 3d 20 4f 45 5f 41 62 6f 72 74  tNull = OE_Abort
daa0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dab0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65    }..  /* The re
dac0: 6d 61 69 6e 69 6e 67 20 74 72 61 6e 73 66 6f 72  maining transfor
dad0: 6d 61 74 69 6f 6e 73 20 6f 6e 6c 79 20 61 70 70  mations only app
dae0: 6c 79 20 74 6f 20 62 2d 74 72 65 65 20 74 61 62  ly to b-tree tab
daf0: 6c 65 73 2c 20 6e 6f 74 20 74 6f 0a 20 20 2a 2a  les, not to.  **
db00: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
db10: 2a 2f 0a 20 20 69 66 28 20 49 4e 5f 44 45 43 4c  */.  if( IN_DECL
db20: 41 52 45 5f 56 54 41 42 20 29 20 72 65 74 75 72  ARE_VTAB ) retur
db30: 6e 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74  n;..  /* Convert
db40: 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65 54 61   the OP_CreateTa
db50: 62 6c 65 20 6f 70 63 6f 64 65 20 74 68 61 74 20  ble opcode that 
db60: 77 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 63  would normally c
db70: 72 65 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 72  reate the.  ** r
db80: 6f 6f 74 2d 70 61 67 65 20 66 6f 72 20 74 68 65  oot-page for the
db90: 20 74 61 62 6c 65 20 69 6e 74 6f 20 61 6e 20 4f   table into an O
dba0: 50 5f 43 72 65 61 74 65 49 6e 64 65 78 20 6f 70  P_CreateIndex op
dbb0: 63 6f 64 65 2e 20 20 54 68 65 20 69 6e 64 65 78  code.  The index
dbc0: 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 77 69  .  ** created wi
dbd0: 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 50 52  ll become the PR
dbe0: 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e  IMARY KEY index.
dbf0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
dc00: 73 65 2d 3e 61 64 64 72 43 72 54 61 62 20 29 7b  se->addrCrTab ){
dc10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 20 29  .    assert( v )
dc20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
dc30: 65 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c  eChangeOpcode(v,
dc40: 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54   pParse->addrCrT
dc50: 61 62 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64  ab, OP_CreateInd
dc60: 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  ex);.  }..  /* L
dc70: 6f 63 61 74 65 20 74 68 65 20 50 52 49 4d 41 52  ocate the PRIMAR
dc80: 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 20 4f 72  Y KEY index.  Or
dc90: 2c 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20  , if this table 
dca0: 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  was originally. 
dcb0: 20 2a 2a 20 61 6e 20 49 4e 54 45 47 45 52 20 50   ** an INTEGER P
dcc0: 52 49 4d 41 52 59 20 4b 45 59 20 74 61 62 6c 65  RIMARY KEY table
dcd0: 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 50  , create a new P
dce0: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
dcf0: 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  . .  */.  if( pT
dd00: 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a  ab->iPKey>=0 ){.
dd10: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
dd20: 69 73 74 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 69  ist;.    Token i
dd30: 70 6b 54 6f 6b 65 6e 3b 0a 20 20 20 20 73 71 6c  pkToken;.    sql
dd40: 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 69  ite3TokenInit(&i
dd50: 70 6b 54 6f 6b 65 6e 2c 20 70 54 61 62 2d 3e 61  pkToken, pTab->a
dd60: 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d  Col[pTab->iPKey]
dd70: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69  .zName);.    pLi
dd80: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
dd90: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
dda0: 65 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  e, 0, .         
ddb0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ddc0: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
ddd0: 5f 49 44 2c 20 26 69 70 6b 54 6f 6b 65 6e 2c 20  _ID, &ipkToken, 
dde0: 30 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  0));.    if( pLi
ddf0: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
de00: 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e      pList->a[0].
de10: 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 50 61 72  sortOrder = pPar
de20: 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72  se->iPkSortOrder
de30: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
de40: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d  arse->pNewTable=
de50: 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 73 71 6c  =pTab );.    sql
de60: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
de70: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c  pParse, 0, 0, 0,
de80: 20 70 4c 69 73 74 2c 20 70 54 61 62 2d 3e 6b 65   pList, pTab->ke
de90: 79 43 6f 6e 66 2c 20 30 2c 20 30 2c 20 30 2c 20  yConf, 0, 0, 0, 
dea0: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
deb0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
dec0: 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59  _IDXTYPE_PRIMARY
ded0: 4b 45 59 29 3b 0a 20 20 20 20 69 66 28 20 64 62  KEY);.    if( db
dee0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
def0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 50 6b   return;.    pPk
df00: 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
df10: 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
df20: 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  .    pTab->iPKey
df30: 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = -1;.  }else{.
df40: 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65      pPk = sqlite
df50: 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
df60: 28 70 54 61 62 29 3b 0a 0a 20 20 20 20 2f 2a 20  (pTab);..    /* 
df70: 42 79 70 61 73 73 20 74 68 65 20 63 72 65 61 74  Bypass the creat
df80: 69 6f 6e 20 6f 66 20 74 68 65 20 50 52 49 4d 41  ion of the PRIMA
df90: 52 59 20 4b 45 59 20 62 74 72 65 65 20 61 6e 64  RY KEY btree and
dfa0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
dfb0: 65 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  er.    ** table 
dfc0: 65 6e 74 72 79 2e 20 54 68 69 73 20 69 73 20 6f  entry. This is o
dfd0: 6e 6c 79 20 72 65 71 75 69 72 65 64 20 69 66 20  nly required if 
dfe0: 63 75 72 72 65 6e 74 6c 79 20 67 65 6e 65 72 61  currently genera
dff0: 74 69 6e 67 20 56 44 42 45 0a 20 20 20 20 2a 2a  ting VDBE.    **
e000: 20 63 6f 64 65 20 66 6f 72 20 61 20 43 52 45 41   code for a CREA
e010: 54 45 20 54 41 42 4c 45 20 28 6e 6f 74 20 77 68  TE TABLE (not wh
e020: 65 6e 20 70 61 72 73 69 6e 67 20 6f 6e 65 20 61  en parsing one a
e030: 73 20 70 61 72 74 20 6f 66 20 72 65 61 64 69 6e  s part of readin
e040: 67 0a 20 20 20 20 2a 2a 20 61 20 64 61 74 61 62  g.    ** a datab
e050: 61 73 65 20 73 63 68 65 6d 61 29 2e 20 20 2a 2f  ase schema).  */
e060: 0a 20 20 20 20 69 66 28 20 76 20 29 7b 0a 20 20  .    if( v ){.  
e070: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
e080: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a  init.busy==0 );.
e090: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e0a0: 65 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c  eChangeOpcode(v,
e0b0: 20 70 50 6b 2d 3e 74 6e 75 6d 2c 20 4f 50 5f 47   pPk->tnum, OP_G
e0c0: 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  oto);.    }..   
e0d0: 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 6d 6f 76   /*.    ** Remov
e0e0: 65 20 61 6c 6c 20 72 65 64 75 6e 64 61 6e 74 20  e all redundant 
e0f0: 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65  columns from the
e100: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 46   PRIMARY KEY.  F
e110: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 68 61 6e  or example, chan
e120: 67 65 0a 20 20 20 20 2a 2a 20 22 50 52 49 4d 41  ge.    ** "PRIMA
e130: 52 59 20 4b 45 59 28 61 2c 62 2c 61 2c 62 2c 63  RY KEY(a,b,a,b,c
e140: 2c 62 2c 63 2c 64 29 22 20 69 6e 74 6f 20 6a 75  ,b,c,d)" into ju
e150: 73 74 20 22 50 52 49 4d 41 52 59 20 4b 45 59 28  st "PRIMARY KEY(
e160: 61 2c 62 2c 63 2c 64 29 22 2e 20 20 4c 61 74 65  a,b,c,d)".  Late
e170: 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 61 73  r.    ** code as
e180: 73 75 6d 65 73 20 74 68 65 20 50 52 49 4d 41 52  sumes the PRIMAR
e190: 59 20 4b 45 59 20 63 6f 6e 74 61 69 6e 73 20 6e  Y KEY contains n
e1a0: 6f 20 72 65 70 65 61 74 65 64 20 63 6f 6c 75 6d  o repeated colum
e1b0: 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ns..    */.    f
e1c0: 6f 72 28 69 3d 6a 3d 31 3b 20 69 3c 70 50 6b 2d  or(i=j=1; i<pPk-
e1d0: 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nKeyCol; i++){.
e1e0: 20 20 20 20 20 20 69 66 28 20 68 61 73 43 6f 6c        if( hasCol
e1f0: 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  umn(pPk->aiColum
e200: 6e 2c 20 6a 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c  n, j, pPk->aiCol
e210: 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  umn[i]) ){.     
e220: 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 2d     pPk->nColumn-
e230: 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  -;.      }else{.
e240: 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43          pPk->aiC
e250: 6f 6c 75 6d 6e 5b 6a 2b 2b 5d 20 3d 20 70 50 6b  olumn[j++] = pPk
e260: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
e270: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
e280: 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20   pPk->nKeyCol = 
e290: 6a 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  j;.  }.  assert(
e2a0: 20 70 50 6b 21 3d 30 20 29 3b 0a 20 20 70 50 6b   pPk!=0 );.  pPk
e2b0: 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 31  ->isCovering = 1
e2c0: 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  ;.  if( !db->ini
e2d0: 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c 65 20  t.imposterTable 
e2e0: 29 20 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e 75  ) pPk->uniqNotNu
e2f0: 6c 6c 20 3d 20 31 3b 0a 20 20 6e 50 6b 20 3d 20  ll = 1;.  nPk = 
e300: 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 0a 20  pPk->nKeyCol;.. 
e310: 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67   /* The root pag
e320: 65 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59  e of the PRIMARY
e330: 20 4b 45 59 20 69 73 20 74 68 65 20 74 61 62 6c   KEY is the tabl
e340: 65 20 72 6f 6f 74 20 70 61 67 65 20 2a 2f 0a 20  e root page */. 
e350: 20 70 50 6b 2d 3e 74 6e 75 6d 20 3d 20 70 54 61   pPk->tnum = pTa
e360: 62 2d 3e 74 6e 75 6d 3b 0a 0a 20 20 2f 2a 20 55  b->tnum;..  /* U
e370: 70 64 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  pdate the in-mem
e380: 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
e390: 6f 6e 20 6f 66 20 61 6c 6c 20 55 4e 49 51 55 45  on of all UNIQUE
e3a0: 20 69 6e 64 69 63 65 73 20 62 79 20 63 6f 6e 76   indices by conv
e3b0: 65 72 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  erting.  ** the 
e3c0: 66 69 6e 61 6c 20 72 6f 77 69 64 20 63 6f 6c 75  final rowid colu
e3d0: 6d 6e 20 69 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d  mn into one or m
e3e0: 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  ore columns of t
e3f0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a  he PRIMARY KEY..
e400: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d    */.  for(pIdx=
e410: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
e420: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
e430: 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e  Next){.    int n
e440: 3b 0a 20 20 20 20 69 66 28 20 49 73 50 72 69 6d  ;.    if( IsPrim
e450: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78  aryKeyIndex(pIdx
e460: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
e470: 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c 6e    for(i=n=0; i<n
e480: 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Pk; i++){.      
e490: 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70  if( !hasColumn(p
e4a0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70  Idx->aiColumn, p
e4b0: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50  Idx->nKeyCol, pP
e4c0: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20  k->aiColumn[i]) 
e4d0: 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ) n++;.    }.   
e4e0: 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
e4f0: 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78     /* This index
e500: 20 69 73 20 61 20 73 75 70 65 72 73 65 74 20 6f   is a superset o
e510: 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  f the primary ke
e520: 79 20 2a 2f 0a 20 20 20 20 20 20 70 49 64 78 2d  y */.      pIdx-
e530: 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d  >nColumn = pIdx-
e540: 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20  >nKeyCol;.      
e550: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
e560: 20 20 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e      if( resizeIn
e570: 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 49  dexObject(db, pI
e580: 64 78 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  dx, pIdx->nKeyCo
e590: 6c 2b 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  l+n) ) return;. 
e5a0: 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 49     for(i=0, j=pI
e5b0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 3c 6e  dx->nKeyCol; i<n
e5c0: 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Pk; i++){.      
e5d0: 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70  if( !hasColumn(p
e5e0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70  Idx->aiColumn, p
e5f0: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50  Idx->nKeyCol, pP
e600: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20  k->aiColumn[i]) 
e610: 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  ){.        pIdx-
e620: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70  >aiColumn[j] = p
e630: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  Pk->aiColumn[i];
e640: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
e650: 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 70 50 6b 2d 3e  zColl[j] = pPk->
e660: 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  azColl[i];.     
e670: 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     j++;.      }.
e680: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
e690: 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e  ( pIdx->nColumn>
e6a0: 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e  =pIdx->nKeyCol+n
e6b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
e6c0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6a  pIdx->nColumn>=j
e6d0: 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64   );.  }..  /* Ad
e6e0: 64 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75  d all table colu
e6f0: 6d 6e 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41  mns to the PRIMA
e700: 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20 20 2a  RY KEY index.  *
e710: 2f 0a 20 20 69 66 28 20 6e 50 6b 3c 70 54 61 62  /.  if( nPk<pTab
e720: 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 69 66  ->nCol ){.    if
e730: 28 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a  ( resizeIndexObj
e740: 65 63 74 28 64 62 2c 20 70 50 6b 2c 20 70 54 61  ect(db, pPk, pTa
e750: 62 2d 3e 6e 43 6f 6c 29 20 29 20 72 65 74 75 72  b->nCol) ) retur
e760: 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  n;.    for(i=0, 
e770: 6a 3d 6e 50 6b 3b 20 69 3c 70 54 61 62 2d 3e 6e  j=nPk; i<pTab->n
e780: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
e790: 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28   if( !hasColumn(
e7a0: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a  pPk->aiColumn, j
e7b0: 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , i) ){.        
e7c0: 61 73 73 65 72 74 28 20 6a 3c 70 50 6b 2d 3e 6e  assert( j<pPk->n
e7d0: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20  Column );.      
e7e0: 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b    pPk->aiColumn[
e7f0: 6a 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  j] = i;.        
e800: 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d  pPk->azColl[j] =
e810: 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
e820: 59 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a  Y;.        j++;.
e830: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e840: 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e 6e    assert( pPk->n
e850: 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a 20 20 20  Column==j );.   
e860: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
e870: 43 6f 6c 3d 3d 6a 20 29 3b 0a 20 20 7d 65 6c 73  Col==j );.  }els
e880: 65 7b 0a 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c  e{.    pPk->nCol
e890: 75 6d 6e 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c  umn = pTab->nCol
e8a0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
e8b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
e8c0: 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20  alled to report 
e8d0: 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68  the final ")" th
e8e0: 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a  at terminates.**
e8f0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
e900: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
e910: 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63   The table struc
e920: 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20  ture that other 
e930: 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  action routines 
e940: 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69  have been buildi
e950: 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74  ng.** is added t
e960: 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68  o the internal h
e970: 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75  ash tables, assu
e980: 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68  ming no errors h
e990: 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e  ave.** occurred.
e9a0: 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20  .**.** An entry 
e9b0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73  for the table is
e9c0: 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73   made in the mas
e9d0: 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73  ter table on dis
e9e0: 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69  k, unless.** thi
e9f0: 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
ea00: 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e   table or db->in
ea10: 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65  it.busy==1.  Whe
ea20: 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  n db->init.busy=
ea30: 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77  =1.** it means w
ea40: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
ea50: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
ea60: 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65  table because we
ea70: 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74   just.** connect
ea80: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
ea90: 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74 68  se or because th
eaa0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
eab0: 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63  table has.** rec
eac0: 65 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73  ently changed, s
ead0: 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  o the entry for 
eae0: 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61  this table alrea
eaf0: 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20  dy exists in.** 
eb00: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
eb10: 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20  r table.  We do 
eb20: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61  not want to crea
eb30: 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a  te it again..**.
eb40: 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65 63  ** If the pSelec
eb50: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  t argument is no
eb60: 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73  t NULL, it means
eb70: 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69   that this routi
eb80: 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64  ne.** was called
eb90: 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62   to create a tab
eba0: 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  le generated fro
ebb0: 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20  m a .** "CREATE 
ebc0: 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c  TABLE ... AS SEL
ebd0: 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65  ECT ..." stateme
ebe0: 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20  nt.  The column 
ebf0: 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
ec00: 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d  new table will m
ec10: 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74 20  atch the result 
ec20: 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
ec30: 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  T..*/.void sqlit
ec40: 65 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61  e3EndTable(.  Pa
ec50: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
ec60: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
ec70: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
ec80: 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20  n *pCons,       
ec90: 20 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74      /* The ',' t
eca0: 6f 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c  oken after the l
ecb0: 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e  ast column defn.
ecc0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e   */.  Token *pEn
ecd0: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d,            /*
ece0: 20 54 68 65 20 27 29 27 20 62 65 66 6f 72 65 20   The ')' before 
ecf0: 6f 70 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 43  options in the C
ed00: 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20  REATE TABLE */. 
ed10: 20 75 38 20 74 61 62 4f 70 74 73 2c 20 20 20 20   u8 tabOpts,    
ed20: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
ed30: 61 20 74 61 62 6c 65 20 6f 70 74 69 6f 6e 73 2e  a table options.
ed40: 20 55 73 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a 20   Usually 0. */. 
ed50: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
ed60: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
ed70: 63 74 20 66 72 6f 6d 20 61 20 22 43 52 45 41 54  ct from a "CREAT
ed80: 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 22  E ... AS SELECT"
ed90: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
eda0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
edb0: 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 74 61     /* The new ta
edc0: 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
edd0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
ede0: 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61  b; /* The databa
edf0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
ee00: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
ee10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ee20: 44 61 74 61 62 61 73 65 20 69 6e 20 77 68 69 63  Database in whic
ee30: 68 20 74 68 65 20 74 61 62 6c 65 20 6c 69 76 65  h the table live
ee40: 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  s */.  Index *pI
ee50: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
ee60: 20 2f 2a 20 41 6e 20 69 6d 70 6c 69 65 64 20 69   /* An implied i
ee70: 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c  ndex of the tabl
ee80: 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 6e 64  e */..  if( pEnd
ee90: 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d  ==0 && pSelect==
eea0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
eeb0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
eec0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
eed0: 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65   );.  p = pParse
eee0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
eef0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
ef00: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  ;..  assert( !db
ef10: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21  ->init.busy || !
ef20: 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 2f 2a  pSelect );..  /*
ef30: 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74   If the db->init
ef40: 2e 62 75 73 79 20 69 73 20 31 20 69 74 20 6d 65  .busy is 1 it me
ef50: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
ef60: 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74  ng the SQL off t
ef70: 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f  he.  ** "sqlite_
ef80: 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69  master" or "sqli
ef90: 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20  te_temp_master" 
efa0: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73  table on the dis
efb0: 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f  k..  ** So do no
efc0: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64  t write to the d
efd0: 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72  isk again.  Extr
efe0: 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67  act the root pag
eff0: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f  e number.  ** fo
f000: 72 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  r the table from
f010: 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65   the db->init.ne
f020: 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54  wTnum field.  (T
f030: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20  he page number. 
f040: 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20   ** should have 
f050: 62 65 65 6e 20 70 75 74 20 74 68 65 72 65 20 62  been put there b
f060: 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e  y the sqliteOpen
f070: 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a  Cb routine.).  *
f080: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72 6f  *.  ** If the ro
f090: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  ot page number i
f0a0: 73 20 31 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  s 1, that means 
f0b0: 74 68 69 73 20 69 73 20 74 68 65 20 73 71 6c 69  this is the sqli
f0c0: 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74  te_master.  ** t
f0d0: 61 62 6c 65 20 69 74 73 65 6c 66 2e 20 20 53 6f  able itself.  So
f0e0: 20 6d 61 72 6b 20 69 74 20 72 65 61 64 2d 6f 6e   mark it read-on
f0f0: 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ly..  */.  if( d
f100: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
f110: 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62      p->tnum = db
f120: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a  ->init.newTnum;.
f130: 20 20 20 20 69 66 28 20 70 2d 3e 74 6e 75 6d 3d      if( p->tnum=
f140: 3d 31 20 29 20 70 2d 3e 74 61 62 46 6c 61 67 73  =1 ) p->tabFlags
f150: 20 7c 3d 20 54 46 5f 52 65 61 64 6f 6e 6c 79 3b   |= TF_Readonly;
f160: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69  .  }..  /* Speci
f170: 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  al processing fo
f180: 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  r WITHOUT ROWID 
f190: 54 61 62 6c 65 73 20 2a 2f 0a 20 20 69 66 28 20  Tables */.  if( 
f1a0: 74 61 62 4f 70 74 73 20 26 20 54 46 5f 57 69 74  tabOpts & TF_Wit
f1b0: 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20 20 20  houtRowid ){.   
f1c0: 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67   if( (p->tabFlag
f1d0: 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65  s & TF_Autoincre
f1e0: 6d 65 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 73  ment) ){.      s
f1f0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
f200: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
f210: 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20   "AUTOINCREMENT 
f220: 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 57  not allowed on W
f230: 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
f240: 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74  les");.      ret
f250: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  urn;.    }.    i
f260: 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20  f( (p->tabFlags 
f270: 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b  & TF_HasPrimaryK
f280: 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ey)==0 ){.      
f290: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
f2a0: 70 50 61 72 73 65 2c 20 22 50 52 49 4d 41 52 59  pParse, "PRIMARY
f2b0: 20 4b 45 59 20 6d 69 73 73 69 6e 67 20 6f 6e 20   KEY missing on 
f2c0: 74 61 62 6c 65 20 25 73 22 2c 20 70 2d 3e 7a 4e  table %s", p->zN
f2d0: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ame);.    }else{
f2e0: 0a 20 20 20 20 20 20 70 2d 3e 74 61 62 46 6c 61  .      p->tabFla
f2f0: 67 73 20 7c 3d 20 54 46 5f 57 69 74 68 6f 75 74  gs |= TF_Without
f300: 52 6f 77 69 64 20 7c 20 54 46 5f 4e 6f 56 69 73  Rowid | TF_NoVis
f310: 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 20  ibleRowid;.     
f320: 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75   convertToWithou
f330: 74 52 6f 77 69 64 54 61 62 6c 65 28 70 50 61 72  tRowidTable(pPar
f340: 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20  se, p);.    }.  
f350: 7d 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  }..  iDb = sqlit
f360: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
f370: 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b  db, p->pSchema);
f380: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
f390: 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a  _OMIT_CHECK.  /*
f3a0: 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69   Resolve names i
f3b0: 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73  n all CHECK cons
f3c0: 74 72 61 69 6e 74 20 65 78 70 72 65 73 73 69 6f  traint expressio
f3d0: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ns..  */.  if( p
f3e0: 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20  ->pCheck ){.    
f3f0: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65  sqlite3ResolveSe
f400: 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61 72  lfReference(pPar
f410: 73 65 2c 20 70 2c 20 4e 43 5f 49 73 43 68 65 63  se, p, NC_IsChec
f420: 6b 2c 20 30 2c 20 70 2d 3e 70 43 68 65 63 6b 29  k, 0, p->pCheck)
f430: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
f440: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
f450: 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a  OMIT_CHECK) */..
f460: 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68    /* Estimate th
f470: 65 20 61 76 65 72 61 67 65 20 72 6f 77 20 73 69  e average row si
f480: 7a 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ze for the table
f490: 20 61 6e 64 20 66 6f 72 20 61 6c 6c 20 69 6d 70   and for all imp
f4a0: 6c 69 65 64 20 69 6e 64 69 63 65 73 20 2a 2f 0a  lied indices */.
f4b0: 20 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57    estimateTableW
f4c0: 69 64 74 68 28 70 29 3b 0a 20 20 66 6f 72 28 70  idth(p);.  for(p
f4d0: 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70  Idx=p->pIndex; p
f4e0: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
f4f0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 65 73 74 69  pNext){.    esti
f500: 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 70  mateIndexWidth(p
f510: 49 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Idx);.  }..  /* 
f520: 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  If not initializ
f530: 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ing, then create
f540: 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68   a record for th
f550: 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a  e new table.  **
f560: 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   in the SQLITE_M
f570: 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74  ASTER table of t
f580: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  he database..  *
f590: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69  *.  ** If this i
f5a0: 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61  s a TEMPORARY ta
f5b0: 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20 65  ble, write the e
f5c0: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75  ntry into the au
f5d0: 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c  xiliary.  ** fil
f5e0: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74  e instead of int
f5f0: 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  o the main datab
f600: 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ase file..  */. 
f610: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
f620: 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  usy ){.    int n
f630: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20  ;.    Vdbe *v;. 
f640: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 20     char *zType; 
f650: 20 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72 20     /* "view" or 
f660: 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63  "table" */.    c
f670: 68 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f  har *zType2;   /
f680: 2a 20 22 56 49 45 57 22 20 6f 72 20 22 54 41 42  * "VIEW" or "TAB
f690: 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  LE" */.    char 
f6a0: 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65  *zStmt;    /* Te
f6b0: 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
f6c0: 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45   TABLE or CREATE
f6d0: 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20   VIEW statement 
f6e0: 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  */..    v = sqli
f6f0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
f700: 65 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45  e);.    if( NEVE
f710: 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
f720: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ;..    sqlite3Vd
f730: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
f740: 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  lose, 0);..    /
f750: 2a 20 0a 20 20 20 20 2a 2a 20 49 6e 69 74 69 61  * .    ** Initia
f760: 6c 69 7a 65 20 7a 54 79 70 65 20 66 6f 72 20 74  lize zType for t
f770: 68 65 20 6e 65 77 20 76 69 65 77 20 6f 72 20 74  he new view or t
f780: 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
f790: 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d   if( p->pSelect=
f7a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
f7b0: 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a   regular table *
f7c0: 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  /.      zType = 
f7d0: 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a  "table";.      z
f7e0: 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b  Type2 = "TABLE";
f7f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f800: 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65  OMIT_VIEW.    }e
f810: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
f820: 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54  view */.      zT
f830: 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20  ype = "view";.  
f840: 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49      zType2 = "VI
f850: 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  EW";.#endif.    
f860: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
f870: 73 20 69 73 20 61 20 43 52 45 41 54 45 20 54 41  s is a CREATE TA
f880: 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43 54  BLE xx AS SELECT
f890: 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68   ..., execute th
f8a0: 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20  e SELECT.    ** 
f8b0: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70  statement to pop
f8c0: 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74 61  ulate the new ta
f8d0: 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61  ble. The root-pa
f8e0: 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
f8f0: 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62  e.    ** new tab
f900: 6c 65 20 69 73 20 69 6e 20 72 65 67 69 73 74 65  le is in registe
f910: 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f  r pParse->regRoo
f920: 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
f930: 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54   Once the SELECT
f940: 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20   has been coded 
f950: 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  by sqlite3Select
f960: 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20  (), it is in a. 
f970: 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73     ** suitable s
f980: 74 61 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f  tate to query fo
f990: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r the column nam
f9a0: 65 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20  es and types to 
f9b0: 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62  be used.    ** b
f9c0: 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  y the new table.
f9d0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
f9e0: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 77 72   shared-cache wr
f9f0: 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  ite-lock is not 
fa00: 72 65 71 75 69 72 65 64 20 74 6f 20 77 72 69 74  required to writ
fa10: 65 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62  e to the new tab
fa20: 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61 20  le,.    ** as a 
fa30: 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74  schema-lock must
fa40: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
fa50: 65 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20 63  en obtained to c
fa60: 72 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65 0a  reate it. Since.
fa70: 20 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d      ** a schema-
fa80: 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61 6c  lock excludes al
fa90: 6c 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  l other database
faa0: 20 75 73 65 72 73 2c 20 74 68 65 20 77 72 69 74   users, the writ
fab0: 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20  e-lock would.   
fac0: 20 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e 74   ** be redundant
fad0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
fae0: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
faf0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
fb00: 74 3b 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74  t;    /* Where t
fb10: 68 65 20 53 45 4c 45 43 54 20 73 68 6f 75 6c 64  he SELECT should
fb20: 20 73 74 6f 72 65 20 72 65 73 75 6c 74 73 20 2a   store results *
fb30: 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 59  /.      int regY
fb40: 69 65 6c 64 3b 20 20 20 20 20 20 20 2f 2a 20 52  ield;       /* R
fb50: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
fb60: 63 6f 2d 72 6f 75 74 69 6e 65 20 65 6e 74 72 79  co-routine entry
fb70: 2d 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20  -point */.      
fb80: 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20  int addrTop;    
fb90: 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
fba0: 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a  e co-routine */.
fbb0: 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63        int regRec
fbc0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72  ;         /* A r
fbd0: 65 63 6f 72 64 20 74 6f 20 62 65 20 69 6e 73 65  ecord to be inse
fbe0: 72 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20  rt into the new 
fbf0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69  table */.      i
fc00: 6e 74 20 72 65 67 52 6f 77 69 64 3b 20 20 20 20  nt regRowid;    
fc10: 20 20 20 2f 2a 20 52 6f 77 69 64 20 6f 66 20 74     /* Rowid of t
fc20: 68 65 20 6e 65 78 74 20 72 6f 77 20 74 6f 20 69  he next row to i
fc30: 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20 20 20 69  nsert */.      i
fc40: 6e 74 20 61 64 64 72 49 6e 73 4c 6f 6f 70 3b 20  nt addrInsLoop; 
fc50: 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
fc60: 20 6c 6f 6f 70 20 66 6f 72 20 69 6e 73 65 72 74   loop for insert
fc70: 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20  ing rows */.    
fc80: 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
fc90: 3b 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65  ;     /* A table
fca0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
fcb0: 74 68 65 20 53 45 4c 45 43 54 20 72 65 73 75 6c  the SELECT resul
fcc0: 74 73 20 2a 2f 0a 0a 20 20 20 20 20 20 72 65 67  ts */..      reg
fcd0: 59 69 65 6c 64 20 3d 20 2b 2b 70 50 61 72 73 65  Yield = ++pParse
fce0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65  ->nMem;.      re
fcf0: 67 52 65 63 20 3d 20 2b 2b 70 50 61 72 73 65 2d  gRec = ++pParse-
fd00: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67  >nMem;.      reg
fd10: 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65  Rowid = ++pParse
fd20: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73  ->nMem;.      as
fd30: 73 65 72 74 28 70 50 61 72 73 65 2d 3e 6e 54 61  sert(pParse->nTa
fd40: 62 3d 3d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  b==1);.      sql
fd50: 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
fd60: 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
fd70: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
fd80: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31   OP_OpenWrite, 1
fd90: 2c 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f  , pParse->regRoo
fda0: 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73  t, iDb);.      s
fdb0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
fdc0: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 32 49  P5(v, OPFLAG_P2I
fdd0: 53 52 45 47 29 3b 0a 20 20 20 20 20 20 70 50 61  SREG);.      pPa
fde0: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20  rse->nTab = 2;. 
fdf0: 20 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73       addrTop = s
fe00: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
fe10: 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20  tAddr(v) + 1;.  
fe20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fe30: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp3(v, OP_Init
fe40: 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69  Coroutine, regYi
fe50: 65 6c 64 2c 20 30 2c 20 61 64 64 72 54 6f 70 29  eld, 0, addrTop)
fe60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
fe70: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
fe80: 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69  est, SRT_Corouti
fe90: 6e 65 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20  ne, regYield);. 
fea0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
feb0: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ct(pParse, pSele
fec0: 63 74 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  ct, &dest);.    
fed0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64    sqlite3VdbeEnd
fee0: 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67  Coroutine(v, reg
fef0: 59 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 73 71  Yield);.      sq
ff00: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
ff10: 65 28 76 2c 20 61 64 64 72 54 6f 70 20 2d 20 31  e(v, addrTop - 1
ff20: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
ff30: 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
ff40: 72 6e 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61  rn;.      pSelTa
ff50: 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c  b = sqlite3Resul
ff60: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
ff70: 72 73 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  rse, pSelect);. 
ff80: 20 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62       if( pSelTab
ff90: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
ffa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
ffb0: 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Col==0 );.      
ffc0: 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->nCol = pSelTa
ffd0: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70  b->nCol;.      p
ffe0: 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->aCol = pSelTab
fff0: 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53  ->aCol;.      pS
10000 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  elTab->nCol = 0;
10010 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  .      pSelTab->
10020 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  aCol = 0;.      
10030 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
10040 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b  le(db, pSelTab);
10050 0a 20 20 20 20 20 20 61 64 64 72 49 6e 73 4c 6f  .      addrInsLo
10060 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
10070 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
10080 6c 64 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d  ld, dest.iSDParm
10090 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
100a0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
100b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
100c0 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
100d0 72 64 2c 20 64 65 73 74 2e 69 53 64 73 74 2c 20  rd, dest.iSdst, 
100e0 64 65 73 74 2e 6e 53 64 73 74 2c 20 72 65 67 52  dest.nSdst, regR
100f0 65 63 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ec);.      sqlit
10100 65 33 54 61 62 6c 65 41 66 66 69 6e 69 74 79 28  e3TableAffinity(
10110 76 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20  v, p, 0);.      
10120 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10130 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
10140 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  , 1, regRowid);.
10150 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10160 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
10170 73 65 72 74 2c 20 31 2c 20 72 65 67 52 65 63 2c  sert, 1, regRec,
10180 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
10190 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
101a0 6f 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70  o(v, addrInsLoop
101b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
101c0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
101d0 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20  addrInsLoop);.  
101e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
101f0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
10200 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  e, 1);.    }..  
10210 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
10220 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   complete text o
10230 66 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61  f the CREATE sta
10240 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66  tement */.    if
10250 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
10260 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61 74     zStmt = creat
10270 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c 20 70  eTableStmt(db, p
10280 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
10290 20 20 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 32      Token *pEnd2
102a0 20 3d 20 74 61 62 4f 70 74 73 20 3f 20 26 70 50   = tabOpts ? &pP
102b0 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
102c0 20 3a 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 6e   : pEnd;.      n
102d0 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 32 2d 3e   = (int)(pEnd2->
102e0 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d  z - pParse->sNam
102f0 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20  eToken.z);.     
10300 20 69 66 28 20 70 45 6e 64 32 2d 3e 7a 5b 30 5d   if( pEnd2->z[0]
10310 21 3d 27 3b 27 20 29 20 6e 20 2b 3d 20 70 45 6e  !=';' ) n += pEn
10320 64 32 2d 3e 6e 3b 0a 20 20 20 20 20 20 7a 53 74  d2->n;.      zSt
10330 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
10340 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20 20  ntf(db, .       
10350 20 20 20 22 43 52 45 41 54 45 20 25 73 20 25 2e     "CREATE %s %.
10360 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20  *s", zType2, n, 
10370 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
10380 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20  en.z.      );.  
10390 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c    }..    /* A sl
103a0 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72  ot for the recor
103b0 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  d has already be
103c0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20  en allocated in 
103d0 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49  the .    ** SQLI
103e0 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e  TE_MASTER table.
103f0 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74    We just need t
10400 6f 20 75 70 64 61 74 65 20 74 68 61 74 20 73 6c  o update that sl
10410 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20  ot with all.    
10420 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  ** the informati
10430 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74  on we've collect
10440 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
10450 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
10460 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
10470 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 22 0a  "UPDATE %Q.%s ".
10480 20 20 20 20 20 20 20 20 20 22 53 45 54 20 74 79           "SET ty
10490 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51  pe='%s', name=%Q
104a0 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72  , tbl_name=%Q, r
104b0 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20 73 71 6c  ootpage=#%d, sql
104c0 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22 57 48  =%Q ".       "WH
104d0 45 52 45 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a  ERE rowid=#%d",.
104e0 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
104f0 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53  b].zDbSName, MAS
10500 54 45 52 5f 4e 41 4d 45 2c 0a 20 20 20 20 20 20  TER_NAME,.      
10510 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e  zType,.      p->
10520 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e  zName,.      p->
10530 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 50 61  zName,.      pPa
10540 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20  rse->regRoot,.  
10550 20 20 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20      zStmt,.     
10560 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69   pParse->regRowi
10570 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  d.    );.    sql
10580 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
10590 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Stmt);.    sqlit
105a0 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
105b0 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69  Parse, iDb);..#i
105c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
105d0 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
105e0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
105f0 73 65 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  see if we need t
10600 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69  o create an sqli
10610 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
10620 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65  e for.    ** kee
10630 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75  ping track of au
10640 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73  toincrement keys
10650 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
10660 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20   (p->tabFlags & 
10670 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  TF_Autoincrement
10680 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 44 62  )!=0 ){.      Db
10690 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
106a0 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20 61 73 73  [iDb];.      ass
106b0 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
106c0 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
106d0 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 20  iDb, 0) );.     
106e0 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
106f0 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b  a->pSeqTab==0 ){
10700 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10710 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
10720 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43  se,.          "C
10730 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73  REATE TABLE %Q.s
10740 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e  qlite_sequence(n
10750 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20  ame,seq)",.     
10760 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61       pDb->zDbSNa
10770 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  me.        );.  
10780 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
10790 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61 72  if..    /* Repar
107a0 73 65 20 65 76 65 72 79 74 68 69 6e 67 20 74 6f  se everything to
107b0 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65   update our inte
107c0 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63 74  rnal data struct
107d0 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ures */.    sqli
107e0 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53  te3VdbeAddParseS
107f0 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a  chemaOp(v, iDb,.
10800 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
10810 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 74  e3MPrintf(db, "t
10820 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44  bl_name='%q' AND
10830 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27   type!='trigger'
10840 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  ", p->zName));. 
10850 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68   }...  /* Add th
10860 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69  e table to the i
10870 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
10880 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ntation of the d
10890 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
108a0 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
108b0 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  y ){.    Table *
108c0 70 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65 6d 61  pOld;.    Schema
108d0 20 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70   *pSchema = p->p
108e0 53 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65  Schema;.    asse
108f0 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
10900 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
10910 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 4f  Db, 0) );.    pO
10920 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ld = sqlite3Hash
10930 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61 2d  Insert(&pSchema-
10940 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61  >tblHash, p->zNa
10950 6d 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20  me, p);.    if( 
10960 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73  pOld ){.      as
10970 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b  sert( p==pOld );
10980 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74    /* Malloc must
10990 20 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73   have failed ins
109a0 69 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29  ide HashInsert()
109b0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
109c0 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
109d0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
109e0 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70   }.    pParse->p
109f0 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  NewTable = 0;.  
10a00 20 20 64 62 2d 3e 62 49 6e 74 65 72 6e 43 68 61    db->bInternCha
10a10 6e 67 65 73 20 3d 20 31 3b 0a 0a 23 69 66 6e 64  nges = 1;..#ifnd
10a20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
10a30 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66  LTERTABLE.    if
10a40 28 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b  ( !p->pSelect ){
10a50 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
10a60 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73  r *zName = (cons
10a70 74 20 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d  t char *)pParse-
10a80 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20  >sNameToken.z;. 
10a90 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a       int nName;.
10aa0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
10ab0 53 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20  Select && pCons 
10ac0 26 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20  && pEnd );.     
10ad0 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30   if( pCons->z==0
10ae0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e   ){.        pCon
10af0 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  s = pEnd;.      
10b00 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20  }.      nName = 
10b10 28 69 6e 74 29 28 28 63 6f 6e 73 74 20 63 68 61  (int)((const cha
10b20 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a  r *)pCons->z - z
10b30 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e  Name);.      p->
10b40 61 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31  addColOffset = 1
10b50 33 20 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43  3 + sqlite3Utf8C
10b60 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e  harLen(zName, nN
10b70 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ame);.    }.#end
10b80 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  if.  }.}..#ifnde
10b90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
10ba0 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72  EW./*.** The par
10bb0 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
10bc0 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20  outine in order 
10bd0 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
10be0 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  VIEW.*/.void sql
10bf0 69 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a  ite3CreateView(.
10c00 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
10c10 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
10c20 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
10c30 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20   Token *pBegin, 
10c40 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54      /* The CREAT
10c50 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67  E token that beg
10c60 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ins the statemen
10c70 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
10c80 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65  ame1,     /* The
10c90 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64   token that hold
10ca0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
10cb0 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65  e view */.  Toke
10cc0 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
10cd0 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74  * The token that
10ce0 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20   holds the name 
10cf0 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  of the view */. 
10d00 20 45 78 70 72 4c 69 73 74 20 2a 70 43 4e 61 6d   ExprList *pCNam
10d10 65 73 2c 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20  es, /* Optional 
10d20 6c 69 73 74 20 6f 66 20 76 69 65 77 20 63 6f 6c  list of view col
10d30 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 53  umn names */.  S
10d40 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
10d50 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74    /* A SELECT st
10d60 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c  atement that wil
10d70 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
10d80 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
10d90 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a  sTemp,        /*
10da0 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50   TRUE for a TEMP
10db0 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20 20  ORARY view */.  
10dc0 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20  int noErr       
10dd0 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65     /* Suppress e
10de0 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 66  rror messages if
10df0 20 56 49 45 57 20 61 6c 72 65 61 64 79 20 65 78   VIEW already ex
10e00 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ists */.){.  Tab
10e10 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a  le *p;.  int n;.
10e20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
10e30 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20  .  Token sEnd;. 
10e40 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20   DbFixer sFix;. 
10e50 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20   Token *pName = 
10e60 30 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20  0;.  int iDb;.  
10e70 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
10e80 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
10e90 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20   pParse->nVar>0 
10ea0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
10eb0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
10ec0 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e  parameters are n
10ed0 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69  ot allowed in vi
10ee0 65 77 73 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ews");.    goto 
10ef0 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c  create_view_fail
10f00 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
10f10 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65  tartTable(pParse
10f20 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
10f30 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20  , isTemp, 1, 0, 
10f40 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20 70 50  noErr);.  p = pP
10f50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
10f60 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
10f70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f  Parse->nErr ) go
10f80 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66  to create_view_f
10f90 61 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33 54 77  ail;.  sqlite3Tw
10fa0 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
10fb0 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
10fc0 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62  , &pName);.  iDb
10fd0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
10fe0 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70  ToIndex(db, p->p
10ff0 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74  Schema);.  sqlit
11000 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
11010 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 76   pParse, iDb, "v
11020 69 65 77 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  iew", pName);.  
11030 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 53 65  if( sqlite3FixSe
11040 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c  lect(&sFix, pSel
11050 65 63 74 29 20 29 20 67 6f 74 6f 20 63 72 65 61  ect) ) goto crea
11060 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20  te_view_fail;.. 
11070 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20   /* Make a copy 
11080 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53 45  of the entire SE
11090 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
110a0 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
110b0 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20  view..  ** This 
110c0 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74  will force all t
110d0 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20  he Expr.token.z 
110e0 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e  values to be dyn
110f0 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c  amically.  ** al
11100 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20 74  located rather t
11110 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  han point to the
11120 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20   input string - 
11130 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
11140 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20  .  ** they will 
11150 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74 68  persist after th
11160 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65  e current sqlite
11170 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65  3_exec() call re
11180 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d  turns..  */.  p-
11190 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
111a0 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
111b0 70 53 65 6c 65 63 74 2c 20 45 58 50 52 44 55 50  pSelect, EXPRDUP
111c0 5f 52 45 44 55 43 45 29 3b 0a 20 20 70 2d 3e 70  _REDUCE);.  p->p
111d0 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  Check = sqlite3E
111e0 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
111f0 43 4e 61 6d 65 73 2c 20 45 58 50 52 44 55 50 5f  CNames, EXPRDUP_
11200 52 45 44 55 43 45 29 3b 0a 20 20 69 66 28 20 64  REDUCE);.  if( d
11210 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
11220 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69  ) goto create_vi
11230 65 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4c  ew_fail;..  /* L
11240 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66  ocate the end of
11250 20 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57   the CREATE VIEW
11260 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b   statement.  Mak
11270 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a  e sEnd point to.
11280 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20    ** the end..  
11290 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72  */.  sEnd = pPar
112a0 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a  se->sLastToken;.
112b0 20 20 61 73 73 65 72 74 28 20 73 45 6e 64 2e 7a    assert( sEnd.z
112c0 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  [0]!=0 );.  if( 
112d0 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29  sEnd.z[0]!=';' )
112e0 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20  {.    sEnd.z += 
112f0 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45  sEnd.n;.  }.  sE
11300 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20  nd.n = 0;.  n = 
11310 28 69 6e 74 29 28 73 45 6e 64 2e 7a 20 2d 20 70  (int)(sEnd.z - p
11320 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20 61 73 73  Begin->z);.  ass
11330 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 7a 20  ert( n>0 );.  z 
11340 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77  = pBegin->z;.  w
11350 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73  hile( sqlite3Iss
11360 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20  pace(z[n-1]) ){ 
11370 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20  n--; }.  sEnd.z 
11380 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e  = &z[n-1];.  sEn
11390 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55  d.n = 1;..  /* U
113a0 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  se sqlite3EndTab
113b0 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68 65 20  le() to add the 
113c0 76 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49  view to the SQLI
113d0 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
113e0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54  */.  sqlite3EndT
113f0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20  able(pParse, 0, 
11400 26 73 45 6e 64 2c 20 30 2c 20 30 29 3b 0a 0a 63  &sEnd, 0, 0);..c
11410 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3a  reate_view_fail:
11420 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
11430 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65  Delete(db, pSele
11440 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ct);.  sqlite3Ex
11450 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
11460 20 70 43 4e 61 6d 65 73 29 3b 0a 20 20 72 65 74   pCNames);.  ret
11470 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  urn;.}.#endif /*
11480 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
11490 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e  W */..#if !defin
114a0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
114b0 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
114c0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
114d0 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a  TUALTABLE)./*.**
114e0 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   The Table struc
114f0 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72  ture pTable is r
11500 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46  eally a VIEW.  F
11510 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73  ill in the names
11520 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   of.** the colum
11530 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69  ns of the view i
11540 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72  n the pTable str
11550 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20  ucture.  Return 
11560 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  the number.** of
11570 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20   errors.  If an 
11580 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65  error is seen le
11590 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
115a0 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e  sage in pParse->
115b0 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20  zErrMsg..*/.int 
115c0 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
115d0 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20  lumnNames(Parse 
115e0 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
115f0 70 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65  pTable){.  Table
11600 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20   *pSelTab;   /* 
11610 41 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72 6f  A fake table fro
11620 6d 20 77 68 69 63 68 20 77 65 20 67 65 74 20 74  m which we get t
11630 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
11640 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b  .  Select *pSel;
11650 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20       /* Copy of 
11660 74 68 65 20 53 45 4c 45 43 54 20 74 68 61 74 20  the SELECT that 
11670 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76  implements the v
11680 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72  iew */.  int nEr
11690 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75  r = 0;     /* Nu
116a0 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65  mber of errors e
116b0 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20  ncountered */.  
116c0 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
116d0 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79    /* Temporarily
116e0 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62 65   holds the numbe
116f0 72 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73 73  r of cursors ass
11700 69 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  igned */.  sqlit
11710 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
11720 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  >db;  /* Databas
11730 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72  e connection for
11740 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a   malloc errors *
11750 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
11760 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
11770 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33 5f 78 61  ION.  sqlite3_xa
11780 75 74 68 20 78 41 75 74 68 3b 20 20 20 20 20 20  uth xAuth;      
11790 20 2f 2a 20 53 61 76 65 64 20 78 41 75 74 68 20   /* Saved xAuth 
117a0 70 6f 69 6e 74 65 72 20 2a 2f 0a 23 65 6e 64 69  pointer */.#endi
117b0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  f..  assert( pTa
117c0 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  ble );..#ifndef 
117d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
117e0 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 73  UALTABLE.  if( s
117f0 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43 6f  qlite3VtabCallCo
11800 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20 70 54  nnect(pParse, pT
11810 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74  able) ){.    ret
11820 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
11830 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56 69  ;.  }.  if( IsVi
11840 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29 20  rtual(pTable) ) 
11850 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
11860 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
11870 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20  _OMIT_VIEW.  /* 
11880 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20  A positive nCol 
11890 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e  means the column
118a0 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73  s names for this
118b0 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61   view are.  ** a
118c0 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20  lready known..  
118d0 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
118e0 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e  >nCol>0 ) return
118f0 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61   0;..  /* A nega
11900 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73  tive nCol is a s
11910 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65  pecial marker me
11920 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72  aning that we ar
11930 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a  e currently.  **
11940 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75   trying to compu
11950 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  te the column na
11960 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65  mes.  If we ente
11970 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  r this routine w
11980 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74  ith.  ** a negat
11990 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61  ive nCol, it mea
119a0 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76  ns two or more v
119b0 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70  iews form a loop
119c0 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a  , like this:.  *
119d0 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  *.  **     CREAT
119e0 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45  E VIEW one AS SE
119f0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b  LECT * FROM two;
11a00 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
11a10 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c   VIEW two AS SEL
11a20 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a  ECT * FROM one;.
11a30 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c    **.  ** Actual
11a40 6c 79 2c 20 74 68 65 20 65 72 72 6f 72 20 61 62  ly, the error ab
11a50 6f 76 65 20 69 73 20 6e 6f 77 20 63 61 75 67 68  ove is now caugh
11a60 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68  t prior to reach
11a70 69 6e 67 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a  ing this point..
11a80 20 20 2a 2a 20 42 75 74 20 74 68 65 20 66 6f 6c    ** But the fol
11a90 6c 6f 77 69 6e 67 20 74 65 73 74 20 69 73 20 73  lowing test is s
11aa0 74 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74 20 61  till important a
11ab0 73 20 69 74 20 64 6f 65 73 20 63 6f 6d 65 20 75  s it does come u
11ac0 70 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66 6f  p.  ** in the fo
11ad0 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20  llowing:.  ** . 
11ae0 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54   **     CREATE T
11af0 41 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28 61 29  ABLE main.ex1(a)
11b00 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  ;.  **     CREAT
11b10 45 20 54 45 4d 50 20 56 49 45 57 20 65 78 31 20  E TEMP VIEW ex1 
11b20 41 53 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  AS SELECT a FROM
11b30 20 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20 20 53   ex1;.  **     S
11b40 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 6d  ELECT * FROM tem
11b50 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20 69 66  p.ex1;.  */.  if
11b60 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30  ( pTable->nCol<0
11b70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
11b80 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11b90 22 76 69 65 77 20 25 73 20 69 73 20 63 69 72 63  "view %s is circ
11ba0 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c  ularly defined",
11bb0 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b   pTable->zName);
11bc0 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
11bd0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 61   }.  assert( pTa
11be0 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a  ble->nCol>=0 );.
11bf0 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20  .  /* If we get 
11c00 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
11c10 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f  ns we need to co
11c20 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c 65 20  mpute the table 
11c30 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65  names..  ** Note
11c40 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74   that the call t
11c50 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  o sqlite3ResultS
11c60 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c  etOfSelect() wil
11c70 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a  l expand any.  *
11c80 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69  * "*" elements i
11c90 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 73 65  n the results se
11ca0 74 20 6f 66 20 74 68 65 20 76 69 65 77 20 61 6e  t of the view an
11cb0 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63 75  d will assign cu
11cc0 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68  rsors.  ** to th
11cd0 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  e elements of th
11ce0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
11cf0 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77 61  But we do not wa
11d00 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67 65 73  nt these changes
11d10 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d  .  ** to be perm
11d20 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20 63  anent.  So the c
11d30 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64 6f  omputation is do
11d40 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20  ne on a copy of 
11d50 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20  the SELECT.  ** 
11d60 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64  statement that d
11d70 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e  efines the view.
11d80 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
11d90 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20  pTable->pSelect 
11da0 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c 69  );.  pSel = sqli
11db0 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
11dc0 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
11dd0 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  , 0);.  if( pSel
11de0 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 72   ){.    n = pPar
11df0 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71  se->nTab;.    sq
11e00 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
11e10 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
11e20 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20  , pSel->pSrc);. 
11e30 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
11e40 3d 20 2d 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f  = -1;.    db->lo
11e50 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65  okaside.bDisable
11e60 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ++;.#ifndef SQLI
11e70 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
11e80 41 54 49 4f 4e 0a 20 20 20 20 78 41 75 74 68 20  ATION.    xAuth 
11e90 3d 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20  = db->xAuth;.   
11ea0 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a   db->xAuth = 0;.
11eb0 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71      pSelTab = sq
11ec0 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
11ed0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
11ee0 53 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41  Sel);.    db->xA
11ef0 75 74 68 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c  uth = xAuth;.#el
11f00 73 65 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d  se.    pSelTab =
11f10 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
11f20 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
11f30 2c 20 70 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a  , pSel);.#endif.
11f40 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
11f50 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 54   = n;.    if( pT
11f60 61 62 6c 65 2d 3e 70 43 68 65 63 6b 20 29 7b 0a  able->pCheck ){.
11f70 20 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45 20        /* CREATE 
11f80 56 49 45 57 20 6e 61 6d 65 28 61 72 67 6c 69 73  VIEW name(arglis
11f90 74 29 20 41 53 20 2e 2e 2e 0a 20 20 20 20 20 20  t) AS ....      
11fa0 2a 2a 20 54 68 65 20 6e 61 6d 65 73 20 6f 66 20  ** The names of 
11fb0 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  the columns in t
11fc0 68 65 20 74 61 62 6c 65 20 61 72 65 20 74 61 6b  he table are tak
11fd0 65 6e 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a  en from.      **
11fe0 20 61 72 67 6c 69 73 74 20 77 68 69 63 68 20 69   arglist which i
11ff0 73 20 73 74 6f 72 65 64 20 69 6e 20 70 54 61 62  s stored in pTab
12000 6c 65 2d 3e 70 43 68 65 63 6b 2e 20 20 54 68 65  le->pCheck.  The
12010 20 70 43 68 65 63 6b 20 66 69 65 6c 64 0a 20 20   pCheck field.  
12020 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20      ** normally 
12030 68 6f 6c 64 73 20 43 48 45 43 4b 20 63 6f 6e 73  holds CHECK cons
12040 74 72 61 69 6e 74 73 20 6f 6e 20 61 6e 20 6f 72  traints on an or
12050 64 69 6e 61 72 79 20 74 61 62 6c 65 2c 20 62 75  dinary table, bu
12060 74 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61  t for.      ** a
12070 20 56 49 45 57 20 69 74 20 68 6f 6c 64 73 20 74   VIEW it holds t
12080 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  he list of colum
12090 6e 20 6e 61 6d 65 73 2e 0a 20 20 20 20 20 20 2a  n names..      *
120a0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  /.      sqlite3C
120b0 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
120c0 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c  st(pParse, pTabl
120d0 65 2d 3e 70 43 68 65 63 6b 2c 20 0a 20 20 20 20  e->pCheck, .    
120e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120f0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 54               &pT
12100 61 62 6c 65 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61  able->nCol, &pTa
12110 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20  ble->aCol);.    
12120 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
12130 46 61 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20  Failed==0 .     
12140 20 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72    && pParse->nEr
12150 72 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70  r==0.       && p
12160 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 70 53 65  Table->nCol==pSe
12170 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  l->pEList->nExpr
12180 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
12190 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
121a0 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
121b0 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
121c0 20 70 54 61 62 6c 65 2c 20 70 53 65 6c 29 3b 0a   pTable, pSel);.
121d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
121e0 65 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b  e if( pSelTab ){
121f0 0a 20 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45  .      /* CREATE
12200 20 56 49 45 57 20 6e 61 6d 65 20 41 53 2e 2e 2e   VIEW name AS...
12210 20 20 77 69 74 68 6f 75 74 20 61 6e 20 61 72 67    without an arg
12220 75 6d 65 6e 74 20 6c 69 73 74 2e 20 20 43 6f 6e  ument list.  Con
12230 73 74 72 75 63 74 0a 20 20 20 20 20 20 2a 2a 20  struct.      ** 
12240 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
12250 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54   from the SELECT
12260 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
12270 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77  defines the view
12280 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
12290 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
122a0 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
122b0 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
122c0 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
122d0 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43        pTable->aC
122e0 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43  ol = pSelTab->aC
122f0 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61  ol;.      pSelTa
12300 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
12310 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c     pSelTab->aCol
12320 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
12330 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
12340 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30  aMutexHeld(db, 0
12350 2c 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d  , pTable->pSchem
12360 61 29 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  a) );.    }else{
12370 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  .      pTable->n
12380 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e  Col = 0;.      n
12390 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  Err++;.    }.   
123a0 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
123b0 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29  ble(db, pSelTab)
123c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
123d0 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
123e0 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  el);.    db->loo
123f0 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 2d  kaside.bDisable-
12400 2d 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  -;.  } else {.  
12410 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20    nErr++;.  }.  
12420 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d  pTable->pSchema-
12430 3e 73 63 68 65 6d 61 46 6c 61 67 73 20 7c 3d 20  >schemaFlags |= 
12440 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b  DB_UnresetViews;
12450 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12460 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20  E_OMIT_VIEW */. 
12470 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a   return nErr;  .
12480 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
12490 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
124a0 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
124b0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
124c0 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a  IRTUALTABLE) */.
124d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
124e0 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20  OMIT_VIEW./*.** 
124f0 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e  Clear the column
12500 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72   names from ever
12510 79 20 56 49 45 57 20 69 6e 20 64 61 74 61 62 61  y VIEW in databa
12520 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69  se idx..*/.stati
12530 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65  c void sqliteVie
12540 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65  wResetAll(sqlite
12550 33 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b  3 *db, int idx){
12560 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a  .  HashElem *i;.
12570 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12580 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
12590 28 64 62 2c 20 69 64 78 2c 20 30 29 20 29 3b 0a  (db, idx, 0) );.
125a0 20 20 69 66 28 20 21 44 62 48 61 73 50 72 6f 70    if( !DbHasProp
125b0 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42  erty(db, idx, DB
125c0 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 20 29  _UnresetViews) )
125d0 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
125e0 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
125f0 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70  (&db->aDb[idx].p
12600 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29  Schema->tblHash)
12610 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68  ; i;i=sqliteHash
12620 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61  Next(i)){.    Ta
12630 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
12640 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
12650 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
12660 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71  lect ){.      sq
12670 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d  lite3DeleteColum
12680 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62 29  nNames(db, pTab)
12690 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43  ;.      pTab->aC
126a0 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 54  ol = 0;.      pT
126b0 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
126c0 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61    }.  }.  DbClea
126d0 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64  rProperty(db, id
126e0 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  x, DB_UnresetVie
126f0 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  ws);.}.#else.# d
12700 65 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77  efine sqliteView
12710 52 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65  ResetAll(A,B).#e
12720 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
12730 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a  MIT_VIEW */../*.
12740 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
12750 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
12760 65 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74  e VDBE to adjust
12770 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63   the internal sc
12780 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20  hema.** used by 
12790 53 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20  SQLite when the 
127a0 62 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65  btree layer move
127b0 73 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70  s a table root p
127c0 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74  age. The.** root
127d0 2d 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65  -page of a table
127e0 20 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74   or index in dat
127f0 61 62 61 73 65 20 69 44 62 20 68 61 73 20 63 68  abase iDb has ch
12800 61 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d  anged from iFrom
12810 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a  .** to iTo..**.*
12820 2a 20 54 69 63 6b 65 74 20 23 31 37 32 38 3a 20  * Ticket #1728: 
12830 20 54 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c   The symbol tabl
12840 65 20 6d 69 67 68 74 20 73 74 69 6c 6c 20 63 6f  e might still co
12850 6e 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ntain informatio
12860 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61  n.** on tables a
12870 6e 64 2f 6f 72 20 69 6e 64 69 63 65 73 20 74 68  nd/or indices th
12880 61 74 20 61 72 65 20 74 68 65 20 70 72 6f 63 65  at are the proce
12890 73 73 20 6f 66 20 62 65 69 6e 67 20 64 65 6c 65  ss of being dele
128a0 74 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61  ted..** If you a
128b0 72 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20  re unlucky, one 
128c0 6f 66 20 74 68 6f 73 65 20 64 65 6c 65 74 65 64  of those deleted
128d0 20 69 6e 64 69 63 65 73 20 6f 72 20 74 61 62 6c   indices or tabl
128e0 65 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65  es might.** have
128f0 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 70 61   the same rootpa
12900 67 65 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65  ge number as the
12910 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 69   real table or i
12920 6e 64 65 78 20 74 68 61 74 20 69 73 0a 2a 2a 20  ndex that is.** 
12930 62 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f  being moved.  So
12940 20 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20   we cannot stop 
12950 73 65 61 72 63 68 69 6e 67 20 61 66 74 65 72 20  searching after 
12960 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20  the first match 
12970 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20  .** because the 
12980 66 69 72 73 74 20 6d 61 74 63 68 20 6d 69 67 68  first match migh
12990 74 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20  t be for one of 
129a0 74 68 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69  the deleted indi
129b0 63 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73  ces.** or tables
129c0 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 62   and not the tab
129d0 6c 65 2f 69 6e 64 65 78 20 74 68 61 74 20 69 73  le/index that is
129e0 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20   actually being 
129f0 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73  moved..** We mus
12a00 74 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69  t continue loopi
12a10 6e 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62  ng until all tab
12a20 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20  les and indices 
12a30 77 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65  with.** rootpage
12a40 3d 3d 69 46 72 6f 6d 20 68 61 76 65 20 62 65 65  ==iFrom have bee
12a50 6e 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 68  n converted to h
12a60 61 76 65 20 61 20 72 6f 6f 74 70 61 67 65 20 6f  ave a rootpage o
12a70 66 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65  f iTo.** in orde
12a80 72 20 74 6f 20 62 65 20 63 65 72 74 61 69 6e 20  r to be certain 
12a90 74 68 61 74 20 77 65 20 67 6f 74 20 74 68 65 20  that we got the 
12aa0 72 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69  right one..*/.#i
12ab0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12ac0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69  T_AUTOVACUUM.voi
12ad0 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67  d sqlite3RootPag
12ae0 65 4d 6f 76 65 64 28 73 71 6c 69 74 65 33 20 2a  eMoved(sqlite3 *
12af0 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74  db, int iDb, int
12b00 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29   iFrom, int iTo)
12b10 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45  {.  HashElem *pE
12b20 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61  lem;.  Hash *pHa
12b30 73 68 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a  sh;.  Db *pDb;..
12b40 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12b50 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
12b60 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
12b70 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
12b80 5b 69 44 62 5d 3b 0a 20 20 70 48 61 73 68 20 3d  [iDb];.  pHash =
12b90 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e   &pDb->pSchema->
12ba0 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70  tblHash;.  for(p
12bb0 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
12bc0 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c  irst(pHash); pEl
12bd0 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65  em; pElem=sqlite
12be0 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
12bf0 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
12c00 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
12c10 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69  ta(pElem);.    i
12c20 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69  f( pTab->tnum==i
12c30 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54  From ){.      pT
12c40 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a  ab->tnum = iTo;.
12c50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73      }.  }.  pHas
12c60 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d  h = &pDb->pSchem
12c70 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f  a->idxHash;.  fo
12c80 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
12c90 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20  shFirst(pHash); 
12ca0 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c  pElem; pElem=sql
12cb0 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65  iteHashNext(pEle
12cc0 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  m)){.    Index *
12cd0 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73  pIdx = sqliteHas
12ce0 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
12cf0 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d    if( pIdx->tnum
12d00 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
12d10 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54   pIdx->tnum = iT
12d20 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  o;.    }.  }.}.#
12d30 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  endif../*.** Wri
12d40 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65  te code to erase
12d50 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
12d60 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65  root-page iTable
12d70 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69   from database i
12d80 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74  Db..** Also writ
12d90 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79  e code to modify
12da0 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
12db0 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74  er table and int
12dc0 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20  ernal schema.** 
12dd0 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f  if a root-page o
12de0 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20  f another table 
12df0 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20  is moved by the 
12e00 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c  btree-layer whil
12e10 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54  st.** erasing iT
12e20 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68  able (this can h
12e30 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75  appen with an au
12e40 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
12e50 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  se)..*/ .static 
12e60 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74  void destroyRoot
12e70 50 61 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  Page(Parse *pPar
12e80 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  se, int iTable, 
12e90 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65  int iDb){.  Vdbe
12ea0 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
12eb0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
12ec0 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
12ed0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
12ee0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 54  e);.  assert( iT
12ef0 61 62 6c 65 3e 31 20 29 3b 0a 20 20 73 71 6c 69  able>1 );.  sqli
12f00 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
12f10 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61   OP_Destroy, iTa
12f20 62 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a 20  ble, r1, iDb);. 
12f30 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
12f40 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65  (pParse);.#ifnde
12f50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
12f60 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50  TOVACUUM.  /* OP
12f70 5f 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20  _Destroy stores 
12f80 61 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31  an in integer r1
12f90 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65  . If this intege
12fa0 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  r.  ** is non-ze
12fb0 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  ro, then it is t
12fc0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
12fd0 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d  ber of a table m
12fe0 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63  oved to.  ** loc
12ff0 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68  ation iTable. Th
13000 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
13010 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71   modifies the sq
13020 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
13030 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63  e to.  ** reflec
13040 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a  t this..  **.  *
13050 2a 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20  * The "#NNN" in 
13060 74 68 65 20 53 51 4c 20 69 73 20 61 20 73 70 65  the SQL is a spe
13070 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68  cial constant th
13080 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65  at means whateve
13090 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20  r value.  ** is 
130a0 69 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e  in register NNN.
130b0 20 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72 75    See grammar ru
130c0 6c 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  les associated w
130d0 69 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49 53  ith the TK_REGIS
130e0 54 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66  TER.  ** token f
130f0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
13100 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  formation..  */.
13110 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
13120 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
13130 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73     "UPDATE %Q.%s
13140 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64   SET rootpage=%d
13150 20 57 48 45 52 45 20 23 25 64 20 41 4e 44 20 72   WHERE #%d AND r
13160 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20 20  ootpage=#%d",.  
13170 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61     pParse->db->a
13180 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
13190 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 69  , MASTER_NAME, i
131a0 54 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a  Table, r1, r1);.
131b0 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
131c0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
131d0 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f  Parse, r1);.}../
131e0 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20  *.** Write VDBE 
131f0 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 61  code to erase ta
13200 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c  ble pTab and all
13210 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69   associated indi
13220 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20  ces on disk..** 
13230 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20 74  Code to update t
13240 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
13250 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65   tables and inte
13260 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69  rnal schema defi
13270 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61  nitions.** in ca
13280 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62  se a root-page b
13290 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74  elonging to anot
132a0 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76  her table is mov
132b0 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20  ed by the btree 
132c0 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f  layer.** is also
132d0 20 61 64 64 65 64 20 28 74 68 69 73 20 63 61 6e   added (this can
132e0 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20   happen with an 
132f0 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
13300 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  base)..*/.static
13310 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62   void destroyTab
13320 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
13330 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a  , Table *pTab){.
13340 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
13350 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
13360 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69  Index *pIdx;.  i
13370 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
13380 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
13390 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
133a0 70 53 63 68 65 6d 61 29 3b 0a 20 20 64 65 73 74  pSchema);.  dest
133b0 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
133c0 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  se, pTab->tnum, 
133d0 69 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78  iDb);.  for(pIdx
133e0 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
133f0 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
13400 70 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74  pNext){.    dest
13410 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
13420 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  se, pIdx->tnum, 
13430 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  iDb);.  }.#else.
13440 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
13450 62 61 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f  base may be auto
13460 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20  -vacuum capable 
13470 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  (if SQLITE_OMIT_
13480 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20  AUTOVACUUM.  ** 
13490 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c  is not defined),
134a0 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f   then it is impo
134b0 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50  rtant to call OP
134c0 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a  _Destroy on the.
134d0 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69    ** table and i
134e0 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20  ndex root-pages 
134f0 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69  in order, starti
13500 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65  ng with the nume
13510 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61  rically .  ** la
13520 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20  rgest root-page 
13530 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61  number. This gua
13540 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e  rantees that non
13550 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61  e of the root-pa
13560 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64  ges.  ** to be d
13570 65 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f  estroyed is relo
13580 63 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c  cated by an earl
13590 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20  ier OP_Destroy. 
135a0 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a  i.e. if the.  **
135b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20   following were 
135c0 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  coded:.  **.  **
135d0 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a   OP_Destroy 4 0.
135e0 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50    ** ....  ** OP
135f0 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a  _Destroy 5 0.  *
13600 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20  *.  ** and root 
13610 70 61 67 65 20 35 20 68 61 70 70 65 6e 65 64 20  page 5 happened 
13620 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65 73  to be the larges
13630 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  t root-page numb
13640 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64  er in the.  ** d
13650 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f  atabase, then ro
13660 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20  ot page 5 would 
13670 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65  be moved to page
13680 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20   4 by the .  ** 
13690 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22  "OP_Destroy 4 0"
136a0 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62   opcode. The sub
136b0 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74  sequent "OP_Dest
136c0 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68  roy 5 0" would h
136d0 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c  it.  ** a free-l
136e0 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  ist page..  */. 
136f0 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62   int iTab = pTab
13700 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44  ->tnum;.  int iD
13710 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20  estroyed = 0;.. 
13720 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
13730 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
13740 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d    int iLargest =
13750 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65   0;..    if( iDe
13760 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54  stroyed==0 || iT
13770 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b  ab<iDestroyed ){
13780 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20  .      iLargest 
13790 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20  = iTab;.    }.  
137a0 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
137b0 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
137c0 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
137d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78  {.      int iIdx
137e0 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20   = pIdx->tnum;. 
137f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
13800 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  x->pSchema==pTab
13810 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
13820 20 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79     if( (iDestroy
13830 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69  ed==0 || (iIdx<i
13840 44 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69  Destroyed)) && i
13850 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a  Idx>iLargest ){.
13860 20 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74          iLargest
13870 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d   = iIdx;.      }
13880 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
13890 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20  Largest==0 ){.  
138a0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
138b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
138c0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
138d0 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
138e0 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
138f0 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 61 73  chema);.      as
13900 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
13910 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e  iDb<pParse->db->
13920 6e 44 62 20 29 3b 0a 20 20 20 20 20 20 64 65 73  nDb );.      des
13930 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
13940 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 69  rse, iLargest, i
13950 44 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73 74  Db);.      iDest
13960 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74  royed = iLargest
13970 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
13980 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  if.}../*.** Remo
13990 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20  ve entries from 
139a0 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e  the sqlite_statN
139b0 20 74 61 62 6c 65 73 20 28 66 6f 72 20 4e 20 69   tables (for N i
139c0 6e 20 28 31 2c 32 2c 33 29 29 0a 2a 2a 20 61 66  n (1,2,3)).** af
139d0 74 65 72 20 61 20 44 52 4f 50 20 49 4e 44 45 58  ter a DROP INDEX
139e0 20 6f 72 20 44 52 4f 50 20 54 41 42 4c 45 20 63   or DROP TABLE c
139f0 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  ommand..*/.stati
13a00 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c  c void sqlite3Cl
13a10 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 0a 20  earStatTables(. 
13a20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
13a30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
13a40 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
13a50 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20  /.  int iDb,    
13a60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
13a70 65 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65  e database numbe
13a80 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  r */.  const cha
13a90 72 20 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a  r *zType,     /*
13aa0 20 22 69 64 78 22 20 6f 72 20 22 74 62 6c 22 20   "idx" or "tbl" 
13ab0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
13ac0 2a 7a 4e 61 6d 65 20 20 20 20 20 20 2f 2a 20 4e  *zName      /* N
13ad0 61 6d 65 20 6f 66 20 69 6e 64 65 78 20 6f 72 20  ame of index or 
13ae0 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  table */.){.  in
13af0 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t i;.  const cha
13b00 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 70 50 61  r *zDbName = pPa
13b10 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
13b20 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 66 6f  ].zDbSName;.  fo
13b30 72 28 69 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b 2b  r(i=1; i<=4; i++
13b40 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 54 61 62  ){.    char zTab
13b50 5b 32 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  [24];.    sqlite
13b60 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
13b70 66 28 7a 54 61 62 29 2c 7a 54 61 62 2c 22 73 71  f(zTab),zTab,"sq
13b80 6c 69 74 65 5f 73 74 61 74 25 64 22 2c 69 29 3b  lite_stat%d",i);
13b90 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
13ba0 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
13bb0 2d 3e 64 62 2c 20 7a 54 61 62 2c 20 7a 44 62 4e  ->db, zTab, zDbN
13bc0 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ame) ){.      sq
13bd0 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
13be0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
13bf0 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
13c00 2e 25 73 20 57 48 45 52 45 20 25 73 3d 25 51 22  .%s WHERE %s=%Q"
13c10 2c 0a 20 20 20 20 20 20 20 20 7a 44 62 4e 61 6d  ,.        zDbNam
13c20 65 2c 20 7a 54 61 62 2c 20 7a 54 79 70 65 2c 20  e, zTab, zType, 
13c30 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  zName.      );. 
13c40 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
13c50 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
13c60 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65 2e  to drop a table.
13c70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
13c80 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 50 61  CodeDropTable(Pa
13c90 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
13ca0 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 44  le *pTab, int iD
13cb0 62 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a  b, int isView){.
13cc0 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
13cd0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
13ce0 65 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67 65 72  e->db;.  Trigger
13cf0 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 44 62   *pTrigger;.  Db
13d00 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
13d10 5b 69 44 62 5d 3b 0a 0a 20 20 76 20 3d 20 73 71  [iDb];..  v = sq
13d20 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
13d30 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
13d40 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  v!=0 );.  sqlite
13d50 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
13d60 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
13d70 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  iDb);..#ifndef S
13d80 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
13d90 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73  ALTABLE.  if( Is
13da0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
13db0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13dc0 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65  AddOp0(v, OP_VBe
13dd0 67 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  gin);.  }.#endif
13de0 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20  ..  /* Drop all 
13df0 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61  triggers associa
13e00 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  ted with the tab
13e10 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
13e20 2e 20 43 6f 64 65 0a 20 20 2a 2a 20 69 73 20 67  . Code.  ** is g
13e30 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f  enerated to remo
13e40 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20  ve entries from 
13e50 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e  sqlite_master an
13e60 64 2f 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74 65  d/or.  ** sqlite
13e70 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20  _temp_master if 
13e80 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20  required..  */. 
13e90 20 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69   pTrigger = sqli
13ea0 74 65 33 54 72 69 67 67 65 72 4c 69 73 74 28 70  te3TriggerList(p
13eb0 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20  Parse, pTab);.  
13ec0 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20  while( pTrigger 
13ed0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
13ee0 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61  Trigger->pSchema
13ef0 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ==pTab->pSchema 
13f00 7c 7c 20 0a 20 20 20 20 20 20 20 20 70 54 72 69  || .        pTri
13f10 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64  gger->pSchema==d
13f20 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
13f30 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  a );.    sqlite3
13f40 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 70  DropTriggerPtr(p
13f50 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 29  Parse, pTrigger)
13f60 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d  ;.    pTrigger =
13f70 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74   pTrigger->pNext
13f80 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
13f90 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
13fa0 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65  NCREMENT.  /* Re
13fb0 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73  move any entries
13fc0 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73   of the sqlite_s
13fd0 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73  equence table as
13fe0 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20 20  sociated with.  
13ff0 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ** the table bei
14000 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73  ng dropped. This
14010 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   is done before 
14020 74 68 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f  the table is dro
14030 70 70 65 64 0a 20 20 2a 2a 20 61 74 20 74 68 65  pped.  ** at the
14040 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e   btree level, in
14050 20 63 61 73 65 20 74 68 65 20 73 71 6c 69 74 65   case the sqlite
14060 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
14070 6e 65 65 64 73 20 74 6f 0a 20 20 2a 2a 20 6d 6f  needs to.  ** mo
14080 76 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ve as a result o
14090 66 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e 20  f the drop (can 
140a0 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76  happen in auto-v
140b0 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 2a  acuum mode)..  *
140c0 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61  /.  if( pTab->ta
140d0 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
140e0 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20  increment ){.   
140f0 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
14100 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
14110 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
14120 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  Q.sqlite_sequenc
14130 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22  e WHERE name=%Q"
14140 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62  ,.      pDb->zDb
14150 53 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  SName, pTab->zNa
14160 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65  me.    );.  }.#e
14170 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20  ndif..  /* Drop 
14180 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  all SQLITE_MASTE
14190 52 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65  R table and inde
141a0 78 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 72  x entries that r
141b0 65 66 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a  efer to the.  **
141c0 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67   table. The prog
141d0 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74  ram name loops t
141e0 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65  hrough the maste
141f0 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65  r table and dele
14200 74 65 73 0a 20 20 2a 2a 20 65 76 65 72 79 20 72  tes.  ** every r
14210 6f 77 20 74 68 61 74 20 72 65 66 65 72 73 20 74  ow that refers t
14220 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65  o a table of the
14230 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
14240 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a  e one being.  **
14250 20 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65   dropped. Trigge
14260 72 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73  rs are handled s
14270 65 70 61 72 61 74 65 6c 79 20 62 65 63 61 75 73  eparately becaus
14280 65 20 61 20 74 72 69 67 67 65 72 20 63 61 6e 20  e a trigger can 
14290 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20  be.  ** created 
142a0 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  in the temp data
142b0 62 61 73 65 20 74 68 61 74 20 72 65 66 65 72 73  base that refers
142c0 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61   to a table in a
142d0 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 64 61 74 61  nother.  ** data
142e0 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  base..  */.  sql
142f0 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
14300 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22  pParse, .      "
14310 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
14320 73 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65  s WHERE tbl_name
14330 3d 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74  =%Q and type!='t
14340 72 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20  rigger'",.      
14350 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 4d  pDb->zDbSName, M
14360 41 53 54 45 52 5f 4e 41 4d 45 2c 20 70 54 61 62  ASTER_NAME, pTab
14370 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
14380 21 69 73 56 69 65 77 20 26 26 20 21 49 73 56 69  !isView && !IsVi
14390 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
143a0 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28     destroyTable(
143b0 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20  pParse, pTab);. 
143c0 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20   }..  /* Remove 
143d0 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
143e0 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e  from SQLite's in
143f0 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e  ternal schema an
14400 64 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68  d modify.  ** th
14410 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
14420 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69  .  */.  if( IsVi
14430 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
14440 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14450 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65 73 74  dOp4(v, OP_VDest
14460 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  roy, iDb, 0, 0, 
14470 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pTab->zName, 0);
14480 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
14490 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44  beAddOp4(v, OP_D
144a0 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20 30  ropTable, iDb, 0
144b0 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
144c0 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  , 0);.  sqlite3C
144d0 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
144e0 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69  se, iDb);.  sqli
144f0 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64  teViewResetAll(d
14500 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  b, iDb);.}../*.*
14510 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
14520 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74  s called to do t
14530 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f  he work of a DRO
14540 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  P TABLE statemen
14550 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74  t..** pName is t
14560 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
14570 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70  able to be dropp
14580 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
14590 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72  te3DropTable(Par
145a0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
145b0 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20  ist *pName, int 
145c0 69 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72  isView, int noEr
145d0 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  r){.  Table *pTa
145e0 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
145f0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
14600 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
14610 69 44 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e  iDb;..  if( db->
14620 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
14630 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
14640 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  op_table;.  }.  
14650 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
14660 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73  nErr==0 );.  ass
14670 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
14680 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  ==1 );.  if( sql
14690 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
146a0 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78  Parse) ) goto ex
146b0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
146c0 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d   if( noErr ) db-
146d0 3e 73 75 70 70 72 65 73 73 45 72 72 2b 2b 3b 0a  >suppressErr++;.
146e0 20 20 61 73 73 65 72 74 28 20 69 73 56 69 65 77    assert( isView
146f0 3d 3d 30 20 7c 7c 20 69 73 56 69 65 77 3d 3d 4c  ==0 || isView==L
14700 4f 43 41 54 45 5f 56 49 45 57 20 29 3b 0a 20 20  OCATE_VIEW );.  
14710 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
14720 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50  cateTableItem(pP
14730 61 72 73 65 2c 20 69 73 56 69 65 77 2c 20 26 70  arse, isView, &p
14740 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 69  Name->a[0]);.  i
14750 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73  f( noErr ) db->s
14760 75 70 70 72 65 73 73 45 72 72 2d 2d 3b 0a 0a 20  uppressErr--;.. 
14770 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
14780 20 20 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20      if( noErr ) 
14790 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
147a0 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61  yNamedSchema(pPa
147b0 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  rse, pName->a[0]
147c0 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  .zDatabase);.   
147d0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
147e0 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62  table;.  }.  iDb
147f0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
14800 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
14810 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73  ->pSchema);.  as
14820 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
14830 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a  iDb<db->nDb );..
14840 20 20 2f 2a 20 49 66 20 70 54 61 62 20 69 73 20    /* If pTab is 
14850 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c  a virtual table,
14860 20 63 61 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c   call ViewGetCol
14870 75 6d 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e  umnNames() to en
14880 73 75 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20  sure.  ** it is 
14890 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
148a0 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
148b0 6c 28 70 54 61 62 29 20 26 26 20 73 71 6c 69 74  l(pTab) && sqlit
148c0 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
148d0 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
148e0 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  b) ){.    goto e
148f0 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
14900 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
14910 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
14920 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
14930 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73  t code;.    cons
14940 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53  t char *zTab = S
14950 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
14960 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
14970 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
14980 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20  iDb].zDbSName;. 
14990 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
149a0 41 72 67 32 20 3d 20 30 3b 0a 20 20 20 20 69 66  Arg2 = 0;.    if
149b0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
149c0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
149d0 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20  E_DELETE, zTab, 
149e0 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20  0, zDb)){.      
149f0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
14a00 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  able;.    }.    
14a10 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20  if( isView ){.  
14a20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
14a30 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
14a40 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
14a50 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
14a60 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65  P_VIEW;.      }e
14a70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
14a80 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
14a90 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 23 69  VIEW;.      }.#i
14aa0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14ab0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
14ac0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56     }else if( IsV
14ad0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
14ae0 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
14af0 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45 3b  ITE_DROP_VTABLE;
14b00 0a 20 20 20 20 20 20 7a 41 72 67 32 20 3d 20 73  .      zArg2 = s
14b10 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28  qlite3GetVTable(
14b20 64 62 2c 20 70 54 61 62 29 2d 3e 70 4d 6f 64 2d  db, pTab)->pMod-
14b30 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20  >zName;.#endif. 
14b40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14b50 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
14b60 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20   && iDb==1 ){.  
14b70 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
14b80 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41  ITE_DROP_TEMP_TA
14b90 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  BLE;.      }else
14ba0 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
14bb0 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42   SQLITE_DROP_TAB
14bc0 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LE;.      }.    
14bd0 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
14be0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
14bf0 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a  e, code, pTab->z
14c00 4e 61 6d 65 2c 20 7a 41 72 67 32 2c 20 7a 44 62  Name, zArg2, zDb
14c10 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
14c20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
14c30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
14c40 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
14c50 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
14c60 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61  ELETE, pTab->zNa
14c70 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
14c80 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
14c90 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
14ca0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
14cb0 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
14cc0 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22  p(pTab->zName, "
14cd0 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20  sqlite_", 7)==0 
14ce0 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53  .    && sqlite3S
14cf0 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e  trNICmp(pTab->zN
14d00 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 74 61  ame, "sqlite_sta
14d10 74 22 2c 20 31 31 29 21 3d 30 20 29 7b 0a 20 20  t", 11)!=0 ){.  
14d20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
14d30 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
14d40 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64   %s may not be d
14d50 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a  ropped", pTab->z
14d60 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
14d70 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
14d80 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
14d90 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
14da0 20 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f 50 20   /* Ensure DROP 
14db0 54 41 42 4c 45 20 69 73 20 6e 6f 74 20 75 73 65  TABLE is not use
14dc0 64 20 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e 64  d on a view, and
14dd0 20 44 52 4f 50 20 56 49 45 57 20 69 73 20 6e 6f   DROP VIEW is no
14de0 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61  t used.  ** on a
14df0 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
14e00 66 28 20 69 73 56 69 65 77 20 26 26 20 70 54 61  f( isView && pTa
14e10 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  b->pSelect==0 ){
14e20 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
14e30 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73  rMsg(pParse, "us
14e40 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20  e DROP TABLE to 
14e50 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22  delete table %s"
14e60 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
14e70 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
14e80 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  op_table;.  }.  
14e90 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20 70  if( !isView && p
14ea0 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
14eb0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14ec0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65  Msg(pParse, "use
14ed0 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65   DROP VIEW to de
14ee0 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c 20 70  lete view %s", p
14ef0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
14f00 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
14f10 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69  table;.  }.#endi
14f20 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
14f30 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20   code to remove 
14f40 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  the table from t
14f50 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a  he master table.
14f60 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20    ** on disk..  
14f70 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
14f80 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
14f90 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
14fa0 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
14fb0 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
14fc0 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 1, iDb);.    
14fd0 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74  sqlite3ClearStat
14fe0 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69  Tables(pParse, i
14ff0 44 62 2c 20 22 74 62 6c 22 2c 20 70 54 61 62 2d  Db, "tbl", pTab-
15000 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
15010 69 74 65 33 46 6b 44 72 6f 70 54 61 62 6c 65 28  ite3FkDropTable(
15020 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2c 20 70  pParse, pName, p
15030 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Tab);.    sqlite
15040 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 70  3CodeDropTable(p
15050 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 44 62  Parse, pTab, iDb
15060 2c 20 69 73 56 69 65 77 29 3b 0a 20 20 7d 0a 0a  , isView);.  }..
15070 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a  exit_drop_table:
15080 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
15090 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d  tDelete(db, pNam
150a0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  e);.}../*.** Thi
150b0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
150c0 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  led to create a 
150d0 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  new foreign key 
150e0 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  on the table.** 
150f0 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
15100 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70  construction.  p
15110 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e  FromCol determin
15120 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73  es which columns
15130 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65  .** in the curre
15140 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74  nt table point t
15150 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  o the foreign ke
15160 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d  y.  If pFromCol=
15170 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65  =0 then.** conne
15180 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68  ct the key to th
15190 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e  e last column in
151a0 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20  serted.  pTo is 
151b0 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74  the name of.** t
151c0 68 65 20 74 61 62 6c 65 20 72 65 66 65 72 72 65  he table referre
151d0 64 20 74 6f 20 28 61 2e 6b 2e 61 20 74 68 65 20  d to (a.k.a the 
151e0 22 70 61 72 65 6e 74 22 20 74 61 62 6c 65 29 2e  "parent" table).
151f0 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69    pToCol is a li
15200 73 74 0a 2a 2a 20 6f 66 20 74 61 62 6c 65 73 20  st.** of tables 
15210 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 54  in the parent pT
15220 6f 20 74 61 62 6c 65 2e 20 20 66 6c 61 67 73 20  o table.  flags 
15230 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20  contains all.** 
15240 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
15250 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72  t the conflict r
15260 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
15270 74 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a  thms specified.*
15280 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45  * in the ON DELE
15290 54 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e  TE, ON UPDATE an
152a0 64 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75  d ON INSERT clau
152b0 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b  ses..**.** An FK
152c0 65 79 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ey structure is 
152d0 63 72 65 61 74 65 64 20 61 6e 64 20 61 64 64 65  created and adde
152e0 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  d to the table c
152f0 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65  urrently.** unde
15300 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69  r construction i
15310 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e  n the pParse->pN
15320 65 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 0a 2a  ewTable field..*
15330 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e  *.** The foreign
15340 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72 20   key is set for 
15350 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73  IMMEDIATE proces
15360 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75  sing.  A subsequ
15370 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73  ent call.** to s
15380 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69  qlite3DeferForei
15390 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68  gnKey() might ch
153a0 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45 46  ange this to DEF
153b0 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ERRED..*/.void s
153c0 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72 65  qlite3CreateFore
153d0 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20  ignKey(.  Parse 
153e0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
153f0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
15400 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
15410 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43  *pFromCol,  /* C
15420 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74  olumns in this t
15430 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20  able that point 
15440 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  to other table *
15450 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20  /.  Token *pTo, 
15460 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
15470 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74 61   of the other ta
15480 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ble */.  ExprLis
15490 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a  t *pToCol,    /*
154a0 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   Columns in the 
154b0 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
154c0 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
154d0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63        /* Conflic
154e0 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
154f0 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20  orithms. */.){. 
15500 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
15510 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64  Parse->db;.#ifnd
15520 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
15530 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65  OREIGN_KEY.  FKe
15540 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20  y *pFKey = 0;.  
15550 46 4b 65 79 20 2a 70 4e 65 78 74 54 6f 3b 0a 20  FKey *pNextTo;. 
15560 20 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72   Table *p = pPar
15570 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
15580 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e   int nByte;.  in
15590 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  t i;.  int nCol;
155a0 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61  .  char *z;..  a
155b0 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b  ssert( pTo!=0 );
155c0 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 49  .  if( p==0 || I
155d0 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
155e0 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
155f0 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20  if( pFromCol==0 
15600 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  ){.    int iCol 
15610 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20  = p->nCol-1;.   
15620 20 69 66 28 20 4e 45 56 45 52 28 69 43 6f 6c 3c   if( NEVER(iCol<
15630 30 29 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  0) ) goto fk_end
15640 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c  ;.    if( pToCol
15650 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70   && pToCol->nExp
15660 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  r!=1 ){.      sq
15670 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
15680 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b  arse, "foreign k
15690 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20  ey on %s".      
156a0 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65     " should refe
156b0 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63  rence only one c
156c0 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25  olumn of table %
156d0 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e  T",.         p->
156e0 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
156f0 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f  , pTo);.      go
15700 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d  to fk_end;.    }
15710 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20  .    nCol = 1;. 
15720 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f   }else if( pToCo
15730 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78  l && pToCol->nEx
15740 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45  pr!=pFromCol->nE
15750 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xpr ){.    sqlit
15760 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
15770 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62  e,.        "numb
15780 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
15790 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65   foreign key doe
157a0 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
157b0 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20  number of ".    
157c0 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20      "columns in 
157d0 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
157e0 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f  able");.    goto
157f0 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65   fk_end;.  }else
15800 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72  {.    nCol = pFr
15810 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20  omCol->nExpr;.  
15820 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  }.  nByte = size
15830 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 28 6e 43  of(*pFKey) + (nC
15840 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 70 46 4b  ol-1)*sizeof(pFK
15850 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70  ey->aCol[0]) + p
15860 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28  To->n + 1;.  if(
15870 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66   pToCol ){.    f
15880 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c  or(i=0; i<pToCol
15890 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
158a0 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71       nByte += sq
158b0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54  lite3Strlen30(pT
158c0 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
158d0 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  ) + 1;.    }.  }
158e0 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74  .  pFKey = sqlit
158f0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
15900 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  b, nByte );.  if
15910 28 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a 20 20  ( pFKey==0 ){.  
15920 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
15930 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f   }.  pFKey->pFro
15940 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e  m = p;.  pFKey->
15950 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70  pNextFrom = p->p
15960 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61  FKey;.  z = (cha
15970 72 2a 29 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b  r*)&pFKey->aCol[
15980 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e  nCol];.  pFKey->
15990 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70  zTo = z;.  memcp
159a0 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f  y(z, pTo->z, pTo
159b0 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e  ->n);.  z[pTo->n
159c0 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
159d0 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 7a 20  Dequote(z);.  z 
159e0 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70  += pTo->n+1;.  p
159f0 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f  FKey->nCol = nCo
15a00 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f  l;.  if( pFromCo
15a10 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65  l==0 ){.    pFKe
15a20 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d  y->aCol[0].iFrom
15a30 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
15a40 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69  }else{.    for(i
15a50 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
15a60 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  {.      int j;. 
15a70 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
15a80 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  p->nCol; j++){. 
15a90 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
15aa0 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f  e3StrICmp(p->aCo
15ab0 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f  l[j].zName, pFro
15ac0 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  mCol->a[i].zName
15ad0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
15ae0 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d    pFKey->aCol[i]
15af0 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20  .iFrom = j;.    
15b00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15b10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
15b20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e       if( j>=p->n
15b30 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Col ){.        s
15b40 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
15b50 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
15b60 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d    "unknown colum
15b70 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65  n \"%s\" in fore
15b80 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
15b90 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  on", .          
15ba0 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
15bb0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
15bc0 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
15bd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
15be0 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
15bf0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
15c00 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
15c10 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
15c20 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61  rlen30(pToCol->a
15c30 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
15c40 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d    pFKey->aCol[i]
15c50 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20  .zCol = z;.     
15c60 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f   memcpy(z, pToCo
15c70 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e  l->a[i].zName, n
15c80 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20  );.      z[n] = 
15c90 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b  0;.      z += n+
15ca0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
15cb0 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
15cc0 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61   = 0;.  pFKey->a
15cd0 41 63 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29  Action[0] = (u8)
15ce0 28 66 6c 61 67 73 20 26 20 30 78 66 66 29 3b 20  (flags & 0xff); 
15cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e             /* ON
15d00 20 44 45 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a   DELETE action *
15d10 2f 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69  /.  pFKey->aActi
15d20 6f 6e 5b 31 5d 20 3d 20 28 75 38 29 28 28 66 6c  on[1] = (u8)((fl
15d30 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66  ags >> 8 ) & 0xf
15d40 66 29 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44  f);    /* ON UPD
15d50 41 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20  ATE action */.. 
15d60 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
15d70 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
15d80 64 62 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d  db, 0, p->pSchem
15d90 61 29 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20  a) );.  pNextTo 
15da0 3d 20 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65  = (FKey *)sqlite
15db0 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e  3HashInsert(&p->
15dc0 70 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73  pSchema->fkeyHas
15dd0 68 2c 20 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  h, .      pFKey-
15de0 3e 7a 54 6f 2c 20 28 76 6f 69 64 20 2a 29 70 46  >zTo, (void *)pF
15df0 4b 65 79 0a 20 20 29 3b 0a 20 20 69 66 28 20 70  Key.  );.  if( p
15e00 4e 65 78 74 54 6f 3d 3d 70 46 4b 65 79 20 29 7b  NextTo==pFKey ){
15e10 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46  .    sqlite3OomF
15e20 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 67 6f  ault(db);.    go
15e30 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20  to fk_end;.  }. 
15e40 20 69 66 28 20 70 4e 65 78 74 54 6f 20 29 7b 0a   if( pNextTo ){.
15e50 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 78      assert( pNex
15e60 74 54 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30 20  tTo->pPrevTo==0 
15e70 29 3b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e  );.    pFKey->pN
15e80 65 78 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f 3b  extTo = pNextTo;
15e90 0a 20 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70 50  .    pNextTo->pP
15ea0 72 65 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a 20  revTo = pFKey;. 
15eb0 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68   }..  /* Link th
15ec0 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f  e foreign key to
15ed0 20 74 68 65 20 74 61 62 6c 65 20 61 73 20 74 68   the table as th
15ee0 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a  e last step..  *
15ef0 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70  /.  p->pFKey = p
15f00 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20  FKey;.  pFKey = 
15f10 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71  0;..fk_end:.  sq
15f20 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
15f30 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f  pFKey);.#endif /
15f40 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
15f50 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
15f60 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  EY) */.  sqlite3
15f70 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
15f80 62 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20  b, pFromCol);.  
15f90 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
15fa0 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c  elete(db, pToCol
15fb0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
15fc0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
15fd0 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49  ed when an INITI
15fe0 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f  ALLY IMMEDIATE o
15ff0 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  r INITIALLY DEFE
16000 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69  RRED.** clause i
16010 73 20 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f  s seen as part o
16020 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  f a foreign key 
16030 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65  definition.  The
16040 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70   isDeferred.** p
16050 61 72 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f  arameter is 1 fo
16060 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  r INITIALLY DEFE
16070 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49  RRED and 0 for I
16080 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
16090 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76  TE..** The behav
160a0 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ior of the most 
160b0 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64  recently created
160c0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
160d0 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f  adjusted.** acco
160e0 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  rdingly..*/.void
160f0 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72   sqlite3DeferFor
16100 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70  eignKey(Parse *p
16110 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66  Parse, int isDef
16120 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20  erred){.#ifndef 
16130 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
16140 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20  IGN_KEY.  Table 
16150 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70  *pTab;.  FKey *p
16160 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61  FKey;.  if( (pTa
16170 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
16180 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46  Table)==0 || (pF
16190 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65  Key = pTab->pFKe
161a0 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  y)==0 ) return;.
161b0 20 20 61 73 73 65 72 74 28 20 69 73 44 65 66 65    assert( isDefe
161c0 72 72 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66  rred==0 || isDef
161d0 65 72 72 65 64 3d 3d 31 20 29 3b 20 2f 2a 20 45  erred==1 ); /* E
161e0 56 3a 20 52 2d 33 30 33 32 33 2d 32 31 39 31 37  V: R-30323-21917
161f0 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44   */.  pFKey->isD
16200 65 66 65 72 72 65 64 20 3d 20 28 75 38 29 69 73  eferred = (u8)is
16210 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66  Deferred;.#endif
16220 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
16230 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
16240 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65 66 69  l erase and refi
16250 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20  ll index *pIdx. 
16260 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64   This is.** used
16270 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61   to initialize a
16280 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 69   newly created i
16290 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d  ndex or to recom
162a0 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  pute the.** cont
162b0 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  ent of an index 
162c0 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61  in response to a
162d0 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64   REINDEX command
162e0 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f  ..**.** if memRo
162f0 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65  otPage is not ne
16300 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73  gative, it means
16310 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20   that the index 
16320 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61  is newly.** crea
16330 74 65 64 2e 20 20 54 68 65 20 72 65 67 69 73 74  ted.  The regist
16340 65 72 20 73 70 65 63 69 66 69 65 64 20 62 79 20  er specified by 
16350 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74  memRootPage cont
16360 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  ains the.** root
16370 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
16380 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d  the index.  If m
16390 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65  emRootPage is ne
163a0 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20  gative, then.** 
163b0 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64  the index alread
163c0 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73  y exists and mus
163d0 74 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66  t be cleared bef
163e0 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c  ore being refill
163f0 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f  ed and.** the ro
16400 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
16410 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74  f the index is t
16420 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78  aken from pIndex
16430 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69  ->tnum..*/.stati
16440 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  c void sqlite3Re
16450 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20  fillIndex(Parse 
16460 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a  *pParse, Index *
16470 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52  pIndex, int memR
16480 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c  ootPage){.  Tabl
16490 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78  e *pTab = pIndex
164a0 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68  ->pTable;  /* Th
164b0 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
164c0 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
164d0 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
164e0 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42  nTab++;     /* B
164f0 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64  tree cursor used
16500 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69   for pTab */.  i
16510 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72 73 65  nt iIdx = pParse
16520 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a  ->nTab++;     /*
16530 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73   Btree cursor us
16540 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f  ed for pIndex */
16550 0a 20 20 69 6e 74 20 69 53 6f 72 74 65 72 3b 20  .  int iSorter; 
16560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16570 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e    /* Cursor open
16580 65 64 20 62 79 20 4f 70 65 6e 53 6f 72 74 65 72  ed by OpenSorter
16590 20 28 69 66 20 69 6e 20 75 73 65 29 20 2a 2f 0a   (if in use) */.
165a0 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20    int addr1;    
165b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165c0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
165d0 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20  op of loop */.  
165e0 69 6e 74 20 61 64 64 72 32 3b 20 20 20 20 20 20  int addr2;      
165f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16600 2a 20 41 64 64 72 65 73 73 20 74 6f 20 6a 75 6d  * Address to jum
16610 70 20 74 6f 20 66 6f 72 20 6e 65 78 74 20 69 74  p to for next it
16620 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
16630 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20   tnum;          
16640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
16650 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65  oot page of inde
16660 78 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 74  x */.  int iPart
16670 49 64 78 4c 61 62 65 6c 3b 20 20 20 20 20 20 20  IdxLabel;       
16680 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f        /* Jump to
16690 20 74 68 69 73 20 6c 61 62 65 6c 20 74 6f 20 73   this label to s
166a0 6b 69 70 20 61 20 72 6f 77 20 2a 2f 0a 20 20 56  kip a row */.  V
166b0 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
166c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
166d0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
166e0 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c  nto this virtual
166f0 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65   machine */.  Ke
16700 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20  yInfo *pKey;    
16710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16720 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65  KeyInfo for inde
16730 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  x */.  int regRe
16740 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20  cord;           
16750 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
16760 72 20 68 6f 6c 64 69 6e 67 20 61 73 73 65 6d 62  r holding assemb
16770 6c 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  led index record
16780 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
16790 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
167a0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
167b0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
167c0 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73  */.  int iDb = s
167d0 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
167e0 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e  dex(db, pIndex->
167f0 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64  pSchema);..#ifnd
16800 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
16810 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69  UTHORIZATION.  i
16820 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
16830 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
16840 54 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64  TE_REINDEX, pInd
16850 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20  ex->zName, 0,.  
16860 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
16870 2e 7a 44 62 53 4e 61 6d 65 20 29 20 29 7b 0a 20  .zDbSName ) ){. 
16880 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
16890 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75  endif..  /* Requ
168a0 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ire a write-lock
168b0 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f   on the table to
168c0 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70   perform this op
168d0 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  eration */.  sql
168e0 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
168f0 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
16900 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e  >tnum, 1, pTab->
16910 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73  zName);..  v = s
16920 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
16930 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
16940 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
16950 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30  ( memRootPage>=0
16960 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d   ){.    tnum = m
16970 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65  emRootPage;.  }e
16980 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20  lse{.    tnum = 
16990 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20  pIndex->tnum;.  
169a0 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74  }.  pKey = sqlit
169b0 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78  e3KeyInfoOfIndex
169c0 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29  (pParse, pIndex)
169d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
169e0 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !=0 || db->mallo
169f0 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
16a00 65 2d 3e 6e 45 72 72 20 29 3b 0a 0a 20 20 2f 2a  e->nErr );..  /*
16a10 20 4f 70 65 6e 20 74 68 65 20 73 6f 72 74 65 72   Open the sorter
16a20 20 63 75 72 73 6f 72 20 69 66 20 77 65 20 61 72   cursor if we ar
16a30 65 20 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f  e to use one. */
16a40 0a 20 20 69 53 6f 72 74 65 72 20 3d 20 70 50 61  .  iSorter = pPa
16a50 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73  rse->nTab++;.  s
16a60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
16a70 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  (v, OP_SorterOpe
16a80 6e 2c 20 69 53 6f 72 74 65 72 2c 20 30 2c 20 70  n, iSorter, 0, p
16a90 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20  Index->nKeyCol, 
16aa0 28 63 68 61 72 2a 29 0a 20 20 20 20 20 20 20 20  (char*).        
16ab0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
16ac0 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b  te3KeyInfoRef(pK
16ad0 65 79 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  ey), P4_KEYINFO)
16ae0 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
16af0 20 74 61 62 6c 65 2e 20 4c 6f 6f 70 20 74 68 72   table. Loop thr
16b00 6f 75 67 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66  ough all rows of
16b10 20 74 68 65 20 74 61 62 6c 65 2c 20 69 6e 73 65   the table, inse
16b20 72 74 69 6e 67 20 69 6e 64 65 78 0a 20 20 2a 2a  rting index.  **
16b30 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 74 68   records into th
16b40 65 20 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 73  e sorter. */.  s
16b50 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
16b60 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44  pParse, iTab, iD
16b70 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
16b80 52 65 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d  Read);.  addr1 =
16b90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16ba0 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
16bb0 20 69 54 61 62 2c 20 30 29 3b 20 56 64 62 65 43   iTab, 0); VdbeC
16bc0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 72 65  overage(v);.  re
16bd0 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
16be0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
16bf0 73 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47  se);..  sqlite3G
16c00 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
16c10 70 50 61 72 73 65 2c 70 49 6e 64 65 78 2c 69 54  pParse,pIndex,iT
16c20 61 62 2c 72 65 67 52 65 63 6f 72 64 2c 30 2c 26  ab,regRecord,0,&
16c30 69 50 61 72 74 49 64 78 4c 61 62 65 6c 2c 30 2c  iPartIdxLabel,0,
16c40 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
16c50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
16c60 72 74 65 72 49 6e 73 65 72 74 2c 20 69 53 6f 72  rterInsert, iSor
16c70 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  ter, regRecord);
16c80 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  .  sqlite3Resolv
16c90 65 50 61 72 74 49 64 78 4c 61 62 65 6c 28 70 50  ePartIdxLabel(pP
16ca0 61 72 73 65 2c 20 69 50 61 72 74 49 64 78 4c 61  arse, iPartIdxLa
16cb0 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  bel);.  sqlite3V
16cc0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16cd0 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
16ce0 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  1+1); VdbeCovera
16cf0 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
16d00 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
16d10 61 64 64 72 31 29 3b 0a 20 20 69 66 28 20 6d 65  addr1);.  if( me
16d20 6d 52 6f 6f 74 50 61 67 65 3c 30 20 29 20 73 71  mRootPage<0 ) sq
16d30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16d40 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75  v, OP_Clear, tnu
16d50 6d 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74  m, iDb);.  sqlit
16d60 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
16d70 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49  OP_OpenWrite, iI
16d80 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a  dx, tnum, iDb, .
16d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16da0 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b 65 79      (char *)pKey
16db0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
16dc0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
16dd0 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42  geP5(v, OPFLAG_B
16de0 55 4c 4b 43 53 52 7c 28 28 6d 65 6d 52 6f 6f 74  ULKCSR|((memRoot
16df0 50 61 67 65 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f  Page>=0)?OPFLAG_
16e00 50 32 49 53 52 45 47 3a 30 29 29 3b 0a 0a 20 20  P2ISREG:0));..  
16e10 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
16e20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16e30 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 53 6f 72  SorterSort, iSor
16e40 74 65 72 2c 20 30 29 3b 20 56 64 62 65 43 6f 76  ter, 0); VdbeCov
16e50 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20  erage(v);.  if( 
16e60 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
16e70 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69 6e 74  ndex) ){.    int
16e80 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j2 = sqlite3Vdb
16e90 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
16ea0 2b 20 33 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  + 3;.    sqlite3
16eb0 56 64 62 65 47 6f 74 6f 28 76 2c 20 6a 32 29 3b  VdbeGoto(v, j2);
16ec0 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c  .    addr2 = sql
16ed0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
16ee0 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ddr(v);.    sqli
16ef0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
16f00 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 43 6f 6d  (v, OP_SorterCom
16f10 70 61 72 65 2c 20 69 53 6f 72 74 65 72 2c 20 6a  pare, iSorter, j
16f20 32 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a 20 20  2, regRecord,.  
16f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f40 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e         pIndex->n
16f50 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76  KeyCol); VdbeCov
16f60 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
16f70 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74  lite3UniqueConst
16f80 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 4f 45  raint(pParse, OE
16f90 5f 41 62 6f 72 74 2c 20 70 49 6e 64 65 78 29 3b  _Abort, pIndex);
16fa0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64  .  }else{.    ad
16fb0 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
16fc0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
16fd0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
16fe0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
16ff0 6f 72 74 65 72 44 61 74 61 2c 20 69 53 6f 72 74  orterData, iSort
17000 65 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 69  er, regRecord, i
17010 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Idx);.  sqlite3V
17020 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
17030 4c 61 73 74 2c 20 69 49 64 78 2c 20 30 2c 20 2d  Last, iIdx, 0, -
17040 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
17050 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
17060 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 72  xInsert, iIdx, r
17070 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
17080 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
17090 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
170a0 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c  EKRESULT);.  sql
170b0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
170c0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
170d0 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
170e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
170f0 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 53 6f  _SorterNext, iSo
17100 72 74 65 72 2c 20 61 64 64 72 32 29 3b 20 56 64  rter, addr2); Vd
17110 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
17120 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
17130 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
17140 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
17150 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
17160 2c 20 69 54 61 62 29 3b 0a 20 20 73 71 6c 69 74  , iTab);.  sqlit
17170 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
17180 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 29 3b  OP_Close, iIdx);
17190 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
171a0 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
171b0 2c 20 69 53 6f 72 74 65 72 29 3b 0a 7d 0a 0a 2f  , iSorter);.}../
171c0 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 68 65  *.** Allocate he
171d0 61 70 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64  ap space to hold
171e0 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63 74   an Index object
171f0 20 77 69 74 68 20 6e 43 6f 6c 20 63 6f 6c 75 6d   with nCol colum
17200 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65 61  ns..**.** Increa
17210 73 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  se the allocatio
17220 6e 20 73 69 7a 65 20 74 6f 20 70 72 6f 76 69 64  n size to provid
17230 65 20 61 6e 20 65 78 74 72 61 20 6e 45 78 74 72  e an extra nExtr
17240 61 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 38 2d  a bytes.** of 8-
17250 62 79 74 65 20 61 6c 69 67 6e 65 64 20 73 70 61  byte aligned spa
17260 63 65 20 61 66 74 65 72 20 74 68 65 20 49 6e 64  ce after the Ind
17270 65 78 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65  ex object and re
17280 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65  turn a.** pointe
17290 72 20 74 6f 20 74 68 69 73 20 65 78 74 72 61 20  r to this extra 
172a0 73 70 61 63 65 20 69 6e 20 2a 70 70 45 78 74 72  space in *ppExtr
172b0 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c  a..*/.Index *sql
172c0 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65  ite3AllocateInde
172d0 78 4f 62 6a 65 63 74 28 0a 20 20 73 71 6c 69 74  xObject(.  sqlit
172e0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
172f0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
17300 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 31 36 20  ection */.  i16 
17310 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  nCol,           
17320 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
17330 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
17340 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  he index */.  in
17350 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
17360 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17370 62 79 74 65 73 20 6f 66 20 65 78 74 72 61 20 73  bytes of extra s
17380 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 20 2a 2f  pace to alloc */
17390 0a 20 20 63 68 61 72 20 2a 2a 70 70 45 78 74 72  .  char **ppExtr
173a0 61 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  a       /* Point
173b0 65 72 20 74 6f 20 74 68 65 20 22 65 78 74 72 61  er to the "extra
173c0 22 20 73 70 61 63 65 20 2a 2f 0a 29 7b 0a 20 20  " space */.){.  
173d0 49 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20  Index *p;       
173e0 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
173f0 64 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a  d index object *
17400 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
17410 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
17420 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 49  s of space for I
17430 6e 64 65 78 20 6f 62 6a 65 63 74 20 2b 20 61 72  ndex object + ar
17440 72 61 79 73 20 2a 2f 0a 0a 20 20 6e 42 79 74 65  rays */..  nByte
17450 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   = ROUND8(sizeof
17460 28 49 6e 64 65 78 29 29 20 2b 20 20 20 20 20 20  (Index)) +      
17470 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
17480 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20   structure  */. 
17490 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38 28           ROUND8(
174a0 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43  sizeof(char*)*nC
174b0 6f 6c 29 20 2b 20 20 20 20 20 20 20 20 20 2f 2a  ol) +         /*
174c0 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20   Index.azColl   
174d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52    */.          R
174e0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4c 6f 67  OUND8(sizeof(Log
174f0 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20  Est)*(nCol+1) + 
17500 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52      /* Index.aiR
17510 6f 77 4c 6f 67 45 73 74 20 20 20 2a 2f 0a 20 20  owLogEst   */.  
17520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
17530 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 20  izeof(i16)*nCol 
17540 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  +            /* 
17550 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20  Index.aiColumn  
17560 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
17570 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38 29 2a       sizeof(u8)*
17580 6e 43 6f 6c 29 3b 20 20 20 20 20 20 20 20 20 20  nCol);          
17590 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72     /* Index.aSor
175a0 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 20 3d 20  tOrder */.  p = 
175b0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
175c0 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 2b 20  ero(db, nByte + 
175d0 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 70  nExtra);.  if( p
175e0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 45   ){.    char *pE
175f0 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29 70  xtra = ((char*)p
17600 29 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  )+ROUND8(sizeof(
17610 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 70 2d 3e  Index));.    p->
17620 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74 20  azColl = (const 
17630 63 68 61 72 2a 2a 29 70 45 78 74 72 61 3b 20 70  char**)pExtra; p
17640 45 78 74 72 61 20 2b 3d 20 52 4f 55 4e 44 38 28  Extra += ROUND8(
17650 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43  sizeof(char*)*nC
17660 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 69 52 6f  ol);.    p->aiRo
17670 77 4c 6f 67 45 73 74 20 3d 20 28 4c 6f 67 45 73  wLogEst = (LogEs
17680 74 2a 29 70 45 78 74 72 61 3b 20 70 45 78 74 72  t*)pExtra; pExtr
17690 61 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45  a += sizeof(LogE
176a0 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 3b 0a 20 20  st)*(nCol+1);.  
176b0 20 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20    p->aiColumn = 
176c0 28 69 31 36 2a 29 70 45 78 74 72 61 3b 20 20 20  (i16*)pExtra;   
176d0 20 20 20 20 70 45 78 74 72 61 20 2b 3d 20 73 69      pExtra += si
176e0 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 3b 0a  zeof(i16)*nCol;.
176f0 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65      p->aSortOrde
17700 72 20 3d 20 28 75 38 2a 29 70 45 78 74 72 61 3b  r = (u8*)pExtra;
17710 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20  .    p->nColumn 
17720 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 6e  = nCol;.    p->n
17730 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2d 20  KeyCol = nCol - 
17740 31 3b 0a 20 20 20 20 2a 70 70 45 78 74 72 61 20  1;.    *ppExtra 
17750 3d 20 28 28 63 68 61 72 2a 29 70 29 20 2b 20 6e  = ((char*)p) + n
17760 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Byte;.  }.  retu
17770 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn p;.}../*.** C
17780 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65  reate a new inde
17790 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62  x for an SQL tab
177a0 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d  le.  pName1.pNam
177b0 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  e2 is the name o
177c0 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20  f the index .** 
177d0 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20  and pTblList is 
177e0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
177f0 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
17800 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f   be indexed.  Bo
17810 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e  th will .** be N
17820 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72  ULL for a primar
17830 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65  y key or an inde
17840 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65  x that is create
17850 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a  d to satisfy a.*
17860 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  * UNIQUE constra
17870 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20  int.  If pTable 
17880 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e  and pIndex are N
17890 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d  ULL, use pParse-
178a0 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73  >pNewTable.** as
178b0 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
178c0 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73   indexed.  pPars
178d0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20  e->pNewTable is 
178e0 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a  a table that is.
178f0 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  ** currently bei
17900 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ng constructed b
17910 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  y a CREATE TABLE
17920 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
17930 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73  * pList is a lis
17940 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
17950 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69  be indexed.  pLi
17960 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  st will be NULL 
17970 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20  if this.** is a 
17980 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75  primary key or u
17990 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74  nique-constraint
179a0 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
179b0 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ent column added
179c0 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65  .** to the table
179d0 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
179e0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
179f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
17a00 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50  CreateIndex(.  P
17a10 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
17a20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61    /* All informa
17a30 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20  tion about this 
17a40 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  parse */.  Token
17a50 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a   *pName1,     /*
17a60 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 69   First part of i
17a70 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62  ndex name. May b
17a80 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  e NULL */.  Toke
17a90 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
17aa0 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  * Second part of
17ab0 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79   index name. May
17ac0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72   be NULL */.  Sr
17ad0 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c  cList *pTblName,
17ae0 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64   /* Table to ind
17af0 65 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e  ex. Use pParse->
17b00 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a  pNewTable if 0 *
17b10 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
17b20 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74  ist,   /* A list
17b30 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
17b40 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  e indexed */.  i
17b50 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
17b60 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f    /* OE_Abort, O
17b70 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70  E_Ignore, OE_Rep
17b80 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65  lace, or OE_None
17b90 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74   */.  Token *pSt
17ba0 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  art,     /* The 
17bb0 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
17bc0 74 20 62 65 67 69 6e 73 20 74 68 69 73 20 73 74  t begins this st
17bd0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70  atement */.  Exp
17be0 72 20 2a 70 50 49 57 68 65 72 65 2c 20 20 20 20  r *pPIWhere,    
17bf0 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
17c00 66 6f 72 20 70 61 72 74 69 61 6c 20 69 6e 64 69  for partial indi
17c10 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ces */.  int sor
17c20 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53  tOrder,     /* S
17c30 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69  ort order of pri
17c40 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c  mary key when pL
17c50 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69  ist==NULL */.  i
17c60 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 2c 20 20  nt ifNotExist,  
17c70 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20    /* Omit error 
17c80 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  if index already
17c90 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 75 38 20   exists */.  u8 
17ca0 69 64 78 54 79 70 65 20 20 20 20 20 20 20 20 20  idxType         
17cb0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 79 70  /* The index typ
17cc0 65 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  e */.){.  Table 
17cd0 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f  *pTab = 0;     /
17ce0 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  * Table to be in
17cf0 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  dexed */.  Index
17d00 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20   *pIndex = 0;   
17d10 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
17d20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20  be created */.  
17d30 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
17d40 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
17d50 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  the index */.  i
17d60 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
17d70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
17d80 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a   characters in z
17d90 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  Name */.  int i,
17da0 20 6a 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46   j;.  DbFixer sF
17db0 69 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ix;        /* Fo
17dc0 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61  r assigning data
17dd0 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54  base names to pT
17de0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  able */.  int so
17df0 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f  rtOrderMask;   /
17e00 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53  * 1 to honor DES
17e10 43 20 69 6e 20 69 6e 64 65 78 2e 20 20 30 20 74  C in index.  0 t
17e20 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73  o ignore. */.  s
17e30 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
17e40 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70  rse->db;.  Db *p
17e50 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
17e60 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69 63 20  /* The specific 
17e70 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
17e80 20 74 68 65 20 69 6e 64 65 78 65 64 20 64 61 74   the indexed dat
17e90 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  abase */.  int i
17ea0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
17eb0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
17ec0 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73  database that is
17ed0 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a   being written *
17ee0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
17ef0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75   = 0;    /* Unqu
17f00 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20  alified name of 
17f10 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65  the index to cre
17f20 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ate */.  struct 
17f30 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
17f40 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72  ListItem; /* For
17f50 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c   looping over pL
17f60 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ist */.  int nEx
17f70 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tra = 0;        
17f80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
17f90 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
17fa0 20 7a 45 78 74 72 61 5b 5d 20 2a 2f 0a 20 20 69   zExtra[] */.  i
17fb0 6e 74 20 6e 45 78 74 72 61 43 6f 6c 3b 20 20 20  nt nExtraCol;   
17fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fd0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
17fe0 72 61 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65  ra columns neede
17ff0 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78  d */.  char *zEx
18000 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tra = 0;        
18010 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
18020 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68 65   space after the
18030 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f   Index object */
18040 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20  .  Index *pPk = 
18050 30 3b 20 20 20 20 20 20 2f 2a 20 50 52 49 4d 41  0;      /* PRIMA
18060 52 59 20 4b 45 59 20 69 6e 64 65 78 20 66 6f 72  RY KEY index for
18070 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
18080 61 62 6c 65 73 20 2a 2f 0a 0a 20 20 69 66 28 20  ables */..  if( 
18090 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
180a0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
180b0 3e 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  >0 ){.    goto e
180c0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
180d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 4e 5f 44  ;.  }.  if( IN_D
180e0 45 43 4c 41 52 45 5f 56 54 41 42 20 26 26 20 69  ECLARE_VTAB && i
180f0 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49  dxType!=SQLITE_I
18100 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45  DXTYPE_PRIMARYKE
18110 59 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  Y ){.    goto ex
18120 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
18130 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54  .  }.  if( SQLIT
18140 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
18150 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
18160 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
18170 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
18180 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
18190 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  nd the table tha
181a0 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
181b0 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c  ed.  Return earl
181c0 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  y if not found..
181d0 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e    */.  if( pTblN
181e0 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f  ame!=0 ){..    /
181f0 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61  * Use the two-pa
18200 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f  rt index name to
18210 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64   determine the d
18220 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20  atabase .    ** 
18230 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68  to search for th
18240 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74  e table. 'Fix' t
18250 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  he table name to
18260 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20   this db.    ** 
18270 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75  before looking u
18280 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  p the table..   
18290 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
182a0 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32  pName1 && pName2
182b0 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71   );.    iDb = sq
182c0 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
182d0 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
182e0 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
182f0 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
18300 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
18310 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73  te_index;.    as
18320 73 65 72 74 28 20 70 4e 61 6d 65 20 26 26 20 70  sert( pName && p
18330 4e 61 6d 65 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e  Name->z );..#ifn
18340 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18350 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49 66  TEMPDB.    /* If
18360 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20   the index name 
18370 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c  was unqualified,
18380 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 61   check if the ta
18390 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20  ble.    ** is a 
183a0 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73  temp table. If s
183b0 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  o, set the datab
183c0 61 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74  ase to 1. Do not
183d0 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   do this.    ** 
183e0 69 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67 20  if initialising 
183f0 61 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  a database schem
18400 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  a..    */.    if
18410 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
18420 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   ){.      pTab =
18430 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c   sqlite3SrcListL
18440 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54  ookup(pParse, pT
18450 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  blName);.      i
18460 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20  f( pName2->n==0 
18470 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d  && pTab && pTab-
18480 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44  >pSchema==db->aD
18490 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a  b[1].pSchema ){.
184a0 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b          iDb = 1;
184b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
184c0 65 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c 69 74  endif..    sqlit
184d0 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
184e0 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69   pParse, iDb, "i
184f0 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  ndex", pName);. 
18500 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
18510 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20  xSrcList(&sFix, 
18520 70 54 62 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20  pTblName) ){.   
18530 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68     /* Because th
18540 65 20 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75  e parser constru
18550 63 74 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f  cts pTblName fro
18560 6d 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74  m a single ident
18570 69 66 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20  ifier,.      ** 
18580 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
18590 74 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c  t can never fail
185a0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
185b0 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t(0);.    }.    
185c0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
185d0 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50  cateTableItem(pP
185e0 61 72 73 65 2c 20 30 2c 20 26 70 54 62 6c 4e 61  arse, 0, &pTblNa
185f0 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 20 20 61  me->a[0]);.    a
18600 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
18610 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20 70 54  cFailed==0 || pT
18620 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab==0 );.    if(
18630 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20   pTab==0 ) goto 
18640 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
18650 78 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d  x;.    if( iDb==
18660 31 20 26 26 20 64 62 2d 3e 61 44 62 5b 69 44 62  1 && db->aDb[iDb
18670 5d 2e 70 53 63 68 65 6d 61 21 3d 70 54 61 62 2d  ].pSchema!=pTab-
18680 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
18690 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
186a0 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
186b0 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 72        "cannot cr
186c0 65 61 74 65 20 61 20 54 45 4d 50 20 69 6e 64 65  eate a TEMP inde
186d0 78 20 6f 6e 20 6e 6f 6e 2d 54 45 4d 50 20 74 61  x on non-TEMP ta
186e0 62 6c 65 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20  ble \"%s\"",.   
186f0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
18700 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
18710 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18720 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
18730 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
18740 29 20 29 20 70 50 6b 20 3d 20 73 71 6c 69 74 65  ) ) pPk = sqlite
18750 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
18760 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pTab);.  }else{
18770 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
18780 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  me==0 );.    ass
18790 65 72 74 28 20 70 53 74 61 72 74 3d 3d 30 20 29  ert( pStart==0 )
187a0 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50 61  ;.    pTab = pPa
187b0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
187c0 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20      if( !pTab ) 
187d0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
187e0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62 20  _index;.    iDb 
187f0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
18800 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
18810 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20  >pSchema);.  }. 
18820 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
18830 69 44 62 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28  iDb];..  assert(
18840 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73   pTab!=0 );.  as
18850 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
18860 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  rr==0 );.  if( s
18870 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
18880 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c  Tab->zName, "sql
18890 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20  ite_", 7)==0 .  
188a0 20 20 20 20 20 26 26 20 64 62 2d 3e 69 6e 69 74       && db->init
188b0 2e 62 75 73 79 3d 3d 30 0a 23 69 66 20 53 51 4c  .busy==0.#if SQL
188c0 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
188d0 49 43 41 54 49 4f 4e 0a 20 20 20 20 20 20 20 26  ICATION.       &
188e0 26 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74  & sqlite3UserAut
188f0 68 54 61 62 6c 65 28 70 54 61 62 2d 3e 7a 4e 61  hTable(pTab->zNa
18900 6d 65 29 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20  me)==0.#endif.  
18910 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53       && sqlite3S
18920 74 72 4e 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a  trNICmp(&pTab->z
18930 4e 61 6d 65 5b 37 5d 2c 22 61 6c 74 65 72 74 61  Name[7],"alterta
18940 62 5f 22 2c 39 29 21 3d 30 20 29 7b 0a 20 20 20  b_",9)!=0 ){.   
18950 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
18960 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
18970 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  %s may not be in
18980 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  dexed", pTab->zN
18990 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
189a0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
189b0 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
189c0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
189d0 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
189e0 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
189f0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
18a00 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74  , "views may not
18a10 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20   be indexed");. 
18a20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
18a30 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
18a40 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
18a50 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
18a60 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56  LTABLE.  if( IsV
18a70 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
18a80 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
18a90 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 72  Msg(pParse, "vir
18aa0 74 75 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20  tual tables may 
18ab0 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29  not be indexed")
18ac0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
18ad0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
18ae0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20  }.#endif..  /*. 
18af0 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d   ** Find the nam
18b00 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  e of the index. 
18b10 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
18b20 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
18b30 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64  another.  ** ind
18b40 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68  ex or table with
18b50 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
18b60 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65   .  **.  ** Exce
18b70 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72  ption:  If we ar
18b80 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61  e reading the na
18b90 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74  mes of permanent
18ba0 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68   indices from th
18bb0 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61  e.  ** sqlite_ma
18bc0 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61  ster table (beca
18bd0 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  use some other p
18be0 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74  rocess changed t
18bf0 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20  he schema) and. 
18c00 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69   ** one of the i
18c10 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69  ndex names colli
18c20 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d  des with the nam
18c30 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79  e of a temporary
18c40 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69   table or.  ** i
18c50 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69  ndex, then we wi
18c60 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70  ll continue to p
18c70 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65  rocess this inde
18c80 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  x..  **.  ** If 
18c90 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e  pName==0 it mean
18ca0 73 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20  s that we are.  
18cb0 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  ** dealing with 
18cc0 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
18cd0 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
18ce0 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  nt.  We have to 
18cf0 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20  invent our.  ** 
18d00 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  own name..  */. 
18d10 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20   if( pName ){.  
18d20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
18d30 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
18d40 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  b, pName);.    i
18d50 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f  f( zName==0 ) go
18d60 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18d70 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
18d80 28 20 70 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b  ( pName->z!=0 );
18d90 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
18da0 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
18db0 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
18dc0 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
18dd0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
18de0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
18df0 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
18e00 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20  it.busy ){.     
18e10 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
18e20 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
18e30 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)!=0 ){.      
18e40 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
18e50 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
18e60 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61   is already a ta
18e70 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  ble named %s", z
18e80 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
18e90 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
18ea0 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
18eb0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
18ec0 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
18ed0 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 44  , zName, pDb->zD
18ee0 62 53 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  bSName)!=0 ){.  
18ef0 20 20 20 20 69 66 28 20 21 69 66 4e 6f 74 45 78      if( !ifNotEx
18f00 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ist ){.        s
18f10 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
18f20 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73  Parse, "index %s
18f30 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
18f40 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
18f50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
18f60 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
18f70 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 20 20 20  .busy );.       
18f80 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
18f90 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
18fa0 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20   iDb);.      }. 
18fb0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
18fc0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
18fd0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
18fe0 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78  int n;.    Index
18ff0 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72   *pLoop;.    for
19000 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e  (pLoop=pTab->pIn
19010 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b  dex, n=1; pLoop;
19020 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e   pLoop=pLoop->pN
19030 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20  ext, n++){}.    
19040 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
19050 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69  Printf(db, "sqli
19060 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f  te_autoindex_%s_
19070 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %d", pTab->zName
19080 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  , n);.    if( zN
19090 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
190a0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
190b0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 0a 20  _index;.    }.. 
190c0 20 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20     /* Automatic 
190d0 69 6e 64 65 78 20 6e 61 6d 65 73 20 67 65 6e 65  index names gene
190e0 72 61 74 65 64 20 66 72 6f 6d 20 77 69 74 68 69  rated from withi
190f0 6e 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72  n sqlite3_declar
19100 65 5f 76 74 61 62 28 29 0a 20 20 20 20 2a 2a 20  e_vtab().    ** 
19110 6d 75 73 74 20 68 61 76 65 20 6e 61 6d 65 73 20  must have names 
19120 74 68 61 74 20 61 72 65 20 64 69 73 74 69 6e 63  that are distinc
19130 74 20 66 72 6f 6d 20 6e 6f 72 6d 61 6c 20 61 75  t from normal au
19140 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6e 61  tomatic index na
19150 6d 65 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  mes..    ** The 
19160 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d  following statem
19170 65 6e 74 20 63 6f 6e 76 65 72 74 73 20 22 73 71  ent converts "sq
19180 6c 69 74 65 33 5f 61 75 74 6f 69 6e 64 65 78 2e  lite3_autoindex.
19190 2e 2e 22 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20  .." into.    ** 
191a0 22 73 71 6c 69 74 65 33 5f 62 75 74 6f 69 6e 64  "sqlite3_butoind
191b0 65 78 2e 2e 2e 22 20 69 6e 20 6f 72 64 65 72 20  ex..." in order 
191c0 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65  to make the name
191d0 73 20 64 69 73 74 69 6e 63 74 2e 0a 20 20 20 20  s distinct..    
191e0 2a 2a 20 54 68 65 20 22 76 74 61 62 5f 65 72 72  ** The "vtab_err
191f0 2e 74 65 73 74 22 20 74 65 73 74 20 64 65 6d 6f  .test" test demo
19200 6e 73 74 72 61 74 65 73 20 74 68 65 20 6e 65 65  nstrates the nee
19210 64 20 6f 66 20 74 68 69 73 20 73 74 61 74 65 6d  d of this statem
19220 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ent. */.    if( 
19230 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
19240 29 20 7a 4e 61 6d 65 5b 37 5d 2b 2b 3b 0a 20 20  ) zName[7]++;.  
19250 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  }..  /* Check fo
19260 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  r authorization 
19270 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64  to create an ind
19280 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ex..  */.#ifndef
19290 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
192a0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
192b0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
192c0 44 62 20 3d 20 70 44 62 2d 3e 7a 44 62 53 4e 61  Db = pDb->zDbSNa
192d0 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  me;.    if( sqli
192e0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
192f0 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
19300 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
19310 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 29 20 29  (iDb), 0, zDb) )
19320 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
19330 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
19340 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51      }.    i = SQ
19350 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45  LITE_CREATE_INDE
19360 58 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54  X;.    if( !OMIT
19370 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
19380 31 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43  1 ) i = SQLITE_C
19390 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
193a0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
193b0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
193c0 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61  e, i, zName, pTa
193d0 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b->zName, zDb) )
193e0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
193f0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
19400 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
19410 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d  ..  /* If pList=
19420 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69  =0, it means thi
19430 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
19440 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70  lled to make a p
19450 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20  rimary.  ** key 
19460 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20  out of the last 
19470 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20  column added to 
19480 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20  the table under 
19490 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20  construction..  
194a0 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66  ** So create a f
194b0 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75  ake list to simu
194c0 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a  late this..  */.
194d0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
194e0 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 70 72 65 76  {.    Token prev
194f0 43 6f 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Col;.    sqlite3
19500 54 6f 6b 65 6e 49 6e 69 74 28 26 70 72 65 76 43  TokenInit(&prevC
19510 6f 6c 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  ol, pTab->aCol[p
19520 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61  Tab->nCol-1].zNa
19530 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  me);.    pList =
19540 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
19550 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
19560 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19570 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
19580 28 64 62 2c 20 54 4b 5f 49 44 2c 20 26 70 72 65  (db, TK_ID, &pre
19590 76 43 6f 6c 2c 20 30 29 29 3b 0a 20 20 20 20 69  vCol, 0));.    i
195a0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f  f( pList==0 ) go
195b0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
195c0 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
195d0 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  ( pList->nExpr==
195e0 31 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 );.    sqlite3
195f0 45 78 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f  ExprListSetSortO
19600 72 64 65 72 28 70 4c 69 73 74 2c 20 73 6f 72 74  rder(pList, sort
19610 4f 72 64 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Order);.  }else{
19620 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
19630 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28  ListCheckLength(
19640 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 22  pParse, pList, "
19650 69 6e 64 65 78 22 29 3b 0a 20 20 7d 0a 0a 20 20  index");.  }..  
19660 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
19670 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20  w many bytes of 
19680 73 70 61 63 65 20 61 72 65 20 72 65 71 75 69 72  space are requir
19690 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78 70 6c  ed to store expl
196a0 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63  icitly.  ** spec
196b0 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  ified collation 
196c0 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a  sequence names..
196d0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
196e0 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
196f0 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
19700 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61  pExpr = pList->a
19710 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61  [i].pExpr;.    a
19720 73 73 65 72 74 28 20 70 45 78 70 72 21 3d 30 20  ssert( pExpr!=0 
19730 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  );.    if( pExpr
19740 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
19750 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61   ){.      nExtra
19760 20 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74 65 33   += (1 + sqlite3
19770 53 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e  Strlen30(pExpr->
19780 75 2e 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20 20 20  u.zToken));.    
19790 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a  }.  }..  /* .  *
197a0 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69  * Allocate the i
197b0 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20  ndex structure. 
197c0 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20  .  */.  nName = 
197d0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
197e0 7a 4e 61 6d 65 29 3b 0a 20 20 6e 45 78 74 72 61  zName);.  nExtra
197f0 43 6f 6c 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d  Col = pPk ? pPk-
19800 3e 6e 4b 65 79 43 6f 6c 20 3a 20 31 3b 0a 20 20  >nKeyCol : 1;.  
19810 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
19820 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a  AllocateIndexObj
19830 65 63 74 28 64 62 2c 20 70 4c 69 73 74 2d 3e 6e  ect(db, pList->n
19840 45 78 70 72 20 2b 20 6e 45 78 74 72 61 43 6f 6c  Expr + nExtraCol
19850 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19870 20 20 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20          nName + 
19880 6e 45 78 74 72 61 20 2b 20 31 2c 20 26 7a 45 78  nExtra + 1, &zEx
19890 74 72 61 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  tra);.  if( db->
198a0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
198b0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
198c0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
198d0 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
198e0 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
198f0 49 6e 64 65 78 2d 3e 61 69 52 6f 77 4c 6f 67 45  Index->aiRowLogE
19900 73 74 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  st) );.  assert(
19910 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
19920 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 7a  NMENT(pIndex->az
19930 43 6f 6c 6c 29 20 29 3b 0a 20 20 70 49 6e 64 65  Coll) );.  pInde
19940 78 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 45 78 74 72  x->zName = zExtr
19950 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e  a;.  zExtra += n
19960 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 6d 65 6d 63  Name + 1;.  memc
19970 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  py(pIndex->zName
19980 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31  , zName, nName+1
19990 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61  );.  pIndex->pTa
199a0 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49  ble = pTab;.  pI
199b0 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20  ndex->onError = 
199c0 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70  (u8)onError;.  p
199d0 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75  Index->uniqNotNu
199e0 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 21 3d 4f 45  ll = onError!=OE
199f0 5f 4e 6f 6e 65 3b 0a 20 20 70 49 6e 64 65 78 2d  _None;.  pIndex-
19a00 3e 69 64 78 54 79 70 65 20 3d 20 69 64 78 54 79  >idxType = idxTy
19a10 70 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53  pe;.  pIndex->pS
19a20 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
19a30 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  iDb].pSchema;.  
19a40 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20  pIndex->nKeyCol 
19a50 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
19a60 20 20 69 66 28 20 70 50 49 57 68 65 72 65 20 29    if( pPIWhere )
19a70 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
19a80 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63  olveSelfReferenc
19a90 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
19aa0 4e 43 5f 50 61 72 74 49 64 78 2c 20 70 50 49 57  NC_PartIdx, pPIW
19ab0 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 70 49  here, 0);.    pI
19ac0 6e 64 65 78 2d 3e 70 50 61 72 74 49 64 78 57 68  ndex->pPartIdxWh
19ad0 65 72 65 20 3d 20 70 50 49 57 68 65 72 65 3b 0a  ere = pPIWhere;.
19ae0 20 20 20 20 70 50 49 57 68 65 72 65 20 3d 20 30      pPIWhere = 0
19af0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
19b00 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
19b10 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
19b20 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  0) );..  /* Chec
19b30 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 73  k to see if we s
19b40 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43  hould honor DESC
19b50 20 72 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64   requests on ind
19b60 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a  ex columns.  */.
19b70 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
19b80 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  ma->file_format>
19b90 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72  =4 ){.    sortOr
19ba0 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20  derMask = -1;   
19bb0 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f  /* Honor DESC */
19bc0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f  .  }else{.    so
19bd0 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b  rtOrderMask = 0;
19be0 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45      /* Ignore DE
19bf0 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20  SC */.  }..  /* 
19c00 41 6e 61 6c 79 7a 65 20 74 68 65 20 6c 69 73 74  Analyze the list
19c10 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20   of expressions 
19c20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 74 65  that form the te
19c30 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  rms of the index
19c40 20 61 6e 64 0a 20 20 2a 2a 20 72 65 70 6f 72 74   and.  ** report
19c50 20 61 6e 79 20 65 72 72 6f 72 73 2e 20 20 49 6e   any errors.  In
19c60 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
19c70 20 77 68 65 72 65 20 74 68 65 20 65 78 70 72 65   where the expre
19c80 73 73 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79  ssion is exactly
19c90 0a 20 20 2a 2a 20 61 20 74 61 62 6c 65 20 63 6f  .  ** a table co
19ca0 6c 75 6d 6e 2c 20 73 74 6f 72 65 20 74 68 61 74  lumn, store that
19cb0 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 69 43 6f 6c   column in aiCol
19cc0 75 6d 6e 5b 5d 2e 20 20 46 6f 72 20 67 65 6e 65  umn[].  For gene
19cd0 72 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ral expressions,
19ce0 0a 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 20 70  .  ** populate p
19cf0 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20  Index->aColExpr 
19d00 61 6e 64 20 73 74 6f 72 65 20 58 4e 5f 45 58 50  and store XN_EXP
19d10 52 20 28 2d 32 29 20 69 6e 20 61 69 43 6f 6c 75  R (-2) in aiColu
19d20 6d 6e 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mn[]..  **.  ** 
19d30 54 4f 44 4f 3a 20 49 73 73 75 65 20 61 20 77 61  TODO: Issue a wa
19d40 72 6e 69 6e 67 20 69 66 20 74 77 6f 20 6f 72 20  rning if two or 
19d50 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  more columns of 
19d60 74 68 65 20 69 6e 64 65 78 20 61 72 65 20 69 64  the index are id
19d70 65 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a 20 54 4f  entical..  ** TO
19d80 44 4f 3a 20 49 73 73 75 65 20 61 20 77 61 72 6e  DO: Issue a warn
19d90 69 6e 67 20 69 66 20 74 68 65 20 74 61 62 6c 65  ing if the table
19da0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20   primary key is 
19db0 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
19dc0 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6b  the.  ** index k
19dd0 65 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ey..  */.  for(i
19de0 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c  =0, pListItem=pL
19df0 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d  ist->a; i<pList-
19e00 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69  >nExpr; i++, pLi
19e10 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45  stItem++){.    E
19e20 78 70 72 20 2a 70 43 45 78 70 72 3b 20 20 20 20  xpr *pCExpr;    
19e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19e40 20 54 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20   The i-th index 
19e50 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
19e60 20 20 69 6e 74 20 72 65 71 75 65 73 74 65 64 53    int requestedS
19e70 6f 72 74 4f 72 64 65 72 3b 20 20 20 20 20 20 20  ortOrder;       
19e80 20 2f 2a 20 41 53 43 20 6f 72 20 44 45 53 43 20   /* ASC or DESC 
19e90 6f 6e 20 74 68 65 20 69 2d 74 68 20 65 78 70 72  on the i-th expr
19ea0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f  ession */.    co
19eb0 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b  nst char *zColl;
19ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19ed0 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  Collation sequen
19ee0 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20  ce name */..    
19ef0 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49  sqlite3StringToI
19f00 64 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  d(pListItem->pEx
19f10 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pr);.    sqlite3
19f20 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72  ResolveSelfRefer
19f30 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70 54 61  ence(pParse, pTa
19f40 62 2c 20 4e 43 5f 49 64 78 45 78 70 72 2c 20 70  b, NC_IdxExpr, p
19f50 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2c  ListItem->pExpr,
19f60 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61   0);.    if( pPa
19f70 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f  rse->nErr ) goto
19f80 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
19f90 65 78 3b 0a 20 20 20 20 70 43 45 78 70 72 20 3d  ex;.    pCExpr =
19fa0 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
19fb0 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 49 74 65  Collate(pListIte
19fc0 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  m->pExpr);.    i
19fd0 66 28 20 70 43 45 78 70 72 2d 3e 6f 70 21 3d 54  f( pCExpr->op!=T
19fe0 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
19ff0 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72    if( pTab==pPar
1a000 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b  se->pNewTable ){
1a010 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1a020 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1a030 20 22 65 78 70 72 65 73 73 69 6f 6e 73 20 70 72   "expressions pr
1a040 6f 68 69 62 69 74 65 64 20 69 6e 20 50 52 49 4d  ohibited in PRIM
1a050 41 52 59 20 4b 45 59 20 61 6e 64 20 22 0a 20 20  ARY KEY and ".  
1a060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55                "U
1a080 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
1a090 73 22 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  s");.        got
1a0a0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1a0b0 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
1a0c0 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61     if( pIndex->a
1a0d0 43 6f 6c 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  ColExpr==0 ){.  
1a0e0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
1a0f0 70 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45  pCopy = sqlite3E
1a100 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
1a110 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  List, 0);.      
1a120 20 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78    pIndex->aColEx
1a130 70 72 20 3d 20 70 43 6f 70 79 3b 0a 20 20 20 20  pr = pCopy;.    
1a140 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
1a150 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1a160 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1a170 43 6f 70 79 21 3d 30 20 29 3b 0a 20 20 20 20 20  Copy!=0 );.     
1a180 20 20 20 20 20 70 4c 69 73 74 49 74 65 6d 20 3d       pListItem =
1a190 20 26 70 43 6f 70 79 2d 3e 61 5b 69 5d 3b 0a 20   &pCopy->a[i];. 
1a1a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1a1b0 0a 20 20 20 20 20 20 6a 20 3d 20 58 4e 5f 45 58  .      j = XN_EX
1a1c0 50 52 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78  PR;.      pIndex
1a1d0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20  ->aiColumn[i] = 
1a1e0 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20 20 70  XN_EXPR;.      p
1a1f0 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75  Index->uniqNotNu
1a200 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ll = 0;.    }els
1a210 65 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 43 45  e{.      j = pCE
1a220 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
1a230 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 3d 30      assert( j<=0
1a240 78 37 66 66 66 20 29 3b 0a 20 20 20 20 20 20 69  x7fff );.      i
1a250 66 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( j<0 ){.      
1a260 20 20 6a 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65    j = pTab->iPKe
1a270 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  y;.      }else i
1a280 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  f( pTab->aCol[j]
1a290 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20  .notNull==0 ){. 
1a2a0 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 75         pIndex->u
1a2b0 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a  niqNotNull = 0;.
1a2c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
1a2d0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
1a2e0 5d 20 3d 20 28 69 31 36 29 6a 3b 0a 20 20 20 20  ] = (i16)j;.    
1a2f0 7d 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 30 3b  }.    zColl = 0;
1a300 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 49 74  .    if( pListIt
1a310 65 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  em->pExpr->op==T
1a320 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20  K_COLLATE ){.   
1a330 20 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20     int nColl;.  
1a340 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73      zColl = pLis
1a350 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 75 2e  tItem->pExpr->u.
1a360 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 43  zToken;.      nC
1a370 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72  oll = sqlite3Str
1a380 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b 20 31  len30(zColl) + 1
1a390 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1a3a0 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b  nExtra>=nColl );
1a3b0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 45  .      memcpy(zE
1a3c0 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f  xtra, zColl, nCo
1a3d0 6c 6c 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  ll);.      zColl
1a3e0 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20 20 20   = zExtra;.     
1a3f0 20 7a 45 78 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c   zExtra += nColl
1a400 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2d  ;.      nExtra -
1a410 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c  = nColl;.    }el
1a420 73 65 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20  se if( j>=0 ){. 
1a430 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61       zColl = pTa
1a440 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c  b->aCol[j].zColl
1a450 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1a460 21 7a 43 6f 6c 6c 20 29 20 7a 43 6f 6c 6c 20 3d  !zColl ) zColl =
1a470 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
1a480 59 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  Y;.    if( !db->
1a490 69 6e 69 74 2e 62 75 73 79 20 26 26 20 21 73 71  init.busy && !sq
1a4a0 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
1a4b0 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c  eq(pParse, zColl
1a4c0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
1a4d0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1a4e0 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  x;.    }.    pIn
1a4f0 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d  dex->azColl[i] =
1a500 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75   zColl;.    requ
1a510 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 20 3d  estedSortOrder =
1a520 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74   pListItem->sort
1a530 4f 72 64 65 72 20 26 20 73 6f 72 74 4f 72 64 65  Order & sortOrde
1a540 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65  rMask;.    pInde
1a550 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  x->aSortOrder[i]
1a560 20 3d 20 28 75 38 29 72 65 71 75 65 73 74 65 64   = (u8)requested
1a570 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a  SortOrder;.  }..
1a580 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
1a590 74 61 62 6c 65 20 6b 65 79 20 74 6f 20 74 68 65  table key to the
1a5a0 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
1a5b0 78 2e 20 20 46 6f 72 20 57 49 54 48 4f 55 54 20  x.  For WITHOUT 
1a5c0 52 4f 57 49 44 0a 20 20 2a 2a 20 74 61 62 6c 65  ROWID.  ** table
1a5d0 73 20 28 77 68 65 6e 20 70 50 6b 21 3d 30 29 20  s (when pPk!=0) 
1a5e0 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65  this will be the
1a5f0 20 64 65 63 6c 61 72 65 64 20 50 52 49 4d 41 52   declared PRIMAR
1a600 59 20 4b 45 59 2e 20 20 46 6f 72 0a 20 20 2a 2a  Y KEY.  For.  **
1a610 20 6e 6f 72 6d 61 6c 20 74 61 62 6c 65 73 20 28   normal tables (
1a620 77 68 65 6e 20 70 50 6b 3d 3d 30 29 20 74 68 69  when pPk==0) thi
1a630 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 72 6f  s will be the ro
1a640 77 69 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  wid..  */.  if( 
1a650 70 50 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a  pPk ){.    for(j
1a660 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43  =0; j<pPk->nKeyC
1a670 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
1a680 69 6e 74 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43  int x = pPk->aiC
1a690 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20  olumn[j];.      
1a6a0 61 73 73 65 72 74 28 20 78 3e 3d 30 20 29 3b 0a  assert( x>=0 );.
1a6b0 20 20 20 20 20 20 69 66 28 20 68 61 73 43 6f 6c        if( hasCol
1a6c0 75 6d 6e 28 70 49 6e 64 65 78 2d 3e 61 69 43 6f  umn(pIndex->aiCo
1a6d0 6c 75 6d 6e 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b  lumn, pIndex->nK
1a6e0 65 79 43 6f 6c 2c 20 78 29 20 29 7b 0a 20 20 20  eyCol, x) ){.   
1a6f0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f       pIndex->nCo
1a700 6c 75 6d 6e 2d 2d 3b 20 0a 20 20 20 20 20 20 7d  lumn--; .      }
1a710 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49  else{.        pI
1a720 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
1a730 5d 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70  ] = x;.        p
1a740 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  Index->azColl[i]
1a750 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a   = pPk->azColl[j
1a760 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ];.        pInde
1a770 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  x->aSortOrder[i]
1a780 20 3d 20 70 50 6b 2d 3e 61 53 6f 72 74 4f 72 64   = pPk->aSortOrd
1a790 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69  er[j];.        i
1a7a0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
1a7b0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d  }.    assert( i=
1a7c0 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e  =pIndex->nColumn
1a7d0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
1a7e0 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
1a7f0 6e 5b 69 5d 20 3d 20 58 4e 5f 52 4f 57 49 44 3b  n[i] = XN_ROWID;
1a800 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43  .    pIndex->azC
1a810 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  oll[i] = sqlite3
1a820 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 7d 0a 20  StrBINARY;.  }. 
1a830 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52   sqlite3DefaultR
1a840 6f 77 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 20  owEst(pIndex);. 
1a850 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65   if( pParse->pNe
1a860 77 54 61 62 6c 65 3d 3d 30 20 29 20 65 73 74 69  wTable==0 ) esti
1a870 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 70  mateIndexWidth(p
1a880 49 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66  Index);..  /* If
1a890 20 74 68 69 73 20 69 6e 64 65 78 20 63 6f 6e 74   this index cont
1a8a0 61 69 6e 73 20 65 76 65 72 79 20 63 6f 6c 75 6d  ains every colum
1a8b0 6e 20 6f 66 20 69 74 73 20 74 61 62 6c 65 2c 20  n of its table, 
1a8c0 74 68 65 6e 20 6d 61 72 6b 0a 20 20 2a 2a 20 69  then mark.  ** i
1a8d0 74 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20  t as a covering 
1a8e0 69 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72  index */.  asser
1a8f0 74 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  t( HasRowid(pTab
1a900 29 20 0a 20 20 20 20 20 20 7c 7c 20 70 54 61 62  ) .      || pTab
1a910 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 73 71 6c  ->iPKey<0 || sql
1a920 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65  ite3ColumnOfInde
1a930 78 28 70 49 6e 64 65 78 2c 20 70 54 61 62 2d 3e  x(pIndex, pTab->
1a940 69 50 4b 65 79 29 3e 3d 30 20 29 3b 0a 20 20 69  iPKey)>=0 );.  i
1a950 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 26  f( pTblName!=0 &
1a960 26 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  & pIndex->nColum
1a970 6e 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  n>=pTab->nCol ){
1a980 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 69 73 43  .    pIndex->isC
1a990 6f 76 65 72 69 6e 67 20 3d 20 31 3b 0a 20 20 20  overing = 1;.   
1a9a0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
1a9b0 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
1a9c0 20 20 20 20 69 66 28 20 6a 3d 3d 70 54 61 62 2d      if( j==pTab-
1a9d0 3e 69 50 4b 65 79 20 29 20 63 6f 6e 74 69 6e 75  >iPKey ) continu
1a9e0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  e;.      if( sql
1a9f0 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65  ite3ColumnOfInde
1aa00 78 28 70 49 6e 64 65 78 2c 6a 29 3e 3d 30 20 29  x(pIndex,j)>=0 )
1aa10 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1aa20 20 70 49 6e 64 65 78 2d 3e 69 73 43 6f 76 65 72   pIndex->isCover
1aa30 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  ing = 0;.      b
1aa40 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
1aa50 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61  .  if( pTab==pPa
1aa60 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29  rse->pNewTable )
1aa70 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f  {.    /* This ro
1aa80 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63  utine has been c
1aa90 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
1aaa0 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
1aab0 65 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72  ex as a.    ** r
1aac0 65 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41  esult of a PRIMA
1aad0 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
1aae0 20 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c   clause on a col
1aaf0 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20  umn definition, 
1ab00 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d  or.    ** a PRIM
1ab10 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
1ab20 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69  E clause followi
1ab30 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65  ng the column de
1ab40 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a  finitions..    *
1ab50 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20  * i.e. one of:. 
1ab60 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45     **.    ** CRE
1ab70 41 54 45 20 54 41 42 4c 45 20 74 28 78 20 50 52  ATE TABLE t(x PR
1ab80 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20  IMARY KEY, y);. 
1ab90 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42     ** CREATE TAB
1aba0 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55  LE t(x, y, UNIQU
1abb0 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a  E(x, y));.    **
1abc0 0a 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77  .    ** Either w
1abd0 61 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65  ay, check to see
1abe0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c   if the table al
1abf0 72 65 61 64 79 20 68 61 73 20 73 75 63 68 20 61  ready has such a
1ac00 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20  n index. If.    
1ac10 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74  ** so, don't bot
1ac20 68 65 72 20 63 72 65 61 74 69 6e 67 20 74 68 69  her creating thi
1ac30 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79  s one. This only
1ac40 20 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20   applies to.    
1ac50 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
1ac60 20 63 72 65 61 74 65 64 20 69 6e 64 69 63 65 73   created indices
1ac70 2e 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61  . Users can do a
1ac80 73 20 74 68 65 79 20 77 69 73 68 20 77 69 74 68  s they wish with
1ac90 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74  .    ** explicit
1aca0 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a   indices..    **
1acb0 0a 20 20 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51  .    ** Two UNIQ
1acc0 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45  UE or PRIMARY KE
1acd0 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  Y constraints ar
1ace0 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75  e considered equ
1acf0 69 76 61 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28  ivalent.    ** (
1ad00 61 6e 64 20 74 68 75 73 20 73 75 70 70 72 65 73  and thus suppres
1ad10 73 69 6e 67 20 74 68 65 20 73 65 63 6f 6e 64 20  sing the second 
1ad20 6f 6e 65 29 20 65 76 65 6e 20 69 66 20 74 68 65  one) even if the
1ad30 79 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74  y have different
1ad40 0a 20 20 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64  .    ** sort ord
1ad50 65 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ers..    **.    
1ad60 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
1ad70 64 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74  different collat
1ad80 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 6f 72  ing sequences or
1ad90 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   if the columns 
1ada0 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  of.    ** the co
1adb0 6e 73 74 72 61 69 6e 74 20 6f 63 63 75 72 20 69  nstraint occur i
1adc0 6e 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65  n different orde
1add0 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e  rs, then the con
1ade0 73 74 72 61 69 6e 74 73 20 61 72 65 0a 20 20 20  straints are.   
1adf0 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 64   ** considered d
1ae00 69 73 74 69 6e 63 74 20 61 6e 64 20 62 6f 74 68  istinct and both
1ae10 20 72 65 73 75 6c 74 20 69 6e 20 73 65 70 61 72   result in separ
1ae20 61 74 65 20 69 6e 64 69 63 65 73 2e 0a 20 20 20  ate indices..   
1ae30 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
1ae40 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
1ae50 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
1ae60 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
1ae70 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
1ae80 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65  nt k;.      asse
1ae90 72 74 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65  rt( IsUniqueInde
1aea0 78 28 70 49 64 78 29 20 29 3b 0a 20 20 20 20 20  x(pIdx) );.     
1aeb0 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69   assert( pIdx->i
1aec0 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49  dxType!=SQLITE_I
1aed0 44 58 54 59 50 45 5f 41 50 50 44 45 46 20 29 3b  DXTYPE_APPDEF );
1aee0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49  .      assert( I
1aef0 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e  sUniqueIndex(pIn
1af00 64 65 78 29 20 29 3b 0a 0a 20 20 20 20 20 20 69  dex) );..      i
1af10 66 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  f( pIdx->nKeyCol
1af20 21 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  !=pIndex->nKeyCo
1af30 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  l ) continue;.  
1af40 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
1af50 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 2b  Idx->nKeyCol; k+
1af60 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
1af70 74 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 20 20  t char *z1;.    
1af80 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1af90 7a 32 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  z2;.        asse
1afa0 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  rt( pIdx->aiColu
1afb0 6d 6e 5b 6b 5d 3e 3d 30 20 29 3b 0a 20 20 20 20  mn[k]>=0 );.    
1afc0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
1afd0 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65  Column[k]!=pInde
1afe0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29  x->aiColumn[k] )
1aff0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1b000 7a 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  z1 = pIdx->azCol
1b010 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32  l[k];.        z2
1b020 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c   = pIndex->azCol
1b030 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[k];.        if
1b040 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
1b050 28 7a 31 2c 20 7a 32 29 20 29 20 62 72 65 61 6b  (z1, z2) ) break
1b060 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b070 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 4b 65  if( k==pIdx->nKe
1b080 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  yCol ){.        
1b090 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
1b0a0 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  r!=pIndex->onErr
1b0b0 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
1b0c0 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72 61 69  /* This constrai
1b0d0 6e 74 20 63 72 65 61 74 65 73 20 74 68 65 20 73  nt creates the s
1b0e0 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61 20 70  ame index as a p
1b0f0 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20  revious.        
1b100 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20    ** constraint 
1b110 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65 77 68  specified somewh
1b120 65 72 65 20 69 6e 20 74 68 65 20 43 52 45 41 54  ere in the CREAT
1b130 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
1b140 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  t..          ** 
1b150 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e 20 43  However the ON C
1b160 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20  ONFLICT clauses 
1b170 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20 49  are different. I
1b180 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20 20 20  f both this .   
1b190 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72         ** constr
1b1a0 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70 72 65  aint and the pre
1b1b0 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65 6e 74  vious equivalent
1b1c0 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 76 65   constraint have
1b1d0 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20 20 20   explicit.      
1b1e0 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49      ** ON CONFLI
1b1f0 43 54 20 63 6c 61 75 73 65 73 20 74 68 69 73 20  CT clauses this 
1b200 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68  is an error. Oth
1b210 65 72 77 69 73 65 2c 20 75 73 65 20 74 68 65 0a  erwise, use the.
1b220 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70            ** exp
1b230 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66 69 65  licitly specifie
1b240 64 20 62 65 68 61 76 69 6f 72 20 66 6f 72 20 74  d behavior for t
1b250 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  he index..      
1b260 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
1b270 20 69 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45   if( !(pIdx->onE
1b280 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
1b290 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72   || pIndex->onEr
1b2a0 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29  ror==OE_Default)
1b2b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1b2c0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1b2d0 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
1b2e0 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69           "confli
1b2f0 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43  cting ON CONFLIC
1b300 54 20 63 6c 61 75 73 65 73 20 73 70 65 63 69 66  T clauses specif
1b310 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ied", 0);.      
1b320 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1b330 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
1b340 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b  r==OE_Default ){
1b350 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64  .            pId
1b360 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e  x->onError = pIn
1b370 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20  dex->onError;.  
1b380 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b390 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1b3a0 69 64 78 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  idxType==SQLITE_
1b3b0 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b  IDXTYPE_PRIMARYK
1b3c0 45 59 20 29 20 70 49 64 78 2d 3e 69 64 78 54 79  EY ) pIdx->idxTy
1b3d0 70 65 20 3d 20 69 64 78 54 79 70 65 3b 0a 20 20  pe = idxType;.  
1b3e0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1b3f0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1b400 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1b410 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e  .  /* Link the n
1b420 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  ew Index structu
1b430 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20  re to its table 
1b440 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72  and to the other
1b450 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  .  ** in-memory 
1b460 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
1b470 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73  res. .  */.  ass
1b480 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
1b490 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 64 62  r==0 );.  if( db
1b4a0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
1b4b0 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
1b4c0 20 61 73 73 65 72 74 28 20 21 49 4e 5f 44 45 43   assert( !IN_DEC
1b4d0 4c 41 52 45 5f 56 54 41 42 20 29 3b 0a 20 20 20  LARE_VTAB );.   
1b4e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1b4f0 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
1b500 64 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70  db, 0, pIndex->p
1b510 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 70  Schema) );.    p
1b520 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
1b530 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e 70 53  sert(&pIndex->pS
1b540 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
1b550 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b560 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65             pInde
1b570 78 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78  x->zName, pIndex
1b580 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  );.    if( p ){.
1b590 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
1b5a0 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d  =pIndex );  /* M
1b5b0 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
1b5c0 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
1b5d0 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
1b5e0 64 62 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  db);.      goto 
1b5f0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1b600 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  x;.    }.    db-
1b610 3e 62 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20  >bInternChanges 
1b620 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 54 62  = 1;.    if( pTb
1b630 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20  lName!=0 ){.    
1b640 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d    pIndex->tnum =
1b650 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
1b660 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  m;.    }.  }..  
1b670 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
1b680 65 20 69 6e 69 74 69 61 6c 20 43 52 45 41 54 45  e initial CREATE
1b690 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
1b6a0 20 28 6f 72 20 43 52 45 41 54 45 20 54 41 42 4c   (or CREATE TABL
1b6b0 45 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 69 6e  E if the.  ** in
1b6c0 64 65 78 20 69 73 20 61 6e 20 69 6d 70 6c 69 65  dex is an implie
1b6d0 64 20 69 6e 64 65 78 20 66 6f 72 20 61 20 55 4e  d index for a UN
1b6e0 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20  IQUE or PRIMARY 
1b6f0 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  KEY constraint) 
1b700 74 68 65 6e 0a 20 20 2a 2a 20 65 6d 69 74 20 63  then.  ** emit c
1b710 6f 64 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ode to allocate 
1b720 74 68 65 20 69 6e 64 65 78 20 72 6f 6f 74 70 61  the index rootpa
1b730 67 65 20 6f 6e 20 64 69 73 6b 20 61 6e 64 20 6d  ge on disk and m
1b740 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72  ake an entry for
1b750 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  .  ** the index 
1b760 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  in the sqlite_ma
1b770 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 70  ster table and p
1b780 6f 70 75 6c 61 74 65 20 74 68 65 20 69 6e 64 65  opulate the inde
1b790 78 20 77 69 74 68 0a 20 20 2a 2a 20 63 6f 6e 74  x with.  ** cont
1b7a0 65 6e 74 2e 20 20 42 75 74 2c 20 64 6f 20 6e 6f  ent.  But, do no
1b7b0 74 20 64 6f 20 74 68 69 73 20 69 66 20 77 65 20  t do this if we 
1b7c0 61 72 65 20 73 69 6d 70 6c 79 20 72 65 61 64 69  are simply readi
1b7d0 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
1b7e0 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20  ster.  ** table 
1b7f0 74 6f 20 70 61 72 73 65 20 74 68 65 20 73 63 68  to parse the sch
1b800 65 6d 61 2c 20 6f 72 20 69 66 20 74 68 69 73 20  ema, or if this 
1b810 69 6e 64 65 78 20 69 73 20 74 68 65 20 50 52 49  index is the PRI
1b820 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20  MARY KEY index. 
1b830 20 2a 2a 20 6f 66 20 61 20 57 49 54 48 4f 55 54   ** of a WITHOUT
1b840 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a 20 20   ROWID table..  
1b850 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e  **.  ** If pTblN
1b860 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ame==0 it means 
1b870 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65  this index is ge
1b880 6e 65 72 61 74 65 64 20 61 73 20 61 6e 20 69 6d  nerated as an im
1b890 70 6c 69 65 64 20 50 52 49 4d 41 52 59 20 4b 45  plied PRIMARY KE
1b8a0 59 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45  Y.  ** or UNIQUE
1b8b0 20 69 6e 64 65 78 20 69 6e 20 61 20 43 52 45 41   index in a CREA
1b8c0 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
1b8d0 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74  nt.  Since the t
1b8e0 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75  able.  ** has ju
1b8f0 73 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c  st been created,
1b900 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   it contains no 
1b910 64 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64  data and the ind
1b920 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ex initializatio
1b930 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20  n.  ** step can 
1b940 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  be skipped..  */
1b950 0a 20 20 65 6c 73 65 20 69 66 28 20 48 61 73 52  .  else if( HasR
1b960 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20 70 54  owid(pTab) || pT
1b970 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20  blName!=0 ){.   
1b980 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68   Vdbe *v;.    ch
1b990 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69  ar *zStmt;.    i
1b9a0 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  nt iMem = ++pPar
1b9b0 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76  se->nMem;..    v
1b9c0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1b9d0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
1b9e0 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65  f( v==0 ) goto e
1b9f0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1ba00 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ;..    sqlite3Be
1ba10 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
1ba20 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
1ba30 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  );..    /* Creat
1ba40 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66  e the rootpage f
1ba50 6f 72 20 74 68 65 20 69 6e 64 65 78 20 75 73 69  or the index usi
1ba60 6e 67 20 43 72 65 61 74 65 49 6e 64 65 78 2e 20  ng CreateIndex. 
1ba70 42 75 74 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  But before.    *
1ba80 2a 20 64 6f 69 6e 67 20 73 6f 2c 20 63 6f 64 65  * doing so, code
1ba90 20 61 20 4e 6f 6f 70 20 69 6e 73 74 72 75 63 74   a Noop instruct
1baa0 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 69 74  ion and store it
1bab0 73 20 61 64 64 72 65 73 73 20 69 6e 20 0a 20 20  s address in .  
1bac0 20 20 2a 2a 20 49 6e 64 65 78 2e 74 6e 75 6d 2e    ** Index.tnum.
1bad0 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
1bae0 64 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 69  d in case this i
1baf0 6e 64 65 78 20 69 73 20 61 63 74 75 61 6c 6c 79  ndex is actually
1bb00 20 61 20 0a 20 20 20 20 2a 2a 20 50 52 49 4d 41   a .    ** PRIMA
1bb10 52 59 20 4b 45 59 20 61 6e 64 20 74 68 65 20 74  RY KEY and the t
1bb20 61 62 6c 65 20 69 73 20 61 63 74 75 61 6c 6c 79  able is actually
1bb30 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
1bb40 20 74 61 62 6c 65 2e 20 49 6e 20 0a 20 20 20 20   table. In .    
1bb50 2a 2a 20 74 68 61 74 20 63 61 73 65 20 74 68 65  ** that case the
1bb60 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75   convertToWithou
1bb70 74 52 6f 77 69 64 54 61 62 6c 65 28 29 20 72 6f  tRowidTable() ro
1bb80 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 70 6c 61  utine will repla
1bb90 63 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 4e 6f  ce.    ** the No
1bba0 6f 70 20 77 69 74 68 20 61 20 47 6f 74 6f 20 74  op with a Goto t
1bbb0 6f 20 6a 75 6d 70 20 6f 76 65 72 20 74 68 65 20  o jump over the 
1bbc0 56 44 42 45 20 63 6f 64 65 20 67 65 6e 65 72 61  VDBE code genera
1bbd0 74 65 64 20 62 65 6c 6f 77 2e 20 2a 2f 0a 20 20  ted below. */.  
1bbe0 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d    pIndex->tnum =
1bbf0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1bc00 70 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a  p0(v, OP_Noop);.
1bc10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1bc20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65 61  ddOp2(v, OP_Crea
1bc30 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20 69 4d  teIndex, iDb, iM
1bc40 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74  em);..    /* Gat
1bc50 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  her the complete
1bc60 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
1bc70 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
1bc80 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20  ent into.    ** 
1bc90 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62  the zStmt variab
1bca0 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  le.    */.    if
1bcb0 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ( pStart ){.    
1bcc0 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 28    int n = (int)(
1bcd0 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b  pParse->sLastTok
1bce0 65 6e 2e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 29  en.z - pName->z)
1bcf0 20 2b 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74   + pParse->sLast
1bd00 54 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 69  Token.n;.      i
1bd10 66 28 20 70 4e 61 6d 65 2d 3e 7a 5b 6e 2d 31 5d  f( pName->z[n-1]
1bd20 3d 3d 27 3b 27 20 29 20 6e 2d 2d 3b 0a 20 20 20  ==';' ) n--;.   
1bd30 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e     /* A named in
1bd40 64 65 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c  dex with an expl
1bd50 69 63 69 74 20 43 52 45 41 54 45 20 49 4e 44 45  icit CREATE INDE
1bd60 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  X statement */. 
1bd70 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c       zStmt = sql
1bd80 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
1bd90 22 43 52 45 41 54 45 25 73 20 49 4e 44 45 58 20  "CREATE%s INDEX 
1bda0 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 6f  %.*s",.        o
1bdb0 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20  nError==OE_None 
1bdc0 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22  ? "" : " UNIQUE"
1bdd0 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a  , n, pName->z);.
1bde0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bdf0 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63   /* An automatic
1be00 20 69 6e 64 65 78 20 63 72 65 61 74 65 64 20 62   index created b
1be10 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  y a PRIMARY KEY 
1be20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  or UNIQUE constr
1be30 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  aint */.      /*
1be40 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
1be50 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a  MPrintf(""); */.
1be60 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b        zStmt = 0;
1be70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
1be80 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73  dd an entry in s
1be90 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72  qlite_master for
1bea0 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20   this index.    
1beb0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  */.    sqlite3Ne
1bec0 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
1bed0 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45  , .        "INSE
1bee0 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41  RT INTO %Q.%s VA
1bef0 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c  LUES('index',%Q,
1bf00 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20  %Q,#%d,%Q);",.  
1bf10 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
1bf20 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53  b].zDbSName, MAS
1bf30 54 45 52 5f 4e 41 4d 45 2c 0a 20 20 20 20 20 20  TER_NAME,.      
1bf40 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c    pIndex->zName,
1bf50 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  .        pTab->z
1bf60 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 69 4d  Name,.        iM
1bf70 65 6d 2c 0a 20 20 20 20 20 20 20 20 7a 53 74 6d  em,.        zStm
1bf80 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  t.    );.    sql
1bf90 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
1bfa0 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46  Stmt);..    /* F
1bfb0 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20 77 69  ill the index wi
1bfc0 74 68 20 64 61 74 61 20 61 6e 64 20 72 65 70 61  th data and repa
1bfd0 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 2e 20  rse the schema. 
1bfe0 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70 69 72  Code an OP_Expir
1bff0 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61  e.    ** to inva
1c000 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 2d 63  lidate all pre-c
1c010 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e  ompiled statemen
1c020 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ts..    */.    i
1c030 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20  f( pTblName ){. 
1c040 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69       sqlite3Refi
1c050 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
1c060 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20  pIndex, iMem);. 
1c070 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e       sqlite3Chan
1c080 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
1c090 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
1c0a0 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65  ite3VdbeAddParse
1c0b0 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c  SchemaOp(v, iDb,
1c0c0 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
1c0d0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 61  3MPrintf(db, "na
1c0e0 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65  me='%q' AND type
1c0f0 3d 27 69 6e 64 65 78 27 22 2c 20 70 49 6e 64 65  ='index'", pInde
1c100 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
1c110 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c120 4f 70 30 28 76 2c 20 4f 50 5f 45 78 70 69 72 65  Op0(v, OP_Expire
1c130 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71  );.    }..    sq
1c140 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
1c150 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75  e(v, pIndex->tnu
1c160 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68  m);.  }..  /* Wh
1c170 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64  en adding an ind
1c180 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  ex to the list o
1c190 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20  f indices for a 
1c1a0 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a  table, make.  **
1c1b0 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65   sure all indice
1c1c0 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70  s labeled OE_Rep
1c1d0 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20  lace come after 
1c1e0 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65  all those labele
1c1f0 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65  d.  ** OE_Ignore
1c200 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
1c210 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72  sary for the cor
1c220 72 65 63 74 20 63 6f 6e 73 74 72 61 69 6e 74 20  rect constraint 
1c230 63 68 65 63 6b 0a 20 20 2a 2a 20 70 72 6f 63 65  check.  ** proce
1c240 73 73 69 6e 67 20 28 69 6e 20 73 71 6c 69 74 65  ssing (in sqlite
1c250 33 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61  3GenerateConstra
1c260 69 6e 74 43 68 65 63 6b 73 28 29 29 20 61 73 20  intChecks()) as 
1c270 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 55 50 44  part of.  ** UPD
1c280 41 54 45 20 61 6e 64 20 49 4e 53 45 52 54 20 73  ATE and INSERT s
1c290 74 61 74 65 6d 65 6e 74 73 2e 20 20 0a 20 20 2a  tatements.  .  *
1c2a0 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
1c2b0 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d  .busy || pTblNam
1c2c0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  e==0 ){.    if( 
1c2d0 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
1c2e0 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e  ace || pTab->pIn
1c2f0 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  dex==0.         
1c300 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d  || pTab->pIndex-
1c310 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70  >onError==OE_Rep
1c320 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e  lace){.      pIn
1c330 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61  dex->pNext = pTa
1c340 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
1c350 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20   pTab->pIndex = 
1c360 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73  pIndex;.    }els
1c370 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
1c380 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70  pOther = pTab->p
1c390 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69  Index;.      whi
1c3a0 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  le( pOther->pNex
1c3b0 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65  t && pOther->pNe
1c3c0 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  xt->onError!=OE_
1c3d0 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20  Replace ){.     
1c3e0 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68     pOther = pOth
1c3f0 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  er->pNext;.     
1c400 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d   }.      pIndex-
1c410 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d  >pNext = pOther-
1c420 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f  >pNext;.      pO
1c430 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49  ther->pNext = pI
1c440 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
1c450 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a  pIndex = 0;.  }.
1c460 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62  .  /* Clean up b
1c470 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f  efore exiting */
1c480 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64  .exit_create_ind
1c490 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78  ex:.  if( pIndex
1c4a0 20 29 20 66 72 65 65 49 6e 64 65 78 28 64 62 2c   ) freeIndex(db,
1c4b0 20 70 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69   pIndex);.  sqli
1c4c0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1c4d0 2c 20 70 50 49 57 68 65 72 65 29 3b 0a 20 20 73  , pPIWhere);.  s
1c4e0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
1c4f0 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
1c500 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
1c510 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 62 6c  tDelete(db, pTbl
1c520 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
1c530 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
1c540 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c  );.}../*.** Fill
1c550 20 74 68 65 20 49 6e 64 65 78 2e 61 69 52 6f 77   the Index.aiRow
1c560 45 73 74 5b 5d 20 61 72 72 61 79 20 77 69 74 68  Est[] array with
1c570 20 64 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61   default informa
1c580 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69  tion - informati
1c590 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65 64  on.** to be used
1c5a0 20 77 68 65 6e 20 77 65 20 68 61 76 65 20 6e 6f   when we have no
1c5b0 74 20 72 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a  t run the ANALYZ
1c5c0 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  E command..**.**
1c5d0 20 61 69 52 6f 77 45 73 74 5b 30 5d 20 69 73 20   aiRowEst[0] is 
1c5e0 73 75 70 70 6f 73 65 64 20 74 6f 20 63 6f 6e 74  supposed to cont
1c5f0 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ain the number o
1c600 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  f elements in th
1c610 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63  e index..** Sinc
1c620 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  e we do not know
1c630 2c 20 67 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f  , guess 1 millio
1c640 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b 31 5d 20  n.  aiRowEst[1] 
1c650 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  is an estimate o
1c660 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  f the.** number 
1c670 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
1c680 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63 68 20  able that match 
1c690 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 76  any particular v
1c6a0 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66  alue of the.** f
1c6b0 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  irst column of t
1c6c0 68 65 20 69 6e 64 65 78 2e 20 20 61 69 52 6f 77  he index.  aiRow
1c6d0 45 73 74 5b 32 5d 20 69 73 20 61 6e 20 65 73 74  Est[2] is an est
1c6e0 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
1c6f0 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74  ber.** of rows t
1c700 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61  hat match any pa
1c710 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 61  rticular combina
1c720 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73  tion of the firs
1c730 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f  t 2 columns.** o
1c740 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 41 6e  f the index.  An
1c750 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 74 20  d so forth.  It 
1c760 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20 74  must always be t
1c770 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a  he case that.*.*
1c780 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f  *           aiRo
1c790 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73  wEst[N]<=aiRowEs
1c7a0 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20  t[N-1].**       
1c7b0 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e      aiRowEst[N]>
1c7c0 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66  =1.**.** Apart f
1c7d0 72 6f 6d 20 74 68 61 74 2c 20 77 65 20 68 61 76  rom that, we hav
1c7e0 65 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f  e little to go o
1c7f0 6e 20 62 65 73 69 64 65 73 20 69 6e 74 75 69 74  n besides intuit
1c800 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77  ion as to.** how
1c810 20 61 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75   aiRowEst[] shou
1c820 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ld be initialize
1c830 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 73 20  d.  The numbers 
1c840 67 65 6e 65 72 61 74 65 64 20 68 65 72 65 0a 2a  generated here.*
1c850 2a 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20 74  * are based on t
1c860 79 70 69 63 61 6c 20 76 61 6c 75 65 73 20 66 6f  ypical values fo
1c870 75 6e 64 20 69 6e 20 61 63 74 75 61 6c 20 69 6e  und in actual in
1c880 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dices..*/.void s
1c890 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77  qlite3DefaultRow
1c8a0 45 73 74 28 49 6e 64 65 78 20 2a 70 49 64 78 29  Est(Index *pIdx)
1c8b0 7b 0a 20 20 2f 2a 20 20 20 20 20 20 20 20 20 20  {.  /*          
1c8c0 20 20 20 20 20 20 31 30 2c 20 20 39 2c 20 20 38        10,  9,  8
1c8d0 2c 20 20 37 2c 20 20 36 20 2a 2f 0a 20 20 4c 6f  ,  7,  6 */.  Lo
1c8e0 67 45 73 74 20 61 56 61 6c 5b 5d 20 3d 20 7b 20  gEst aVal[] = { 
1c8f0 33 33 2c 20 33 32 2c 20 33 30 2c 20 32 38 2c 20  33, 32, 30, 28, 
1c900 32 36 20 7d 3b 0a 20 20 4c 6f 67 45 73 74 20 2a  26 };.  LogEst *
1c910 61 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77 4c  a = pIdx->aiRowL
1c920 6f 67 45 73 74 3b 0a 20 20 69 6e 74 20 6e 43 6f  ogEst;.  int nCo
1c930 70 79 20 3d 20 4d 49 4e 28 41 72 72 61 79 53 69  py = MIN(ArraySi
1c940 7a 65 28 61 56 61 6c 29 2c 20 70 49 64 78 2d 3e  ze(aVal), pIdx->
1c950 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 69 6e 74 20  nKeyCol);.  int 
1c960 69 3b 0a 0a 20 20 2f 2a 20 49 6e 64 65 78 65 73  i;..  /* Indexes
1c970 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 72 6f   with default ro
1c980 77 20 65 73 74 69 6d 61 74 65 73 20 73 68 6f 75  w estimates shou
1c990 6c 64 20 6e 6f 74 20 68 61 76 65 20 73 74 61 74  ld not have stat
1c9a0 31 20 64 61 74 61 20 2a 2f 0a 20 20 61 73 73 65  1 data */.  asse
1c9b0 72 74 28 20 21 70 49 64 78 2d 3e 68 61 73 53 74  rt( !pIdx->hasSt
1c9c0 61 74 31 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  at1 );..  /* Set
1c9d0 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1c9e0 20 28 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73   (number of rows
1c9f0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 29 20 74   in the index) t
1ca00 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  o the estimated 
1ca10 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  .  ** number of 
1ca20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
1ca30 65 2c 20 6f 72 20 68 61 6c 66 20 74 68 65 20 6e  e, or half the n
1ca40 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
1ca50 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20   the table.  ** 
1ca60 66 6f 72 20 61 20 70 61 72 74 69 61 6c 20 69 6e  for a partial in
1ca70 64 65 78 2e 20 20 20 42 75 74 20 64 6f 20 6e 6f  dex.   But do no
1ca80 74 20 6c 65 74 20 74 68 65 20 65 73 74 69 6d 61  t let the estima
1ca90 74 65 20 64 72 6f 70 20 62 65 6c 6f 77 20 31 30  te drop below 10
1caa0 2e 20 2a 2f 0a 20 20 61 5b 30 5d 20 3d 20 70 49  . */.  a[0] = pI
1cab0 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52 6f 77  dx->pTable->nRow
1cac0 4c 6f 67 45 73 74 3b 0a 20 20 69 66 28 20 70 49  LogEst;.  if( pI
1cad0 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  dx->pPartIdxWher
1cae0 65 21 3d 30 20 29 20 61 5b 30 5d 20 2d 3d 20 31  e!=0 ) a[0] -= 1
1caf0 30 3b 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d  0;  assert( 10==
1cb00 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 29  sqlite3LogEst(2)
1cb10 20 29 3b 0a 20 20 69 66 28 20 61 5b 30 5d 3c 33   );.  if( a[0]<3
1cb20 33 20 29 20 61 5b 30 5d 20 3d 20 33 33 3b 20 20  3 ) a[0] = 33;  
1cb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb40 61 73 73 65 72 74 28 20 33 33 3d 3d 73 71 6c 69  assert( 33==sqli
1cb50 74 65 33 4c 6f 67 45 73 74 28 31 30 29 20 29 3b  te3LogEst(10) );
1cb60 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 20  ..  /* Estimate 
1cb70 74 68 61 74 20 61 5b 31 5d 20 69 73 20 31 30 2c  that a[1] is 10,
1cb80 20 61 5b 32 5d 20 69 73 20 39 2c 20 61 5b 33 5d   a[2] is 9, a[3]
1cb90 20 69 73 20 38 2c 20 61 5b 34 5d 20 69 73 20 37   is 8, a[4] is 7
1cba0 2c 20 61 5b 35 5d 20 69 73 0a 20 20 2a 2a 20 36  , a[5] is.  ** 6
1cbb0 20 61 6e 64 20 65 61 63 68 20 73 75 62 73 65 71   and each subseq
1cbc0 75 65 6e 74 20 76 61 6c 75 65 20 28 69 66 20 61  uent value (if a
1cbd0 6e 79 29 20 69 73 20 35 2e 20 20 2a 2f 0a 20 20  ny) is 5.  */.  
1cbe0 6d 65 6d 63 70 79 28 26 61 5b 31 5d 2c 20 61 56  memcpy(&a[1], aV
1cbf0 61 6c 2c 20 6e 43 6f 70 79 2a 73 69 7a 65 6f 66  al, nCopy*sizeof
1cc00 28 4c 6f 67 45 73 74 29 29 3b 0a 20 20 66 6f 72  (LogEst));.  for
1cc10 28 69 3d 6e 43 6f 70 79 2b 31 3b 20 69 3c 3d 70  (i=nCopy+1; i<=p
1cc20 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b  Idx->nKeyCol; i+
1cc30 2b 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 32  +){.    a[i] = 2
1cc40 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3;              
1cc50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 32 33        assert( 23
1cc60 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
1cc70 35 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  5) );.  }..  ass
1cc80 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c  ert( 0==sqlite3L
1cc90 6f 67 45 73 74 28 31 29 20 29 3b 0a 20 20 69 66  ogEst(1) );.  if
1cca0 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28  ( IsUniqueIndex(
1ccb0 70 49 64 78 29 20 29 20 61 5b 70 49 64 78 2d 3e  pIdx) ) a[pIdx->
1ccc0 6e 4b 65 79 43 6f 6c 5d 20 3d 20 30 3b 0a 7d 0a  nKeyCol] = 0;.}.
1ccd0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1cce0 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e  ine will drop an
1ccf0 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20   existing named 
1cd00 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75  index.  This rou
1cd10 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tine.** implemen
1cd20 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45  ts the DROP INDE
1cd30 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  X statement..*/.
1cd40 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70  void sqlite3Drop
1cd50 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
1cd60 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e  rse, SrcList *pN
1cd70 61 6d 65 2c 20 69 6e 74 20 69 66 45 78 69 73 74  ame, int ifExist
1cd80 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  s){.  Index *pIn
1cd90 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  dex;.  Vdbe *v;.
1cda0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1cdb0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
1cdc0 74 20 69 44 62 3b 0a 0a 20 20 61 73 73 65 72 74  t iDb;..  assert
1cdd0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
1cde0 30 20 29 3b 20 20 20 2f 2a 20 4e 65 76 65 72 20  0 );   /* Never 
1cdf0 63 61 6c 6c 65 64 20 77 69 74 68 20 70 72 69 6f  called with prio
1ce00 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 66  r errors */.  if
1ce10 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1ce20 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  ed ){.    goto e
1ce30 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
1ce40 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e    }.  assert( pN
1ce50 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ame->nSrc==1 );.
1ce60 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
1ce70 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
1ce80 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
1ce90 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
1cea0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49  _index;.  }.  pI
1ceb0 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69  ndex = sqlite3Fi
1cec0 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d  ndIndex(db, pNam
1ced0 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70  e->a[0].zName, p
1cee0 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
1cef0 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e  base);.  if( pIn
1cf00 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  dex==0 ){.    if
1cf10 28 20 21 69 66 45 78 69 73 74 73 20 29 7b 0a 20  ( !ifExists ){. 
1cf20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1cf30 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
1cf40 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22   such index: %S"
1cf50 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  , pName, 0);.   
1cf60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
1cf70 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e  lite3CodeVerifyN
1cf80 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61 72 73  amedSchema(pPars
1cf90 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
1cfa0 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 7d  Database);.    }
1cfb0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65  .    pParse->che
1cfc0 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
1cfd0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
1cfe0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66  _index;.  }.  if
1cff0 28 20 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70  ( pIndex->idxTyp
1d000 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50  e!=SQLITE_IDXTYP
1d010 45 5f 41 50 50 44 45 46 20 29 7b 0a 20 20 20 20  E_APPDEF ){.    
1d020 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1d030 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61  pParse, "index a
1d040 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55  ssociated with U
1d050 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f  NIQUE ".      "o
1d060 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  r PRIMARY KEY co
1d070 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20  nstraint cannot 
1d080 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b  be dropped", 0);
1d090 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
1d0a0 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
1d0b0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
1d0c0 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
1d0d0 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29  pIndex->pSchema)
1d0e0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1d0f0 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
1d100 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ION.  {.    int 
1d110 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
1d120 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61  OP_INDEX;.    Ta
1d130 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64  ble *pTab = pInd
1d140 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20  ex->pTable;.    
1d150 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
1d160 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
1d170 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e  DbSName;.    con
1d180 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  st char *zTab = 
1d190 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
1d1a0 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
1d1b0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1d1c0 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
1d1d0 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29  E, zTab, 0, zDb)
1d1e0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
1d1f0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
1d200 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f      }.    if( !O
1d210 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
1d220 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54  b ) code = SQLIT
1d230 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45  E_DROP_TEMP_INDE
1d240 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  X;.    if( sqlit
1d250 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1d260 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78  se, code, pIndex
1d270 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  ->zName, pTab->z
1d280 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Name, zDb) ){.  
1d290 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
1d2a0 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
1d2b0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1d2c0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1d2d0 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64  o remove the ind
1d2e0 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20  ex and from the 
1d2f0 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  master table */.
1d300 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
1d310 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
1d320 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
1d330 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
1d340 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
1d350 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  1, iDb);.    sql
1d360 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
1d370 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22  pParse,.       "
1d380 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
1d390 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 20  s WHERE name=%Q 
1d3a0 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27  AND type='index'
1d3b0 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44  ",.       db->aD
1d3c0 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c  b[iDb].zDbSName,
1d3d0 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 70 49   MASTER_NAME, pI
1d3e0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  ndex->zName.    
1d3f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6c  );.    sqlite3Cl
1d400 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 70 50  earStatTables(pP
1d410 61 72 73 65 2c 20 69 44 62 2c 20 22 69 64 78 22  arse, iDb, "idx"
1d420 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29  , pIndex->zName)
1d430 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61  ;.    sqlite3Cha
1d440 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
1d450 2c 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73 74  , iDb);.    dest
1d460 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
1d470 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  se, pIndex->tnum
1d480 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
1d490 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1d4a0 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69   OP_DropIndex, i
1d4b0 44 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65 78  Db, 0, 0, pIndex
1d4c0 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d  ->zName, 0);.  }
1d4d0 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  ..exit_drop_inde
1d4e0 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  x:.  sqlite3SrcL
1d4f0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e  istDelete(db, pN
1d500 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  ame);.}../*.** p
1d510 41 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74  Array is a point
1d520 65 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f  er to an array o
1d530 66 20 6f 62 6a 65 63 74 73 2e 20 45 61 63 68 20  f objects. Each 
1d540 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a  object in the.**
1d550 20 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74 72   array is szEntr
1d560 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  y bytes in size.
1d570 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73   This routine us
1d580 65 73 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c  es sqlite3DbReal
1d590 6c 6f 63 28 29 0a 2a 2a 20 74 6f 20 65 78 74 65  loc().** to exte
1d5a0 6e 64 20 74 68 65 20 61 72 72 61 79 20 73 6f 20  nd the array so 
1d5b0 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73 70  that there is sp
1d5c0 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20 6f 62  ace for a new ob
1d5d0 6a 65 63 74 20 61 74 20 74 68 65 20 65 6e 64 2e  ject at the end.
1d5e0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
1d5f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1d600 6c 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 63 6f  led, *pnEntry co
1d610 6e 74 61 69 6e 73 20 74 68 65 20 63 75 72 72 65  ntains the curre
1d620 6e 74 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68  nt size of.** th
1d630 65 20 61 72 72 61 79 20 28 69 6e 20 65 6e 74 72  e array (in entr
1d640 69 65 73 20 2d 20 73 6f 20 74 68 65 20 61 6c 6c  ies - so the all
1d650 6f 63 61 74 69 6f 6e 20 69 73 20 28 28 2a 70 6e  ocation is ((*pn
1d660 45 6e 74 72 79 29 20 2a 20 73 7a 45 6e 74 72 79  Entry) * szEntry
1d670 29 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20 74 6f  ) bytes.** in to
1d680 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tal)..**.** If t
1d690 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 69 73 20  he realloc() is 
1d6a0 73 75 63 63 65 73 73 66 75 6c 20 28 69 2e 65 2e  successful (i.e.
1d6b0 20 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f 6e 64 69   if no OOM condi
1d6c0 74 69 6f 6e 20 6f 63 63 75 72 73 29 2c 20 74 68  tion occurs), th
1d6d0 65 0a 2a 2a 20 73 70 61 63 65 20 61 6c 6c 6f 63  e.** space alloc
1d6e0 61 74 65 64 20 66 6f 72 20 74 68 65 20 6e 65 77  ated for the new
1d6f0 20 6f 62 6a 65 63 74 20 69 73 20 7a 65 72 6f 65   object is zeroe
1d700 64 2c 20 2a 70 6e 45 6e 74 72 79 20 75 70 64 61  d, *pnEntry upda
1d710 74 65 64 20 74 6f 0a 2a 2a 20 72 65 66 6c 65 63  ted to.** reflec
1d720 74 20 74 68 65 20 6e 65 77 20 73 69 7a 65 20 6f  t the new size o
1d730 66 20 74 68 65 20 61 72 72 61 79 20 61 6e 64 20  f the array and 
1d740 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1d750 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a   new allocation.
1d760 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 2a 70 49  ** returned. *pI
1d770 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  dx is set to the
1d780 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 65   index of the ne
1d790 77 20 61 72 72 61 79 20 65 6e 74 72 79 20 69 6e  w array entry in
1d7a0 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
1d7b0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
1d7c0 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 66 61  the realloc() fa
1d7d0 69 6c 73 2c 20 2a 70 49 64 78 20 69 73 20 73 65  ils, *pIdx is se
1d7e0 74 20 74 6f 20 2d 31 2c 20 2a 70 6e 45 6e 74 72  t to -1, *pnEntr
1d7f0 79 20 72 65 6d 61 69 6e 73 0a 2a 2a 20 75 6e 63  y remains.** unc
1d800 68 61 6e 67 65 64 20 61 6e 64 20 61 20 63 6f 70  hanged and a cop
1d810 79 20 6f 66 20 70 41 72 72 61 79 20 72 65 74 75  y of pArray retu
1d820 72 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  rned..*/.void *s
1d830 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
1d840 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ate(.  sqlite3 *
1d850 64 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  db,      /* Conn
1d860 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79  ection to notify
1d870 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75   of malloc failu
1d880 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  res */.  void *p
1d890 41 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72  Array,     /* Ar
1d8a0 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20  ray of objects. 
1d8b0 20 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f   Might be reallo
1d8c0 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73  cated */.  int s
1d8d0 7a 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20  zEntry,      /* 
1d8e0 53 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a  Size of each obj
1d8f0 65 63 74 20 69 6e 20 74 68 65 20 61 72 72 61 79  ect in the array
1d900 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e 74   */.  int *pnEnt
1d910 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ry,     /* Numbe
1d920 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 63 75 72  r of objects cur
1d930 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a 2f  rently in use */
1d940 0a 20 20 69 6e 74 20 2a 70 49 64 78 20 20 20 20  .  int *pIdx    
1d950 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
1d960 65 20 69 6e 64 65 78 20 6f 66 20 61 20 6e 65 77  e index of a new
1d970 20 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b   slot here */.){
1d980 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e  .  char *z;.  in
1d990 74 20 6e 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a  t n = *pnEntry;.
1d9a0 20 20 69 66 28 20 28 6e 20 26 20 28 6e 2d 31 29    if( (n & (n-1)
1d9b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )==0 ){.    int 
1d9c0 73 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f 20 31 20  sz = (n==0) ? 1 
1d9d0 3a 20 32 2a 6e 3b 0a 20 20 20 20 76 6f 69 64 20  : 2*n;.    void 
1d9e0 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44  *pNew = sqlite3D
1d9f0 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72  bRealloc(db, pAr
1da00 72 61 79 2c 20 73 7a 2a 73 7a 45 6e 74 72 79 29  ray, sz*szEntry)
1da10 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
1da20 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 49 64 78  0 ){.      *pIdx
1da30 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74   = -1;.      ret
1da40 75 72 6e 20 70 41 72 72 61 79 3b 0a 20 20 20 20  urn pArray;.    
1da50 7d 0a 20 20 20 20 70 41 72 72 61 79 20 3d 20 70  }.    pArray = p
1da60 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28  New;.  }.  z = (
1da70 63 68 61 72 2a 29 70 41 72 72 61 79 3b 0a 20 20  char*)pArray;.  
1da80 6d 65 6d 73 65 74 28 26 7a 5b 6e 20 2a 20 73 7a  memset(&z[n * sz
1da90 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74  Entry], 0, szEnt
1daa0 72 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 6e  ry);.  *pIdx = n
1dab0 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a  ;.  ++*pnEntry;.
1dac0 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b    return pArray;
1dad0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
1dae0 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
1daf0 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69  o the given IdLi
1db00 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
1db10 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e  w IdList if.** n
1db20 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  eed be..**.** A 
1db30 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65  new IdList is re
1db40 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  turned, or NULL 
1db50 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  if malloc() fail
1db60 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71  s..*/.IdList *sq
1db70 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e  lite3IdListAppen
1db80 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  d(sqlite3 *db, I
1db90 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  dList *pList, To
1dba0 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
1dbb0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
1dbc0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
1dbd0 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
1dbe0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
1dbf0 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20  eof(IdList) );. 
1dc00 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
1dc10 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
1dc20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c    pList->a = sql
1dc30 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
1dc40 65 28 0a 20 20 20 20 20 20 64 62 2c 0a 20 20 20  e(.      db,.   
1dc50 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20     pList->a,.   
1dc60 20 20 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d     sizeof(pList-
1dc70 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20 26 70  >a[0]),.      &p
1dc80 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20 20  List->nId,.     
1dc90 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28 20 69   &i.  );.  if( i
1dca0 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
1dcb0 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
1dcc0 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65  , pList);.    re
1dcd0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c  turn 0;.  }.  pL
1dce0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
1dcf0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1dd00 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65  mToken(db, pToke
1dd10 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69  n);.  return pLi
1dd20 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  st;.}../*.** Del
1dd30 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a  ete an IdList..*
1dd40 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64  /.void sqlite3Id
1dd50 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74  ListDelete(sqlit
1dd60 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a  e3 *db, IdList *
1dd70 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
1dd80 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1dd90 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
1dda0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
1ddb0 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  d; i++){.    sql
1ddc0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1ddd0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
1dde0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1ddf0 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
1de00 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ->a);.  sqlite3D
1de10 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69 73  bFreeNN(db, pLis
1de20 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
1de30 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e  urn the index in
1de40 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64   pList of the id
1de50 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a  entifier named z
1de60 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a  Id.  Return -1.*
1de70 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  * if not found..
1de80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64  */.int sqlite3Id
1de90 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74  ListIndex(IdList
1dea0 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63   *pList, const c
1deb0 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
1dec0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
1ded0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31  t==0 ) return -1
1dee0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1def0 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
1df00 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1df10 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61  StrICmp(pList->a
1df20 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  [i].zName, zName
1df30 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b  )==0 ) return i;
1df40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
1df50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e  ;.}../*.** Expan
1df60 64 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f  d the space allo
1df70 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 67 69  cated for the gi
1df80 76 65 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a 65  ven SrcList obje
1df90 63 74 20 62 79 0a 2a 2a 20 63 72 65 61 74 69 6e  ct by.** creatin
1dfa0 67 20 6e 45 78 74 72 61 20 6e 65 77 20 73 6c 6f  g nExtra new slo
1dfb0 74 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  ts beginning at 
1dfc0 69 53 74 61 72 74 2e 20 20 69 53 74 61 72 74 20  iStart.  iStart 
1dfd0 69 73 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a 2a  is zero based..*
1dfe0 2a 20 4e 65 77 20 73 6c 6f 74 73 20 61 72 65 20  * New slots are 
1dff0 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  zeroed..**.** Fo
1e000 72 20 65 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f  r example, suppo
1e010 73 65 20 61 20 53 72 63 4c 69 73 74 20 69 6e 69  se a SrcList ini
1e020 74 69 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20  tially contains 
1e030 74 77 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c 42  two entries: A,B
1e040 2e 0a 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20 33  ..** To append 3
1e050 20 6e 65 77 20 65 6e 74 72 69 65 73 20 6f 6e 74   new entries ont
1e060 6f 20 74 68 65 20 65 6e 64 2c 20 64 6f 20 74 68  o the end, do th
1e070 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c  is:.**.**    sql
1e080 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72  ite3SrcListEnlar
1e090 67 65 28 64 62 2c 20 70 53 72 63 6c 69 73 74 2c  ge(db, pSrclist,
1e0a0 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66   3, 2);.**.** Af
1e0b0 74 65 72 20 74 68 65 20 63 61 6c 6c 20 61 62 6f  ter the call abo
1e0c0 76 65 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e 74  ve it would cont
1e0d0 61 69 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c 2c  ain:  A, B, nil,
1e0e0 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66   nil, nil..** If
1e0f0 20 74 68 65 20 69 53 74 61 72 74 20 61 72 67 75   the iStart argu
1e100 6d 65 6e 74 20 68 61 64 20 62 65 65 6e 20 31 20  ment had been 1 
1e110 69 6e 73 74 65 61 64 20 6f 66 20 32 2c 20 74 68  instead of 2, th
1e120 65 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  en the result.**
1e130 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   would have been
1e140 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20  :  A, nil, nil, 
1e150 6e 69 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65 70  nil, B.  To prep
1e160 65 6e 64 20 74 68 65 20 6e 65 77 20 73 6c 6f 74  end the new slot
1e170 73 2c 0a 2a 2a 20 74 68 65 20 69 53 74 61 72 74  s,.** the iStart
1e180 20 76 61 6c 75 65 20 77 6f 75 6c 64 20 62 65 20   value would be 
1e190 30 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 74  0.  The result t
1e1a0 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a  hen would.** be:
1e1b0 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20   nil, nil, nil, 
1e1c0 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  A, B..**.** If a
1e1d0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
1e1e0 6f 6e 20 66 61 69 6c 73 20 74 68 65 20 53 72 63  on fails the Src
1e1f0 4c 69 73 74 20 69 73 20 75 6e 63 68 61 6e 67 65  List is unchange
1e200 64 2e 20 20 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d  d.  The.** db->m
1e210 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
1e220 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
1e230 74 72 75 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74  true..*/.SrcList
1e240 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
1e250 45 6e 6c 61 72 67 65 28 0a 20 20 73 71 6c 69 74  Enlarge(.  sqlit
1e260 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 2f 2a  e3 *db,       /*
1e270 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
1e280 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f  tion to notify o
1e290 66 20 4f 4f 4d 20 65 72 72 6f 72 73 20 2a 2f 0a  f OOM errors */.
1e2a0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
1e2b0 20 20 20 20 20 2f 2a 20 54 68 65 20 53 72 63 4c       /* The SrcL
1e2c0 69 73 74 20 74 6f 20 62 65 20 65 6e 6c 61 72 67  ist to be enlarg
1e2d0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  ed */.  int nExt
1e2e0 72 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ra,        /* Nu
1e2f0 6d 62 65 72 20 6f 66 20 6e 65 77 20 73 6c 6f 74  mber of new slot
1e300 73 20 74 6f 20 61 64 64 20 74 6f 20 70 53 72 63  s to add to pSrc
1e310 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  ->a[] */.  int i
1e320 53 74 61 72 74 20 20 20 20 20 20 20 20 20 2f 2a  Start         /*
1e330 20 49 6e 64 65 78 20 69 6e 20 70 53 72 63 2d 3e   Index in pSrc->
1e340 61 5b 5d 20 6f 66 20 66 69 72 73 74 20 6e 65 77  a[] of first new
1e350 20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e   slot */.){.  in
1e360 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74  t i;..  /* Sanit
1e370 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 63 61  y checking on ca
1e380 6c 6c 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73  lling parameters
1e390 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53   */.  assert( iS
1e3a0 74 61 72 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73  tart>=0 );.  ass
1e3b0 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 31 20 29  ert( nExtra>=1 )
1e3c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
1e3d0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1e3e0 20 69 53 74 61 72 74 3c 3d 70 53 72 63 2d 3e 6e   iStart<=pSrc->n
1e3f0 53 72 63 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  Src );..  /* All
1e400 6f 63 61 74 65 20 61 64 64 69 74 69 6f 6e 61 6c  ocate additional
1e410 20 73 70 61 63 65 20 69 66 20 6e 65 65 64 65 64   space if needed
1e420 20 2a 2f 0a 20 20 69 66 28 20 28 75 33 32 29 70   */.  if( (u32)p
1e430 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61  Src->nSrc+nExtra
1e440 3e 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 29 7b  >pSrc->nAlloc ){
1e450 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  .    SrcList *pN
1e460 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c  ew;.    int nAll
1e470 6f 63 20 3d 20 70 53 72 63 2d 3e 6e 53 72 63 2a  oc = pSrc->nSrc*
1e480 32 2b 6e 45 78 74 72 61 3b 0a 20 20 20 20 69 6e  2+nExtra;.    in
1e490 74 20 6e 47 6f 74 3b 0a 20 20 20 20 70 4e 65 77  t nGot;.    pNew
1e4a0 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
1e4b0 6c 6f 63 28 64 62 2c 20 70 53 72 63 2c 0a 20 20  loc(db, pSrc,.  
1e4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
1e4d0 65 6f 66 28 2a 70 53 72 63 29 20 2b 20 28 6e 41  eof(*pSrc) + (nA
1e4e0 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70  lloc-1)*sizeof(p
1e4f0 53 72 63 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  Src->a[0]) );.  
1e500 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
1e510 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64  .      assert( d
1e520 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1e530 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e540 70 53 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pSrc;.    }.    
1e550 70 53 72 63 20 3d 20 70 4e 65 77 3b 0a 20 20 20  pSrc = pNew;.   
1e560 20 6e 47 6f 74 20 3d 20 28 73 71 6c 69 74 65 33   nGot = (sqlite3
1e570 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c  DbMallocSize(db,
1e580 20 70 4e 65 77 29 20 2d 20 73 69 7a 65 6f 66 28   pNew) - sizeof(
1e590 2a 70 53 72 63 29 29 2f 73 69 7a 65 6f 66 28 70  *pSrc))/sizeof(p
1e5a0 53 72 63 2d 3e 61 5b 30 5d 29 2b 31 3b 0a 20 20  Src->a[0])+1;.  
1e5b0 20 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 3d    pSrc->nAlloc =
1e5c0 20 6e 47 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   nGot;.  }..  /*
1e5d0 20 4d 6f 76 65 20 65 78 69 73 74 69 6e 67 20 73   Move existing s
1e5e0 6c 6f 74 73 20 74 68 61 74 20 63 6f 6d 65 20 61  lots that come a
1e5f0 66 74 65 72 20 74 68 65 20 6e 65 77 6c 79 20 69  fter the newly i
1e600 6e 73 65 72 74 65 64 20 73 6c 6f 74 73 0a 20 20  nserted slots.  
1e610 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20 77 61  ** out of the wa
1e620 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 53 72  y */.  for(i=pSr
1e630 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 69 53  c->nSrc-1; i>=iS
1e640 74 61 72 74 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  tart; i--){.    
1e650 70 53 72 63 2d 3e 61 5b 69 2b 6e 45 78 74 72 61  pSrc->a[i+nExtra
1e660 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a  ] = pSrc->a[i];.
1e670 20 20 7d 0a 20 20 70 53 72 63 2d 3e 6e 53 72 63    }.  pSrc->nSrc
1e680 20 2b 3d 20 6e 45 78 74 72 61 3b 0a 0a 20 20 2f   += nExtra;..  /
1e690 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c 79  * Zero the newly
1e6a0 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73   allocated slots
1e6b0 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 53   */.  memset(&pS
1e6c0 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30  rc->a[iStart], 0
1e6d0 2c 20 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61  , sizeof(pSrc->a
1e6e0 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20  [0])*nExtra);.  
1e6f0 66 6f 72 28 69 3d 69 53 74 61 72 74 3b 20 69 3c  for(i=iStart; i<
1e700 69 53 74 61 72 74 2b 6e 45 78 74 72 61 3b 20 69  iStart+nExtra; i
1e710 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61  ++){.    pSrc->a
1e720 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31  [i].iCursor = -1
1e730 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75  ;.  }..  /* Retu
1e740 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1e750 74 68 65 20 65 6e 6c 61 72 67 65 64 20 53 72 63  the enlarged Src
1e760 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e  List */.  return
1e770 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   pSrc;.}.../*.**
1e780 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61   Append a new ta
1e790 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20  ble name to the 
1e7a0 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20  given SrcList.  
1e7b0 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 72 63  Create a new Src
1e7c0 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
1e7d0 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79  be.  A new entry
1e7e0 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 74   is created in t
1e7f0 68 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20  he SrcList even 
1e800 69 66 20 70 54 61 62 6c 65 20 69 73 20 4e 55 4c  if pTable is NUL
1e810 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69  L..**.** A SrcLi
1e820 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  st is returned, 
1e830 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65  or NULL if there
1e840 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   is an OOM error
1e850 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 0a  .  The returned.
1e860 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74  ** SrcList might
1e870 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
1e880 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74  the SrcList that
1e890 20 77 61 73 20 69 6e 70 75 74 20 6f 72 20 69 74   was input or it
1e8a0 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e   might be.** a n
1e8b0 65 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f  ew one.  If an O
1e8c0 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  OM error does oc
1e8d0 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 70  curs, then the p
1e8e0 72 69 6f 72 20 76 61 6c 75 65 20 6f 66 20 70 4c  rior value of pL
1e8f0 69 73 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 69  ist.** that is i
1e900 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75  nput to this rou
1e910 74 69 6e 65 20 69 73 20 61 75 74 6f 6d 61 74 69  tine is automati
1e920 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a  cally freed..**.
1e930 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20  ** If pDatabase 
1e940 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20  is not null, it 
1e950 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74  means that the t
1e960 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69  able has an opti
1e970 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65  onal.** database
1e980 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c   name prefix.  L
1e990 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61  ike this:  "data
1e9a0 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68  base.table".  Th
1e9b0 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70  e pDatabase.** p
1e9c0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62  oints to the tab
1e9d0 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
1e9e0 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f  pTable points to
1e9f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
1ea00 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69  me..** The SrcLi
1ea10 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65  st.a[].zName fie
1ea20 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  ld is filled wit
1ea30 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  h the table name
1ea40 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20   which might.** 
1ea50 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65  come from pTable
1ea60 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69   (if pDatabase i
1ea70 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20  s NULL) or from 
1ea80 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20  pDatabase.  .** 
1ea90 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74  SrcList.a[].zDat
1eaa0 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20  abase is filled 
1eab0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
1eac0 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62  e name from pTab
1ead0 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e  le,.** or with N
1eae0 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61  ULL if no databa
1eaf0 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e  se is specified.
1eb00 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  .**.** In other 
1eb10 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c  words, if call l
1eb20 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
1eb30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
1eb40 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41  rcListAppend(D,A
1eb50 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,0);.**.** The
1eb60 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e  n B is a table n
1eb70 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
1eb80 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73  base name is uns
1eb90 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61  pecified.  If ca
1eba0 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69  lled.** like thi
1ebb0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
1ebc0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1ebd0 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a  ppend(D,A,B,C);.
1ebe0 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20  **.** Then C is 
1ebf0 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  the table name a
1ec00 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61  nd B is the data
1ec10 62 61 73 65 20 6e 61 6d 65 2e 20 20 49 66 20 43  base name.  If C
1ec20 20 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74   is defined.** t
1ec30 68 65 6e 20 73 6f 20 69 73 20 42 2e 20 20 49 6e  hen so is B.  In
1ec40 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 65   other words, we
1ec50 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 63 61   never have a ca
1ec60 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a 20  se where:.**.** 
1ec70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
1ec80 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41  rcListAppend(D,A
1ec90 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74  ,0,C);.**.** Bot
1eca0 68 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61  h pTable and pDa
1ecb0 74 61 62 61 73 65 20 61 72 65 20 61 73 73 75 6d  tabase are assum
1ecc0 65 64 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e  ed to be quoted.
1ecd0 20 20 54 68 65 79 20 61 72 65 20 64 65 71 75 6f    They are dequo
1ece0 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62 65  ted.** before be
1ecf0 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68 65  ing added to the
1ed00 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72 63   SrcList..*/.Src
1ed10 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
1ed20 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 73 71  ListAppend(.  sq
1ed30 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1ed40 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
1ed50 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c  to notify of mal
1ed60 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a  loc failures */.
1ed70 20 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74    SrcList *pList
1ed80 2c 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20  ,     /* Append 
1ed90 74 6f 20 74 68 69 73 20 53 72 63 4c 69 73 74 2e  to this SrcList.
1eda0 20 4e 55 4c 4c 20 63 72 65 61 74 65 73 20 61 20   NULL creates a 
1edb0 6e 65 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20  new SrcList */. 
1edc0 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20   Token *pTable, 
1edd0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
1ede0 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b   append */.  Tok
1edf0 65 6e 20 2a 70 44 61 74 61 62 61 73 65 20 20 20  en *pDatabase   
1ee00 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 66 20   /* Database of 
1ee10 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  the table */.){.
1ee20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1ee30 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1ee40 61 73 73 65 72 74 28 20 70 44 61 74 61 62 61 73  assert( pDatabas
1ee50 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65 21 3d  e==0 || pTable!=
1ee60 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20  0 );  /* Cannot 
1ee70 68 61 76 65 20 43 20 77 69 74 68 6f 75 74 20 42  have C without B
1ee80 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62   */.  assert( db
1ee90 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69  !=0 );.  if( pLi
1eea0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
1eeb0 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
1eec0 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
1eed0 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b  zeof(SrcList) );
1eee0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
1eef0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1ef00 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20    pList->nAlloc 
1ef10 3d 20 31 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  = 1;.    pList->
1ef20 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 6d 65  nSrc = 1;.    me
1ef30 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 30  mset(&pList->a[0
1ef40 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69  ], 0, sizeof(pLi
1ef50 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20  st->a[0]));.    
1ef60 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72  pList->a[0].iCur
1ef70 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73  sor = -1;.  }els
1ef80 65 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  e{.    pList = s
1ef90 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
1efa0 61 72 67 65 28 64 62 2c 20 70 4c 69 73 74 2c 20  arge(db, pList, 
1efb0 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b  1, pList->nSrc);
1efc0 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d  .  }.  if( db->m
1efd0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
1efe0 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
1eff0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
1f000 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  t);.    return 0
1f010 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20  ;.  }.  pItem = 
1f020 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
1f030 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20  >nSrc-1];.  if( 
1f040 70 44 61 74 61 62 61 73 65 20 26 26 20 70 44 61  pDatabase && pDa
1f050 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a  tabase->z==0 ){.
1f060 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20      pDatabase = 
1f070 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61  0;.  }.  if( pDa
1f080 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20 54 6f  tabase ){.    To
1f090 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61  ken *pTemp = pDa
1f0a0 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74  tabase;.    pDat
1f0b0 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a  abase = pTable;.
1f0c0 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65      pTable = pTe
1f0d0 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d  mp;.  }.  pItem-
1f0e0 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
1f0f0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
1f100 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 70 49 74  , pTable);.  pIt
1f110 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
1f120 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1f130 6f 6b 65 6e 28 64 62 2c 20 70 44 61 74 61 62 61  oken(db, pDataba
1f140 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  se);.  return pL
1f150 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  ist;.}../*.** As
1f160 73 69 67 6e 20 56 64 62 65 43 75 72 73 6f 72 20  sign VdbeCursor 
1f170 69 6e 64 65 78 20 6e 75 6d 62 65 72 73 20 74 6f  index numbers to
1f180 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61   all tables in a
1f190 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64   SrcList.*/.void
1f1a0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1f1b0 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72  ssignCursors(Par
1f1c0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
1f1d0 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
1f1e0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53  nt i;.  struct S
1f1f0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1f200 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69  em;.  assert(pLi
1f210 73 74 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  st || pParse->db
1f220 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1f230 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
1f240 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  .    for(i=0, pI
1f250 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c  tem=pList->a; i<
1f260 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  pList->nSrc; i++
1f270 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1f280 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75    if( pItem->iCu
1f290 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b  rsor>=0 ) break;
1f2a0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43  .      pItem->iC
1f2b0 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
1f2c0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66  nTab++;.      if
1f2d0 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
1f2e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1f2f0 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
1f300 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
1f310 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e  pItem->pSelect->
1f320 70 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pSrc);.      }. 
1f330 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1f340 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
1f350 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75  re SrcList inclu
1f360 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62  ding all its sub
1f370 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f  structure..*/.vo
1f380 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
1f390 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
1f3a0 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c  *db, SrcList *pL
1f3b0 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
1f3c0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1f3d0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
1f3e0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
1f3f0 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65  turn;.  for(pIte
1f400 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
1f410 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20   i<pList->nSrc; 
1f420 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
1f430 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1f440 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74  (db, pItem->zDat
1f450 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69  abase);.    sqli
1f460 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
1f470 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
1f480 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1f490 62 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  b, pItem->zAlias
1f4a0 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  );.    if( pItem
1f4b0 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79  ->fg.isIndexedBy
1f4c0 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
1f4d0 28 64 62 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 7a  (db, pItem->u1.z
1f4e0 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20  IndexedBy);.    
1f4f0 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  if( pItem->fg.is
1f500 54 61 62 46 75 6e 63 20 29 20 73 71 6c 69 74 65  TabFunc ) sqlite
1f510 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
1f520 64 62 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46  db, pItem->u1.pF
1f530 75 6e 63 41 72 67 29 3b 0a 20 20 20 20 73 71 6c  uncArg);.    sql
1f540 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
1f550 64 62 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29  db, pItem->pTab)
1f560 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
1f570 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49  ectDelete(db, pI
1f580 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  tem->pSelect);. 
1f590 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
1f5a0 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
1f5b0 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pOn);.    sqlite
1f5c0 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
1f5d0 2c 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29  , pItem->pUsing)
1f5e0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
1f5f0 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69 73  bFreeNN(db, pLis
1f600 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  t);.}../*.** Thi
1f610 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1f620 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
1f630 72 20 74 6f 20 61 64 64 20 61 20 6e 65 77 20 74  r to add a new t
1f640 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e  erm to the.** en
1f650 64 20 6f 66 20 61 20 67 72 6f 77 69 6e 67 20 46  d of a growing F
1f660 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ROM clause.  The
1f670 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
1f680 73 20 74 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a  s the part of.**
1f690 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1f6a0 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
1f6b0 79 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74  y been construct
1f6c0 65 64 2e 20 20 22 70 22 20 69 73 20 4e 55 4c 4c  ed.  "p" is NULL
1f6d0 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 74  .** if this is t
1f6e0 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66  he first term of
1f6f0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1f700 2e 20 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44  .  pTable and pD
1f710 61 74 61 62 61 73 65 0a 2a 2a 20 61 72 65 20 74  atabase.** are t
1f720 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
1f730 61 62 6c 65 20 61 6e 64 20 64 61 74 61 62 61 73  able and databas
1f740 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
1f750 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ROM clause term.
1f760 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 69 73  .** pDatabase is
1f770 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 64 61 74   NULL if the dat
1f780 61 62 61 73 65 20 6e 61 6d 65 20 71 75 61 6c 69  abase name quali
1f790 66 69 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20  fier is missing 
1f7a0 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63  - the.** usual c
1f7b0 61 73 65 2e 20 20 49 66 20 74 68 65 20 74 65 72  ase.  If the ter
1f7c0 6d 20 68 61 73 20 61 6e 20 61 6c 69 61 73 2c 20  m has an alias, 
1f7d0 74 68 65 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e  then pAlias poin
1f7e0 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69  ts to the.** ali
1f7f0 61 73 20 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68  as token.  If th
1f800 65 20 74 65 72 6d 20 69 73 20 61 20 73 75 62 71  e term is a subq
1f810 75 65 72 79 2c 20 74 68 65 6e 20 70 53 75 62 71  uery, then pSubq
1f820 75 65 72 79 20 69 73 20 74 68 65 0a 2a 2a 20 53  uery is the.** S
1f830 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1f840 74 68 61 74 20 74 68 65 20 73 75 62 71 75 65 72  that the subquer
1f850 79 20 65 6e 63 6f 64 65 73 2e 20 20 54 68 65 20  y encodes.  The 
1f860 70 54 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44  pTable and.** pD
1f870 61 74 61 62 61 73 65 20 70 61 72 61 6d 65 74 65  atabase paramete
1f880 72 73 20 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20  rs are NULL for 
1f890 73 75 62 71 75 65 72 69 65 73 2e 20 20 54 68 65  subqueries.  The
1f8a0 20 70 4f 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a   pOn and pUsing.
1f8b0 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  ** parameters ar
1f8c0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
1f8d0 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e   the ON and USIN
1f8e0 47 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  G clauses..**.**
1f8f0 20 52 65 74 75 72 6e 20 61 20 6e 65 77 20 53 72   Return a new Sr
1f900 63 4c 69 73 74 20 77 68 69 63 68 20 65 6e 63 6f  cList which enco
1f910 64 65 73 20 69 73 20 74 68 65 20 46 52 4f 4d 20  des is the FROM 
1f920 77 69 74 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20  with the new.** 
1f930 74 65 72 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53  term added..*/.S
1f940 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
1f950 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d  rcListAppendFrom
1f960 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Term(.  Parse *p
1f970 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
1f980 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
1f990 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
1f9a0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1f9b0 2f 2a 20 54 68 65 20 6c 65 66 74 20 70 61 72 74  /* The left part
1f9c0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1f9d0 75 73 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e  use already seen
1f9e0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61   */.  Token *pTa
1f9f0 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
1fa00 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
1fa10 6c 65 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65  le to add to the
1fa20 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
1fa30 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61    Token *pDataba
1fa40 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  se,       /* Nam
1fa50 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1fa60 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61  e containing pTa
1fa70 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ble */.  Token *
1fa80 70 41 6c 69 61 73 2c 20 20 20 20 20 20 20 20 20  pAlias,         
1fa90 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61   /* The right-ha
1faa0 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 41  nd side of the A
1fab0 53 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  S subexpression 
1fac0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  */.  Select *pSu
1fad0 62 71 75 65 72 79 2c 20 20 20 20 20 20 2f 2a 20  bquery,      /* 
1fae0 41 20 73 75 62 71 75 65 72 79 20 75 73 65 64 20  A subquery used 
1faf0 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61  in place of a ta
1fb00 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78  ble name */.  Ex
1fb10 70 72 20 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20  pr *pOn,        
1fb20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20        /* The ON 
1fb30 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e  clause of a join
1fb40 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 55   */.  IdList *pU
1fb50 73 69 6e 67 20 20 20 20 20 20 20 20 20 20 2f 2a  sing          /*
1fb60 20 54 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   The USING claus
1fb70 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29  e of a join */.)
1fb80 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  {.  struct SrcLi
1fb90 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1fba0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1fbb0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
1fbc0 28 20 21 70 20 26 26 20 28 70 4f 6e 20 7c 7c 20  ( !p && (pOn || 
1fbd0 70 55 73 69 6e 67 29 20 29 7b 0a 20 20 20 20 73  pUsing) ){.    s
1fbe0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1fbf0 50 61 72 73 65 2c 20 22 61 20 4a 4f 49 4e 20 63  Parse, "a JOIN c
1fc00 6c 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65  lause is require
1fc10 64 20 62 65 66 6f 72 65 20 25 73 22 2c 20 0a 20  d before %s", . 
1fc20 20 20 20 20 20 28 70 4f 6e 20 3f 20 22 4f 4e 22       (pOn ? "ON"
1fc30 20 3a 20 22 55 53 49 4e 47 22 29 0a 20 20 20 20   : "USING").    
1fc40 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65  );.    goto appe
1fc50 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20  nd_from_error;. 
1fc60 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33   }.  p = sqlite3
1fc70 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62  SrcListAppend(db
1fc80 2c 20 70 2c 20 70 54 61 62 6c 65 2c 20 70 44 61  , p, pTable, pDa
1fc90 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  tabase);.  if( p
1fca0 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e  ==0 || NEVER(p->
1fcb0 6e 53 72 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nSrc==0) ){.    
1fcc0 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d  goto append_from
1fcd0 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 49  _error;.  }.  pI
1fce0 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e  tem = &p->a[p->n
1fcf0 53 72 63 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74  Src-1];.  assert
1fd00 28 20 70 41 6c 69 61 73 21 3d 30 20 29 3b 0a 20  ( pAlias!=0 );. 
1fd10 20 69 66 28 20 70 41 6c 69 61 73 2d 3e 6e 20 29   if( pAlias->n )
1fd20 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c  {.    pItem->zAl
1fd30 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ias = sqlite3Nam
1fd40 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
1fd50 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49  Alias);.  }.  pI
1fd60 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70  tem->pSelect = p
1fd70 53 75 62 71 75 65 72 79 3b 0a 20 20 70 49 74 65  Subquery;.  pIte
1fd80 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20  m->pOn = pOn;.  
1fd90 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20  pItem->pUsing = 
1fda0 70 55 73 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e  pUsing;.  return
1fdb0 20 70 3b 0a 0a 20 61 70 70 65 6e 64 5f 66 72 6f   p;.. append_fro
1fdc0 6d 5f 65 72 72 6f 72 3a 0a 20 20 61 73 73 65 72  m_error:.  asser
1fdd0 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 73 71 6c  t( p==0 );.  sql
1fde0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1fdf0 62 2c 20 70 4f 6e 29 3b 0a 20 20 73 71 6c 69 74  b, pOn);.  sqlit
1fe00 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
1fe10 62 2c 20 70 55 73 69 6e 67 29 3b 0a 20 20 73 71  b, pUsing);.  sq
1fe20 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
1fe30 65 28 64 62 2c 20 70 53 75 62 71 75 65 72 79 29  e(db, pSubquery)
1fe40 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
1fe50 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 49 4e  ./*.** Add an IN
1fe60 44 45 58 45 44 20 42 59 20 6f 72 20 4e 4f 54 20  DEXED BY or NOT 
1fe70 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 74  INDEXED clause t
1fe80 6f 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  o the most recen
1fe90 74 6c 79 20 61 64 64 65 64 20 0a 2a 2a 20 65 6c  tly added .** el
1fea0 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 73 6f 75  ement of the sou
1feb0 72 63 65 2d 6c 69 73 74 20 70 61 73 73 65 64 20  rce-list passed 
1fec0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
1fed0 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  gument..*/.void 
1fee0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e  sqlite3SrcListIn
1fef0 64 65 78 65 64 42 79 28 50 61 72 73 65 20 2a 70  dexedBy(Parse *p
1ff00 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
1ff10 70 2c 20 54 6f 6b 65 6e 20 2a 70 49 6e 64 65 78  p, Token *pIndex
1ff20 65 64 42 79 29 7b 0a 20 20 61 73 73 65 72 74 28  edBy){.  assert(
1ff30 20 70 49 6e 64 65 78 65 64 42 79 21 3d 30 20 29   pIndexedBy!=0 )
1ff40 3b 0a 20 20 69 66 28 20 70 20 26 26 20 41 4c 57  ;.  if( p && ALW
1ff50 41 59 53 28 70 2d 3e 6e 53 72 63 3e 30 29 20 29  AYS(p->nSrc>0) )
1ff60 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
1ff70 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1ff80 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63   = &p->a[p->nSrc
1ff90 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
1ffa0 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e   pItem->fg.notIn
1ffb0 64 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20  dexed==0 );.    
1ffc0 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66  assert( pItem->f
1ffd0 67 2e 69 73 49 6e 64 65 78 65 64 42 79 3d 3d 30  g.isIndexedBy==0
1ffe0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1fff0 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46  pItem->fg.isTabF
20000 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  unc==0 );.    if
20010 28 20 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3d  ( pIndexedBy->n=
20020 3d 31 20 26 26 20 21 70 49 6e 64 65 78 65 64 42  =1 && !pIndexedB
20030 79 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a  y->z ){.      /*
20040 20 41 20 22 4e 4f 54 20 49 4e 44 45 58 45 44 22   A "NOT INDEXED"
20050 20 63 6c 61 75 73 65 20 77 61 73 20 73 75 70 70   clause was supp
20060 6c 69 65 64 2e 20 53 65 65 20 70 61 72 73 65 2e  lied. See parse.
20070 79 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73  y .      ** cons
20080 74 72 75 63 74 20 22 69 6e 64 65 78 65 64 5f 6f  truct "indexed_o
20090 70 74 22 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  pt" for details.
200a0 20 2a 2f 0a 20 20 20 20 20 20 70 49 74 65 6d 2d   */.      pItem-
200b0 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20 3d  >fg.notIndexed =
200c0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
200d0 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 31 2e 7a       pItem->u1.z
200e0 49 6e 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69  IndexedBy = sqli
200f0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
20100 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e  (pParse->db, pIn
20110 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20 20 20  dexedBy);.      
20120 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65  pItem->fg.isInde
20130 78 65 64 42 79 20 3d 20 28 70 49 74 65 6d 2d 3e  xedBy = (pItem->
20140 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 21 3d 30  u1.zIndexedBy!=0
20150 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
20160 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 6c 69  /*.** Add the li
20170 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  st of function a
20180 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  rguments to the 
20190 53 72 63 4c 69 73 74 20 65 6e 74 72 79 20 66 6f  SrcList entry fo
201a0 72 20 61 0a 2a 2a 20 74 61 62 6c 65 2d 76 61 6c  r a.** table-val
201b0 75 65 64 2d 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ued-function..*/
201c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
201d0 4c 69 73 74 46 75 6e 63 41 72 67 73 28 50 61 72  ListFuncArgs(Par
201e0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
201f0 69 73 74 20 2a 70 2c 20 45 78 70 72 4c 69 73 74  ist *p, ExprList
20200 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28 20   *pList){.  if( 
20210 70 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  p ){.    struct 
20220 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
20230 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e  tem = &p->a[p->n
20240 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65  Src-1];.    asse
20250 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f  rt( pItem->fg.no
20260 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a 20  tIndexed==0 );. 
20270 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
20280 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79  ->fg.isIndexedBy
20290 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
202a0 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54  t( pItem->fg.isT
202b0 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  abFunc==0 );.   
202c0 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63   pItem->u1.pFunc
202d0 41 72 67 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20  Arg = pList;.   
202e0 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62   pItem->fg.isTab
202f0 46 75 6e 63 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  Func = 1;.  }els
20300 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
20310 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
20320 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b  rse->db, pList);
20330 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  .  }.}../*.** Wh
20340 65 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61  en building up a
20350 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20   FROM clause in 
20360 74 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 20  the parser, the 
20370 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  join operator.**
20380 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61 74   is initially at
20390 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65  tached to the le
203a0 66 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75 74  ft operand.  But
203b0 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
203c0 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20 74  tor.** expects t
203d0 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
203e0 20 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72 69   to be on the ri
203f0 67 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68  ght operand.  Th
20400 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68  is routine.** Sh
20410 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70  ifts all join op
20420 65 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66  erators from lef
20430 74 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20 61  t to right for a
20440 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a  n entire FROM.**
20450 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45   clause..**.** E
20460 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65 20  xample: Suppose 
20470 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65  the join is like
20480 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
20490 20 20 20 20 20 20 20 41 20 6e 61 74 75 72 61 6c         A natural
204a0 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a   cross join B.**
204b0 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72  .** The operator
204c0 20 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72 6f   is "natural cro
204d0 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41  ss join".  The A
204e0 20 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73 20   and B operands 
204f0 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  are stored.** in
20500 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e   p->a[0] and p->
20510 61 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76 65  a[1], respective
20520 6c 79 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  ly.  The parser 
20530 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65 73  initially stores
20540 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72   the.** operator
20550 20 77 69 74 68 20 41 2e 20 20 54 68 69 73 20 72   with A.  This r
20560 6f 75 74 69 6e 65 20 73 68 69 66 74 73 20 74 68  outine shifts th
20570 61 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72  at operator over
20580 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73   to B..*/.void s
20590 71 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68 69  qlite3SrcListShi
205a0 66 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c 69  ftJoinType(SrcLi
205b0 73 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  st *p){.  if( p 
205c0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
205d0 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63 2d    for(i=p->nSrc-
205e0 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
205f0 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 66 67 2e 6a      p->a[i].fg.j
20600 6f 69 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69  ointype = p->a[i
20610 2d 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b  -1].fg.jointype;
20620 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 5b  .    }.    p->a[
20630 30 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d  0].fg.jointype =
20640 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
20650 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
20660 6f 64 65 20 66 6f 72 20 61 20 42 45 47 49 4e 20  ode for a BEGIN 
20670 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
20680 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54  id sqlite3BeginT
20690 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
206a0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74 79   *pParse, int ty
206b0 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pe){.  sqlite3 *
206c0 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  db;.  Vdbe *v;. 
206d0 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72   int i;..  asser
206e0 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a  t( pParse!=0 );.
206f0 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
20700 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  b;.  assert( db!
20710 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  =0 );.  if( sqli
20720 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
20730 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
20740 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22  SACTION, "BEGIN"
20750 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72  , 0, 0) ){.    r
20760 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d  eturn;.  }.  v =
20770 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
20780 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21  pParse);.  if( !
20790 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  v ) return;.  if
207a0 28 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52  ( type!=TK_DEFER
207b0 52 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  RED ){.    for(i
207c0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
207d0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
207e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
207f0 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  OP_Transaction, 
20800 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43  i, (type==TK_EXC
20810 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20  LUSIVE)+1);.    
20820 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
20830 73 42 74 72 65 65 28 76 2c 20 69 29 3b 0a 20 20  sBtree(v, i);.  
20840 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
20850 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
20860 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 29 3b 0a 7d  P_AutoCommit);.}
20870 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
20880 20 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20 61   VDBE code for a
20890 20 43 4f 4d 4d 49 54 20 73 74 61 74 65 6d 65 6e   COMMIT statemen
208a0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
208b0 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74  e3CommitTransact
208c0 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
208d0 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a  e){.  Vdbe *v;..
208e0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
208f0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
20900 20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20 29   pParse->db!=0 )
20910 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  ;.  if( sqlite3A
20920 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
20930 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
20940 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30  ION, "COMMIT", 0
20950 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , 0) ){.    retu
20960 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71  rn;.  }.  v = sq
20970 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
20980 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
20990 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
209a0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 41 75 74  AddOp1(v, OP_Aut
209b0 6f 43 6f 6d 6d 69 74 2c 20 31 29 3b 0a 20 20 7d  oCommit, 1);.  }
209c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
209d0 74 65 20 56 44 42 45 20 63 6f 64 65 20 66 6f 72  te VDBE code for
209e0 20 61 20 52 4f 4c 4c 42 41 43 4b 20 73 74 61 74   a ROLLBACK stat
209f0 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
20a00 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72  qlite3RollbackTr
20a10 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
20a20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65  *pParse){.  Vdbe
20a30 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *v;..  assert( 
20a40 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61  pParse!=0 );.  a
20a50 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
20a60 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71  b!=0 );.  if( sq
20a70 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
20a80 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
20a90 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c  ANSACTION, "ROLL
20aa0 42 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 7b 0a  BACK", 0, 0) ){.
20ab0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
20ac0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
20ad0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
20ae0 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
20af0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
20b00 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c  , OP_AutoCommit,
20b10 20 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   1, 1);.  }.}../
20b20 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
20b30 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
20b40 74 68 65 20 70 61 72 73 65 72 20 77 68 65 6e 20  the parser when 
20b50 69 74 20 70 61 72 73 65 73 20 61 20 63 6f 6d 6d  it parses a comm
20b60 61 6e 64 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a  and to create,.*
20b70 2a 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c  * release or rol
20b80 6c 62 61 63 6b 20 61 6e 20 53 51 4c 20 73 61 76  lback an SQL sav
20b90 65 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64  epoint. .*/.void
20ba0 20 73 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e   sqlite3Savepoin
20bb0 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
20bc0 20 69 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a   int op, Token *
20bd0 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a  pName){.  char *
20be0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
20bf0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61  ameFromToken(pPa
20c00 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b  rse->db, pName);
20c10 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a  .  if( zName ){.
20c20 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71      Vdbe *v = sq
20c30 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
20c40 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  rse);.#ifndef SQ
20c50 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
20c60 49 5a 41 54 49 4f 4e 0a 20 20 20 20 73 74 61 74  IZATION.    stat
20c70 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20  ic const char * 
20c80 63 6f 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22  const az[] = { "
20c90 42 45 47 49 4e 22 2c 20 22 52 45 4c 45 41 53 45  BEGIN", "RELEASE
20ca0 22 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b  ", "ROLLBACK" };
20cb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 53 41  .    assert( !SA
20cc0 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26  VEPOINT_BEGIN &&
20cd0 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
20ce0 53 45 3d 3d 31 20 26 26 20 53 41 56 45 50 4f 49  SE==1 && SAVEPOI
20cf0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29  NT_ROLLBACK==2 )
20d00 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
20d10 20 21 76 20 7c 7c 20 73 71 6c 69 74 65 33 41 75   !v || sqlite3Au
20d20 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
20d30 53 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54  SQLITE_SAVEPOINT
20d40 2c 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c  , az[op], zName,
20d50 20 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c   0) ){.      sql
20d60 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
20d70 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  e->db, zName);. 
20d80 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
20d90 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
20da0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
20db0 61 76 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c  avepoint, op, 0,
20dc0 20 30 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59   0, zName, P4_DY
20dd0 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  NAMIC);.  }.}../
20de0 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
20df0 68 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65  he TEMP database
20e00 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61   is open and ava
20e10 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20  ilable for use. 
20e20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e   Return.** the n
20e30 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
20e40 20 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f    Leave any erro
20e50 72 20 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68  r messages in th
20e60 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75  e pParse structu
20e70 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  re..*/.int sqlit
20e80 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61  e3OpenTempDataba
20e90 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
20ea0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
20eb0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
20ec0 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
20ed0 70 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73  pBt==0 && !pPars
20ee0 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
20ef0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74    int rc;.    Bt
20f00 72 65 65 20 2a 70 42 74 3b 0a 20 20 20 20 73 74  ree *pBt;.    st
20f10 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66  atic const int f
20f20 6c 61 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20  lags = .        
20f30 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
20f40 41 44 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20  ADWRITE |.      
20f50 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
20f60 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20  CREATE |.       
20f70 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
20f80 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20  XCLUSIVE |.     
20f90 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
20fa0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c  _DELETEONCLOSE |
20fb0 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
20fc0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a  E_OPEN_TEMP_DB;.
20fd0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
20fe0 33 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70  3BtreeOpen(db->p
20ff0 56 66 73 2c 20 30 2c 20 64 62 2c 20 26 70 42 74  Vfs, 0, db, &pBt
21000 2c 20 30 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  , 0, flags);.   
21010 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21020 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
21030 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
21040 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f  se, "unable to o
21050 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
21060 64 61 74 61 62 61 73 65 20 22 0a 20 20 20 20 20  database ".     
21070 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f     "file for sto
21080 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74  ring temporary t
21090 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70  ables");.      p
210a0 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a  Parse->rc = rc;.
210b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
210c0 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 44      }.    db->aD
210d0 62 5b 31 5d 2e 70 42 74 20 3d 20 70 42 74 3b 0a  b[1].pBt = pBt;.
210e0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
210f0 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29  aDb[1].pSchema )
21100 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
21110 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42  _NOMEM==sqlite3B
21120 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28  treeSetPageSize(
21130 70 42 74 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67  pBt, db->nextPag
21140 65 73 69 7a 65 2c 20 2d 31 2c 20 30 29 20 29 7b  esize, -1, 0) ){
21150 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  .      sqlite3Oo
21160 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
21170 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
21180 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
21190 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72  ;.}../*.** Recor
211a0 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
211b0 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
211c0 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62  e will need to b
211d0 65 20 76 65 72 69 66 69 65 64 0a 2a 2a 20 66 6f  e verified.** fo
211e0 72 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 20  r database iDb. 
211f0 20 54 68 65 20 63 6f 64 65 20 74 6f 20 61 63 74   The code to act
21200 75 61 6c 6c 79 20 76 65 72 69 66 79 20 74 68 65  ually verify the
21210 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 2a   schema cookie.*
21220 2a 20 77 69 6c 6c 20 6f 63 63 75 72 20 61 74 20  * will occur at 
21230 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74  the end of the t
21240 6f 70 2d 6c 65 76 65 6c 20 56 44 42 45 20 61 6e  op-level VDBE an
21250 64 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61  d will be genera
21260 74 65 64 0a 2a 2a 20 6c 61 74 65 72 2c 20 62 79  ted.** later, by
21270 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f   sqlite3FinishCo
21280 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  ding()..*/.void 
21290 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
212a0 79 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70  ySchema(Parse *p
212b0 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b  Parse, int iDb){
212c0 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65  .  Parse *pTople
212d0 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72  vel = sqlite3Par
212e0 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
212f0 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  e);..  assert( i
21300 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 70 50 61  Db>=0 && iDb<pPa
21310 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a  rse->db->nDb );.
21320 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
21330 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ->db->aDb[iDb].p
21340 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20  Bt!=0 || iDb==1 
21350 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
21360 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41  <SQLITE_MAX_ATTA
21370 43 48 45 44 2b 32 20 29 3b 0a 20 20 61 73 73 65  CHED+2 );.  asse
21380 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
21390 61 4d 75 74 65 78 48 65 6c 64 28 70 50 61 72 73  aMutexHeld(pPars
213a0 65 2d 3e 64 62 2c 20 69 44 62 2c 20 30 29 20 29  e->db, iDb, 0) )
213b0 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 54 65  ;.  if( DbMaskTe
213c0 73 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f  st(pToplevel->co
213d0 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d  okieMask, iDb)==
213e0 30 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53  0 ){.    DbMaskS
213f0 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f  et(pToplevel->co
21400 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a  okieMask, iDb);.
21410 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
21420 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
21430 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
21440 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28  penTempDatabase(
21450 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20  pToplevel);.    
21460 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
21470 66 20 61 72 67 75 6d 65 6e 74 20 7a 44 62 20 69  f argument zDb i
21480 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 61 6c  s NULL, then cal
21490 6c 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  l sqlite3CodeVer
214a0 69 66 79 53 63 68 65 6d 61 28 29 20 66 6f 72 20  ifySchema() for 
214b0 65 61 63 68 20 0a 2a 2a 20 61 74 74 61 63 68 65  each .** attache
214c0 64 20 64 61 74 61 62 61 73 65 2e 20 4f 74 68 65  d database. Othe
214d0 72 77 69 73 65 2c 20 69 6e 76 6f 6b 65 20 69 74  rwise, invoke it
214e0 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
214f0 65 20 6e 61 6d 65 64 20 7a 44 62 20 6f 6e 6c 79  e named zDb only
21500 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
21510 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64  3CodeVerifyNamed
21520 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50  Schema(Parse *pP
21530 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
21540 20 2a 7a 44 62 29 7b 0a 20 20 73 71 6c 69 74 65   *zDb){.  sqlite
21550 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
21560 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  db;.  int i;.  f
21570 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
21580 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20  b; i++){.    Db 
21590 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
215a0 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  i];.    if( pDb-
215b0 3e 70 42 74 20 26 26 20 28 21 7a 44 62 20 7c 7c  >pBt && (!zDb ||
215c0 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
215d0 6d 70 28 7a 44 62 2c 20 70 44 62 2d 3e 7a 44 62  mp(zDb, pDb->zDb
215e0 53 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20 20 20  SName)) ){.     
215f0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
21600 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
21610 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d   i);.    }.  }.}
21620 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
21630 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20   VDBE code that 
21640 70 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69  prepares for doi
21650 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  ng an operation 
21660 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68  that.** might ch
21670 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73  ange the databas
21680 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
21690 75 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e  utine starts a n
216a0 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ew transaction i
216b0 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72  f we are not alr
216c0 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61  eady within.** a
216d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49   transaction.  I
216e0 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79  f we are already
216f0 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61   within a transa
21700 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68  ction, then a ch
21710 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73  eckpoint.** is s
21720 65 74 20 69 66 20 74 68 65 20 73 65 74 53 74 61  et if the setSta
21730 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72  tement parameter
21740 20 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65   is true.  A che
21750 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a  ckpoint should.*
21760 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65  * be set for ope
21770 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67  rations that mig
21780 68 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20  ht fail (due to 
21790 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61  a constraint) pa
217a0 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79  rt of.** the way
217b0 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69   through and whi
217c0 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  ch will need to 
217d0 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73  undo some writes
217e0 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
217f0 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74  to.** rollback t
21800 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63  he whole transac
21810 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61  tion.  For opera
21820 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20  tions where all 
21830 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63  constraints.** c
21840 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65  an be checked be
21850 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73  fore any changes
21860 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65   are made to the
21870 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73   database, it is
21880 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73   never.** necess
21890 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72  ary to undo a wr
218a0 69 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63  ite and the chec
218b0 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f  kpoint should no
218c0 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69  t be set..*/.voi
218d0 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72  d sqlite3BeginWr
218e0 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72  iteOperation(Par
218f0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
21900 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e  setStatement, in
21910 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20  t iDb){.  Parse 
21920 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
21930 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
21940 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  l(pParse);.  sql
21950 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
21960 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
21970 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74 28 70  );.  DbMaskSet(p
21980 54 6f 70 6c 65 76 65 6c 2d 3e 77 72 69 74 65 4d  Toplevel->writeM
21990 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 70 54 6f  ask, iDb);.  pTo
219a0 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57  plevel->isMultiW
219b0 72 69 74 65 20 7c 3d 20 73 65 74 53 74 61 74 65  rite |= setState
219c0 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ment;.}../*.** I
219d0 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
219e0 20 73 74 61 74 65 6d 65 6e 74 20 63 75 72 72 65   statement curre
219f0 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
21a00 72 75 63 74 69 6f 6e 20 6d 69 67 68 74 20 77 72  ruction might wr
21a10 69 74 65 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e  ite.** more than
21a20 20 6f 6e 65 20 65 6e 74 72 79 20 28 65 78 61 6d   one entry (exam
21a30 70 6c 65 3a 20 64 65 6c 65 74 69 6e 67 20 6f 6e  ple: deleting on
21a40 65 20 72 6f 77 20 74 68 65 6e 20 69 6e 73 65 72  e row then inser
21a50 74 69 6e 67 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a  ting another,.**
21a60 20 69 6e 73 65 72 74 69 6e 67 20 6d 75 6c 74 69   inserting multi
21a70 70 6c 65 20 72 6f 77 73 20 69 6e 20 61 20 74 61  ple rows in a ta
21a80 62 6c 65 2c 20 6f 72 20 69 6e 73 65 72 74 69 6e  ble, or insertin
21a90 67 20 61 20 72 6f 77 20 61 6e 64 20 69 6e 64 65  g a row and inde
21aa0 78 20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a 20 49  x entries.).** I
21ab0 66 20 61 6e 20 61 62 6f 72 74 20 6f 63 63 75 72  f an abort occur
21ac0 73 20 61 66 74 65 72 20 73 6f 6d 65 20 6f 66 20  s after some of 
21ad0 74 68 65 73 65 20 77 72 69 74 65 73 20 68 61 76  these writes hav
21ae0 65 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74 68 65  e completed, the
21af0 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  n it will.** be 
21b00 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64  necessary to und
21b10 6f 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 64 20  o the completed 
21b20 77 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  writes..*/.void 
21b30 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74  sqlite3MultiWrit
21b40 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
21b50 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c  {.  Parse *pTopl
21b60 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
21b70 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
21b80 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c  se);.  pToplevel
21b90 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 3d  ->isMultiWrite =
21ba0 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68   1;.}../* .** Th
21bb0 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
21bc0 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
21bd0 69 6e 65 20 69 66 20 69 73 20 64 69 73 63 6f 76  ine if is discov
21be0 65 72 73 20 74 68 61 74 20 69 74 20 69 73 0a 2a  ers that it is.*
21bf0 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 62  * possible to ab
21c00 6f 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ort a statement 
21c10 70 72 69 6f 72 20 74 6f 20 63 6f 6d 70 6c 65 74  prior to complet
21c20 69 6f 6e 2e 20 20 49 6e 20 6f 72 64 65 72 20 74  ion.  In order t
21c30 6f 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68  o .** perform th
21c40 69 73 20 61 62 6f 72 74 20 77 69 74 68 6f 75 74  is abort without
21c50 20 63 6f 72 72 75 70 74 69 6e 67 20 74 68 65 20   corrupting the 
21c60 64 61 74 61 62 61 73 65 2c 20 77 65 20 6e 65 65  database, we nee
21c70 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75 72  d to make.** sur
21c80 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65  e that the state
21c90 6d 65 6e 74 20 69 73 20 70 72 6f 74 65 63 74 65  ment is protecte
21ca0 64 20 62 79 20 61 20 73 74 61 74 65 6d 65 6e 74  d by a statement
21cb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
21cc0 0a 2a 2a 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c  .** Technically,
21cd0 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f   we only need to
21ce0 20 73 65 74 20 74 68 65 20 6d 61 79 41 62 6f 72   set the mayAbor
21cf0 74 20 66 6c 61 67 20 69 66 20 74 68 65 0a 2a 2a  t flag if the.**
21d00 20 69 73 4d 75 6c 74 69 57 72 69 74 65 20 66 6c   isMultiWrite fl
21d10 61 67 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  ag was previousl
21d20 79 20 73 65 74 2e 20 20 54 68 65 72 65 20 69 73  y set.  There is
21d30 20 61 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e   a time dependen
21d40 63 79 0a 2a 2a 20 73 75 63 68 20 74 68 61 74 20  cy.** such that 
21d50 74 68 65 20 61 62 6f 72 74 20 6d 75 73 74 20 6f  the abort must o
21d60 63 63 75 72 20 61 66 74 65 72 20 74 68 65 20 6d  ccur after the m
21d70 75 6c 74 69 77 72 69 74 65 2e 20 20 54 68 69 73  ultiwrite.  This
21d80 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20 73   makes.** some s
21d90 74 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6c 76  tatements involv
21da0 69 6e 67 20 74 68 65 20 52 45 50 4c 41 43 45 20  ing the REPLACE 
21db0 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  conflict resolut
21dc0 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a  ion algorithm.**
21dd0 20 67 6f 20 61 20 6c 69 74 74 6c 65 20 66 61 73   go a little fas
21de0 74 65 72 2e 20 20 42 75 74 20 74 61 6b 69 6e 67  ter.  But taking
21df0 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68   advantage of th
21e00 69 73 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e  is time dependen
21e10 63 79 0a 2a 2a 20 6d 61 6b 65 73 20 69 74 20 6d  cy.** makes it m
21e20 6f 72 65 20 64 69 66 66 69 63 75 6c 74 20 74 6f  ore difficult to
21e30 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20   prove that the 
21e40 63 6f 64 65 20 69 73 20 63 6f 72 72 65 63 74 20  code is correct 
21e50 28 69 6e 20 0a 2a 2a 20 70 61 72 74 69 63 75 6c  (in .** particul
21e60 61 72 2c 20 69 74 20 70 72 65 76 65 6e 74 73 20  ar, it prevents 
21e70 75 73 20 66 72 6f 6d 20 77 72 69 74 69 6e 67 20  us from writing 
21e80 61 6e 20 65 66 66 65 63 74 69 76 65 0a 2a 2a 20  an effective.** 
21e90 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
21ea0 66 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d  f sqlite3AssertM
21eb0 61 79 41 62 6f 72 74 28 29 29 20 61 6e 64 20 73  ayAbort()) and s
21ec0 6f 20 77 65 20 68 61 76 65 20 63 68 6f 73 65 6e  o we have chosen
21ed0 0a 2a 2a 20 74 6f 20 74 61 6b 65 20 74 68 65 20  .** to take the 
21ee0 73 61 66 65 20 72 6f 75 74 65 20 61 6e 64 20 73  safe route and s
21ef0 6b 69 70 20 74 68 65 20 6f 70 74 69 6d 69 7a 61  kip the optimiza
21f00 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
21f10 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 50 61  lite3MayAbort(Pa
21f20 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
21f30 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
21f40 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
21f50 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
21f60 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61  .  pToplevel->ma
21f70 79 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f  yAbort = 1;.}../
21f80 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
21f90 48 61 6c 74 20 74 68 61 74 20 63 61 75 73 65 73  Halt that causes
21fa0 20 74 68 65 20 76 64 62 65 20 74 6f 20 72 65 74   the vdbe to ret
21fb0 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f  urn an SQLITE_CO
21fc0 4e 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72 72 6f  NSTRAINT.** erro
21fd0 72 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72 20 70  r. The onError p
21fe0 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69  arameter determi
21ff0 6e 65 73 20 77 68 69 63 68 20 28 69 66 20 61 6e  nes which (if an
22000 79 29 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  y) of the statem
22010 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63 75  ent.** and/or cu
22020 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
22030 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
22040 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22050 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
22060 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
22070 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
22080 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
22090 20 65 72 72 43 6f 64 65 2c 20 20 20 20 20 20 2f   errCode,      /
220a0 2a 20 65 78 74 65 6e 64 65 64 20 65 72 72 6f 72  * extended error
220b0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   code */.  int o
220c0 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20  nError,      /* 
220d0 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20  Constraint type 
220e0 2a 2f 0a 20 20 63 68 61 72 20 2a 70 34 2c 20 20  */.  char *p4,  
220f0 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
22100 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 69 38 20  message */.  i8 
22110 70 34 74 79 70 65 2c 20 20 20 20 20 20 20 20 2f  p4type,        /
22120 2a 20 50 34 5f 53 54 41 54 49 43 20 6f 72 20 50  * P4_STATIC or P
22130 34 5f 54 52 41 4e 53 49 45 4e 54 20 2a 2f 0a 20  4_TRANSIENT */. 
22140 20 75 38 20 70 35 45 72 72 6d 73 67 20 20 20 20   u8 p5Errmsg    
22150 20 20 20 2f 2a 20 50 35 5f 45 72 72 4d 73 67 20     /* P5_ErrMsg 
22160 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  type */.){.  Vdb
22170 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
22180 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
22190 20 61 73 73 65 72 74 28 20 28 65 72 72 43 6f 64   assert( (errCod
221a0 65 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  e&0xff)==SQLITE_
221b0 43 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a 20 20  CONSTRAINT );.  
221c0 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  if( onError==OE_
221d0 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 73 71 6c  Abort ){.    sql
221e0 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
221f0 72 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rse);.  }.  sqli
22200 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
22210 20 4f 50 5f 48 61 6c 74 2c 20 65 72 72 43 6f 64   OP_Halt, errCod
22220 65 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 70  e, onError, 0, p
22230 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 73 71  4, p4type);.  sq
22240 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
22250 35 28 76 2c 20 70 35 45 72 72 6d 73 67 29 3b 0a  5(v, p5Errmsg);.
22260 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  }../*.** Code an
22270 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20   OP_Halt due to 
22280 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52  UNIQUE or PRIMAR
22290 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
222a0 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 76   violation..*/.v
222b0 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 69 71 75  oid sqlite3Uniqu
222c0 65 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50  eConstraint(.  P
222d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
222e0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
222f0 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  ext */.  int onE
22300 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f  rror,      /* Co
22310 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f  nstraint type */
22320 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20  .  Index *pIdx  
22330 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
22340 78 20 74 68 61 74 20 74 72 69 67 67 65 72 73 20  x that triggers 
22350 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  the constraint *
22360 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72  /.){.  char *zEr
22370 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 53 74  r;.  int j;.  St
22380 72 41 63 63 75 6d 20 65 72 72 4d 73 67 3b 0a 20  rAccum errMsg;. 
22390 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
223a0 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20 20  Idx->pTable;..  
223b0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49  sqlite3StrAccumI
223c0 6e 69 74 28 26 65 72 72 4d 73 67 2c 20 70 50 61  nit(&errMsg, pPa
223d0 72 73 65 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 32  rse->db, 0, 0, 2
223e0 30 30 29 3b 0a 20 20 69 66 28 20 70 49 64 78 2d  00);.  if( pIdx-
223f0 3e 61 43 6f 6c 45 78 70 72 20 29 7b 0a 20 20 20  >aColExpr ){.   
22400 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
22410 26 65 72 72 4d 73 67 2c 20 22 69 6e 64 65 78 20  &errMsg, "index 
22420 27 25 71 27 22 2c 20 70 49 64 78 2d 3e 7a 4e 61  '%q'", pIdx->zNa
22430 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me);.  }else{.  
22440 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64    for(j=0; j<pId
22450 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29  x->nKeyCol; j++)
22460 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  {.      char *zC
22470 6f 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ol;.      assert
22480 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
22490 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  [j]>=0 );.      
224a0 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  zCol = pTab->aCo
224b0 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  l[pIdx->aiColumn
224c0 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  [j]].zName;.    
224d0 20 20 69 66 28 20 6a 20 29 20 73 71 6c 69 74 65    if( j ) sqlite
224e0 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
224f0 26 65 72 72 4d 73 67 2c 20 22 2c 20 22 2c 20 32  &errMsg, ", ", 2
22500 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22510 58 50 72 69 6e 74 66 28 26 65 72 72 4d 73 67 2c  XPrintf(&errMsg,
22520 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e   "%s.%s", pTab->
22530 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20  zName, zCol);.  
22540 20 20 7d 0a 20 20 7d 0a 20 20 7a 45 72 72 20 3d    }.  }.  zErr =
22550 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
22560 46 69 6e 69 73 68 28 26 65 72 72 4d 73 67 29 3b  Finish(&errMsg);
22570 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f  .  sqlite3HaltCo
22580 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c  nstraint(pParse,
22590 20 0a 20 20 20 20 49 73 50 72 69 6d 61 72 79 4b   .    IsPrimaryK
225a0 65 79 49 6e 64 65 78 28 70 49 64 78 29 20 3f 20  eyIndex(pIdx) ? 
225b0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
225c0 54 5f 50 52 49 4d 41 52 59 4b 45 59 20 0a 20 20  T_PRIMARYKEY .  
225d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225e0 20 20 20 20 20 20 20 20 20 20 3a 20 53 51 4c 49            : SQLI
225f0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e  TE_CONSTRAINT_UN
22600 49 51 55 45 2c 0a 20 20 20 20 6f 6e 45 72 72 6f  IQUE,.    onErro
22610 72 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41  r, zErr, P4_DYNA
22620 4d 49 43 2c 20 50 35 5f 43 6f 6e 73 74 72 61 69  MIC, P5_Constrai
22630 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 0a 2f  ntUnique);.}.../
22640 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
22650 48 61 6c 74 20 64 75 65 20 74 6f 20 6e 6f 6e 2d  Halt due to non-
22660 75 6e 69 71 75 65 20 72 6f 77 69 64 2e 0a 2a 2f  unique rowid..*/
22670 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 77  .void sqlite3Row
22680 69 64 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  idConstraint(.  
22690 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
226a0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
226b0 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  text */.  int on
226c0 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43  Error,      /* C
226d0 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
226e0 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a  on algorithm */.
226f0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 20 20    Table *pTab   
22700 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
22710 20 77 69 74 68 20 74 68 65 20 6e 6f 6e 2d 75 6e   with the non-un
22720 69 71 75 65 20 72 6f 77 69 64 20 2a 2f 20 0a 29  ique rowid */ .)
22730 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a  {.  char *zMsg;.
22740 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
22750 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29  pTab->iPKey>=0 )
22760 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c  {.    zMsg = sql
22770 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
22780 73 65 2d 3e 64 62 2c 20 22 25 73 2e 25 73 22 2c  se->db, "%s.%s",
22790 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pTab->zName,.  
227a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227b0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43          pTab->aC
227c0 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e  ol[pTab->iPKey].
227d0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d  zName);.    rc =
227e0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
227f0 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20  NT_PRIMARYKEY;. 
22800 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4d 73 67   }else{.    zMsg
22810 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
22820 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 25  f(pParse->db, "%
22830 73 2e 72 6f 77 69 64 22 2c 20 70 54 61 62 2d 3e  s.rowid", pTab->
22840 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d  zName);.    rc =
22850 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
22860 4e 54 5f 52 4f 57 49 44 3b 0a 20 20 7d 0a 20 20  NT_ROWID;.  }.  
22870 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
22880 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 72 63  raint(pParse, rc
22890 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a 4d 73 67 2c  , onError, zMsg,
228a0 20 50 34 5f 44 59 4e 41 4d 49 43 2c 0a 20 20 20   P4_DYNAMIC,.   
228b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228c0 20 20 20 20 20 50 35 5f 43 6f 6e 73 74 72 61 69       P5_Constrai
228d0 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 2f 2a  ntUnique);.}../*
228e0 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
228f0 20 69 66 20 70 49 6e 64 65 78 20 75 73 65 73 20   if pIndex uses 
22900 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
22910 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52  quence pColl.  R
22920 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
22930 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61 6c   it does and fal
22940 73 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  se if it does no
22950 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  t..*/.#ifndef SQ
22960 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
22970 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c  X.static int col
22980 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73  lationMatch(cons
22990 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49  t char *zColl, I
229a0 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20  ndex *pIndex){. 
229b0 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
229c0 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20  ( zColl!=0 );.  
229d0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65  for(i=0; i<pInde
229e0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
229f0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
22a00 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a   *z = pIndex->az
22a10 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 61 73 73  Coll[i];.    ass
22a20 65 72 74 28 20 7a 21 3d 30 20 7c 7c 20 70 49 6e  ert( z!=0 || pIn
22a30 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
22a40 3c 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  <0 );.    if( pI
22a50 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
22a60 5d 3e 3d 30 20 26 26 20 30 3d 3d 73 71 6c 69 74  ]>=0 && 0==sqlit
22a70 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f  e3StrICmp(z, zCo
22a80 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ll) ){.      ret
22a90 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
22aa0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
22ab0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63  endif../*.** Rec
22ac0 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
22ad0 65 73 20 6f 66 20 70 54 61 62 20 74 68 61 74 20  es of pTab that 
22ae0 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  use the collatin
22af0 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
22b00 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30  ..** If pColl==0
22b10 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 20   then recompute 
22b20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70  all indices of p
22b30 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  Tab..*/.#ifndef 
22b40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
22b50 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEX.static void 
22b60 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50 61 72  reindexTable(Par
22b70 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
22b80 65 20 2a 70 54 61 62 2c 20 63 68 61 72 20 63 6f  e *pTab, char co
22b90 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49  nst *zColl){.  I
22ba0 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
22bb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
22bc0 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65   index associate
22bd0 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a  d with pTab */..
22be0 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61    for(pIndex=pTa
22bf0 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  b->pIndex; pInde
22c00 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78  x; pIndex=pIndex
22c10 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
22c20 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f  ( zColl==0 || co
22c30 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f  llationMatch(zCo
22c40 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20  ll, pIndex) ){. 
22c50 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73       int iDb = s
22c60 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
22c70 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
22c80 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
22c90 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
22ca0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
22cb0 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
22cc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
22cd0 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
22ce0 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a  e, pIndex, -1);.
22cf0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
22d00 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70  if../*.** Recomp
22d10 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
22d20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  of all tables in
22d30 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77   all databases w
22d40 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69  here the.** indi
22d50 63 65 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c  ces use the coll
22d60 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
22d70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d  Coll.  If pColl=
22d80 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74  =0 then recomput
22d90 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73  e.** all indices
22da0 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a   everywhere..*/.
22db0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
22dc0 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
22dd0 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 44  ic void reindexD
22de0 61 74 61 62 61 73 65 73 28 50 61 72 73 65 20 2a  atabases(Parse *
22df0 70 50 61 72 73 65 2c 20 63 68 61 72 20 63 6f 6e  pParse, char con
22e00 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62  st *zColl){.  Db
22e10 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
22e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
22e30 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a  ingle database *
22e40 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
22e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e60 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
22e70 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a  index number */.
22e80 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
22e90 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
22ea0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
22eb0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61  nnection */.  Ha
22ec0 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20  shElem *k;      
22ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
22ee0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61   looping over ta
22ef0 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20  bles in pDb */. 
22f00 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
22f10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22f20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64  A table in the d
22f30 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 61 73  atabase */..  as
22f40 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
22f50 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65  eeHoldsAllMutexe
22f60 73 28 64 62 29 20 29 3b 20 20 2f 2a 20 4e 65 65  s(db) );  /* Nee
22f70 64 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61  ded for schema a
22f80 63 63 65 73 73 20 2a 2f 0a 20 20 66 6f 72 28 69  ccess */.  for(i
22f90 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44  Db=0, pDb=db->aD
22fa0 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  b; iDb<db->nDb; 
22fb0 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20  iDb++, pDb++){. 
22fc0 20 20 20 61 73 73 65 72 74 28 20 70 44 62 21 3d     assert( pDb!=
22fd0 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73  0 );.    for(k=s
22fe0 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
22ff0 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62  pDb->pSchema->tb
23000 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71  lHash);  k; k=sq
23010 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29  liteHashNext(k))
23020 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 28  {.      pTab = (
23030 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73  Table*)sqliteHas
23040 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20  hData(k);.      
23050 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61  reindexTable(pPa
23060 72 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c  rse, pTab, zColl
23070 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
23080 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  endif../*.** Gen
23090 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
230a0 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61  he REINDEX comma
230b0 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  nd..**.**       
230c0 20 52 45 49 4e 44 45 58 20 20 20 20 20 20 20 20   REINDEX        
230d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230e0 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20      -- 1.**     
230f0 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c     REINDEX  <col
23100 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20 20  lation>         
23110 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20        -- 2.**   
23120 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c       REINDEX  ?<
23130 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c  database>.?<tabl
23140 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20  ename>  -- 3.** 
23150 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
23160 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e  ?<database>.?<in
23170 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a  dexname>  -- 4.*
23180 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73  *.** Form 1 caus
23190 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69  es all indices i
231a0 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64  n all attached d
231b0 61 74 61 62 61 73 65 73 20 74 6f 20 62 65 20 72  atabases to be r
231c0 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20  ebuilt..** Form 
231d0 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20 69  2 rebuilds all i
231e0 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64 61  ndices in all da
231f0 74 61 62 61 73 65 73 20 74 68 61 74 20 75 73 65  tabases that use
23200 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f   the named.** co
23210 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
23220 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20 34  .  Forms 3 and 4
23230 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61 6d   rebuild the nam
23240 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a  ed index or all.
23250 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63  ** indices assoc
23260 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  iated with the n
23270 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23  amed table..*/.#
23280 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
23290 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20  IT_REINDEX.void 
232a0 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28 50  sqlite3Reindex(P
232b0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
232c0 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b  ken *pName1, Tok
232d0 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43  en *pName2){.  C
232e0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
232f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
23300 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
23310 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64   to be reindexed
23320 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  , or NULL */.  c
23330 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20  har *z;         
23340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
23350 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  me of a table or
23360 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73   index */.  cons
23370 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20  t char *zDb;    
23380 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
23390 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
233a0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
233b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
233c0 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74   /* A table in t
233d0 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
233e0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
233f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23400 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61  An index associa
23410 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f  ted with pTab */
23420 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
23430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23440 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69  * The database i
23450 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ndex number */. 
23460 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
23470 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20  Parse->db;   /* 
23480 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
23490 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b  nection */.  Tok
234a0 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20  en *pObjName;   
234b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
234c0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
234d0 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65 69   index to be rei
234e0 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  ndexed */..  /* 
234f0 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  Read the databas
23500 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20  e schema. If an 
23510 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65  error occurs, le
23520 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
23530 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f  sage.  ** and co
23540 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  de in pParse and
23550 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f   return NULL. */
23560 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
23570 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
23580 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
23590 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
235a0 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20    if( pName1==0 
235b0 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61  ){.    reindexDa
235c0 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20  tabases(pParse, 
235d0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  0);.    return;.
235e0 20 20 7d 65 6c 73 65 20 69 66 28 20 4e 45 56 45    }else if( NEVE
235f0 52 28 70 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c 20  R(pName2==0) || 
23600 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a  pName2->z==0 ){.
23610 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b      char *zColl;
23620 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
23630 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43  me1->z );.    zC
23640 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  oll = sqlite3Nam
23650 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
23660 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a  e->db, pName1);.
23670 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29      if( !zColl )
23680 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f   return;.    pCo
23690 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
236a0 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28  CollSeq(db, ENC(
236b0 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a  db), zColl, 0);.
236c0 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b      if( pColl ){
236d0 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 44 61  .      reindexDa
236e0 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20  tabases(pParse, 
236f0 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  zColl);.      sq
23700 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
23710 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65  zColl);.      re
23720 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
23730 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
23740 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20  , zColl);.  }.  
23750 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
23760 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
23770 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
23780 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69   &pObjName);.  i
23790 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72  f( iDb<0 ) retur
237a0 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  n;.  z = sqlite3
237b0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
237c0 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69  , pObjName);.  i
237d0 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
237e0 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ;.  zDb = db->aD
237f0 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b  b[iDb].zDbSName;
23800 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
23810 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
23820 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54  , zDb);.  if( pT
23830 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65  ab ){.    reinde
23840 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  xTable(pParse, p
23850 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  Tab, 0);.    sql
23860 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
23870 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
23880 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71   }.  pIndex = sq
23890 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
238a0 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71  b, z, zDb);.  sq
238b0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
238c0 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  z);.  if( pIndex
238d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
238e0 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
238f0 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
23900 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  b);.    sqlite3R
23910 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
23920 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a  e, pIndex, -1);.
23930 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
23940 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
23950 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
23960 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68  e to identify th
23970 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72  e object to be r
23980 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65  eindexed");.}.#e
23990 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
239a0 72 6e 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  rn a KeyInfo str
239b0 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20 61  ucture that is a
239c0 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
239d0 68 65 20 67 69 76 65 6e 20 49 6e 64 65 78 2e 0a  he given Index..
239e0 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
239f0 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73   should invoke s
23a00 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
23a10 65 66 28 29 20 6f 6e 20 74 68 65 20 72 65 74 75  ef() on the retu
23a20 72 6e 65 64 20 6f 62 6a 65 63 74 0a 2a 2a 20 77  rned object.** w
23a30 68 65 6e 20 69 74 20 68 61 73 20 66 69 6e 69 73  hen it has finis
23a40 68 65 64 20 75 73 69 6e 67 20 69 74 2e 0a 2a 2f  hed using it..*/
23a50 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
23a60 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28  3KeyInfoOfIndex(
23a70 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
23a80 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69  ndex *pIdx){.  i
23a90 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c  nt i;.  int nCol
23aa0 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   = pIdx->nColumn
23ab0 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70  ;.  int nKey = p
23ac0 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20  Idx->nKeyCol;.  
23ad0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a 20  KeyInfo *pKey;. 
23ae0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
23af0 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
23b00 69 66 28 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f  if( pIdx->uniqNo
23b10 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 70 4b 65  tNull ){.    pKe
23b20 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  y = sqlite3KeyIn
23b30 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  foAlloc(pParse->
23b40 64 62 2c 20 6e 4b 65 79 2c 20 6e 43 6f 6c 2d 6e  db, nKey, nCol-n
23b50 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Key);.  }else{. 
23b60 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65     pKey = sqlite
23b70 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50  3KeyInfoAlloc(pP
23b80 61 72 73 65 2d 3e 64 62 2c 20 6e 43 6f 6c 2c 20  arse->db, nCol, 
23b90 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4b  0);.  }.  if( pK
23ba0 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ey ){.    assert
23bb0 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ( sqlite3KeyInfo
23bc0 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79  IsWriteable(pKey
23bd0 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ) );.    for(i=0
23be0 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
23bf0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
23c00 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e   *zColl = pIdx->
23c10 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  azColl[i];.     
23c20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20   pKey->aColl[i] 
23c30 3d 20 7a 43 6f 6c 6c 3d 3d 73 71 6c 69 74 65 33  = zColl==sqlite3
23c40 53 74 72 42 49 4e 41 52 59 20 3f 20 30 20 3a 0a  StrBINARY ? 0 :.
23c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c          sqlite3L
23c70 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
23c80 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  rse, zColl);.   
23c90 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72     pKey->aSortOr
23ca0 64 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61  der[i] = pIdx->a
23cb0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20  SortOrder[i];.  
23cc0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72    }.    if( pPar
23cd0 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
23ce0 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
23cf0 55 6e 72 65 66 28 70 4b 65 79 29 3b 0a 20 20 20  Unref(pKey);.   
23d00 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20     pKey = 0;.   
23d10 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
23d20 70 4b 65 79 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  pKey;.}..#ifndef
23d30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
23d40 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ./* .** This rou
23d50 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20  tine is invoked 
23d60 6f 6e 63 65 20 70 65 72 20 43 54 45 20 62 79 20  once per CTE by 
23d70 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
23d80 20 70 61 72 73 69 6e 67 20 61 20 0a 2a 2a 20 57   parsing a .** W
23d90 49 54 48 20 63 6c 61 75 73 65 2e 20 0a 2a 2f 0a  ITH clause. .*/.
23da0 57 69 74 68 20 2a 73 71 6c 69 74 65 33 57 69 74  With *sqlite3Wit
23db0 68 41 64 64 28 0a 20 20 50 61 72 73 65 20 2a 70  hAdd(.  Parse *p
23dc0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
23dd0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
23de0 78 74 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57  xt */.  With *pW
23df0 69 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ith,            
23e00 2f 2a 20 45 78 69 73 74 69 6e 67 20 57 49 54 48  /* Existing WITH
23e10 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c   clause, or NULL
23e20 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
23e30 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me,           /*
23e40 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6d   Name of the com
23e50 6d 6f 6e 2d 74 61 62 6c 65 20 2a 2f 0a 20 20 45  mon-table */.  E
23e60 78 70 72 4c 69 73 74 20 2a 70 41 72 67 6c 69 73  xprList *pArglis
23e70 74 2c 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e  t,     /* Option
23e80 61 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6c  al column name l
23e90 69 73 74 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ist for the tabl
23ea0 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
23eb0 51 75 65 72 79 20 20 20 20 20 20 20 20 20 20 2f  Query          /
23ec0 2a 20 51 75 65 72 79 20 75 73 65 64 20 74 6f 20  * Query used to 
23ed0 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 74  initialize the t
23ee0 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  able */.){.  sql
23ef0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
23f00 65 2d 3e 64 62 3b 0a 20 20 57 69 74 68 20 2a 70  e->db;.  With *p
23f10 4e 65 77 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  New;.  char *zNa
23f20 6d 65 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  me;..  /* Check 
23f30 74 68 61 74 20 74 68 65 20 43 54 45 20 6e 61 6d  that the CTE nam
23f40 65 20 69 73 20 75 6e 69 71 75 65 20 77 69 74 68  e is unique with
23f50 69 6e 20 74 68 69 73 20 57 49 54 48 20 63 6c 61  in this WITH cla
23f60 75 73 65 2e 20 49 66 0a 20 20 2a 2a 20 6e 6f 74  use. If.  ** not
23f70 2c 20 73 74 6f 72 65 20 61 6e 20 65 72 72 6f 72  , store an error
23f80 20 69 6e 20 74 68 65 20 50 61 72 73 65 20 73 74   in the Parse st
23f90 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 7a 4e  ructure. */.  zN
23fa0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
23fb0 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
23fc0 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  e->db, pName);. 
23fd0 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 20 70 57   if( zName && pW
23fe0 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ith ){.    int i
23ff0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
24000 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b  <pWith->nCte; i+
24010 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
24020 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61  lite3StrICmp(zNa
24030 6d 65 2c 20 70 57 69 74 68 2d 3e 61 5b 69 5d 2e  me, pWith->a[i].
24040 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
24050 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
24060 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75  rMsg(pParse, "du
24070 70 6c 69 63 61 74 65 20 57 49 54 48 20 74 61 62  plicate WITH tab
24080 6c 65 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 4e  le name: %s", zN
24090 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
240a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
240b0 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20  With ){.    int 
240c0 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
240d0 70 57 69 74 68 29 20 2b 20 28 73 69 7a 65 6f 66  pWith) + (sizeof
240e0 28 70 57 69 74 68 2d 3e 61 5b 31 5d 29 20 2a 20  (pWith->a[1]) * 
240f0 70 57 69 74 68 2d 3e 6e 43 74 65 29 3b 0a 20 20  pWith->nCte);.  
24100 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
24110 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 57  DbRealloc(db, pW
24120 69 74 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  ith, nByte);.  }
24130 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 20 3d  else{.    pNew =
24140 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
24150 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
24160 2a 70 57 69 74 68 29 29 3b 0a 20 20 7d 0a 20 20  *pWith));.  }.  
24170 61 73 73 65 72 74 28 20 28 70 4e 65 77 21 3d 30  assert( (pNew!=0
24180 20 26 26 20 7a 4e 61 6d 65 21 3d 30 29 20 7c 7c   && zName!=0) ||
24190 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
241a0 64 20 29 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e  d );..  if( db->
241b0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
241c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
241d0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 41  istDelete(db, pA
241e0 72 67 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  rglist);.    sql
241f0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
24200 28 64 62 2c 20 70 51 75 65 72 79 29 3b 0a 20 20  (db, pQuery);.  
24210 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
24220 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
24230 70 4e 65 77 20 3d 20 70 57 69 74 68 3b 0a 20 20  pNew = pWith;.  
24240 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d  }else{.    pNew-
24250 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70  >a[pNew->nCte].p
24260 53 65 6c 65 63 74 20 3d 20 70 51 75 65 72 79 3b  Select = pQuery;
24270 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65  .    pNew->a[pNe
24280 77 2d 3e 6e 43 74 65 5d 2e 70 43 6f 6c 73 20 3d  w->nCte].pCols =
24290 20 70 41 72 67 6c 69 73 74 3b 0a 20 20 20 20 70   pArglist;.    p
242a0 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74  New->a[pNew->nCt
242b0 65 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  e].zName = zName
242c0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e  ;.    pNew->a[pN
242d0 65 77 2d 3e 6e 43 74 65 5d 2e 7a 43 74 65 45 72  ew->nCte].zCteEr
242e0 72 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  r = 0;.    pNew-
242f0 3e 6e 43 74 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  >nCte++;.  }..  
24300 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
24310 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 63  /*.** Free the c
24320 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 57  ontents of the W
24330 69 74 68 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ith object passe
24340 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
24350 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  argument..*/.voi
24360 64 20 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c  d sqlite3WithDel
24370 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
24380 20 57 69 74 68 20 2a 70 57 69 74 68 29 7b 0a 20   With *pWith){. 
24390 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20   if( pWith ){.  
243a0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
243b0 28 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e  (i=0; i<pWith->n
243c0 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Cte; i++){.     
243d0 20 73 74 72 75 63 74 20 43 74 65 20 2a 70 43 74   struct Cte *pCt
243e0 65 20 3d 20 26 70 57 69 74 68 2d 3e 61 5b 69 5d  e = &pWith->a[i]
243f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
24400 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
24410 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 29 3b 0a  , pCte->pCols);.
24420 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
24430 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43  ectDelete(db, pC
24440 74 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  te->pSelect);.  
24450 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
24460 65 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d  e(db, pCte->zNam
24470 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
24480 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
24490 70 57 69 74 68 29 3b 0a 20 20 7d 0a 7d 0a 23 65  pWith);.  }.}.#e
244a0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
244b0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45  (SQLITE_OMIT_CTE
244c0 29 20 2a 2f 0a                                   ) */.