/ Hex Artifact Content
Login

Artifact 6466a704dbf63090db20434e0cecbc04b005b2fbbaff505282fbc149a0e0537c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
03a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
03b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
03c0: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
03d0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20  */.  int iTab;  
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03f0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
0400: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0410: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0420: 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20 20 20 20  sWriteLock;     
0430: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 77     /* True for w
0440: 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c 73  rite lock.  Fals
0450: 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f 63  e for a read loc
0460: 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  k */.  const cha
0470: 72 20 2a 7a 4c 6f 63 6b 4e 61 6d 65 3b 20 2f 2a  r *zLockName; /*
0480: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
0490: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
04a0: 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
04b0: 74 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20  that we want to 
04c0: 6c 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20  lock a table at 
04d0: 72 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a  run-time.  .**.*
04e0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
04f0: 65 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f  e locked has roo
0500: 74 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20  t page iTab and 
0510: 69 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61  is found in data
0520: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72  base iDb..** A r
0530: 65 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c  ead or a write l
0540: 6f 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e  ock can be taken
0550: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73   depending on is
0560: 57 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  Writelock..**.**
0570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
0580: 73 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66  st records the f
0590: 61 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63  act that the loc
05a0: 6b 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54  k is desired.  T
05b0: 68 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61  he.** code to ma
05c0: 6b 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75  ke the lock occu
05d0: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  r is generated b
05e0: 79 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74  y a later call t
05f0: 6f 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f  o.** codeTableLo
0600: 63 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75  cks() which occu
0610: 72 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  rs during sqlite
0620: 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
0630: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0640: 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72  TableLock(.  Par
0650: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0660: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0670: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
0680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
0690: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
06a0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
06b0: 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  he table to lock
06c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
06d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
06e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
06f0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0700: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0710: 73 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f  sWriteLock,    /
0720: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69  * True for a wri
0730: 74 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e  te lock */.  con
0740: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
0750: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0760: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0770: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
0780: 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
0790: 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
07a0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  l(pParse);.  int
07b0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   i;.  int nBytes
07c0: 3b 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70  ;.  TableLock *p
07d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
07e0: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62  =0 );..  if( iDb
07f0: 3d 3d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==1 ) return;.  
0800: 69 66 28 20 21 73 71 6c 69 74 65 33 42 74 72 65  if( !sqlite3Btre
0810: 65 53 68 61 72 61 62 6c 65 28 70 50 61 72 73 65  eSharable(pParse
0820: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ->db->aDb[iDb].p
0830: 42 74 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Bt) ) return;.  
0840: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 70 6c  for(i=0; i<pTopl
0850: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0860: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
0870: 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62  &pToplevel->aTab
0880: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0890: 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20 26  f( p->iDb==iDb &
08a0: 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62 20  & p->iTab==iTab 
08b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57 72  ){.      p->isWr
08c0: 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69 73  iteLock = (p->is
08d0: 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73 57  WriteLock || isW
08e0: 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  riteLock);.     
08f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
0900: 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20 73   }..  nBytes = s
0910: 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b 29  izeof(TableLock)
0920: 20 2a 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e   * (pToplevel->n
0930: 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20  TableLock+1);.  
0940: 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c  pToplevel->aTabl
0950: 65 4c 6f 63 6b 20 3d 0a 20 20 20 20 20 20 73 71  eLock =.      sq
0960: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
0970: 46 72 65 65 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  Free(pToplevel->
0980: 64 62 2c 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61  db, pToplevel->a
0990: 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74 65  TableLock, nByte
09a0: 73 29 3b 0a 20 20 69 66 28 20 70 54 6f 70 6c 65  s);.  if( pTople
09b0: 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20  vel->aTableLock 
09c0: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 54 6f 70  ){.    p = &pTop
09d0: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
09e0: 6b 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61  k[pToplevel->nTa
09f0: 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20  bleLock++];.    
0a00: 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  p->iDb = iDb;.  
0a10: 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62    p->iTab = iTab
0a20: 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65  ;.    p->isWrite
0a30: 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f  Lock = isWriteLo
0a40: 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4c 6f 63 6b  ck;.    p->zLock
0a50: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
0a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 70 6c  }else{.    pTopl
0a70: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0a80: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
0a90: 33 4f 6f 6d 46 61 75 6c 74 28 70 54 6f 70 6c 65  3OomFault(pTople
0aa0: 76 65 6c 2d 3e 64 62 29 3b 0a 20 20 7d 0a 7d 0a  vel->db);.  }.}.
0ab0: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
0ac0: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74  P_TableLock inst
0ad0: 72 75 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68  ruction for each
0ae0: 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79   table locked by
0af0: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
0b00: 74 20 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79  t (configured by
0b10: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
0b20: 33 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a  3TableLock())..*
0b30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
0b40: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72  deTableLocks(Par
0b50: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
0b60: 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56  nt i;.  Vdbe *pV
0b70: 64 62 65 3b 20 0a 0a 20 20 70 56 64 62 65 20 3d  dbe; ..  pVdbe =
0b80: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
0b90: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
0ba0: 74 28 20 70 56 64 62 65 21 3d 30 20 29 3b 20 2f  t( pVdbe!=0 ); /
0bb0: 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  * sqlite3GetVdbe
0bc0: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 3a 20 56 44   cannot fail: VD
0bd0: 42 45 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  BE already alloc
0be0: 61 74 65 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  ated */..  for(i
0bf0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54  =0; i<pParse->nT
0c00: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0c10: 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70      TableLock *p
0c20: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62   = &pParse->aTab
0c30: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0c40: 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a  nt p1 = p->iDb;.
0c50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
0c60: 64 64 4f 70 34 28 70 56 64 62 65 2c 20 4f 50 5f  ddOp4(pVdbe, OP_
0c70: 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70  TableLock, p1, p
0c80: 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73 57 72 69  ->iTab, p->isWri
0c90: 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  teLock,.        
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
0cb0: 3e 7a 4c 6f 63 6b 4e 61 6d 65 2c 20 50 34 5f 53  >zLockName, P4_S
0cc0: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  TATIC);.  }.}.#e
0cd0: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f  lse.  #define co
0ce0: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a  deTableLocks(x).
0cf0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0d00: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0d10: 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20 6f   given yDbMask o
0d20: 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20 2d  bject is empty -
0d30: 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 20   if it contains 
0d40: 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20 54  no.** 1 bits.  T
0d50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0d60: 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61 73  sed by the DbMas
0d70: 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20 44  kAllZero() and D
0d80: 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a 2a  bMaskNotZero().*
0d90: 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53 51  * macros when SQ
0da0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0db0: 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  D is greater tha
0dc0: 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  n 30..*/.#if SQL
0dd0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
0de0: 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33 44  >30.int sqlite3D
0df0: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44 62  bMaskAllZero(yDb
0e00: 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20 69  Mask m){.  int i
0e10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
0e20: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b 20  izeof(yDbMask); 
0e30: 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29 20  i++) if( m[i] ) 
0e40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
0e50: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
0e60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0e70: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
0e80: 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  er a single SQL 
0e90: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ea0: 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64  en.** parsed and
0eb0: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20   a VDBE program 
0ec0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20  to execute that 
0ed0: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ee0: 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e 20  en.** prepared. 
0ef0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
0f00: 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e 67  ts the finishing
0f10: 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65 0a   touches on the.
0f20: 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  ** VDBE program 
0f30: 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 70  and resets the p
0f40: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20  Parse structure 
0f50: 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20  for the next.** 
0f60: 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  parse..**.** Not
0f70: 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72 72  e that if an err
0f80: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20  or occurred, it 
0f90: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
0fa0: 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42  e that.** no VDB
0fb0: 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72  E code was gener
0fc0: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
0fd0: 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
0fe0: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
0ff0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1000: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
1010: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
1020: 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a 20  Toplevel==0 );. 
1030: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1040: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1050: 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b  nested ) return;
1060: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1070: 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
1080: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 69  e->nErr ){.    i
1090: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
10a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 72 73  QLITE_OK ) pPars
10b0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
10c0: 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
10d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
10e0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
10f0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
1100: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
1110: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
1120: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
1130: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1140: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
1150: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
1160: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20  isMultiWrite .  
1170: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
1180: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
1190: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  t(v, pParse->may
11a0: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76  Abort));.  if( v
11b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11c0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
11d0: 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53 51 4c 49  Halt);..#if SQLI
11e0: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
11f0: 43 41 54 49 4f 4e 0a 20 20 20 20 69 66 28 20 70  CATION.    if( p
1200: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
1210: 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  k>0 && db->init.
1220: 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  busy==0 ){.     
1230: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
1240: 49 6e 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20  Init(db);.      
1250: 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74  if( db->auth.aut
1260: 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55 73 65  hLevel<UAUTH_Use
1270: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
1280: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1290: 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20 61  rse, "user not a
12a0: 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b 0a  uthenticated");.
12b0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
12c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 48  rc = SQLITE_AUTH
12d0: 5f 55 53 45 52 3b 0a 20 20 20 20 20 20 20 20 72  _USER;.        r
12e0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
12f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1300: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
1310: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
1320: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
1330: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
1340: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
1350: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
1360: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
1370: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
1380: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
1390: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
13a0: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
13b0: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
13c0: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
13d0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
13e0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
13f0: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
1400: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
1410: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
1420: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
1430: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1440: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1450: 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 26 26  iled==0 .     &&
1460: 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72 6f 28   (DbMaskNonZero(
1470: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1480: 73 6b 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70  sk) || pParse->p
1490: 43 6f 6e 73 74 45 78 70 72 29 0a 20 20 20 20 29  ConstExpr).    )
14a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 2c  {.      int iDb,
14b0: 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   i;.      assert
14c0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
14d0: 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f 64 65  Op(v, 0)->opcode
14e0: 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20 20 20  ==OP_Init );.   
14f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1500: 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a 20 20  mpHere(v, 0);.  
1510: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69      for(iDb=0; i
1520: 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
1530: 2b 29 7b 0a 20 20 20 20 20 20 20 20 53 63 68 65  +){.        Sche
1540: 6d 61 20 2a 70 53 63 68 65 6d 61 3b 0a 20 20 20  ma *pSchema;.   
1550: 20 20 20 20 20 69 66 28 20 44 62 4d 61 73 6b 54       if( DbMaskT
1560: 65 73 74 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  est(pParse->cook
1570: 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
1580: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
15a0: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
15b0: 3b 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d  ;.        pSchem
15c0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
15d0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  .pSchema;.      
15e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f0: 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20 20 20  Op4Int(v,.      
1600: 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63 74 69      OP_Transacti
1610: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
1620: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
1630: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 44   */.          iD
1640: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20 20   /* P1 */.      
1670: 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74 28 70      DbMaskTest(p
1680: 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
1690: 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a 2f 0a  ,iDb), /* P2 */.
16a0: 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d            pSchem
16b0: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
16c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
16d0: 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  P3 */.          
16e0: 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
16f0: 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
1700: 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20     /* P4 */.    
1710: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1720: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1730: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
1740: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b  eChangeP5(v, 1);
1750: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
1760: 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20 20 20  ment((v,.       
1770: 20 20 20 20 20 20 20 22 75 73 65 73 53 74 6d 74         "usesStmt
1780: 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70 50 61  Journal=%d", pPa
1790: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20 26 26  rse->mayAbort &&
17a0: 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69   pParse->isMulti
17b0: 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20 20 7d  Write));.      }
17c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
17e0: 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  E.      for(i=0;
17f0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61 62   i<pParse->nVtab
1800: 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Lock; i++){.    
1810: 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20 3d      char *vtab =
1820: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1830: 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 50  GetVTable(db, pP
1840: 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63 6b  arse->apVtabLock
1850: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [i]);.        sq
1860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1870: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c  v, OP_VBegin, 0,
1880: 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f   0, 0, vtab, P4_
1890: 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a 20  VTAB);.      }. 
18a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 74       pParse->nVt
18b0: 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e 64  abLock = 0;.#end
18c0: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 63  if..      /* Onc
18d0: 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69 65  e all the cookie
18e0: 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72 69  s have been veri
18f0: 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61 63  fied and transac
1900: 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a 20  tions opened, . 
1910: 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 74       ** obtain t
1920: 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
1930: 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69 73  e-locks. This is
1940: 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
1950: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 68  the .      ** sh
1960: 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75  ared-cache featu
1970: 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20  re is enabled.. 
1980: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
1990: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50 61  deTableLocks(pPa
19a0: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  rse);..      /* 
19b0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20 41  Initialize any A
19c0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61 74  UTOINCREMENT dat
19d0: 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65 71  a structures req
19e0: 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  uired..      */.
19f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74        sqlite3Aut
1a00: 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e 28  oincrementBegin(
1a10: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1a20: 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e 74  /* Code constant
1a30: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1a40: 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65 64  t where factored
1a50: 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c 6f   out of inner lo
1a60: 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ops */.      if(
1a70: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1a80: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45  xpr ){.        E
1a90: 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20 70  xprList *pEL = p
1aa0: 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
1ab0: 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  r;.        pPars
1ac0: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
1ad0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
1ae0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e 45  r(i=0; i<pEL->nE
1af0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1b00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b10: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
1b20: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  ->a[i].pExpr, pE
1b30: 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73 74  L->a[i].u.iConst
1b40: 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20 20  ExprReg);.      
1b50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
1b60: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a     /* Finally, j
1b70: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1b80: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1b90: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65   executable code
1ba0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1bb0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31 29  e3VdbeGoto(v, 1)
1bc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
1bd0: 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20  /* Get the VDBE 
1be0: 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f  program ready fo
1bf0: 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f  r execution.  */
1c00: 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72  .  if( v && pPar
1c10: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21  se->nErr==0 && !
1c20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c30: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e   ){.    /* A min
1c40: 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73  imum of one curs
1c50: 6f 72 20 69 73 20 72 65 71 75 69 72 65 64 20 69  or is required i
1c60: 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
1c70: 69 73 20 75 73 65 64 0a 20 20 20 20 2a 20 20 53  is used.    *  S
1c80: 65 65 20 74 69 63 6b 65 74 20 5b 61 36 39 36 33  ee ticket [a6963
1c90: 37 39 63 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20  79c1f08866] */. 
1ca0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70     if( pParse->p
1cb0: 41 69 6e 63 21 3d 30 20 26 26 20 70 50 61 72 73  Ainc!=0 && pPars
1cc0: 65 2d 3e 6e 54 61 62 3d 3d 30 20 29 20 70 50 61  e->nTab==0 ) pPa
1cd0: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20  rse->nTab = 1;. 
1ce0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61     sqlite3VdbeMa
1cf0: 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61 72 73  keReady(v, pPars
1d00: 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  e);.    pParse->
1d10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1d20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1d30: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
1d40: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 7d 0a  TE_ERROR;.  }.}.
1d50: 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70  ./*.** Run the p
1d60: 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67  arser and code g
1d70: 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72 73 69  enerator recursi
1d80: 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  vely in order to
1d90: 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64   generate.** cod
1da0: 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74  e for the SQL st
1db0: 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e  atement given on
1dc0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1dd0: 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74  e pParse context
1de0: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
1df0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1e00: 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61 72 73  .  When the pars
1e10: 65 72 20 69 73 20 72 75 6e 20 72 65 63 75 72 73  er is run recurs
1e20: 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61  ively.** this wa
1e30: 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f  y, the final OP_
1e40: 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65  Halt is not appe
1e50: 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69  nded and other i
1e60: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a  nitialization.**
1e70: 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f   and finalizatio
1e80: 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74  n steps are omit
1e90: 74 65 64 20 62 65 63 61 75 73 65 20 74 68 6f 73  ted because thos
1ea0: 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62  e are handling b
1eb0: 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f  y the.** outermo
1ec0: 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a  st parser..**.**
1ed0: 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20   Not everything 
1ee0: 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68  is nestable.  Th
1ef0: 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20 64  is facility is d
1f00: 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69  esigned to permi
1f10: 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44  t.** INSERT, UPD
1f20: 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20  ATE, and DELETE 
1f30: 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e  operations again
1f40: 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  st SQLITE_MASTER
1f50: 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69  .  Use.** care i
1f60: 66 20 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20  f you decide to 
1f70: 74 72 79 20 74 6f 20 75 73 65 20 74 68 69 73 20  try to use this 
1f80: 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65  routine for some
1f90: 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e   other purposes.
1fa0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1fb0: 4e 65 73 74 65 64 50 61 72 73 65 28 50 61 72 73  NestedParse(Pars
1fc0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
1fd0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
1fe0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
1ff0: 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  ap;.  char *zSql
2000: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
2010: 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  g = 0;.  sqlite3
2020: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
2030: 62 3b 0a 20 20 63 68 61 72 20 73 61 76 65 42 75  b;.  char saveBu
2040: 66 5b 50 41 52 53 45 5f 54 41 49 4c 5f 53 5a 5d  f[PARSE_TAIL_SZ]
2050: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
2060: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  >nErr ) return;.
2070: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
2080: 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b 20 20  ->nested<10 );  
2090: 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c  /* Nesting shoul
20a0: 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d  d only be of lim
20b0: 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a 20 20  ited depth */.  
20c0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
20d0: 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  rmat);.  zSql = 
20e0: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
20f0: 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  db, zFormat, ap)
2100: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
2110: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b    if( zSql==0 ){
2120: 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20 20 2f  .    return;   /
2130: 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74 20  * A malloc must 
2140: 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  have failed */. 
2150: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73   }.  pParse->nes
2160: 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28  ted++;.  memcpy(
2170: 73 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f 54  saveBuf, PARSE_T
2180: 41 49 4c 28 70 50 61 72 73 65 29 2c 20 50 41 52  AIL(pParse), PAR
2190: 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 6d  SE_TAIL_SZ);.  m
21a0: 65 6d 73 65 74 28 50 41 52 53 45 5f 54 41 49 4c  emset(PARSE_TAIL
21b0: 28 70 50 61 72 73 65 29 2c 20 30 2c 20 50 41 52  (pParse), 0, PAR
21c0: 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 73  SE_TAIL_SZ);.  s
21d0: 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28  qlite3RunParser(
21e0: 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a  pParse, zSql, &z
21f0: 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
2200: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72  e3DbFree(db, zEr
2210: 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  rMsg);.  sqlite3
2220: 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29  DbFree(db, zSql)
2230: 3b 0a 20 20 6d 65 6d 63 70 79 28 50 41 52 53 45  ;.  memcpy(PARSE
2240: 5f 54 41 49 4c 28 70 50 61 72 73 65 29 2c 20 73  _TAIL(pParse), s
2250: 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f 54 41  aveBuf, PARSE_TA
2260: 49 4c 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73 65  IL_SZ);.  pParse
2270: 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 23  ->nested--;.}..#
2280: 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  if SQLITE_USER_A
2290: 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a  UTHENTICATION./*
22a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
22b0: 69 66 20 7a 54 61 62 6c 65 20 69 73 20 74 68 65  if zTable is the
22c0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73   name of the sys
22d0: 74 65 6d 20 74 61 62 6c 65 20 74 68 61 74 20 73  tem table that s
22e0: 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6c 69 73  tores the.** lis
22f0: 74 20 6f 66 20 75 73 65 72 73 20 61 6e 64 20 74  t of users and t
2300: 68 65 69 72 20 61 63 63 65 73 73 20 63 72 65 64  heir access cred
2310: 65 6e 74 69 61 6c 73 2e 0a 2a 2f 0a 69 6e 74 20  entials..*/.int 
2320: 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54  sqlite3UserAuthT
2330: 61 62 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20  able(const char 
2340: 2a 7a 54 61 62 6c 65 29 7b 0a 20 20 72 65 74 75  *zTable){.  retu
2350: 72 6e 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  rn sqlite3_stric
2360: 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69  mp(zTable, "sqli
2370: 74 65 5f 75 73 65 72 22 29 3d 3d 30 3b 0a 7d 0a  te_user")==0;.}.
2380: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  #endif../*.** Lo
2390: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
23a0: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
23b0: 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61  t describes a pa
23c0: 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
23d0: 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e  e.** table given
23e0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
23f0: 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74  t table and (opt
2400: 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d  ionally) the nam
2410: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
2420: 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
2430: 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
2440: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
2450: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
2460: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
2470: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
2480: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
2490: 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a  e table and the.
24a0: 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  ** first matchin
24b0: 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75 72  g table is retur
24c0: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
24d0: 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  ng for duplicate
24e0: 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20   table.** names 
24f0: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
2500: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 20 54  earch order is T
2510: 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20  EMP first, then 
2520: 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a  MAIN, then any.*
2530: 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  * auxiliary data
2540: 62 61 73 65 73 20 61 64 64 65 64 20 75 73 69 6e  bases added usin
2550: 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d  g the ATTACH com
2560: 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  mand..**.** See 
2570: 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61  also sqlite3Loca
2580: 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61  teTable()..*/.Ta
2590: 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  ble *sqlite3Find
25a0: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
25b0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
25c0: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
25d0: 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20 20   *zDatabase){.  
25e0: 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20  Table *p = 0;.  
25f0: 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  int i;..  /* All
2600: 20 6d 75 74 65 78 65 73 20 61 72 65 20 72 65 71   mutexes are req
2610: 75 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d 61  uired for schema
2620: 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20 73   access.  Make s
2630: 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65 6d  ure we hold them
2640: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a  . */.  assert( z
2650: 44 61 74 61 62 61 73 65 21 3d 30 20 7c 7c 20 73  Database!=0 || s
2660: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
2670: 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29  AllMutexes(db) )
2680: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  ;.#if SQLITE_USE
2690: 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
26a0: 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20 61  .  /* Only the a
26b0: 64 6d 69 6e 20 75 73 65 72 20 69 73 20 61 6c 6c  dmin user is all
26c0: 6f 77 65 64 20 74 6f 20 6b 6e 6f 77 20 74 68 61  owed to know tha
26d0: 74 20 74 68 65 20 73 71 6c 69 74 65 5f 75 73 65  t the sqlite_use
26e0: 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 65 78 69  r table.  ** exi
26f0: 73 74 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  sts */.  if( db-
2700: 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c 3c  >auth.authLevel<
2710: 55 41 55 54 48 5f 41 64 6d 69 6e 20 26 26 20 73  UAUTH_Admin && s
2720: 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54 61  qlite3UserAuthTa
2730: 62 6c 65 28 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  ble(zName)!=0 ){
2740: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2750: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68 69 6c   }.#endif.  whil
2760: 65 28 31 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  e(1){.    for(i=
2770: 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64  OMIT_TEMPDB; i<d
2780: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
2790: 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32      int j = (i<2
27a0: 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f  ) ? i^1 : i;   /
27b0: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
27c0: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
27d0: 20 20 20 69 66 28 20 7a 44 61 74 61 62 61 73 65     if( zDatabase
27e0: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74  ==0 || sqlite3St
27f0: 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65 2c  rICmp(zDatabase,
2800: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62 53   db->aDb[j].zDbS
2810: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
2820: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
2830: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
2840: 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a  ld(db, j, 0) );.
2850: 20 20 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69          p = sqli
2860: 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
2870: 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d  >aDb[j].pSchema-
2880: 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 29  >tblHash, zName)
2890: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 20  ;.        if( p 
28a0: 29 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20  ) return p;.    
28b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a    }.    }.    /*
28c0: 20 4e 6f 74 20 66 6f 75 6e 64 2e 20 20 49 66 20   Not found.  If 
28d0: 74 68 65 20 6e 61 6d 65 20 77 65 20 77 65 72 65  the name we were
28e0: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 77 61 73   looking for was
28f0: 20 74 65 6d 70 2e 73 71 6c 69 74 65 5f 6d 61 73   temp.sqlite_mas
2900: 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ter.    ** then 
2910: 63 68 61 6e 67 65 20 74 68 65 20 6e 61 6d 65 20  change the name 
2920: 74 6f 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  to sqlite_temp_m
2930: 61 73 74 65 72 20 61 6e 64 20 74 72 79 20 61 67  aster and try ag
2940: 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ain. */.    if( 
2950: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
2960: 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d  Name, MASTER_NAM
2970: 45 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  E)!=0 ) break;. 
2980: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
2990: 74 72 69 63 6d 70 28 7a 44 61 74 61 62 61 73 65  tricmp(zDatabase
29a0: 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 44 62  , db->aDb[1].zDb
29b0: 53 4e 61 6d 65 29 21 3d 30 20 29 20 62 72 65 61  SName)!=0 ) brea
29c0: 6b 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54  k;.    zName = T
29d0: 45 4d 50 5f 4d 41 53 54 45 52 5f 4e 41 4d 45 3b  EMP_MASTER_NAME;
29e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
29f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  .}../*.** Locate
2a00: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   the in-memory s
2a10: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
2a20: 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63  scribes a partic
2a30: 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a  ular database.**
2a40: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65   table given the
2a50: 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61   name of that ta
2a60: 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61  ble and (optiona
2a70: 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66  lly) the name of
2a80: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
2a90: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
2aa0: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e  table.  Return N
2ab0: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
2ac0: 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e  .  Also leave an
2ad0: 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67  .** error messag
2ae0: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
2af0: 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rMsg..**.** The 
2b00: 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
2b10: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2b20: 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 54  and sqlite3FindT
2b30: 61 62 6c 65 28 29 20 69 73 20 74 68 61 74 20 74  able() is that t
2b40: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6c  his.** routine l
2b50: 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d  eaves an error m
2b60: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
2b70: 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65 0a  ->zErrMsg where.
2b80: 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  ** sqlite3FindTa
2b90: 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a  ble() does not..
2ba0: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
2bb0: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 0a 20 20  3LocateTable(.  
2bc0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2bd0: 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65 78         /* contex
2be0: 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 72 65  t in which to re
2bf0: 70 6f 72 74 20 65 72 72 6f 72 73 20 2a 2f 0a 20  port errors */. 
2c00: 20 75 33 32 20 66 6c 61 67 73 2c 20 20 20 20 20   u32 flags,     
2c10: 20 20 20 20 20 20 20 20 2f 2a 20 4c 4f 43 41 54          /* LOCAT
2c20: 45 5f 56 49 45 57 20 6f 72 20 4c 4f 43 41 54 45  E_VIEW or LOCATE
2c30: 5f 4e 4f 45 52 52 20 2a 2f 0a 20 20 63 6f 6e 73  _NOERR */.  cons
2c40: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
2c50: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2c60: 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 6c  e table we are l
2c70: 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20  ooking for */.  
2c80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 61  const char *zDba
2c90: 73 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  se     /* Name o
2ca0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
2cb0: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
2cc0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
2cd0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2ce0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
2cf0: 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
2d00: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
2d10: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
2d20: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
2d30: 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
2d40: 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
2d50: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
2d60: 20 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d 3e 6d   */.  if( (db->m
2d70: 44 62 46 6c 61 67 73 20 26 20 44 42 46 4c 41 47  DbFlags & DBFLAG
2d80: 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 29 3d  _SchemaKnownOk)=
2d90: 3d 30 20 0a 20 20 20 26 26 20 53 51 4c 49 54 45  =0 .   && SQLITE
2da0: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
2db0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 0a 20  Schema(pParse). 
2dc0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
2dd0: 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c  ;.  }..  p = sql
2de0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
2df0: 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29  , zName, zDbase)
2e00: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
2e10: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2e20: 7a 4d 73 67 20 3d 20 66 6c 61 67 73 20 26 20 4c  zMsg = flags & L
2e30: 4f 43 41 54 45 5f 56 49 45 57 20 3f 20 22 6e 6f  OCATE_VIEW ? "no
2e40: 20 73 75 63 68 20 76 69 65 77 22 20 3a 20 22 6e   such view" : "n
2e50: 6f 20 73 75 63 68 20 74 61 62 6c 65 22 3b 0a 23  o such table";.#
2e60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2e70: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
2e80: 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20      /* If zName 
2e90: 69 73 20 74 68 65 20 6e 6f 74 20 74 68 65 20 6e  is the not the n
2ea0: 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 69  ame of a table i
2eb0: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 63 72 65  n the schema cre
2ec0: 61 74 65 64 20 75 73 69 6e 67 0a 20 20 20 20 2a  ated using.    *
2ed0: 2a 20 43 52 45 41 54 45 2c 20 74 68 65 6e 20 63  * CREATE, then c
2ee0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
2ef0: 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  t is the name of
2f00: 20 61 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c   an virtual tabl
2f10: 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 61  e that.    ** ca
2f20: 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79 6d 6f 75  n be an eponymou
2f30: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  s virtual table.
2f40: 20 2a 2f 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a   */.    Module *
2f50: 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 2a 29  pMod = (Module*)
2f60: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
2f70: 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20 7a 4e  &db->aModule, zN
2f80: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4d  ame);.    if( pM
2f90: 6f 64 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33  od==0 && sqlite3
2fa0: 5f 73 74 72 6e 69 63 6d 70 28 7a 4e 61 6d 65 2c  _strnicmp(zName,
2fb0: 20 22 70 72 61 67 6d 61 5f 22 2c 20 37 29 3d 3d   "pragma_", 7)==
2fc0: 30 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f 64 20  0 ){.      pMod 
2fd0: 3d 20 73 71 6c 69 74 65 33 50 72 61 67 6d 61 56  = sqlite3PragmaV
2fe0: 74 61 62 52 65 67 69 73 74 65 72 28 64 62 2c 20  tabRegister(db, 
2ff0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
3000: 20 20 69 66 28 20 70 4d 6f 64 20 26 26 20 73 71    if( pMod && sq
3010: 6c 69 74 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f  lite3VtabEponymo
3020: 75 73 54 61 62 6c 65 49 6e 69 74 28 70 50 61 72  usTableInit(pPar
3030: 73 65 2c 20 70 4d 6f 64 29 20 29 7b 0a 20 20 20  se, pMod) ){.   
3040: 20 20 20 72 65 74 75 72 6e 20 70 4d 6f 64 2d 3e     return pMod->
3050: 70 45 70 6f 54 61 62 3b 0a 20 20 20 20 7d 0a 23  pEpoTab;.    }.#
3060: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 66  endif.    if( (f
3070: 6c 61 67 73 20 26 20 4c 4f 43 41 54 45 5f 4e 4f  lags & LOCATE_NO
3080: 45 52 52 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ERR)==0 ){.     
3090: 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b 0a 20   if( zDbase ){. 
30a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
30b0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
30c0: 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a 4d 73 67  %s: %s.%s", zMsg
30d0: 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29  , zDbase, zName)
30e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
30f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
3100: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3110: 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c 20 7a  %s: %s", zMsg, z
3120: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
3130: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65       pParse->che
3140: 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
3150: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
3160: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  n p;.}../*.** Lo
3170: 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69  cate the table i
3180: 64 65 6e 74 69 66 69 65 64 20 62 79 20 2a 70 2e  dentified by *p.
3190: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
31a0: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
31b0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
31c0: 6c 65 28 29 2e 20 54 68 65 20 64 69 66 66 65 72  le(). The differ
31d0: 65 6e 63 65 20 62 65 74 77 65 65 6e 0a 2a 2a 20  ence between.** 
31e0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
31f0: 6c 65 28 29 20 61 6e 64 20 74 68 69 73 20 66 75  le() and this fu
3200: 6e 63 74 69 6f 6e 20 69 73 20 74 68 61 74 20 74  nction is that t
3210: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 73  his function res
3220: 74 72 69 63 74 73 0a 2a 2a 20 74 68 65 20 73 65  tricts.** the se
3230: 61 72 63 68 20 74 6f 20 73 63 68 65 6d 61 20 28  arch to schema (
3240: 70 2d 3e 70 53 63 68 65 6d 61 29 20 69 66 20 69  p->pSchema) if i
3250: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20 70  t is not NULL. p
3260: 2d 3e 70 53 63 68 65 6d 61 20 6d 61 79 20 62 65  ->pSchema may be
3270: 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20  .** non-NULL if 
3280: 69 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  it is part of a 
3290: 76 69 65 77 20 6f 72 20 74 72 69 67 67 65 72 20  view or trigger 
32a0: 70 72 6f 67 72 61 6d 20 64 65 66 69 6e 69 74 69  program definiti
32b0: 6f 6e 2e 20 53 65 65 0a 2a 2a 20 73 71 6c 69 74  on. See.** sqlit
32c0: 65 33 46 69 78 53 72 63 4c 69 73 74 28 29 20 66  e3FixSrcList() f
32d0: 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 54  or details..*/.T
32e0: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63  able *sqlite3Loc
32f0: 61 74 65 54 61 62 6c 65 49 74 65 6d 28 0a 20 20  ateTableItem(.  
3300: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
3310: 20 20 75 33 32 20 66 6c 61 67 73 2c 0a 20 20 73    u32 flags,.  s
3320: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
3330: 65 6d 20 2a 70 0a 29 7b 0a 20 20 63 6f 6e 73 74  em *p.){.  const
3340: 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 61 73   char *zDb;.  as
3350: 73 65 72 74 28 20 70 2d 3e 70 53 63 68 65 6d 61  sert( p->pSchema
3360: 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 61 74 61 62  ==0 || p->zDatab
3370: 61 73 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ase==0 );.  if( 
3380: 70 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  p->pSchema ){.  
3390: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
33a0: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
33b0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
33c0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7a 44  pSchema);.    zD
33d0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  b = pParse->db->
33e0: 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
33f0: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
3400: 7a 44 62 20 3d 20 70 2d 3e 7a 44 61 74 61 62 61  zDb = p->zDataba
3410: 73 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  se;.  }.  return
3420: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
3430: 62 6c 65 28 70 50 61 72 73 65 2c 20 66 6c 61 67  ble(pParse, flag
3440: 73 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  s, p->zName, zDb
3450: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  );.}../*.** Loca
3460: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
3470: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
3480: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
3490: 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
34a0: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
34b0: 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a  of that index.**
34c0: 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66   and the name of
34d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
34e0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
34f0: 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e  index..** Return
3500: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
3510: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61  nd..**.** If zDa
3520: 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c  tabase is 0, all
3530: 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73   databases are s
3540: 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a  earched for the.
3550: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  ** table and the
3560: 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20   first matching 
3570: 69 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e 65  index is returne
3580: 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67  d.  (No checking
3590: 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74  .** for duplicat
35a0: 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69 73  e index names is
35b0: 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61   done.)  The sea
35c0: 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20  rch order is.** 
35d0: 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e  TEMP first, then
35e0: 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20   MAIN, then any 
35f0: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
3600: 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69  ses added.** usi
3610: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
3620: 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20  mmand..*/.Index 
3630: 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65  *sqlite3FindInde
3640: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  x(sqlite3 *db, c
3650: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
3660: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
3670: 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  b){.  Index *p =
3680: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 2f   0;.  int i;.  /
3690: 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72  * All mutexes ar
36a0: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  e required for s
36b0: 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d  chema access.  M
36c0: 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64  ake sure we hold
36d0: 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65   them. */.  asse
36e0: 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20 73 71  rt( zDb!=0 || sq
36f0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
3700: 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b  llMutexes(db) );
3710: 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45  .  for(i=OMIT_TE
3720: 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  MPDB; i<db->nDb;
3730: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
3740: 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a   = (i<2) ? i^1 :
3750: 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54   i;  /* Search T
3760: 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20  EMP before MAIN 
3770: 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  */.    Schema *p
3780: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
3790: 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20  [j].pSchema;.   
37a0: 20 61 73 73 65 72 74 28 20 70 53 63 68 65 6d 61   assert( pSchema
37b0: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20   );.    if( zDb 
37c0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
37d0: 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a  p(zDb, db->aDb[j
37e0: 5d 2e 7a 44 62 53 4e 61 6d 65 29 20 29 20 63 6f  ].zDbSName) ) co
37f0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
3800: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
3810: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a  aMutexHeld(db, j
3820: 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 20 3d 20  , 0) );.    p = 
3830: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
3840: 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  &pSchema->idxHas
3850: 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  h, zName);.    i
3860: 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20  f( p ) break;.  
3870: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
3880: 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74  ./*.** Reclaim t
3890: 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  he memory used b
38a0: 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 76 6f  y an index.*/.vo
38b0: 69 64 20 73 71 6c 69 74 65 33 46 72 65 65 49 6e  id sqlite3FreeIn
38c0: 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dex(sqlite3 *db,
38d0: 20 49 6e 64 65 78 20 2a 70 29 7b 0a 23 69 66 6e   Index *p){.#ifn
38e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
38f0: 41 4e 41 4c 59 5a 45 0a 20 20 73 71 6c 69 74 65  ANALYZE.  sqlite
3900: 33 44 65 6c 65 74 65 49 6e 64 65 78 53 61 6d 70  3DeleteIndexSamp
3910: 6c 65 73 28 64 62 2c 20 70 29 3b 0a 23 65 6e 64  les(db, p);.#end
3920: 69 66 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  if.  sqlite3Expr
3930: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50  Delete(db, p->pP
3940: 61 72 74 49 64 78 57 68 65 72 65 29 3b 0a 20 20  artIdxWhere);.  
3950: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
3960: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 61 43 6f  elete(db, p->aCo
3970: 6c 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  lExpr);.  sqlite
3980: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
3990: 43 6f 6c 41 66 66 29 3b 0a 20 20 69 66 28 20 70  ColAff);.  if( p
39a0: 2d 3e 69 73 52 65 73 69 7a 65 64 20 29 20 73 71  ->isResized ) sq
39b0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
39c0: 28 76 6f 69 64 20 2a 29 70 2d 3e 61 7a 43 6f 6c  (void *)p->azCol
39d0: 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  l);.#ifdef SQLIT
39e0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
39f0: 52 5f 53 54 41 54 34 0a 20 20 73 71 6c 69 74 65  R_STAT4.  sqlite
3a00: 33 5f 66 72 65 65 28 70 2d 3e 61 69 52 6f 77 45  3_free(p->aiRowE
3a10: 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  st);.#endif.  sq
3a20: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3a30: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  p);.}../*.** For
3a40: 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c 6c 65   the index calle
3a50: 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69 63 68  d zIdxName which
3a60: 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   is found in the
3a70: 20 64 61 74 61 62 61 73 65 20 69 44 62 2c 0a 2a   database iDb,.*
3a80: 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20 69 6e  * unlike that in
3a90: 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54 61 62  dex from its Tab
3aa0: 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74  le then remove t
3ab0: 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a 2a 2a  he index from.**
3ac0: 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20   the index hash 
3ad0: 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65 20 61  table and free a
3ae0: 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  ll memory struct
3af0: 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a  ures associated.
3b00: 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 64 65  ** with the inde
3b10: 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  x..*/.void sqlit
3b20: 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  e3UnlinkAndDelet
3b30: 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a  eIndex(sqlite3 *
3b40: 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e  db, int iDb, con
3b50: 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e 61 6d  st char *zIdxNam
3b60: 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  e){.  Index *pIn
3b70: 64 65 78 3b 0a 20 20 48 61 73 68 20 2a 70 48 61  dex;.  Hash *pHa
3b80: 73 68 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  sh;..  assert( s
3b90: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
3ba0: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
3bb0: 29 20 29 3b 0a 20 20 70 48 61 73 68 20 3d 20 26  ) );.  pHash = &
3bc0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
3bd0: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20  hema->idxHash;. 
3be0: 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
3bf0: 33 48 61 73 68 49 6e 73 65 72 74 28 70 48 61 73  3HashInsert(pHas
3c00: 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 30 29 3b  h, zIdxName, 0);
3c10: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49  .  if( ALWAYS(pI
3c20: 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69 66 28  ndex) ){.    if(
3c30: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
3c40: 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20  >pIndex==pIndex 
3c50: 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
3c60: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20  >pTable->pIndex 
3c70: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
3c80: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3c90: 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
3ca0: 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69    /* Justificati
3cb0: 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28 29 3b 20  on of ALWAYS(); 
3cc0: 20 54 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20   The index must 
3cd0: 62 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f  be on the list o
3ce0: 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63  f.      ** indic
3cf0: 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 20 3d  es. */.      p =
3d00: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
3d10: 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77  >pIndex;.      w
3d20: 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 29 20  hile( ALWAYS(p) 
3d30: 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e  && p->pNext!=pIn
3d40: 64 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e  dex ){ p = p->pN
3d50: 65 78 74 3b 20 7d 0a 20 20 20 20 20 20 69 66 28  ext; }.      if(
3d60: 20 41 4c 57 41 59 53 28 70 20 26 26 20 70 2d 3e   ALWAYS(p && p->
3d70: 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29 20 29  pNext==pIndex) )
3d80: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65  {.        p->pNe
3d90: 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  xt = pIndex->pNe
3da0: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
3db0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 72 65  }.    sqlite3Fre
3dc0: 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  eIndex(db, pInde
3dd0: 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6d 44  x);.  }.  db->mD
3de0: 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47  bFlags |= DBFLAG
3df0: 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 7d  _SchemaChange;.}
3e00: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 74 68 72  ../*.** Look thr
3e10: 6f 75 67 68 20 74 68 65 20 6c 69 73 74 20 6f 66  ough the list of
3e20: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
3e30: 69 6c 65 73 20 69 6e 20 64 62 2d 3e 61 44 62 5b  iles in db->aDb[
3e40: 5d 20 61 6e 64 20 69 66 0a 2a 2a 20 61 6e 79 20  ] and if.** any 
3e50: 68 61 76 65 20 62 65 65 6e 20 63 6c 6f 73 65 64  have been closed
3e60: 2c 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72  , remove them fr
3e70: 6f 6d 20 74 68 65 20 6c 69 73 74 2e 20 20 52 65  om the list.  Re
3e80: 61 6c 6c 6f 63 61 74 65 20 74 68 65 0a 2a 2a 20  allocate the.** 
3e90: 64 62 2d 3e 61 44 62 5b 5d 20 73 74 72 75 63 74  db->aDb[] struct
3ea0: 75 72 65 20 74 6f 20 61 20 73 6d 61 6c 6c 65 72  ure to a smaller
3eb0: 20 73 69 7a 65 2c 20 69 66 20 70 6f 73 73 69 62   size, if possib
3ec0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 79 20  le..**.** Entry 
3ed0: 30 20 28 74 68 65 20 22 6d 61 69 6e 22 20 64 61  0 (the "main" da
3ee0: 74 61 62 61 73 65 29 20 61 6e 64 20 65 6e 74 72  tabase) and entr
3ef0: 79 20 31 20 28 74 68 65 20 22 74 65 6d 70 22 20  y 1 (the "temp" 
3f00: 64 61 74 61 62 61 73 65 29 0a 2a 2a 20 61 72 65  database).** are
3f10: 20 6e 65 76 65 72 20 63 61 6e 64 69 64 61 74 65   never candidate
3f20: 73 20 66 6f 72 20 62 65 69 6e 67 20 63 6f 6c 6c  s for being coll
3f30: 61 70 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  apsed..*/.void s
3f40: 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61  qlite3CollapseDa
3f50: 74 61 62 61 73 65 41 72 72 61 79 28 73 71 6c 69  tabaseArray(sqli
3f60: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
3f70: 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  i, j;.  for(i=j=
3f80: 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  2; i<db->nDb; i+
3f90: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44  +){.    struct D
3fa0: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
3fb0: 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
3fc0: 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  b->pBt==0 ){.   
3fd0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3fe0: 28 64 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61  (db, pDb->zDbSNa
3ff0: 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  me);.      pDb->
4000: 7a 44 62 53 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  zDbSName = 0;.  
4010: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
4020: 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69 20    }.    if( j<i 
4030: 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ){.      db->aDb
4040: 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  [j] = db->aDb[i]
4050: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b  ;.    }.    j++;
4060: 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 44 62 20 3d  .  }.  db->nDb =
4070: 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44   j;.  if( db->nD
4080: 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21  b<=2 && db->aDb!
4090: 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29  =db->aDbStatic )
40a0: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d  {.    memcpy(db-
40b0: 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e  >aDbStatic, db->
40c0: 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62  aDb, 2*sizeof(db
40d0: 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20  ->aDb[0]));.    
40e0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
40f0: 2c 20 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20  , db->aDb);.    
4100: 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44  db->aDb = db->aD
4110: 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a  bStatic;.  }.}..
4120: 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20  /*.** Reset the 
4130: 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 20 64  schema for the d
4140: 61 74 61 62 61 73 65 20 61 74 20 69 6e 64 65 78  atabase at index
4150: 20 69 44 62 2e 20 20 41 6c 73 6f 20 72 65 73 65   iDb.  Also rese
4160: 74 20 74 68 65 0a 2a 2a 20 54 45 4d 50 20 73 63  t the.** TEMP sc
4170: 68 65 6d 61 2e 20 20 54 68 65 20 72 65 73 65 74  hema.  The reset
4180: 20 69 73 20 64 65 66 65 72 72 65 64 20 69 66 20   is deferred if 
4190: 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 20  db->nSchemaLock 
41a0: 69 73 20 6e 6f 74 20 7a 65 72 6f 2e 0a 2a 2a 20  is not zero..** 
41b0: 44 65 66 65 72 72 65 64 20 72 65 73 65 74 73 20  Deferred resets 
41c0: 6d 61 79 20 62 65 20 72 75 6e 20 62 79 20 63 61  may be run by ca
41d0: 6c 6c 69 6e 67 20 77 69 74 68 20 69 44 62 3c 30  lling with iDb<0
41e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
41f0: 33 52 65 73 65 74 4f 6e 65 53 63 68 65 6d 61 28  3ResetOneSchema(
4200: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
4210: 20 69 44 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   iDb){.  int i;.
4220: 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62    assert( iDb<db
4230: 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 69 66 28 20  ->nDb );..  if( 
4240: 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73  iDb>=0 ){.    as
4250: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
4260: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
4270: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
4280: 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 64 62  DbSetProperty(db
4290: 2c 20 69 44 62 2c 20 44 42 5f 52 65 73 65 74 57  , iDb, DB_ResetW
42a0: 61 6e 74 65 64 29 3b 0a 20 20 20 20 44 62 53 65  anted);.    DbSe
42b0: 74 50 72 6f 70 65 72 74 79 28 64 62 2c 20 31 2c  tProperty(db, 1,
42c0: 20 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64 29   DB_ResetWanted)
42d0: 3b 0a 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61  ;.    db->mDbFla
42e0: 67 73 20 26 3d 20 7e 44 42 46 4c 41 47 5f 53 63  gs &= ~DBFLAG_Sc
42f0: 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 3b 0a 20 20 7d  hemaKnownOk;.  }
4300: 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 63 68 65  .  if( db->nSche
4310: 6d 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  maLock==0 ){.   
4320: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
4330: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
4340: 20 69 66 28 20 44 62 48 61 73 50 72 6f 70 65 72   if( DbHasProper
4350: 74 79 28 64 62 2c 20 69 2c 20 44 42 5f 52 65 73  ty(db, i, DB_Res
4360: 65 74 57 61 6e 74 65 64 29 20 29 7b 0a 20 20 20  etWanted) ){.   
4370: 20 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65       sqlite3Sche
4380: 6d 61 5a 65 72 6f 28 64 62 2c 20 69 29 3b 0a 20  maZero(db, i);. 
4390: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
43a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
43b0: 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72  all schema infor
43c0: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 6c 6c 20  mation from all 
43d0: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
43e0: 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a  es (including.**
43f0: 20 22 6d 61 69 6e 22 20 61 6e 64 20 22 74 65 6d   "main" and "tem
4400: 70 22 29 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  p") for a single
4410: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
4420: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
4430: 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
4440: 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
4450: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
4460: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
4470: 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64  3BtreeEnterAll(d
4480: 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  b);.  assert( db
4490: 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 3d 3d 30  ->nSchemaLock==0
44a0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
44b0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 3d 28 69 3f 69  <db->nDb; i=(i?i
44c0: 2b 31 3a 32 29 29 7b 0a 20 20 20 20 44 62 20 2a  +1:2)){.    Db *
44d0: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
44e0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
44f0: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
4500: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c   sqlite3SchemaCl
4510: 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61  ear(pDb->pSchema
4520: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
4530: 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61  qlite3SchemaClea
4540: 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  r(db->aDb[1].pSc
4550: 68 65 6d 61 29 3b 0a 20 20 64 62 2d 3e 6d 44 62  hema);.  db->mDb
4560: 46 6c 61 67 73 20 26 3d 20 7e 28 44 42 46 4c 41  Flags &= ~(DBFLA
4570: 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 7c 44  G_SchemaChange|D
4580: 42 46 4c 41 47 5f 53 63 68 65 6d 61 4b 6e 6f 77  BFLAG_SchemaKnow
4590: 6e 4f 6b 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  nOk);.  sqlite3V
45a0: 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62  tabUnlockList(db
45b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
45c0: 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20  eLeaveAll(db);. 
45d0: 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65   sqlite3Collapse
45e0: 44 61 74 61 62 61 73 65 41 72 72 61 79 28 64 62  DatabaseArray(db
45f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
4600: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
4610: 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74  ed when a commit
4620: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64   occurs..*/.void
4630: 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
4640: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71  ternalChanges(sq
4650: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62  lite3 *db){.  db
4660: 2d 3e 6d 44 62 46 6c 61 67 73 20 26 3d 20 7e 44  ->mDbFlags &= ~D
4670: 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e  BFLAG_SchemaChan
4680: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  ge;.}../*.** Del
4690: 65 74 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ete memory alloc
46a0: 61 74 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c  ated for the col
46b0: 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 20 61 20 74  umn names of a t
46c0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 28 74 68  able or view (th
46d0: 65 0a 2a 2a 20 54 61 62 6c 65 2e 61 43 6f 6c 5b  e.** Table.aCol[
46e0: 5d 20 61 72 72 61 79 29 2e 0a 2a 2f 0a 76 6f 69  ] array)..*/.voi
46f0: 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 43  d sqlite3DeleteC
4700: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 73 71 6c 69 74  olumnNames(sqlit
4710: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
4720: 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Table){.  int i;
4730: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
4740: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
4750: 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70  e!=0 );.  if( (p
4760: 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43  Col = pTable->aC
4770: 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f  ol)!=0 ){.    fo
4780: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d  r(i=0; i<pTable-
4790: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
47a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
47b0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
47c0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
47d0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
47e0: 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66  te(db, pCol->pDf
47f0: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
4800: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
4810: 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d  l->zColl);.    }
4820: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
4830: 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61  ee(db, pTable->a
4840: 43 6f 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Col);.  }.}../*.
4850: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65  ** Remove the me
4860: 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74  mory data struct
4870: 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ures associated 
4880: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a  with the given.*
4890: 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61  * Table.  No cha
48a0: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
48b0: 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f   disk by this ro
48c0: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  utine..**.** Thi
48d0: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64  s routine just d
48e0: 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20  eletes the data 
48f0: 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64  structure.  It d
4900: 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a  oes not unlink.*
4910: 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61  * the table data
4920: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
4930: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20  the hash table. 
4940: 20 42 75 74 20 69 74 20 64 6f 65 73 20 64 65 73   But it does des
4950: 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73  troy.** memory s
4960: 74 72 75 63 74 75 72 65 73 20 6f 66 20 74 68 65  tructures of the
4970: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
4980: 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69  eign keys associ
4990: 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68  ated with .** th
49a0: 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  e table..**.** T
49b0: 68 65 20 64 62 20 70 61 72 61 6d 65 74 65 72 20  he db parameter 
49c0: 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 74  is optional.  It
49d0: 20 69 73 20 6e 65 65 64 65 64 20 69 66 20 74 68   is needed if th
49e0: 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 0a  e Table object .
49f0: 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b  ** contains look
4a00: 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 20 20 28  aside memory.  (
4a10: 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 69 6e  Table objects in
4a20: 20 74 68 65 20 73 63 68 65 6d 61 20 64 6f 20 6e   the schema do n
4a30: 6f 74 20 75 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73  ot use.** lookas
4a40: 69 64 65 20 6d 65 6d 6f 72 79 2c 20 62 75 74 20  ide memory, but 
4a50: 73 6f 6d 65 20 65 70 68 65 6d 65 72 61 6c 20 54  some ephemeral T
4a60: 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 64 6f 2e  able objects do.
4a70: 29 20 20 4f 72 20 74 68 65 0a 2a 2a 20 64 62 20  )  Or the.** db 
4a80: 70 61 72 61 6d 65 74 65 72 20 63 61 6e 20 62 65  parameter can be
4a90: 20 75 73 65 64 20 77 69 74 68 20 64 62 2d 3e 70   used with db->p
4aa0: 6e 42 79 74 65 73 46 72 65 65 64 20 74 6f 20 6d  nBytesFreed to m
4ab0: 65 61 73 75 72 65 20 74 68 65 20 6d 65 6d 6f 72  easure the memor
4ac0: 79 0a 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65  y.** used by the
4ad0: 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a   Table object..*
4ae0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 51  /.static void SQ
4af0: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 64 65  LITE_NOINLINE de
4b00: 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65  leteTable(sqlite
4b10: 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54  3 *db, Table *pT
4b20: 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a  able){.  Index *
4b30: 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a  pIndex, *pNext;.
4b40: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
4b50: 45 42 55 47 0a 20 20 2f 2a 20 52 65 63 6f 72 64  EBUG.  /* Record
4b60: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
4b70: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 6f 6b 61  utstanding looka
4b80: 73 69 64 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  side allocations
4b90: 20 69 6e 20 73 63 68 65 6d 61 20 54 61 62 6c 65   in schema Table
4ba0: 73 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20  s.  ** prior to 
4bb0: 64 6f 69 6e 67 20 61 6e 79 20 66 72 65 65 28 29  doing any free()
4bc0: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 53 69   operations.  Si
4bd0: 6e 63 65 20 73 63 68 65 6d 61 20 54 61 62 6c 65  nce schema Table
4be0: 73 20 64 6f 20 6e 6f 74 20 75 73 65 0a 20 20 2a  s do not use.  *
4bf0: 2a 20 6c 6f 6f 6b 61 73 69 64 65 2c 20 74 68 69  * lookaside, thi
4c00: 73 20 6e 75 6d 62 65 72 20 73 68 6f 75 6c 64 20  s number should 
4c10: 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f 0a 20  not change. */. 
4c20: 20 69 6e 74 20 6e 4c 6f 6f 6b 61 73 69 64 65 20   int nLookaside 
4c30: 3d 20 30 3b 0a 20 20 69 66 28 20 64 62 20 26 26  = 0;.  if( db &&
4c40: 20 28 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61   (pTable->tabFla
4c50: 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
4c60: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4c 6f  l)==0 ){.    nLo
4c70: 6f 6b 61 73 69 64 65 20 3d 20 73 71 6c 69 74 65  okaside = sqlite
4c80: 33 4c 6f 6f 6b 61 73 69 64 65 55 73 65 64 28 64  3LookasideUsed(d
4c90: 62 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  b, 0);.  }.#endi
4ca0: 66 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61  f..  /* Delete a
4cb0: 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63  ll indices assoc
4cc0: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
4cd0: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28  table. */.  for(
4ce0: 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d  pIndex = pTable-
4cf0: 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b  >pIndex; pIndex;
4d00: 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a   pIndex=pNext){.
4d10: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64      pNext = pInd
4d20: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61  ex->pNext;.    a
4d30: 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 70  ssert( pIndex->p
4d40: 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e  Schema==pTable->
4d50: 70 53 63 68 65 6d 61 0a 20 20 20 20 20 20 20 20  pSchema.        
4d60: 20 7c 7c 20 28 49 73 56 69 72 74 75 61 6c 28 70   || (IsVirtual(p
4d70: 54 61 62 6c 65 29 20 26 26 20 70 49 6e 64 65 78  Table) && pIndex
4d80: 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54  ->idxType!=SQLIT
4d90: 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46  E_IDXTYPE_APPDEF
4da0: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 28 64 62  ) );.    if( (db
4db0: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74  ==0 || db->pnByt
4dc0: 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26 20 21  esFreed==0) && !
4dd0: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65  IsVirtual(pTable
4de0: 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ) ){.      char 
4df0: 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e 64 65 78 2d  *zName = pIndex-
4e00: 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20 20 20 20 54  >zName; .      T
4e10: 45 53 54 4f 4e 4c 59 20 28 20 49 6e 64 65 78 20  ESTONLY ( Index 
4e20: 2a 70 4f 6c 64 20 3d 20 29 20 73 71 6c 69 74 65  *pOld = ) sqlite
4e30: 33 48 61 73 68 49 6e 73 65 72 74 28 0a 20 20 20  3HashInsert(.   
4e40: 20 20 20 20 20 20 26 70 49 6e 64 65 78 2d 3e 70        &pIndex->p
4e50: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c  Schema->idxHash,
4e60: 20 7a 4e 61 6d 65 2c 20 30 0a 20 20 20 20 20 20   zName, 0.      
4e70: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
4e80: 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65   db==0 || sqlite
4e90: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
4ea0: 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e  (db, 0, pIndex->
4eb0: 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20  pSchema) );.    
4ec0: 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d    assert( pOld==
4ed0: 70 49 6e 64 65 78 20 7c 7c 20 70 4f 6c 64 3d 3d  pIndex || pOld==
4ee0: 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  0 );.    }.    s
4ef0: 71 6c 69 74 65 33 46 72 65 65 49 6e 64 65 78 28  qlite3FreeIndex(
4f00: 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d  db, pIndex);.  }
4f10: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e  ..  /* Delete an
4f20: 79 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  y foreign keys a
4f30: 74 74 61 63 68 65 64 20 74 6f 20 74 68 69 73 20  ttached to this 
4f40: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69  table. */.  sqli
4f50: 74 65 33 46 6b 44 65 6c 65 74 65 28 64 62 2c 20  te3FkDelete(db, 
4f60: 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44  pTable);..  /* D
4f70: 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20  elete the Table 
4f80: 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
4f90: 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
4fa0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d  LITE_ENABLE_NORM
4fb0: 41 4c 49 5a 45 0a 20 20 69 66 28 20 70 54 61 62  ALIZE.  if( pTab
4fc0: 6c 65 2d 3e 70 43 6f 6c 48 61 73 68 20 29 7b 0a  le->pColHash ){.
4fd0: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 43      sqlite3HashC
4fe0: 6c 65 61 72 28 70 54 61 62 6c 65 2d 3e 70 43 6f  lear(pTable->pCo
4ff0: 6c 48 61 73 68 29 3b 0a 20 20 20 20 73 71 6c 69  lHash);.    sqli
5000: 74 65 33 5f 66 72 65 65 28 70 54 61 62 6c 65 2d  te3_free(pTable-
5010: 3e 70 43 6f 6c 48 61 73 68 29 3b 0a 20 20 7d 0a  >pColHash);.  }.
5020: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
5030: 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  DeleteColumnName
5040: 73 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20  s(db, pTable);. 
5050: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5060: 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  b, pTable->zName
5070: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
5080: 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a  ee(db, pTable->z
5090: 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74  ColAff);.  sqlit
50a0: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
50b0: 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  b, pTable->pSele
50c0: 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ct);.  sqlite3Ex
50d0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
50e0: 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29   pTable->pCheck)
50f0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
5100: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
5110: 4c 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  LE.  sqlite3Vtab
5120: 43 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65  Clear(db, pTable
5130: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
5140: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
5150: 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72  able);..  /* Ver
5160: 69 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b  ify that no look
5170: 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 77 61 73  aside memory was
5180: 20 75 73 65 64 20 62 79 20 73 63 68 65 6d 61 20   used by schema 
5190: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65  tables */.  asse
51a0: 72 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d  rt( nLookaside==
51b0: 30 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d  0 || nLookaside=
51c0: 3d 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64  =sqlite3Lookasid
51d0: 65 55 73 65 64 28 64 62 2c 30 29 20 29 3b 0a 7d  eUsed(db,0) );.}
51e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c  .void sqlite3Del
51f0: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33  eteTable(sqlite3
5200: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61   *db, Table *pTa
5210: 62 6c 65 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f  ble){.  /* Do no
5220: 74 20 64 65 6c 65 74 65 20 74 68 65 20 74 61 62  t delete the tab
5230: 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66  le until the ref
5240: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61  erence count rea
5250: 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20  ches zero. */.  
5260: 69 66 28 20 21 70 54 61 62 6c 65 20 29 20 72 65  if( !pTable ) re
5270: 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 28 21 64  turn;.  if( ((!d
5280: 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73  b || db->pnBytes
5290: 46 72 65 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d  Freed==0) && (--
52a0: 70 54 61 62 6c 65 2d 3e 6e 54 61 62 52 65 66 29  pTable->nTabRef)
52b0: 3e 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  >0) ) return;.  
52c0: 64 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  deleteTable(db, 
52d0: 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  pTable);.}.../*.
52e0: 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69  ** Unlink the gi
52f0: 76 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  ven table from t
5300: 68 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61  he hash tables a
5310: 6e 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68  nd the delete th
5320: 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63  e.** table struc
5330: 74 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74  ture with all it
5340: 73 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f  s indices and fo
5350: 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76  reign keys..*/.v
5360: 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e  oid sqlite3Unlin
5370: 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28  kAndDeleteTable(
5380: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
5390: 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   iDb, const char
53a0: 20 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54   *zTabName){.  T
53b0: 61 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70  able *p;.  Db *p
53c0: 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64  Db;..  assert( d
53d0: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
53e0: 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
53f0: 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
5400: 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b  ert( zTabName );
5410: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
5420: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
5430: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
5440: 0a 20 20 74 65 73 74 63 61 73 65 28 20 7a 54 61  .  testcase( zTa
5450: 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20  bName[0]==0 );  
5460: 2f 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74  /* Zero-length t
5470: 61 62 6c 65 20 6e 61 6d 65 73 20 61 72 65 20 61  able names are a
5480: 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44 62 20  llowed */.  pDb 
5490: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
54a0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61  .  p = sqlite3Ha
54b0: 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70  shInsert(&pDb->p
54c0: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c  Schema->tblHash,
54d0: 20 7a 54 61 62 4e 61 6d 65 2c 20 30 29 3b 0a 20   zTabName, 0);. 
54e0: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
54f0: 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62  ble(db, p);.  db
5500: 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42  ->mDbFlags |= DB
5510: 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67  FLAG_SchemaChang
5520: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  e;.}../*.** Give
5530: 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72  n a token, retur
5540: 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  n a string that 
5550: 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20  consists of the 
5560: 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20  text of that.** 
5570: 74 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20 74 6f  token.  Space to
5580: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
5590: 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20  ed string.** is 
55a0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
55b0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
55c0: 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
55d0: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  y the calling.**
55e0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
55f0: 20 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d   Any quotation m
5600: 61 72 6b 73 20 28 65 78 3a 20 20 22 6e 61 6d 65  arks (ex:  "name
5610: 22 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65  ", 'name', [name
5620: 5d 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20 74 68  ], or `name`) th
5630: 61 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74  at.** surround t
5640: 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 74  he body of the t
5650: 6f 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76 65 64  oken are removed
5660: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61  ..**.** Tokens a
5670: 72 65 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f  re often just po
5680: 69 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20  inters into the 
5690: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78  original SQL tex
56a0: 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20  t and so.** are 
56b0: 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61  not \000 termina
56c0: 74 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20  ted and are not 
56d0: 70 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65  persistent.  The
56e0: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
56f0: 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d  .** is \000 term
5700: 69 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70 65  inated and is pe
5710: 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61  rsistent..*/.cha
5720: 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72  r *sqlite3NameFr
5730: 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20  omToken(sqlite3 
5740: 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  *db, Token *pNam
5750: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  e){.  char *zNam
5760: 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29  e;.  if( pName )
5770: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  {.    zName = sq
5780: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64  lite3DbStrNDup(d
5790: 62 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d  b, (char*)pName-
57a0: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20  >z, pName->n);. 
57b0: 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
57c0: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73  e(zName);.  }els
57d0: 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30  e{.    zName = 0
57e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
57f0: 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  Name;.}../*.** O
5800: 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  pen the sqlite_m
5810: 61 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72  aster table stor
5820: 65 64 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e  ed in database n
5830: 75 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a  umber iDb for.**
5840: 20 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61   writing. The ta
5850: 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73  ble is opened us
5860: 69 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f  ing cursor 0..*/
5870: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65  .void sqlite3Ope
5880: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 50 61 72  nMasterTable(Par
5890: 73 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b  se *p, int iDb){
58a0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
58b0: 69 74 65 33 47 65 74 56 64 62 65 28 70 29 3b 0a  ite3GetVdbe(p);.
58c0: 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
58d0: 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53 54 45  ck(p, iDb, MASTE
58e0: 52 5f 52 4f 4f 54 2c 20 31 2c 20 4d 41 53 54 45  R_ROOT, 1, MASTE
58f0: 52 5f 4e 41 4d 45 29 3b 0a 20 20 73 71 6c 69 74  R_NAME);.  sqlit
5900: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
5910: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
5920: 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c   0, MASTER_ROOT,
5930: 20 69 44 62 2c 20 35 29 3b 0a 20 20 69 66 28 20   iDb, 5);.  if( 
5940: 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20  p->nTab==0 ){.  
5950: 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20    p->nTab = 1;. 
5960: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61   }.}../*.** Para
5970: 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e  meter zName poin
5980: 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d  ts to a nul-term
5990: 69 6e 61 74 65 64 20 62 75 66 66 65 72 20 63 6f  inated buffer co
59a0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d  ntaining the nam
59b0: 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61 62 61  e.** of a databa
59c0: 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d  se ("main", "tem
59d0: 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f  p" or the name o
59e0: 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62  f an attached db
59f0: 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ). This.** funct
5a00: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
5a10: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d  index of the nam
5a20: 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64  ed database in d
5a30: 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20  b->aDb[], or.** 
5a40: 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  -1 if the named 
5a50: 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  db cannot be fou
5a60: 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
5a70: 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c  e3FindDbName(sql
5a80: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
5a90: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
5aa0: 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 20  int i = -1;     
5ab0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
5ac0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28 20  number */.  if( 
5ad0: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44 62 20  zName ){.    Db 
5ae0: 2a 70 44 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d  *pDb;.    for(i=
5af0: 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62  (db->nDb-1), pDb
5b00: 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e  =&db->aDb[i]; i>
5b10: 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b  =0; i--, pDb--){
5b20: 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71  .      if( 0==sq
5b30: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 44  lite3_stricmp(pD
5b40: 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a 4e 61  b->zDbSName, zNa
5b50: 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  me) ) break;.   
5b60: 20 20 20 2f 2a 20 22 6d 61 69 6e 22 20 69 73 20     /* "main" is 
5b70: 61 6c 77 61 79 73 20 61 6e 20 61 63 63 65 70 74  always an accept
5b80: 61 62 6c 65 20 61 6c 69 61 73 20 66 6f 72 20 74  able alias for t
5b90: 68 65 20 70 72 69 6d 61 72 79 20 64 61 74 61 62  he primary datab
5ba0: 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65  ase.      ** eve
5bb0: 6e 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e  n if it has been
5bc0: 20 72 65 6e 61 6d 65 64 20 75 73 69 6e 67 20 53   renamed using S
5bd0: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4d  QLITE_DBCONFIG_M
5be0: 41 49 4e 44 42 4e 41 4d 45 2e 20 2a 2f 0a 20 20  AINDBNAME. */.  
5bf0: 20 20 20 20 69 66 28 20 69 3d 3d 30 20 26 26 20      if( i==0 && 
5c00: 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63  0==sqlite3_stric
5c10: 6d 70 28 22 6d 61 69 6e 22 2c 20 7a 4e 61 6d 65  mp("main", zName
5c20: 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  ) ) break;.    }
5c30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b  .  }.  return i;
5c40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f  .}../*.** The to
5c50: 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61  ken *pName conta
5c60: 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ins the name of 
5c70: 61 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68  a database (eith
5c80: 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20  er "main" or.** 
5c90: 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61  "temp" or the na
5ca0: 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65  me of an attache
5cb0: 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74  d db). This rout
5cc0: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a  ine returns the.
5cd0: 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  ** index of the 
5ce0: 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69  named database i
5cf0: 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20  n db->aDb[], or 
5d00: 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  -1 if the named 
5d10: 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  db .** does not 
5d20: 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  exist..*/.int sq
5d30: 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69  lite3FindDb(sqli
5d40: 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a  te3 *db, Token *
5d50: 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pName){.  int i;
5d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5d80: 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65  * Database numbe
5d90: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  r */.  char *zNa
5da0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
5db0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5dc0: 61 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63  ame we are searc
5dd0: 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e  hing for */.  zN
5de0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
5df0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
5e00: 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c  Name);.  i = sql
5e10: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64  ite3FindDbName(d
5e20: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  b, zName);.  sql
5e30: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
5e40: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
5e50: 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62  i;.}../* The tab
5e60: 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72  le or view or tr
5e70: 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61  igger name is pa
5e80: 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75  ssed to this rou
5e90: 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a  tine via tokens.
5ea0: 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e  ** pName1 and pN
5eb0: 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62  ame2. If the tab
5ec0: 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c  le name was full
5ed0: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72  y qualified, for
5ee0: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
5ef0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78  CREATE TABLE xxx
5f00: 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a  .yyy (...);.** .
5f10: 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69  ** Then pName1 i
5f20: 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61  s set to "xxx" a
5f30: 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e  nd pName2 "yyy".
5f40: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
5f50: 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62  nd if.** the tab
5f60: 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66  le name is not f
5f70: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
5f80: 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41  i.e.:.**.** CREA
5f90: 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e  TE TABLE yyy(...
5fa0: 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e  );.**.** Then pN
5fb0: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
5fc0: 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  yyy" and pName2 
5fd0: 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  is ""..**.** Thi
5fe0: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
5ff0: 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69  he *ppUnqual poi
6000: 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  nter to point at
6010: 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d   the token (pNam
6020: 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29  e1 or.** pName2)
6030: 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65   that stores the
6040: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62   unqualified tab
6050: 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e  le name.  The in
6060: 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  dex of the.** da
6070: 74 61 62 61 73 65 20 22 78 78 78 22 20 69 73 20  tabase "xxx" is 
6080: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
6090: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
60a0: 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ame(.  Parse *pP
60b0: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
60c0: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
60d0: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
60e0: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
60f0: 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68  ame1,      /* Th
6100: 65 20 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e  e "xxx" in the n
6110: 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72  ame "xxx.yyy" or
6120: 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65   "xxx" */.  Toke
6130: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20  n *pName2,      
6140: 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e 20  /* The "yyy" in 
6150: 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79  the name "xxx.yy
6160: 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a  y" */.  Token **
6170: 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57  pUnqual     /* W
6180: 72 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69  rite the unquali
6190: 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65  fied object name
61a0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
61b0: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
61c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
61d0: 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68  abase holding th
61e0: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71  e object */.  sq
61f0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
6200: 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72  se->db;..  asser
6210: 74 28 20 70 4e 61 6d 65 32 21 3d 30 20 29 3b 0a  t( pName2!=0 );.
6220: 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3e    if( pName2->n>
6230: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  0 ){.    if( db-
6240: 3e 69 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a 20  >init.busy ) {. 
6250: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
6260: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f  rMsg(pParse, "co
6270: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 22 29  rrupt database")
6280: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  ;.      return -
6290: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 55  1;.    }.    *pU
62a0: 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a  nqual = pName2;.
62b0: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
62c0: 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d  3FindDb(db, pNam
62d0: 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  e1);.    if( iDb
62e0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  <0 ){.      sqli
62f0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
6300: 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74  se, "unknown dat
6310: 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65  abase %T", pName
6320: 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  1);.      return
6330: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   -1;.    }.  }el
6340: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
6350: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20  db->init.iDb==0 
6360: 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  || db->init.busy
6370: 20 7c 7c 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42   || IN_RENAME_OB
6380: 4a 45 43 54 0a 20 20 20 20 20 20 20 20 20 20 20  JECT.           
6390: 20 20 7c 7c 20 28 64 62 2d 3e 6d 44 62 46 6c 61    || (db->mDbFla
63a0: 67 73 20 26 20 44 42 46 4c 41 47 5f 56 61 63 75  gs & DBFLAG_Vacu
63b0: 75 6d 29 21 3d 30 29 3b 0a 20 20 20 20 69 44 62  um)!=0);.    iDb
63c0: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b   = db->init.iDb;
63d0: 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20  .    *pUnqual = 
63e0: 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65  pName1;.  }.  re
63f0: 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a  turn iDb;.}../*.
6400: 2a 2a 20 54 72 75 65 20 69 66 20 50 52 41 47 4d  ** True if PRAGM
6410: 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
6420: 61 20 69 73 20 4f 4e 0a 2a 2f 0a 69 6e 74 20 73  a is ON.*/.int s
6430: 71 6c 69 74 65 33 57 72 69 74 61 62 6c 65 53 63  qlite3WritableSc
6440: 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62  hema(sqlite3 *db
6450: 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  ){.  testcase( (
6460: 64 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49 54  db->flags&(SQLIT
6470: 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51  E_WriteSchema|SQ
6480: 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65 29 29  LITE_Defensive))
6490: 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
64a0: 65 28 20 28 64 62 2d 3e 66 6c 61 67 73 26 28 53  e( (db->flags&(S
64b0: 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d  QLITE_WriteSchem
64c0: 61 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69  a|SQLITE_Defensi
64d0: 76 65 29 29 3d 3d 0a 20 20 20 20 20 20 20 20 20  ve))==.         
64e0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 72 69        SQLITE_Wri
64f0: 74 65 53 63 68 65 6d 61 20 29 3b 0a 20 20 74 65  teSchema );.  te
6500: 73 74 63 61 73 65 28 20 28 64 62 2d 3e 66 6c 61  stcase( (db->fla
6510: 67 73 26 28 53 51 4c 49 54 45 5f 57 72 69 74 65  gs&(SQLITE_Write
6520: 53 63 68 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65  Schema|SQLITE_De
6530: 66 65 6e 73 69 76 65 29 29 3d 3d 0a 20 20 20 20  fensive))==.    
6540: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
6550: 45 5f 44 65 66 65 6e 73 69 76 65 20 29 3b 0a 20  E_Defensive );. 
6560: 20 74 65 73 74 63 61 73 65 28 20 28 64 62 2d 3e   testcase( (db->
6570: 66 6c 61 67 73 26 28 53 51 4c 49 54 45 5f 57 72  flags&(SQLITE_Wr
6580: 69 74 65 53 63 68 65 6d 61 7c 53 51 4c 49 54 45  iteSchema|SQLITE
6590: 5f 44 65 66 65 6e 73 69 76 65 29 29 3d 3d 0a 20  _Defensive))==. 
65a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
65b0: 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d  QLITE_WriteSchem
65c0: 61 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69  a|SQLITE_Defensi
65d0: 76 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve) );.  return 
65e0: 28 64 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49  (db->flags&(SQLI
65f0: 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c 53  TE_WriteSchema|S
6600: 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65 29  QLITE_Defensive)
6610: 29 3d 3d 53 51 4c 49 54 45 5f 57 72 69 74 65 53  )==SQLITE_WriteS
6620: 63 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  chema;.}../*.** 
6630: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
6640: 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66  used to check if
6650: 20 74 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e   the UTF-8 strin
6660: 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67  g zName is a leg
6670: 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65  al.** unqualifie
6680: 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77  d name for a new
6690: 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28   schema object (
66a0: 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69  table, index, vi
66b0: 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72  ew or.** trigger
66c0: 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65  ). All names are
66d0: 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20 74 68   legal except th
66e0: 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e 20 77  ose that begin w
66f0: 69 74 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a  ith the string.*
6700: 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20  * "sqlite_" (in 
6710: 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20  upper, lower or 
6720: 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54 68 69  mixed case). Thi
6730: 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  s portion of the
6740: 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73   namespace.** is
6750: 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e   reserved for in
6760: 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69  ternal use..*/.i
6770: 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  nt sqlite3CheckO
6780: 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20  bjectName(Parse 
6790: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
67a0: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
67b0: 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e  f( !pParse->db->
67c0: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61  init.busy && pPa
67d0: 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a  rse->nested==0 .
67e0: 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
67f0: 69 74 65 33 57 72 69 74 61 62 6c 65 53 63 68 65  ite3WritableSche
6800: 6d 61 28 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d  ma(pParse->db)==
6810: 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30  0.          && 0
6820: 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ==sqlite3StrNICm
6830: 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
6840: 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71  _", 7) ){.    sq
6850: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
6860: 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61  arse, "object na
6870: 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  me reserved for 
6880: 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73  internal use: %s
6890: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ", zName);.    r
68a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
68b0: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
68c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
68d0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
68e0: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
68f0: 78 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2f 0a  x of a table.*/.
6900: 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 50 72  Index *sqlite3Pr
6910: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 54 61  imaryKeyIndex(Ta
6920: 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e  ble *pTab){.  In
6930: 64 65 78 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  dex *p;.  for(p=
6940: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 20  pTab->pIndex; p 
6950: 26 26 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79  && !IsPrimaryKey
6960: 49 6e 64 65 78 28 70 29 3b 20 70 3d 70 2d 3e 70  Index(p); p=p->p
6970: 4e 65 78 74 29 7b 7d 0a 20 20 72 65 74 75 72 6e  Next){}.  return
6980: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   p;.}../*.** Ret
6990: 75 72 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f  urn the column o
69a0: 66 20 69 6e 64 65 78 20 70 49 64 78 20 74 68 61  f index pIdx tha
69b0: 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
69c0: 20 74 61 62 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e   table.** column
69d0: 20 69 43 6f 6c 2e 20 20 52 65 74 75 72 6e 20 2d   iCol.  Return -
69e0: 31 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  1 if not found..
69f0: 2a 2f 0a 69 31 36 20 73 71 6c 69 74 65 33 43 6f  */.i16 sqlite3Co
6a00: 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 49 6e 64 65  lumnOfIndex(Inde
6a10: 78 20 2a 70 49 64 78 2c 20 69 31 36 20 69 43 6f  x *pIdx, i16 iCo
6a20: 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  l){.  int i;.  f
6a30: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
6a40: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
6a50: 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64     if( iCol==pId
6a60: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29  x->aiColumn[i] )
6a70: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
6a80: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
6a90: 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74  *.** Begin const
6aa0: 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ructing a new ta
6ab0: 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ble representati
6ac0: 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54  on in memory.  T
6ad0: 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  his is.** the fi
6ae0: 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61  rst of several a
6af0: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74  ction routines t
6b00: 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69  hat get called i
6b10: 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f  n response.** to
6b20: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
6b30: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70  statement.  In p
6b40: 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20  articular, this 
6b50: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
6b60: 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e  d.** after seein
6b70: 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45  g tokens "CREATE
6b80: 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e  " and "TABLE" an
6b90: 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  d the table name
6ba0: 2e 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20  . The isTemp.** 
6bb0: 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20  flag is true if 
6bc0: 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  the table should
6bd0: 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68   be stored in th
6be0: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
6bf0: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73  base.** file ins
6c00: 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d  tead of in the m
6c10: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
6c20: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
6c30: 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a  ally the case.**
6c40: 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22   when the "TEMP"
6c50: 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20   or "TEMPORARY" 
6c60: 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69  keyword occurs i
6c70: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45  n between.** CRE
6c80: 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a  ATE and TABLE..*
6c90: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62  *.** The new tab
6ca0: 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69  le record is ini
6cb0: 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74  tialized and put
6cc0: 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77   in pParse->pNew
6cd0: 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72  Table..** As mor
6ce0: 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  e of the CREATE 
6cf0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
6d00: 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74  is parsed, addit
6d10: 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20  ional action.** 
6d20: 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65  routines will be
6d30: 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d   called to add m
6d40: 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ore information 
6d50: 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a  to this record..
6d60: 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
6d70: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
6d80: 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
6d90: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
6da0: 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  () routine.** is
6db0: 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c   called to compl
6dc0: 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63  ete the construc
6dd0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20  tion of the new 
6de0: 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f  table record..*/
6df0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61  .void sqlite3Sta
6e00: 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  rtTable(.  Parse
6e10: 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
6e20: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
6e30: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
6e40: 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72  ,   /* First par
6e50: 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  t of the name of
6e60: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
6e70: 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ew */.  Token *p
6e80: 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f  Name2,   /* Seco
6e90: 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  nd part of the n
6ea0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
6eb0: 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e   or view */.  in
6ec0: 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f  t isTemp,      /
6ed0: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
6ee0: 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a  s a TEMP table *
6ef0: 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20  /.  int isView, 
6f00: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
6f10: 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20 2a  this is a VIEW *
6f20: 2f 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75 61  /.  int isVirtua
6f30: 6c 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  l,   /* True if 
6f40: 74 68 69 73 20 69 73 20 61 20 56 49 52 54 55 41  this is a VIRTUA
6f50: 4c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  L table */.  int
6f60: 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f 2a   noErr        /*
6f70: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74   Do nothing if t
6f80: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
6f90: 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  sts */.){.  Tabl
6fa0: 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68 61  e *pTable;.  cha
6fb0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a  r *zName = 0; /*
6fc0: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
6fd0: 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20   new table */.  
6fe0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
6ff0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
7000: 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20   *v;.  int iDb; 
7010: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
7020: 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72  ase number to cr
7030: 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69  eate the table i
7040: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
7050: 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61  ame;    /* Unqua
7060: 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74  lified name of t
7070: 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61  he table to crea
7080: 74 65 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d  te */..  if( db-
7090: 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 64 62  >init.busy && db
70a0: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3d 3d  ->init.newTnum==
70b0: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 53 70 65 63  1 ){.    /* Spec
70c0: 69 61 6c 20 63 61 73 65 3a 20 20 50 61 72 73 69  ial case:  Parsi
70d0: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
70e0: 73 74 65 72 20 6f 72 20 73 71 6c 69 74 65 5f 74  ster or sqlite_t
70f0: 65 6d 70 5f 6d 61 73 74 65 72 20 73 63 68 65 6d  emp_master schem
7100: 61 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 64  a */.    iDb = d
7110: 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20  b->init.iDb;.   
7120: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
7130: 44 62 53 74 72 44 75 70 28 64 62 2c 20 53 43 48  DbStrDup(db, SCH
7140: 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29 3b  EMA_TABLE(iDb));
7150: 0a 20 20 20 20 70 4e 61 6d 65 20 3d 20 70 4e 61  .    pName = pNa
7160: 6d 65 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me1;.  }else{.  
7170: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20    /* The common 
7180: 63 61 73 65 20 2a 2f 0a 20 20 20 20 69 44 62 20  case */.    iDb 
7190: 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
71a0: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
71b0: 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e  me1, pName2, &pN
71c0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44  ame);.    if( iD
71d0: 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b<0 ) return;.  
71e0: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
71f0: 44 42 20 26 26 20 69 73 54 65 6d 70 20 26 26 20  DB && isTemp && 
7200: 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 26 26 20 69  pName2->n>0 && i
7210: 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f  Db!=1 ){.      /
7220: 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20  * If creating a 
7230: 74 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20  temp table, the 
7240: 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  name may not be 
7250: 71 75 61 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73  qualified. Unles
7260: 73 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  s .      ** the 
7270: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73  database name is
7280: 20 22 74 65 6d 70 22 20 61 6e 79 77 61 79 2e 20   "temp" anyway. 
7290: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
72a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
72b0: 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62  , "temporary tab
72c0: 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  le name must be 
72d0: 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20  unqualified");. 
72e0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
72f0: 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54   }.    if( !OMIT
7300: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
7310: 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 20 20 20  p ) iDb = 1;.   
7320: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
7330: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
7340: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , pName);.    if
7350: 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  ( IN_RENAME_OBJE
7360: 43 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  CT ){.      sqli
7370: 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61  te3RenameTokenMa
7380: 70 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a  p(pParse, (void*
7390: 29 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 29 3b 0a  )zName, pName);.
73a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72      }.  }.  pPar
73b0: 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d  se->sNameToken =
73c0: 20 2a 70 4e 61 6d 65 3b 0a 20 20 69 66 28 20 7a   *pName;.  if( z
73d0: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
73e0: 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
73f0: 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  K!=sqlite3CheckO
7400: 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65  bjectName(pParse
7410: 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  , zName) ){.    
7420: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
7430: 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66  _error;.  }.  if
7440: 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d  ( db->init.iDb==
7450: 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a  1 ) isTemp = 1;.
7460: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7470: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
7480: 4e 0a 20 20 61 73 73 65 72 74 28 20 69 73 54 65  N.  assert( isTe
7490: 6d 70 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 3d  mp==0 || isTemp=
74a0: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
74b0: 69 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56  isView==0 || isV
74c0: 69 65 77 3d 3d 31 20 29 3b 0a 20 20 7b 0a 20 20  iew==1 );.  {.  
74d0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
74e0: 38 20 61 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20  8 aCode[] = {.  
74f0: 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41       SQLITE_CREA
7500: 54 45 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20  TE_TABLE,.      
7510: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
7520: 45 4d 50 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20  EMP_TABLE,.     
7530: 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f    SQLITE_CREATE_
7540: 56 49 45 57 2c 0a 20 20 20 20 20 20 20 53 51 4c  VIEW,.       SQL
7550: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
7560: 56 49 45 57 0a 20 20 20 20 7d 3b 0a 20 20 20 20  VIEW.    };.    
7570: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
7580: 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
7590: 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
75a0: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
75b0: 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
75c0: 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
75d0: 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29  isTemp), 0, zDb)
75e0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
75f0: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
7600: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7610: 21 69 73 56 69 72 74 75 61 6c 20 26 26 20 73 71  !isVirtual && sq
7620: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
7630: 50 61 72 73 65 2c 20 28 69 6e 74 29 61 43 6f 64  Parse, (int)aCod
7640: 65 5b 69 73 54 65 6d 70 2b 32 2a 69 73 56 69 65  e[isTemp+2*isVie
7650: 77 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  w],.            
7660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7670: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
7680: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
7690: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
76a0: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
76b0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
76c0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
76d0: 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64  new table name d
76e0: 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20  oes not collide 
76f0: 77 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67  with an existing
7700: 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74  .  ** index or t
7710: 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65  able name in the
7720: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20   same database. 
7730: 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20   Issue an error 
7740: 6d 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20  message if.  ** 
7750: 69 74 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63  it does. The exc
7760: 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65  eption is if the
7770: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
7780: 20 70 61 72 73 65 64 20 77 61 73 20 70 61 73 73   parsed was pass
7790: 65 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71  ed.  ** to an sq
77a0: 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74  lite3_declare_vt
77b0: 61 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68  ab() call. In th
77c0: 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65  at case only the
77d0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20   column names.  
77e0: 2a 2a 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c  ** and types wil
77f0: 6c 20 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68  l be used, so th
7800: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
7810: 6f 20 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73  o test for names
7820: 70 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73  pace.  ** collis
7830: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
7840: 20 21 49 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52   !IN_SPECIAL_PAR
7850: 53 45 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  SE ){.    char *
7860: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
7870: 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20  b].zDbSName;.   
7880: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
7890: 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
78a0: 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
78b0: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
78c0: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
78d0: 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20 73 71  .    pTable = sq
78e0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
78f0: 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a  b, zName, zDb);.
7900: 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 20 29      if( pTable )
7910: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6e 6f 45  {.      if( !noE
7920: 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rr ){.        sq
7930: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
7940: 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54 20  arse, "table %T 
7950: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
7960: 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   pName);.      }
7970: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
7980: 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e  sert( !db->init.
7990: 62 75 73 79 20 7c 7c 20 43 4f 52 52 55 50 54 5f  busy || CORRUPT_
79a0: 44 42 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  DB );.        sq
79b0: 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
79c0: 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
79d0: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
79e0: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
79f0: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
7a00: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
7a10: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
7a20: 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20  me, zDb)!=0 ){. 
7a30: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
7a40: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68  rMsg(pParse, "th
7a50: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
7a60: 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 25 73  n index named %s
7a70: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
7a80: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
7a90: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
7aa0: 20 7d 0a 0a 20 20 70 54 61 62 6c 65 20 3d 20 73   }..  pTable = s
7ab0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
7ac0: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
7ad0: 62 6c 65 29 29 3b 0a 20 20 69 66 28 20 70 54 61  ble));.  if( pTa
7ae0: 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ble==0 ){.    as
7af0: 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
7b00: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 50  Failed );.    pP
7b10: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
7b20: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
7b30: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
7b40: 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e  ;.    goto begin
7b50: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
7b60: 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  }.  pTable->zNam
7b70: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61  e = zName;.  pTa
7b80: 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  ble->iPKey = -1;
7b90: 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65  .  pTable->pSche
7ba0: 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ma = db->aDb[iDb
7bb0: 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 61  ].pSchema;.  pTa
7bc0: 62 6c 65 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31  ble->nTabRef = 1
7bd0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
7be0: 44 45 46 41 55 4c 54 5f 52 4f 57 45 53 54 0a 20  DEFAULT_ROWEST. 
7bf0: 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67   pTable->nRowLog
7c00: 45 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Est = sqlite3Log
7c10: 45 73 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55  Est(SQLITE_DEFAU
7c20: 4c 54 5f 52 4f 57 45 53 54 29 3b 0a 23 65 6c 73  LT_ROWEST);.#els
7c30: 65 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77  e.  pTable->nRow
7c40: 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73  LogEst = 200; as
7c50: 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74  sert( 200==sqlit
7c60: 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36  e3LogEst(1048576
7c70: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  ) );.#endif.  as
7c80: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e  sert( pParse->pN
7c90: 65 77 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  ewTable==0 );.  
7ca0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
7cb0: 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f  e = pTable;..  /
7cc0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
7cd0: 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65   magic sqlite_se
7ce0: 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65  quence table use
7cf0: 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65  d by autoincreme
7d00: 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65  nt,.  ** then re
7d10: 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74  cord a pointer t
7d20: 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20  o this table in 
7d30: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
7d40: 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a  e structure.  **
7d50: 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20   so that INSERT 
7d60: 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62  can find the tab
7d70: 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a  le easily..  */.
7d80: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7d90: 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
7da0: 54 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  T.  if( !pParse-
7db0: 3e 6e 65 73 74 65 64 20 26 26 20 73 74 72 63 6d  >nested && strcm
7dc0: 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
7dd0: 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29  _sequence")==0 )
7de0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
7df0: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
7e00: 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
7e10: 20 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e   );.    pTable->
7e20: 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62  pSchema->pSeqTab
7e30: 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23   = pTable;.  }.#
7e40: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69  endif..  /* Begi
7e50: 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65  n generating the
7e60: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
7e70: 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c 65  insert the table
7e80: 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a   record into.  *
7e90: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  * the SQLITE_MAS
7ea0: 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65  TER table.  Note
7eb0: 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74   in particular t
7ec0: 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61  hat we must go a
7ed0: 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c  head.  ** and al
7ee0: 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f 72  locate the recor
7ef0: 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  d number for the
7f00: 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77   table entry now
7f10: 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20  .  Before any.  
7f20: 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  ** PRIMARY KEY o
7f30: 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64  r UNIQUE keyword
7f40: 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20 54  s are parsed.  T
7f50: 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69  hose keywords wi
7f60: 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e  ll cause.  ** in
7f70: 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65 61  dices to be crea
7f80: 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c  ted and the tabl
7f90: 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f  e record must co
7fa0: 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20  me before the . 
7fb0: 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65   ** indices.  He
7fc0: 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20  nce, the record 
7fd0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
7fe0: 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c  able must be all
7ff0: 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e  ocated.  ** now.
8000: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
8010: 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76  >init.busy && (v
8020: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
8030: 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b  e(pParse))!=0 ){
8040: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b 0a  .    int addr1;.
8050: 20 20 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d      int fileForm
8060: 61 74 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 31  at;.    int reg1
8070: 2c 20 72 65 67 32 2c 20 72 65 67 33 3b 0a 20 20  , reg2, reg3;.  
8080: 20 20 2f 2a 20 6e 75 6c 6c 52 6f 77 5b 5d 20 69    /* nullRow[] i
8090: 73 20 61 6e 20 4f 50 5f 52 65 63 6f 72 64 20 65  s an OP_Record e
80a0: 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 6f 77  ncoding of a row
80b0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 35 20 4e 55   containing 5 NU
80c0: 4c 4c 73 20 2a 2f 0a 20 20 20 20 73 74 61 74 69  LLs */.    stati
80d0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6e 75 6c  c const char nul
80e0: 6c 52 6f 77 5b 5d 20 3d 20 7b 20 36 2c 20 30 2c  lRow[] = { 6, 0,
80f0: 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20   0, 0, 0, 0 };. 
8100: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
8110: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
8120: 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a  arse, 1, iDb);..
8130: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8140: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
8150: 0a 20 20 20 20 69 66 28 20 69 73 56 69 72 74 75  .    if( isVirtu
8160: 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  al ){.      sqli
8170: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
8180: 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20   OP_VBegin);.   
8190: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
81a0: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f  * If the file fo
81b0: 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e  rmat and encodin
81c0: 67 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  g in the databas
81d0: 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20  e have not been 
81e0: 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74  set, .    ** set
81f0: 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a   them now..    *
8200: 2f 0a 20 20 20 20 72 65 67 31 20 3d 20 70 50 61  /.    reg1 = pPa
8210: 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20  rse->regRowid = 
8220: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
8230: 20 20 20 20 72 65 67 32 20 3d 20 70 50 61 72 73      reg2 = pPars
8240: 65 2d 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70  e->regRoot = ++p
8250: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
8260: 20 72 65 67 33 20 3d 20 2b 2b 70 50 61 72 73 65   reg3 = ++pParse
8270: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
8280: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
8290: 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20   OP_ReadCookie, 
82a0: 69 44 62 2c 20 72 65 67 33 2c 20 42 54 52 45 45  iDb, reg3, BTREE
82b0: 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20  _FILE_FORMAT);. 
82c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
82d0: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
82e0: 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c  .    addr1 = sql
82f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
8300: 2c 20 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b 20  , OP_If, reg3); 
8310: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
8320: 0a 20 20 20 20 66 69 6c 65 46 6f 72 6d 61 74 20  .    fileFormat 
8330: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
8340: 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65  QLITE_LegacyFile
8350: 46 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20 20 20  Fmt)!=0 ?.      
8360: 20 20 20 20 20 20 20 20 20 20 20 20 31 20 3a 20              1 : 
8370: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f  SQLITE_MAX_FILE_
8380: 46 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69  FORMAT;.    sqli
8390: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
83a0: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
83b0: 44 62 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46  Db, BTREE_FILE_F
83c0: 4f 52 4d 41 54 2c 20 66 69 6c 65 46 6f 72 6d 61  ORMAT, fileForma
83d0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
83e0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
83f0: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
8400: 42 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44  BTREE_TEXT_ENCOD
8410: 49 4e 47 2c 20 45 4e 43 28 64 62 29 29 3b 0a 20  ING, ENC(db));. 
8420: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
8430: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
8440: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a  ;..    /* This j
8450: 75 73 74 20 63 72 65 61 74 65 73 20 61 20 70 6c  ust creates a pl
8460: 61 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72  ace-holder recor
8470: 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  d in the sqlite_
8480: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20  master table..  
8490: 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20    ** The record 
84a0: 63 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74  created does not
84b0: 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e   contain anythin
84c0: 67 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20  g yet.  It will 
84d0: 62 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20  be replaced.    
84e0: 2a 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20 65  ** by the real e
84f0: 6e 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e  ntry in code gen
8500: 65 72 61 74 65 64 20 61 74 20 73 71 6c 69 74 65  erated at sqlite
8510: 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20  3EndTable()..   
8520: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
8530: 6f 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77  owid for the new
8540: 20 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20 69   entry is left i
8550: 6e 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73  n register pPars
8560: 65 2d 3e 72 65 67 52 6f 77 69 64 2e 0a 20 20 20  e->regRowid..   
8570: 20 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67   ** The root pag
8580: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
8590: 6e 65 77 20 74 61 62 6c 65 20 69 73 20 6c 65 66  new table is lef
85a0: 74 20 69 6e 20 72 65 67 20 70 50 61 72 73 65 2d  t in reg pParse-
85b0: 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a  >regRoot..    **
85c0: 20 54 68 65 20 72 6f 77 69 64 20 61 6e 64 20 72   The rowid and r
85d0: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
85e0: 76 61 6c 75 65 73 20 61 72 65 20 6e 65 65 64 65  values are neede
85f0: 64 20 62 79 20 74 68 65 20 63 6f 64 65 20 74 68  d by the code th
8600: 61 74 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  at.    ** sqlite
8610: 33 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 20 67  3EndTable will g
8620: 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a  enerate..    */.
8630: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
8640: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
8650: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
8660: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
8670: 42 4c 45 29 0a 20 20 20 20 69 66 28 20 69 73 56  BLE).    if( isV
8680: 69 65 77 20 7c 7c 20 69 73 56 69 72 74 75 61 6c  iew || isVirtual
8690: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
86a0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
86b0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
86c0: 67 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  g2);.    }else.#
86d0: 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20  endif.    {.    
86e0: 20 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72    pParse->addrCr
86f0: 54 61 62 20 3d 0a 20 20 20 20 20 20 20 20 20 73  Tab =.         s
8700: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
8710: 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 42 74 72  (v, OP_CreateBtr
8720: 65 65 2c 20 69 44 62 2c 20 72 65 67 32 2c 20 42  ee, iDb, reg2, B
8730: 54 52 45 45 5f 49 4e 54 4b 45 59 29 3b 0a 20 20  TREE_INTKEY);.  
8740: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f    }.    sqlite3O
8750: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70  penMasterTable(p
8760: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
8770: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8780: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
8790: 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20 20 20  d, 0, reg1);.   
87a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
87b0: 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 36  p4(v, OP_Blob, 6
87c0: 2c 20 72 65 67 33 2c 20 30 2c 20 6e 75 6c 6c 52  , reg3, 0, nullR
87d0: 6f 77 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  ow, P4_STATIC);.
87e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
87f0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
8800: 72 74 2c 20 30 2c 20 72 65 67 33 2c 20 72 65 67  rt, 0, reg3, reg
8810: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
8820: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
8830: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
8840: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8850: 64 4f 70 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp0(v, OP_Close
8860: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72  );.  }..  /* Nor
8870: 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20  mal (non-error) 
8880: 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74  return. */.  ret
8890: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  urn;..  /* If an
88a0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77   error occurs, w
88b0: 65 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62  e jump here */.b
88c0: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
88d0: 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  :.  sqlite3DbFre
88e0: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
88f0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65  return;.}../* Se
8900: 74 20 70 72 6f 70 65 72 74 69 65 73 20 6f 66 20  t properties of 
8910: 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 62  a table column b
8920: 61 73 65 64 20 6f 6e 20 74 68 65 20 28 6d 61 67  ased on the (mag
8930: 69 63 61 6c 29 0a 2a 2a 20 6e 61 6d 65 20 6f 66  ical).** name of
8940: 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a   the column..*/.
8950: 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
8960: 45 5f 48 49 44 44 45 4e 5f 43 4f 4c 55 4d 4e 53  E_HIDDEN_COLUMNS
8970: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6c  .void sqlite3Col
8980: 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f  umnPropertiesFro
8990: 6d 4e 61 6d 65 28 54 61 62 6c 65 20 2a 70 54 61  mName(Table *pTa
89a0: 62 2c 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29  b, Column *pCol)
89b0: 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  {.  if( sqlite3_
89c0: 73 74 72 6e 69 63 6d 70 28 70 43 6f 6c 2d 3e 7a  strnicmp(pCol->z
89d0: 4e 61 6d 65 2c 20 22 5f 5f 68 69 64 64 65 6e 5f  Name, "__hidden_
89e0: 5f 22 2c 20 31 30 29 3d 3d 30 20 29 7b 0a 20 20  _", 10)==0 ){.  
89f0: 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73    pCol->colFlags
8a00: 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44   |= COLFLAG_HIDD
8a10: 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  EN;.  }else if( 
8a20: 70 54 61 62 20 26 26 20 70 43 6f 6c 21 3d 70 54  pTab && pCol!=pT
8a30: 61 62 2d 3e 61 43 6f 6c 20 26 26 20 28 70 43 6f  ab->aCol && (pCo
8a40: 6c 5b 2d 31 5d 2e 63 6f 6c 46 6c 61 67 73 20 26  l[-1].colFlags &
8a50: 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e 29   COLFLAG_HIDDEN)
8a60: 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61   ){.    pTab->ta
8a70: 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 4f 4f 4f  bFlags |= TF_OOO
8a80: 48 69 64 64 65 6e 3b 0a 20 20 7d 0a 7d 0a 23 65  Hidden;.  }.}.#e
8a90: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  ndif.../*.** Add
8aa0: 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f   a new column to
8ab0: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
8ac0: 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74  ntly being const
8ad0: 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  ructed..**.** Th
8ae0: 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74  e parser calls t
8af0: 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65  his routine once
8b00: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
8b10: 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20   declaration.** 
8b20: 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  in a CREATE TABL
8b30: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71  E statement.  sq
8b40: 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
8b50: 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a  ) gets called.**
8b60: 20 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68   first to get th
8b70: 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65  ings going.  The
8b80: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
8b90: 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63  s called for eac
8ba0: 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  h.** column..*/.
8bb0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
8bc0: 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61  olumn(Parse *pPa
8bd0: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  rse, Token *pNam
8be0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29  e, Token *pType)
8bf0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
8c00: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  int i;.  char *z
8c10: 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  ;.  char *zType;
8c20: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
8c30: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
8c40: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
8c50: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
8c60: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
8c70: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d  return;.  if( p-
8c80: 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d  >nCol+1>db->aLim
8c90: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
8ca0: 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73  COLUMN] ){.    s
8cb0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8cc0: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
8cd0: 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c   columns on %s",
8ce0: 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20   p->zName);.    
8cf0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 20  return;.  }.  z 
8d00: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
8d10: 63 52 61 77 28 64 62 2c 20 70 4e 61 6d 65 2d 3e  cRaw(db, pName->
8d20: 6e 20 2b 20 70 54 79 70 65 2d 3e 6e 20 2b 20 32  n + pType->n + 2
8d30: 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  );.  if( z==0 ) 
8d40: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 49 4e  return;.  if( IN
8d50: 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29  _RENAME_OBJECT )
8d60: 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f   sqlite3RenameTo
8d70: 6b 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28  kenMap(pParse, (
8d80: 76 6f 69 64 2a 29 7a 2c 20 70 4e 61 6d 65 29 3b  void*)z, pName);
8d90: 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 4e 61  .  memcpy(z, pNa
8da0: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29  me->z, pName->n)
8db0: 3b 0a 20 20 7a 5b 70 4e 61 6d 65 2d 3e 6e 5d 20  ;.  z[pName->n] 
8dc0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  = 0;.  sqlite3De
8dd0: 71 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f 72 28  quote(z);.  for(
8de0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
8df0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
8e00: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 2c  lite3_stricmp(z,
8e10: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d   p->aCol[i].zNam
8e20: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  e)==0 ){.      s
8e30: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8e40: 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74  Parse, "duplicat
8e50: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25  e column name: %
8e60: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71  s", z);.      sq
8e70: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
8e80: 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  z);.      return
8e90: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
8ea0: 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37  ( (p->nCol & 0x7
8eb0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75  )==0 ){.    Colu
8ec0: 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e  mn *aNew;.    aN
8ed0: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ew = sqlite3DbRe
8ee0: 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c  alloc(db,p->aCol
8ef0: 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a  ,(p->nCol+8)*siz
8f00: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
8f10: 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d  ;.    if( aNew==
8f20: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
8f30: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
8f40: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
8f50: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c     }.    p->aCol
8f60: 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = aNew;.  }.  p
8f70: 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70  Col = &p->aCol[p
8f80: 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65  ->nCol];.  memse
8f90: 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f  t(pCol, 0, sizeo
8fa0: 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a  f(p->aCol[0]));.
8fb0: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20    pCol->zName = 
8fc0: 7a 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  z;.  sqlite3Colu
8fd0: 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d  mnPropertiesFrom
8fe0: 4e 61 6d 65 28 70 2c 20 70 43 6f 6c 29 3b 0a 20  Name(p, pCol);. 
8ff0: 0a 20 20 69 66 28 20 70 54 79 70 65 2d 3e 6e 3d  .  if( pType->n=
9000: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
9010: 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65  there is no type
9020: 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75   specified, colu
9030: 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66  mns have the def
9040: 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20  ault affinity.  
9050: 20 20 2a 2a 20 27 42 4c 4f 42 27 20 77 69 74 68    ** 'BLOB' with
9060: 20 61 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20   a default size 
9070: 6f 66 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20  of 4 bytes. */. 
9080: 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74     pCol->affinit
9090: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  y = SQLITE_AFF_B
90a0: 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73  LOB;.    pCol->s
90b0: 7a 45 73 74 20 3d 20 31 3b 0a 23 69 66 64 65 66  zEst = 1;.#ifdef
90c0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
90d0: 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53  ORTER_REFERENCES
90e0: 0a 20 20 20 20 69 66 28 20 34 3e 3d 73 71 6c 69  .    if( 4>=sqli
90f0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
9100: 73 7a 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20  szSorterRef ){. 
9110: 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c       pCol->colFl
9120: 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 53  ags |= COLFLAG_S
9130: 4f 52 54 45 52 52 45 46 3b 0a 20 20 20 20 7d 0a  ORTERREF;.    }.
9140: 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a  #endif.  }else{.
9150: 20 20 20 20 7a 54 79 70 65 20 3d 20 7a 20 2b 20      zType = z + 
9160: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
9170: 7a 29 20 2b 20 31 3b 0a 20 20 20 20 6d 65 6d 63  z) + 1;.    memc
9180: 70 79 28 7a 54 79 70 65 2c 20 70 54 79 70 65 2d  py(zType, pType-
9190: 3e 7a 2c 20 70 54 79 70 65 2d 3e 6e 29 3b 0a 20  >z, pType->n);. 
91a0: 20 20 20 7a 54 79 70 65 5b 70 54 79 70 65 2d 3e     zType[pType->
91b0: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  n] = 0;.    sqli
91c0: 74 65 33 44 65 71 75 6f 74 65 28 7a 54 79 70 65  te3Dequote(zType
91d0: 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66  );.    pCol->aff
91e0: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41  inity = sqlite3A
91f0: 66 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70  ffinityType(zTyp
9200: 65 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 70 43  e, pCol);.    pC
9210: 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20  ol->colFlags |= 
9220: 43 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b  COLFLAG_HASTYPE;
9230: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b  .  }.  p->nCol++
9240: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73  ;.  pParse->cons
9250: 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 3d 20 30  traintName.n = 0
9260: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
9270: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
9280: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
9290: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
92a0: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
92b0: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
92c0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22   statement.  A "
92d0: 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72  NOT NULL" constr
92e0: 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e  aint has.** been
92f0: 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d   seen on a colum
9300: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
9310: 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c   sets the notNul
9320: 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65  l flag on.** the
9330: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
9340: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
9350: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
9360: 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28  lite3AddNotNull(
9370: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
9380: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54  nt onError){.  T
9390: 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d  able *p;.  Colum
93a0: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 70 20 3d 20 70  n *pCol;.  p = p
93b0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
93c0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
93d0: 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29  NEVER(p->nCol<1)
93e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f   ) return;.  pCo
93f0: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  l = &p->aCol[p->
9400: 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 70 43 6f 6c 2d  nCol-1];.  pCol-
9410: 3e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f  >notNull = (u8)o
9420: 6e 45 72 72 6f 72 3b 0a 20 20 70 2d 3e 74 61 62  nError;.  p->tab
9430: 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 4e  Flags |= TF_HasN
9440: 6f 74 4e 75 6c 6c 3b 0a 0a 20 20 2f 2a 20 53 65  otNull;..  /* Se
9450: 74 20 74 68 65 20 75 6e 69 71 4e 6f 74 4e 75 6c  t the uniqNotNul
9460: 6c 20 66 6c 61 67 20 6f 6e 20 61 6e 79 20 55 4e  l flag on any UN
9470: 49 51 55 45 20 6f 72 20 50 4b 20 69 6e 64 65 78  IQUE or PK index
9480: 65 73 20 61 6c 72 65 61 64 79 20 63 72 65 61 74  es already creat
9490: 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20  ed.  ** on this 
94a0: 63 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a 20 20 69 66  column.  */.  if
94b0: 28 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73  ( pCol->colFlags
94c0: 20 26 20 43 4f 4c 46 4c 41 47 5f 55 4e 49 51 55   & COLFLAG_UNIQU
94d0: 45 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  E ){.    Index *
94e0: 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49  pIdx;.    for(pI
94f0: 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49  dx=p->pIndex; pI
9500: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
9510: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73  Next){.      ass
9520: 65 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43  ert( pIdx->nKeyC
9530: 6f 6c 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f  ol==1 && pIdx->o
9540: 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
9550: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  );.      if( pId
9560: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
9570: 70 2d 3e 6e 43 6f 6c 2d 31 20 29 7b 0a 20 20 20  p->nCol-1 ){.   
9580: 20 20 20 20 20 70 49 64 78 2d 3e 75 6e 69 71 4e       pIdx->uniqN
9590: 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20  otNull = 1;.    
95a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
95b0: 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20  ./*.** Scan the 
95c0: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65  column type name
95d0: 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e   zType (length n
95e0: 54 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e  Type) and return
95f0: 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74   the.** associat
9600: 65 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65  ed affinity type
9610: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
9620: 74 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65  tine does a case
9630: 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61  -independent sea
9640: 72 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72  rch of zType for
9650: 20 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69   the .** substri
9660: 6e 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ngs in the follo
9670: 77 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f  wing table. If o
9680: 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72  ne of the substr
9690: 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64  ings is.** found
96a0: 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
96b0: 69 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73 20  ing affinity is 
96c0: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79  returned. If zTy
96d0: 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d  pe contains.** m
96e0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20  ore than one of 
96f0: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20  the substrings, 
9700: 65 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20 74  entries toward t
9710: 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68  he top of .** th
9720: 65 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69  e table take pri
9730: 6f 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70  ority. For examp
9740: 6c 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20  le, if zType is 
9750: 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53  'BLOBINT', .** S
9760: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
9770: 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  R is returned..*
9780: 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20  *.** Substring  
9790: 20 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a     | Affinity.**
97a0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
97b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
97c0: 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20  -.** 'INT'      
97d0: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
97e0: 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52  INTEGER.** 'CHAR
97f0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
9800: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43  E_AFF_TEXT.** 'C
9810: 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOB'        | SQ
9820: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
9830: 20 27 54 45 58 54 27 20 20 20 20 20 20 20 20 7c   'TEXT'        |
9840: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
9850: 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20  .** 'BLOB'      
9860: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 42    | SQLITE_AFF_B
9870: 4c 4f 42 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20  LOB.** 'REAL'   
9880: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
9890: 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27  F_REAL.** 'FLOA'
98a0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
98b0: 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f  _AFF_REAL.** 'DO
98c0: 55 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  UB'        | SQL
98d0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a  ITE_AFF_REAL.**.
98e0: 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68  ** If none of th
98f0: 65 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20  e substrings in 
9900: 74 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20  the above table 
9910: 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51  are found,.** SQ
9920: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
9930: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
9940: 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66  .char sqlite3Aff
9950: 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20  inityType(const 
9960: 63 68 61 72 20 2a 7a 49 6e 2c 20 43 6f 6c 75 6d  char *zIn, Colum
9970: 6e 20 2a 70 43 6f 6c 29 7b 0a 20 20 75 33 32 20  n *pCol){.  u32 
9980: 68 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66  h = 0;.  char af
9990: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  f = SQLITE_AFF_N
99a0: 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20  UMERIC;.  const 
99b0: 63 68 61 72 20 2a 7a 43 68 61 72 20 3d 20 30 3b  char *zChar = 0;
99c0: 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 49 6e 21  ..  assert( zIn!
99d0: 3d 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 7a  =0 );.  while( z
99e0: 49 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d  In[0] ){.    h =
99f0: 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65   (h<<8) + sqlite
9a00: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a  3UpperToLower[(*
9a10: 7a 49 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20  zIn)&0xff];.    
9a20: 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68  zIn++;.    if( h
9a30: 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68  ==(('c'<<24)+('h
9a40: 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b  '<<16)+('a'<<8)+
9a50: 27 72 27 29 20 29 7b 20 20 20 20 20 20 20 20 20  'r') ){         
9a60: 20 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20      /* CHAR */. 
9a70: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
9a80: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
9a90: 20 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 20    zChar = zIn;. 
9aa0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
9ab0: 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c  (('c'<<24)+('l'<
9ac0: 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62  <16)+('o'<<8)+'b
9ad0: 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43  ') ){       /* C
9ae0: 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  LOB */.      aff
9af0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   = SQLITE_AFF_TE
9b00: 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  XT;.    }else if
9b10: 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b  ( h==(('t'<<24)+
9b20: 28 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c  ('e'<<16)+('x'<<
9b30: 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20  8)+'t') ){      
9b40: 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20   /* TEXT */.    
9b50: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
9b60: 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c  FF_TEXT;.    }el
9b70: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c  se if( h==(('b'<
9b80: 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28  <24)+('l'<<16)+(
9b90: 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20  'o'<<8)+'b')    
9ba0: 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f        /* BLOB */
9bb0: 0a 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66  .        && (aff
9bc0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
9bd0: 45 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  ERIC || aff==SQL
9be0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b  ITE_AFF_REAL) ){
9bf0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
9c00: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20  ITE_AFF_BLOB;.  
9c10: 20 20 20 20 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d      if( zIn[0]==
9c20: 27 28 27 20 29 20 7a 43 68 61 72 20 3d 20 7a 49  '(' ) zChar = zI
9c30: 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  n;.#ifndef SQLIT
9c40: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
9c50: 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20  POINT.    }else 
9c60: 69 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34  if( h==(('r'<<24
9c70: 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27  )+('e'<<16)+('a'
9c80: 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20  <<8)+'l')       
9c90: 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20     /* REAL */.  
9ca0: 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51        && aff==SQ
9cb0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
9cc0: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
9cd0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b  SQLITE_AFF_REAL;
9ce0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
9cf0: 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c  ==(('f'<<24)+('l
9d00: 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b  '<<16)+('o'<<8)+
9d10: 27 61 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a  'a')          /*
9d20: 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20   FLOA */.       
9d30: 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   && aff==SQLITE_
9d40: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20  AFF_NUMERIC ){. 
9d50: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
9d60: 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20  E_AFF_REAL;.    
9d70: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
9d80: 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36  d'<<24)+('o'<<16
9d90: 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20  )+('u'<<8)+'b') 
9da0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42           /* DOUB
9db0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61   */.        && a
9dc0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
9dd0: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
9de0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
9df0: 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20  _REAL;.#endif.  
9e00: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30    }else if( (h&0
9e10: 78 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69  x00FFFFFF)==(('i
9e20: 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b  '<<16)+('n'<<8)+
9e30: 27 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e  't') ){    /* IN
9e40: 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  T */.      aff =
9e50: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
9e60: 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  GER;.      break
9e70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
9e80: 2a 20 49 66 20 70 43 6f 6c 20 69 73 20 6e 6f 74  * If pCol is not
9e90: 20 4e 55 4c 4c 2c 20 73 74 6f 72 65 20 61 6e 20   NULL, store an 
9ea0: 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
9eb0: 66 69 65 6c 64 20 73 69 7a 65 2e 20 20 54 68 65  field size.  The
9ec0: 0a 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 20 69  .  ** estimate i
9ed0: 73 20 73 63 61 6c 65 64 20 73 6f 20 74 68 61 74  s scaled so that
9ee0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20   the size of an 
9ef0: 69 6e 74 65 67 65 72 20 69 73 20 31 2e 20 20 2a  integer is 1.  *
9f00: 2f 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a  /.  if( pCol ){.
9f10: 20 20 20 20 69 6e 74 20 76 20 3d 20 30 3b 20 20      int v = 0;  
9f20: 20 2f 2a 20 64 65 66 61 75 6c 74 20 73 69 7a 65   /* default size
9f30: 20 69 73 20 61 70 70 72 6f 78 20 34 20 62 79 74   is approx 4 byt
9f40: 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66  es */.    if( af
9f50: 66 3c 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  f<SQLITE_AFF_NUM
9f60: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 69 66  ERIC ){.      if
9f70: 28 20 7a 43 68 61 72 20 29 7b 0a 20 20 20 20 20  ( zChar ){.     
9f80: 20 20 20 77 68 69 6c 65 28 20 7a 43 68 61 72 5b     while( zChar[
9f90: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0] ){.          
9fa0: 69 66 28 20 73 71 6c 69 74 65 33 49 73 64 69 67  if( sqlite3Isdig
9fb0: 69 74 28 7a 43 68 61 72 5b 30 5d 29 20 29 7b 0a  it(zChar[0]) ){.
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
9fd0: 4c 4f 42 28 6b 29 2c 20 56 41 52 43 48 41 52 28  LOB(k), VARCHAR(
9fe0: 6b 29 2c 20 43 48 41 52 28 6b 29 20 2d 3e 20 72  k), CHAR(k) -> r
9ff0: 3d 28 6b 2f 34 2b 31 29 20 2a 2f 0a 20 20 20 20  =(k/4+1) */.    
a000: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
a010: 65 74 49 6e 74 33 32 28 7a 43 68 61 72 2c 20 26  etInt32(zChar, &
a020: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v);.            
a030: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
a040: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 43 68   }.          zCh
a050: 61 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ar++;.        }.
a060: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a070: 20 20 20 20 20 76 20 3d 20 31 36 3b 20 20 20 2f       v = 16;   /
a080: 2a 20 42 4c 4f 42 2c 20 54 45 58 54 2c 20 43 4c  * BLOB, TEXT, CL
a090: 4f 42 20 2d 3e 20 72 3d 35 20 20 28 61 70 70 72  OB -> r=5  (appr
a0a0: 6f 78 20 32 30 20 62 79 74 65 73 29 2a 2f 0a 20  ox 20 bytes)*/. 
a0b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
a0c0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
a0d0: 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
a0e0: 43 45 53 0a 20 20 20 20 69 66 28 20 76 3e 3d 73  CES.    if( v>=s
a0f0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
a100: 69 67 2e 73 7a 53 6f 72 74 65 72 52 65 66 20 29  ig.szSorterRef )
a110: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f  {.      pCol->co
a120: 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41  lFlags |= COLFLA
a130: 47 5f 53 4f 52 54 45 52 52 45 46 3b 0a 20 20 20  G_SORTERREF;.   
a140: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 76 20   }.#endif.    v 
a150: 3d 20 76 2f 34 20 2b 20 31 3b 0a 20 20 20 20 69  = v/4 + 1;.    i
a160: 66 28 20 76 3e 32 35 35 20 29 20 76 20 3d 20 32  f( v>255 ) v = 2
a170: 35 35 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a  55;.    pCol->sz
a180: 45 73 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72  Est = v;.  }.  r
a190: 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a  eturn aff;.}../*
a1a0: 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69  .** The expressi
a1b0: 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  on is the defaul
a1c0: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
a1d0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
a1e0: 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66  ded column.** of
a1f0: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
a200: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
a210: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44  ruction..**.** D
a220: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70  efault value exp
a230: 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65  ressions must be
a240: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73   constant.  Rais
a250: 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69  e an exception i
a260: 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74  f this.** is not
a270: 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a   the case..**.**
a280: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
a290: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
a2a0: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
a2b0: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
a2c0: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
a2d0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
a2e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a2f0: 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65  3AddDefaultValue
a300: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
a310: 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
a320: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
a330: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
a340: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
a350: 20 54 68 65 20 70 61 72 73 65 64 20 65 78 70 72   The parsed expr
a360: 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 64 65  ession of the de
a370: 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 20  fault value */. 
a380: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74   const char *zSt
a390: 61 72 74 2c 20 20 20 20 20 20 2f 2a 20 53 74 61  art,      /* Sta
a3a0: 72 74 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c  rt of the defaul
a3b0: 74 20 76 61 6c 75 65 20 74 65 78 74 20 2a 2f 0a  t value text */.
a3c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
a3d0: 6e 64 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  nd         /* Fi
a3e0: 72 73 74 20 63 68 61 72 61 63 74 65 72 20 70 61  rst character pa
a3f0: 73 74 20 65 6e 64 20 6f 66 20 64 65 66 61 75 74  st end of defaut
a400: 20 76 61 6c 75 65 20 74 65 78 74 20 2a 2f 0a 29   value text */.)
a410: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
a420: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
a430: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
a440: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20  arse->db;.  p = 
a450: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
a460: 65 3b 0a 20 20 69 66 28 20 70 21 3d 30 20 29 7b  e;.  if( p!=0 ){
a470: 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d  .    pCol = &(p-
a480: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d  >aCol[p->nCol-1]
a490: 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  );.    if( !sqli
a4a0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
a4b0: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 45 78 70  tOrFunction(pExp
a4c0: 72 2c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  r, db->init.busy
a4d0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
a4e0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
a4f0: 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75  e, "default valu
a500: 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d  e of column [%s]
a510: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74   is not constant
a520: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ",.          pCo
a530: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  l->zName);.    }
a540: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
a550: 20 63 6f 70 79 20 6f 66 20 70 45 78 70 72 20 69   copy of pExpr i
a560: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f  s used instead o
a570: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20  f the original, 
a580: 61 73 20 70 45 78 70 72 20 63 6f 6e 74 61 69 6e  as pExpr contain
a590: 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e  s.      ** token
a5a0: 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
a5b0: 76 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e  volatile memory.
a5c0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
a5d0: 45 78 70 72 20 78 3b 0a 20 20 20 20 20 20 73 71  Expr x;.      sq
a5e0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
a5f0: 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29  db, pCol->pDflt)
a600: 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
a610: 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29  x, 0, sizeof(x))
a620: 3b 0a 20 20 20 20 20 20 78 2e 6f 70 20 3d 20 54  ;.      x.op = T
a630: 4b 5f 53 50 41 4e 3b 0a 20 20 20 20 20 20 78 2e  K_SPAN;.      x.
a640: 75 2e 7a 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74  u.zToken = sqlit
a650: 65 33 44 62 53 70 61 6e 44 75 70 28 64 62 2c 20  e3DbSpanDup(db, 
a660: 7a 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20  zStart, zEnd);. 
a670: 20 20 20 20 20 78 2e 70 4c 65 66 74 20 3d 20 70       x.pLeft = p
a680: 45 78 70 72 3b 0a 20 20 20 20 20 20 78 2e 66 6c  Expr;.      x.fl
a690: 61 67 73 20 3d 20 45 50 5f 53 6b 69 70 3b 0a 20  ags = EP_Skip;. 
a6a0: 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74       pCol->pDflt
a6b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
a6c0: 70 28 64 62 2c 20 26 78 2c 20 45 58 50 52 44 55  p(db, &x, EXPRDU
a6d0: 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20  P_REDUCE);.     
a6e0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
a6f0: 62 2c 20 78 2e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  b, x.u.zToken);.
a700: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
a710: 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
a720: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
a730: 65 6e 61 6d 65 45 78 70 72 55 6e 6d 61 70 28 70  enameExprUnmap(p
a740: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
a750: 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
a760: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
a770: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 61 63 6b  );.}../*.** Back
a780: 77 61 72 64 73 20 43 6f 6d 70 61 74 69 62 69 6c  wards Compatibil
a790: 69 74 79 20 48 61 63 6b 3a 0a 2a 2a 20 0a 2a 2a  ity Hack:.** .**
a7a0: 20 48 69 73 74 6f 72 69 63 61 6c 20 76 65 72 73   Historical vers
a7b0: 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61  ions of SQLite a
a7c0: 63 63 65 70 74 65 64 20 73 74 72 69 6e 67 73 20  ccepted strings 
a7d0: 61 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  as column names 
a7e0: 69 6e 0a 2a 2a 20 69 6e 64 65 78 65 73 20 61 6e  in.** indexes an
a7f0: 64 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  d PRIMARY KEY co
a800: 6e 73 74 72 61 69 6e 74 73 20 61 6e 64 20 69 6e  nstraints and in
a810: 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
a820: 6e 74 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a  nts.  Example:.*
a830: 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20  *.**     CREATE 
a840: 54 41 42 4c 45 20 78 79 7a 28 61 2c 62 2c 63 2c  TABLE xyz(a,b,c,
a850: 64 2c 65 2c 50 52 49 4d 41 52 59 20 4b 45 59 28  d,e,PRIMARY KEY(
a860: 27 61 27 29 2c 55 4e 49 51 55 45 28 27 62 27 2c  'a'),UNIQUE('b',
a870: 27 63 27 20 43 4f 4c 4c 41 54 45 20 74 72 69 6d  'c' COLLATE trim
a880: 29 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20  ).**     CREATE 
a890: 49 4e 44 45 58 20 61 62 63 20 4f 4e 20 78 79 7a  INDEX abc ON xyz
a8a0: 28 27 63 27 2c 27 64 27 20 44 45 53 43 2c 27 65  ('c','d' DESC,'e
a8b0: 27 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  ' COLLATE nocase
a8c0: 20 44 45 53 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68   DESC);.**.** Th
a8d0: 69 73 20 69 73 20 67 6f 6f 66 79 2e 20 20 42 75  is is goofy.  Bu
a8e0: 74 20 74 6f 20 70 72 65 73 65 72 76 65 20 62 61  t to preserve ba
a8f0: 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
a900: 69 6c 69 74 79 20 77 65 20 63 6f 6e 74 69 6e 75  ility we continu
a910: 65 20 74 6f 0a 2a 2a 20 61 63 63 65 70 74 20 69  e to.** accept i
a920: 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
a930: 20 64 6f 65 73 20 74 68 65 20 6e 65 63 65 73 73   does the necess
a940: 61 72 79 20 63 6f 6e 76 65 72 73 69 6f 6e 2e 20  ary conversion. 
a950: 20 49 74 20 63 6f 6e 76 65 72 74 73 0a 2a 2a 20   It converts.** 
a960: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 67  the expression g
a970: 69 76 65 6e 20 69 6e 20 69 74 73 20 61 72 67 75  iven in its argu
a980: 6d 65 6e 74 20 66 72 6f 6d 20 61 20 54 4b 5f 53  ment from a TK_S
a990: 54 52 49 4e 47 20 69 6e 74 6f 20 61 20 54 4b 5f  TRING into a TK_
a9a0: 49 44 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 70  ID.** if the exp
a9b0: 72 65 73 73 69 6f 6e 20 69 73 20 6a 75 73 74 20  ression is just 
a9c0: 61 20 54 4b 5f 53 54 52 49 4e 47 20 77 69 74 68  a TK_STRING with
a9d0: 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 43 4f 4c   an optional COL
a9e0: 4c 41 54 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20  LATE clause..** 
a9f0: 49 66 20 74 68 65 20 65 70 78 72 65 73 73 69 6f  If the epxressio
aa00: 6e 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6f 74  n is anything ot
aa10: 68 65 72 20 74 68 61 6e 20 54 4b 5f 53 54 52 49  her than TK_STRI
aa20: 4e 47 2c 20 74 68 65 20 65 78 70 72 65 73 73 69  NG, the expressi
aa30: 6f 6e 20 69 73 0a 2a 2a 20 75 6e 63 68 61 6e 67  on is.** unchang
aa40: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
aa50: 69 64 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67  id sqlite3String
aa60: 54 6f 49 64 28 45 78 70 72 20 2a 70 29 7b 0a 20  ToId(Expr *p){. 
aa70: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53   if( p->op==TK_S
aa80: 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e  TRING ){.    p->
aa90: 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 65  op = TK_ID;.  }e
aaa0: 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  lse if( p->op==T
aab0: 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 70 2d 3e  K_COLLATE && p->
aac0: 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 54  pLeft->op==TK_ST
aad0: 52 49 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e 70  RING ){.    p->p
aae0: 4c 65 66 74 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44  Left->op = TK_ID
aaf0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
ab00: 65 73 69 67 6e 61 74 65 20 74 68 65 20 50 52 49  esignate the PRI
ab10: 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65  MARY KEY for the
ab20: 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69   table.  pList i
ab30: 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65  s a list of name
ab40: 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73  s .** of columns
ab50: 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70   that form the p
ab60: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
ab70: 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74  pList is NULL, t
ab80: 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20  hen the.** most 
ab90: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63  recently added c
aba0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62  olumn of the tab
abb0: 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72  le is the primar
abc0: 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  y key..**.** A t
abd0: 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74  able can have at
abe0: 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72   most one primar
abf0: 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74  y key.  If the t
ac00: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73  able already has
ac10: 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65  .** a primary ke
ac20: 79 20 28 61 6e 64 20 74 68 69 73 20 69 73 20 74  y (and this is t
ac30: 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72  he second primar
ac40: 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61  y key) then crea
ac50: 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a  te an.** error..
ac60: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49  **.** If the PRI
ac70: 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61  MARY KEY is on a
ac80: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77   single column w
ac90: 68 6f 73 65 20 64 61 74 61 74 79 70 65 20 69 73  hose datatype is
aca0: 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65   INTEGER,.** the
acb0: 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f  n we will try to
acc0: 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e   use that column
acd0: 20 61 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20   as the rowid.  
ace0: 53 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50  Set the Table.iP
acf0: 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20  Key.** field of 
ad00: 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20  the table under 
ad10: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20  construction to 
ad20: 62 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  be the index of 
ad30: 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50  the.** INTEGER P
ad40: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
ad50: 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20  n.  Table.iPKey 
ad60: 69 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20  is set to -1 if 
ad70: 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49  there is.** no I
ad80: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
ad90: 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  EY..**.** If the
ada0: 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49   key is not an I
adb0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
adc0: 45 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  EY, then create 
add0: 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65  a unique.** inde
ade0: 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20  x for the key.  
adf0: 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65 61  No index is crea
ae00: 74 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20  ted for INTEGER 
ae10: 50 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f  PRIMARY KEYs..*/
ae20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
ae30: 50 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61  PrimaryKey(.  Pa
ae40: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
ae50: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
ae60: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
ae70: 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73   *pList,  /* Lis
ae80: 74 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73  t of field names
ae90: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
aea0: 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
aeb0: 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
aec0: 20 64 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75   do with a uniqu
aed0: 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a  eness conflict *
aee0: 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c  /.  int autoInc,
aef0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
af00: 20 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45   the AUTOINCREME
af10: 4e 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  NT keyword is pr
af20: 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73  esent */.  int s
af30: 6f 72 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20  ortOrder     /* 
af40: 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72  SQLITE_SO_ASC or
af50: 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20   SQLITE_SO_DESC 
af60: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
af70: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
af80: 65 77 54 61 62 6c 65 3b 0a 20 20 43 6f 6c 75 6d  ewTable;.  Colum
af90: 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69  n *pCol = 0;.  i
afa0: 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b  nt iCol = -1, i;
afb0: 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20  .  int nTerm;.  
afc0: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f  if( pTab==0 ) go
afd0: 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  to primary_key_e
afe0: 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d  xit;.  if( pTab-
aff0: 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48  >tabFlags & TF_H
b000: 61 73 50 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a  asPrimaryKey ){.
b010: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
b020: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
b030: 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22     "table \"%s\"
b040: 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
b050: 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c  ne primary key",
b060: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
b070: 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f     goto primary_
b080: 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20  key_exit;.  }.  
b090: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
b0a0: 3d 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b  = TF_HasPrimaryK
b0b0: 65 79 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  ey;.  if( pList=
b0c0: 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  =0 ){.    iCol =
b0d0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b   pTab->nCol - 1;
b0e0: 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61  .    pCol = &pTa
b0f0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20  b->aCol[iCol];. 
b100: 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67     pCol->colFlag
b110: 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49  s |= COLFLAG_PRI
b120: 4d 4b 45 59 3b 0a 20 20 20 20 6e 54 65 72 6d 20  MKEY;.    nTerm 
b130: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
b140: 20 20 6e 54 65 72 6d 20 3d 20 70 4c 69 73 74 2d    nTerm = pList-
b150: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28  >nExpr;.    for(
b160: 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b  i=0; i<nTerm; i+
b170: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
b180: 70 43 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  pCExpr = sqlite3
b190: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
b1a0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
b1b0: 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
b1c0: 28 20 70 43 45 78 70 72 21 3d 30 20 29 3b 0a 20  ( pCExpr!=0 );. 
b1d0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 69       sqlite3Stri
b1e0: 6e 67 54 6f 49 64 28 70 43 45 78 70 72 29 3b 0a  ngToId(pCExpr);.
b1f0: 20 20 20 20 20 20 69 66 28 20 70 43 45 78 70 72        if( pCExpr
b200: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20  ->op==TK_ID ){. 
b210: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
b220: 72 20 2a 7a 43 4e 61 6d 65 20 3d 20 70 43 45 78  r *zCName = pCEx
b230: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
b240: 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30        for(iCol=0
b250: 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  ; iCol<pTab->nCo
b260: 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  l; iCol++){.    
b270: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
b280: 33 53 74 72 49 43 6d 70 28 7a 43 4e 61 6d 65 2c  3StrICmp(zCName,
b290: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
b2a0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
b2b0: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
b2c0: 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  = &pTab->aCol[iC
b2d0: 6f 6c 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ol];.           
b2e0: 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
b2f0: 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b  |= COLFLAG_PRIMK
b300: 45 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EY;.            
b310: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
b320: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
b330: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
b340: 20 69 66 28 20 6e 54 65 72 6d 3d 3d 31 0a 20 20   if( nTerm==1.  
b350: 20 26 26 20 70 43 6f 6c 0a 20 20 20 26 26 20 73   && pCol.   && s
b360: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 73 71  qlite3StrICmp(sq
b370: 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28  lite3ColumnType(
b380: 70 43 6f 6c 2c 22 22 29 2c 20 22 49 4e 54 45 47  pCol,""), "INTEG
b390: 45 52 22 29 3d 3d 30 0a 20 20 20 26 26 20 73 6f  ER")==0.   && so
b3a0: 72 74 4f 72 64 65 72 21 3d 53 51 4c 49 54 45 5f  rtOrder!=SQLITE_
b3b0: 53 4f 5f 44 45 53 43 0a 20 20 29 7b 0a 20 20 20  SO_DESC.  ){.   
b3c0: 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
b3d0: 42 4a 45 43 54 20 26 26 20 70 4c 69 73 74 20 29  BJECT && pList )
b3e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
b3f0: 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70 28  enameTokenRemap(
b400: 70 50 61 72 73 65 2c 20 26 70 54 61 62 2d 3e 69  pParse, &pTab->i
b410: 50 4b 65 79 2c 20 70 4c 69 73 74 2d 3e 61 5b 30  PKey, pList->a[0
b420: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ].pExpr);.    }.
b430: 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
b440: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62  = iCol;.    pTab
b450: 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75 38 29  ->keyConf = (u8)
b460: 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61 73 73  onError;.    ass
b470: 65 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d 30 20  ert( autoInc==0 
b480: 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20 29 3b  || autoInc==1 );
b490: 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c  .    pTab->tabFl
b4a0: 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63 2a 54  ags |= autoInc*T
b4b0: 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b  F_Autoincrement;
b4c0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29  .    if( pList )
b4d0: 20 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74   pParse->iPkSort
b4e0: 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 2d 3e 61  Order = pList->a
b4f0: 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [0].sortOrder;. 
b500: 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49   }else if( autoI
b510: 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  nc ){.#ifndef SQ
b520: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
b530: 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69  CREMENT.    sqli
b540: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
b550: 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45  se, "AUTOINCREME
b560: 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77  NT is only allow
b570: 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20  ed on an ".     
b580: 20 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41    "INTEGER PRIMA
b590: 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66  RY KEY");.#endif
b5a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
b5b0: 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78  lite3CreateIndex
b5c0: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30  (pParse, 0, 0, 0
b5d0: 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72  , pList, onError
b5e0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
b5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b600: 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20 30 2c  0, sortOrder, 0,
b610: 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f   SQLITE_IDXTYPE_
b620: 50 52 49 4d 41 52 59 4b 45 59 29 3b 0a 20 20 20  PRIMARYKEY);.   
b630: 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a   pList = 0;.  }.
b640: 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69  .primary_key_exi
b650: 74 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  t:.  sqlite3Expr
b660: 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73  ListDelete(pPars
b670: 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  e->db, pList);. 
b680: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
b690: 2a 20 41 64 64 20 61 20 6e 65 77 20 43 48 45 43  * Add a new CHEC
b6a0: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20  K constraint to 
b6b0: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
b6c0: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
b6d0: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
b6e0: 73 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43  sqlite3AddCheckC
b6f0: 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72  onstraint(.  Par
b700: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
b710: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
b720: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43 68  t */.  Expr *pCh
b730: 65 63 6b 45 78 70 72 20 20 2f 2a 20 54 68 65 20  eckExpr  /* The 
b740: 63 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e  check expression
b750: 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
b760: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
b770: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
b780: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
b790: 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  le;.  sqlite3 *d
b7a0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
b7b0: 20 20 69 66 28 20 70 54 61 62 20 26 26 20 21 49    if( pTab && !I
b7c0: 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 0a 20  N_DECLARE_VTAB. 
b7d0: 20 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72    && !sqlite3Btr
b7e0: 65 65 49 73 52 65 61 64 6f 6e 6c 79 28 64 62 2d  eeIsReadonly(db-
b7f0: 3e 61 44 62 5b 64 62 2d 3e 69 6e 69 74 2e 69 44  >aDb[db->init.iD
b800: 62 5d 2e 70 42 74 29 0a 20 20 29 7b 0a 20 20 20  b].pBt).  ){.   
b810: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20   pTab->pCheck = 
b820: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
b830: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 54  ppend(pParse, pT
b840: 61 62 2d 3e 70 43 68 65 63 6b 2c 20 70 43 68 65  ab->pCheck, pChe
b850: 63 6b 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  ckExpr);.    if(
b860: 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61   pParse->constra
b870: 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a 20 20 20  intName.n ){.   
b880: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
b890: 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65  stSetName(pParse
b8a0: 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20  , pTab->pCheck, 
b8b0: 26 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61  &pParse->constra
b8c0: 69 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20  intName, 1);.   
b8d0: 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69   }.  }else.#endi
b8e0: 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  f.  {.    sqlite
b8f0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
b900: 73 65 2d 3e 64 62 2c 20 70 43 68 65 63 6b 45 78  se->db, pCheckEx
b910: 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  pr);.  }.}../*.*
b920: 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74  * Set the collat
b930: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20  ion function of 
b940: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
b950: 79 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63  y parsed table c
b960: 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20  olumn.** to the 
b970: 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a  CollSeq given..*
b980: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
b990: 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72  dCollateType(Par
b9a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
b9b0: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61  n *pToken){.  Ta
b9c0: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
b9d0: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20  .  char *zColl; 
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b9f0: 44 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66  Dequoted name of
ba00: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
ba10: 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  nce */.  sqlite3
ba20: 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 20   *db;..  if( (p 
ba30: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
ba40: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
ba50: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
ba60: 31 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  1;.  db = pParse
ba70: 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20  ->db;.  zColl = 
ba80: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
ba90: 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29  oken(db, pToken)
baa0: 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29  ;.  if( !zColl )
bab0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20   return;..  if( 
bac0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
bad0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f  lSeq(pParse, zCo
bae0: 6c 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ll) ){.    Index
baf0: 20 2a 70 49 64 78 3b 0a 20 20 20 20 73 71 6c 69   *pIdx;.    sqli
bb00: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
bb10: 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b  >aCol[i].zColl);
bb20: 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  .    p->aCol[i].
bb30: 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20  zColl = zColl;. 
bb40: 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
bb50: 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72  column is declar
bb60: 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52  ed as "<name> PR
bb70: 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54  IMARY KEY COLLAT
bb80: 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a  E <type>",.    *
bb90: 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20  * then an index 
bba0: 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 72  may have been cr
bbb0: 65 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f  eated on this co
bbc0: 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a  lumn before the.
bbd0: 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e      ** collation
bbe0: 20 74 79 70 65 20 77 61 73 20 61 64 64 65 64 2e   type was added.
bbf0: 20 43 6f 72 72 65 63 74 20 74 68 69 73 20 69 66   Correct this if
bc00: 20 69 74 20 69 73 20 74 68 65 20 63 61 73 65 2e   it is the case.
bc10: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
bc20: 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20  pIdx=p->pIndex; 
bc30: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
bc40: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61  >pNext){.      a
bc50: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65  ssert( pIdx->nKe
bc60: 79 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20  yCol==1 );.     
bc70: 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c   if( pIdx->aiCol
bc80: 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20  umn[0]==i ){.   
bc90: 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
bca0: 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69  l[0] = p->aCol[i
bcb0: 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  ].zColl;.      }
bcc0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
bcd0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
bce0: 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  e(db, zColl);.  
bcf0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
bd00: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
bd10: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
bd20: 65 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61  equence for data
bd30: 62 61 73 65 20 6e 61 74 69 76 65 20 74 65 78 74  base native text
bd40: 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65  .** encoding ide
bd50: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73  ntified by the s
bd60: 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e  tring zName, len
bd70: 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  gth nName..**.**
bd80: 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
bd90: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
bda0: 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69  ence is not avai
bdb0: 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76  lable, or not av
bdc0: 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68  ailable.** in th
bdd0: 65 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76  e database nativ
bde0: 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20  e encoding, the 
bdf0: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
be00: 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a  y is invoked to.
be10: 2a 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20 49  ** request it. I
be20: 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  f the collation 
be30: 66 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74  factory does not
be40: 20 73 75 70 70 6c 79 20 73 75 63 68 20 61 20 73   supply such a s
be50: 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20  equence,.** and 
be60: 74 68 65 20 73 65 71 75 65 6e 63 65 20 69 73 20  the sequence is 
be70: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f  available in ano
be80: 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69  ther text encodi
be90: 6e 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73  ng, then that is
bea0: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73  .** returned ins
beb0: 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  tead..**.** If n
bec0: 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
bed0: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c  e requested coll
bee0: 61 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20  ations sequence 
bef0: 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f  are available, o
bf00: 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72  r.** another err
bf10: 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  or occurs, NULL 
bf20: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
bf30: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
bf40: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
bf50: 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54   pParse..**.** T
bf60: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
bf70: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
bf80: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
bf90: 65 71 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74  eq().  This rout
bfa0: 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74  ine.** invokes t
bfb0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
bfc0: 74 6f 72 79 20 69 66 20 74 68 65 20 6e 61 6d 65  tory if the name
bfd0: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e  d collation cann
bfe0: 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a 20 61  ot be found.** a
bff0: 6e 64 20 67 65 6e 65 72 61 74 65 73 20 61 6e 20  nd generates an 
c000: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a  error message..*
c010: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73  *.** See also: s
c020: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
c030: 71 28 29 2c 20 73 71 6c 69 74 65 33 47 65 74 43  q(), sqlite3GetC
c040: 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43 6f 6c 6c  ollSeq().*/.Coll
c050: 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61  Seq *sqlite3Loca
c060: 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  teCollSeq(Parse 
c070: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
c080: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73  har *zName){.  s
c090: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
c0a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e  rse->db;.  u8 en
c0b0: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 75  c = ENC(db);.  u
c0c0: 38 20 69 6e 69 74 62 75 73 79 20 3d 20 64 62 2d  8 initbusy = db-
c0d0: 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f  >init.busy;.  Co
c0e0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20  llSeq *pColl;.. 
c0f0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
c100: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
c110: 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69 6e 69 74  enc, zName, init
c120: 62 75 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e  busy);.  if( !in
c130: 69 74 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c  itbusy && (!pCol
c140: 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d  l || !pColl->xCm
c150: 70 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  p) ){.    pColl 
c160: 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c  = sqlite3GetColl
c170: 53 65 71 28 70 50 61 72 73 65 2c 20 65 6e 63 2c  Seq(pParse, enc,
c180: 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a   pColl, zName);.
c190: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 43    }..  return pC
c1a0: 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  oll;.}.../*.** G
c1b0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
c1c0: 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74  t will increment
c1d0: 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
c1e0: 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63  ie..**.** The sc
c1f0: 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75  hema cookie is u
c200: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
c210: 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61   when the schema
c220: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61   for the.** data
c230: 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41  base changes.  A
c240: 66 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61  fter each schema
c250: 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f   change, the coo
c260: 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61  kie value.** cha
c270: 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72  nges.  When a pr
c280: 6f 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64  ocess first read
c290: 73 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20  s the schema it 
c2a0: 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63  records the.** c
c2b0: 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74  ookie.  Thereaft
c2c0: 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20  er, whenever it 
c2d0: 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74  goes to access t
c2e0: 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20  he database,.** 
c2f0: 69 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f  it checks the co
c300: 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  okie to make sur
c310: 65 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73  e the schema has
c320: 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20   not changed.** 
c330: 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73  since it was las
c340: 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  t read..**.** Th
c350: 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63  is plan is not c
c360: 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74  ompletely bullet
c370: 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70  -proof.  It is p
c380: 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74  ossible for.** t
c390: 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61  he schema to cha
c3a0: 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  nge multiple tim
c3b0: 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63  es and for the c
c3c0: 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73  ookie to be.** s
c3d0: 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72  et back to prior
c3e0: 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68   value.  But sch
c3f0: 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20  ema changes are 
c400: 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e  infrequent.** an
c410: 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  d the probabilit
c420: 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65  y of hitting the
c430: 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c   same cookie val
c440: 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20  ue is only.** 1 
c450: 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20  chance in 2^32. 
c460: 20 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65   So we're safe e
c470: 6e 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50  nough..**.** IMP
c480: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
c490: 52 2d 33 34 32 33 30 2d 35 36 30 34 39 20 53 51  R-34230-56049 SQ
c4a0: 4c 69 74 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  Lite automatical
c4b0: 6c 79 20 69 6e 63 72 65 6d 65 6e 74 73 0a 2a 2a  ly increments.**
c4c0: 20 74 68 65 20 73 63 68 65 6d 61 2d 76 65 72 73   the schema-vers
c4d0: 69 6f 6e 20 77 68 65 6e 65 76 65 72 20 74 68 65  ion whenever the
c4e0: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 2e   schema changes.
c4f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
c500: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50 61 72  ChangeCookie(Par
c510: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
c520: 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  iDb){.  sqlite3 
c530: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
c540: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
c550: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
c560: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
c570: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
c580: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 73  , iDb, 0) );.  s
c590: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
c5a0: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
c5b0: 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 53 43 48  , iDb, BTREE_SCH
c5c0: 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 0a 20 20  EMA_VERSION, .  
c5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5e0: 20 28 69 6e 74 29 28 31 2b 28 75 6e 73 69 67 6e   (int)(1+(unsign
c5f0: 65 64 29 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  ed)db->aDb[iDb].
c600: 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f  pSchema->schema_
c610: 63 6f 6f 6b 69 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a  cookie));.}../*.
c620: 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e  ** Measure the n
c630: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
c640: 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75  ers needed to ou
c650: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a  tput the given.*
c660: 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54  * identifier.  T
c670: 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e  he number return
c680: 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20  ed includes any 
c690: 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62  quotes used.** b
c6a0: 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c  ut does not incl
c6b0: 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72  ude the null ter
c6c0: 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  minator..**.** T
c6d0: 68 65 20 65 73 74 69 6d 61 74 65 20 69 73 20 63  he estimate is c
c6e0: 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49 74  onservative.  It
c6f0: 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72   might be larger
c700: 20 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a   that what is.**
c710: 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a   really needed..
c720: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64  */.static int id
c730: 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20  entLength(const 
c740: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
c750: 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a  n;.  for(n=0; *z
c760: 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20  ; n++, z++){.   
c770: 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20   if( *z=='"' ){ 
c780: 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74  n++; }.  }.  ret
c790: 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a  urn n + 2;.}../*
c7a0: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61  .** The first pa
c7b0: 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69  rameter is a poi
c7c0: 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75 74 70 75  nter to an outpu
c7d0: 74 20 62 75 66 66 65 72 2e 20 54 68 65 20 73 65  t buffer. The se
c7e0: 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65 74  cond .** paramet
c7f0: 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  er is a pointer 
c800: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68  to an integer th
c810: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
c820: 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20 77 68 69  offset at.** whi
c830: 63 68 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f  ch to write into
c840: 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
c850: 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
c860: 6e 20 63 6f 70 69 65 73 20 74 68 65 0a 2a 2a 20  n copies the.** 
c870: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
c880: 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f  tring pointed to
c890: 20 62 79 20 74 68 65 20 74 68 69 72 64 20 70 61   by the third pa
c8a0: 72 61 6d 65 74 65 72 2c 20 7a 53 69 67 6e 65 64  rameter, zSigned
c8b0: 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74 68 65  Ident,.** to the
c8c0: 20 73 70 65 63 69 66 69 65 64 20 6f 66 66 73 65   specified offse
c8d0: 74 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20  t in the buffer 
c8e0: 61 6e 64 20 75 70 64 61 74 65 73 20 2a 70 49 64  and updates *pId
c8f0: 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20 74 6f  x to refer.** to
c900: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
c910: 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 62  after the last b
c920: 79 74 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f  yte written befo
c930: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
c940: 20 0a 2a 2a 20 49 66 20 74 68 65 20 73 74 72 69   .** If the stri
c950: 6e 67 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 20  ng zSignedIdent 
c960: 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c  consists entirel
c970: 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75 6d 65 72  y of alpha-numer
c980: 69 63 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73  ic.** characters
c990: 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e  , does not begin
c9a0: 20 77 69 74 68 20 61 20 64 69 67 69 74 20 61 6e   with a digit an
c9b0: 64 20 69 73 20 6e 6f 74 20 61 6e 20 53 51 4c 20  d is not an SQL 
c9c0: 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e  keyword,.** then
c9d0: 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f   it is copied to
c9e0: 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
c9f0: 65 72 20 65 78 61 63 74 6c 79 20 61 73 20 69 74  er exactly as it
ca00: 20 69 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a   is. Otherwise,.
ca10: 2a 2a 20 69 74 20 69 73 20 71 75 6f 74 65 64 20  ** it is quoted 
ca20: 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d 71 75 6f  using double-quo
ca30: 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tes..*/.static v
ca40: 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61  oid identPut(cha
ca50: 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c  r *z, int *pIdx,
ca60: 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64   char *zSignedId
ca70: 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ent){.  unsigned
ca80: 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20   char *zIdent = 
ca90: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
caa0: 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20  zSignedIdent;.  
cab0: 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75  int i, j, needQu
cac0: 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78  ote;.  i = *pIdx
cad0: 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49  ;..  for(j=0; zI
cae0: 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  dent[j]; j++){. 
caf0: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49     if( !sqlite3I
cb00: 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d  salnum(zIdent[j]
cb10: 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d  ) && zIdent[j]!=
cb20: 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  '_' ) break;.  }
cb30: 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 73  .  needQuote = s
cb40: 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 49  qlite3Isdigit(zI
cb50: 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20  dent[0]).       
cb60: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b       || sqlite3K
cb70: 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e  eywordCode(zIden
cb80: 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a 20 20 20  t, j)!=TK_ID.   
cb90: 20 20 20 20 20 20 20 20 20 7c 7c 20 7a 49 64 65           || zIde
cba0: 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20 20 20 20 20  nt[j]!=0.       
cbb0: 20 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b 0a 0a 20       || j==0;.. 
cbc0: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
cbd0: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
cbe0: 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74   for(j=0; zIdent
cbf0: 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a  [j]; j++){.    z
cc00: 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a  [i++] = zIdent[j
cc10: 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e  ];.    if( zIden
cc20: 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b  t[j]=='"' ) z[i+
cc30: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20  +] = '"';.  }.  
cc40: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
cc50: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
cc60: 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64  z[i] = 0;.  *pId
cc70: 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x = i;.}../*.** 
cc80: 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54  Generate a CREAT
cc90: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
cca0: 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  t appropriate fo
ccb0: 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74  r the given.** t
ccc0: 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f  able.  Memory to
ccd0: 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f   hold the text o
cce0: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
ccf0: 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66  is obtained.** f
cd00: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
cd10: 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  () and must be f
cd20: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
cd30: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ing function..*/
cd40: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72  .static char *cr
cd50: 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73 71  eateTableStmt(sq
cd60: 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65  lite3 *db, Table
cd70: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b   *p){.  int i, k
cd80: 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74  , n;.  char *zSt
cd90: 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70  mt;.  char *zSep
cda0: 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b  , *zSep2, *zEnd;
cdb0: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
cdc0: 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28  .  n = 0;.  for(
cdd0: 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20  pCol = p->aCol, 
cde0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
cdf0: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
ce00: 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67    n += identLeng
ce10: 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20  th(pCol->zName) 
ce20: 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20  + 5;.  }.  n += 
ce30: 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a  identLength(p->z
ce40: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35  Name);.  if( n<5
ce50: 30 20 29 7b 20 0a 20 20 20 20 7a 53 65 70 20 3d  0 ){ .    zSep =
ce60: 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d   "";.    zSep2 =
ce70: 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d   ",";.    zEnd =
ce80: 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   ")";.  }else{. 
ce90: 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22     zSep = "\n  "
cea0: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
ceb0: 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20  \n  ";.    zEnd 
cec0: 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e  = "\n)";.  }.  n
ced0: 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43   += 35 + 6*p->nC
cee0: 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71  ol;.  zStmt = sq
cef0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
cf00: 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a 53  (0, n);.  if( zS
cf10: 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  tmt==0 ){.    sq
cf20: 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
cf30: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
cf40: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
cf50: 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74  nprintf(n, zStmt
cf60: 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  , "CREATE TABLE 
cf70: 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65  ");.  k = sqlite
cf80: 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29  3Strlen30(zStmt)
cf90: 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74  ;.  identPut(zSt
cfa0: 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65  mt, &k, p->zName
cfb0: 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20  );.  zStmt[k++] 
cfc0: 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f  = '(';.  for(pCo
cfd0: 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20  l=p->aCol, i=0; 
cfe0: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  i<p->nCol; i++, 
cff0: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 61  pCol++){.    sta
d000: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
d010: 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20   const azType[] 
d020: 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  = {.        /* S
d030: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 20  QLITE_AFF_BLOB  
d040: 20 20 2a 2f 20 22 22 2c 0a 20 20 20 20 20 20 20    */ "",.       
d050: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 54   /* SQLITE_AFF_T
d060: 45 58 54 20 20 20 20 2a 2f 20 22 20 54 45 58 54  EXT    */ " TEXT
d070: 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51  ",.        /* SQ
d080: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
d090: 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20 20   */ " NUM",.    
d0a0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
d0b0: 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22 20 49  F_INTEGER */ " I
d0c0: 4e 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  NT",.        /* 
d0d0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
d0e0: 20 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20 20     */ " REAL".  
d0f0: 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e    };.    int len
d100: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
d110: 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73 71   *zType;..    sq
d120: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
d130: 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  -k, &zStmt[k], z
d140: 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73  Sep);.    k += s
d150: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26  qlite3Strlen30(&
d160: 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a  zStmt[k]);.    z
d170: 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20  Sep = zSep2;.   
d180: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
d190: 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65   &k, pCol->zName
d1a0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
d1b0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51  Col->affinity-SQ
d1c0: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 3e 3d  LITE_AFF_BLOB >=
d1d0: 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74   0 );.    assert
d1e0: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
d1f0: 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  -SQLITE_AFF_BLOB
d200: 20 3c 20 41 72 72 61 79 53 69 7a 65 28 61 7a 54   < ArraySize(azT
d210: 79 70 65 29 20 29 3b 0a 20 20 20 20 74 65 73 74  ype) );.    test
d220: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
d230: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
d240: 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 74 65 73  _BLOB );.    tes
d250: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
d260: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
d270: 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 74 65  F_TEXT );.    te
d280: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
d290: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
d2a0: 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20  FF_NUMERIC );.  
d2b0: 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c    testcase( pCol
d2c0: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
d2d0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29  TE_AFF_INTEGER )
d2e0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
d2f0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
d300: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
d310: 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54 79 70  );.    .    zTyp
d320: 65 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f 6c 2d  e = azType[pCol-
d330: 3e 61 66 66 69 6e 69 74 79 20 2d 20 53 51 4c 49  >affinity - SQLI
d340: 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 3b 0a 20 20  TE_AFF_BLOB];.  
d350: 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53    len = sqlite3S
d360: 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a  trlen30(zType);.
d370: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
d380: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
d390: 54 45 5f 41 46 46 5f 42 4c 4f 42 20 0a 20 20 20  TE_AFF_BLOB .   
d3a0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 6c           || pCol
d3b0: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71 6c 69  ->affinity==sqli
d3c0: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
d3d0: 7a 54 79 70 65 2c 20 30 29 20 29 3b 0a 20 20 20  zType, 0) );.   
d3e0: 20 6d 65 6d 63 70 79 28 26 7a 53 74 6d 74 5b 6b   memcpy(&zStmt[k
d3f0: 5d 2c 20 7a 54 79 70 65 2c 20 6c 65 6e 29 3b 0a  ], zType, len);.
d400: 20 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20      k += len;.  
d410: 20 20 61 73 73 65 72 74 28 20 6b 3c 3d 6e 20 29    assert( k<=n )
d420: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
d430: 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a  snprintf(n-k, &z
d440: 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a  Stmt[k], "%s", z
d450: 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  End);.  return z
d460: 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Stmt;.}../*.** R
d470: 65 73 69 7a 65 20 61 6e 20 49 6e 64 65 78 20 6f  esize an Index o
d480: 62 6a 65 63 74 20 74 6f 20 68 6f 6c 64 20 4e 20  bject to hold N 
d490: 63 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c 2e 20 20  columns total.  
d4a0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
d4b0: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 61  .** on success a
d4c0: 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  nd SQLITE_NOMEM 
d4d0: 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  on an OOM error.
d4e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
d4f0: 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74  esizeIndexObject
d500: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e  (sqlite3 *db, In
d510: 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20 4e  dex *pIdx, int N
d520: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72  ){.  char *zExtr
d530: 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  a;.  int nByte;.
d540: 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
d550: 75 6d 6e 3e 3d 4e 20 29 20 72 65 74 75 72 6e 20  umn>=N ) return 
d560: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
d570: 65 72 74 28 20 70 49 64 78 2d 3e 69 73 52 65 73  ert( pIdx->isRes
d580: 69 7a 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 42 79  ized==0 );.  nBy
d590: 74 65 20 3d 20 28 73 69 7a 65 6f 66 28 63 68 61  te = (sizeof(cha
d5a0: 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28 69 31 36  r*) + sizeof(i16
d5b0: 29 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a 45 78 74  ) + 1)*N;.  zExt
d5c0: 72 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ra = sqlite3DbMa
d5d0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
d5e0: 74 65 29 3b 0a 20 20 69 66 28 20 7a 45 78 74 72  te);.  if( zExtr
d5f0: 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  a==0 ) return SQ
d600: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
d610: 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61  .  memcpy(zExtra
d620: 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 2c 20  , pIdx->azColl, 
d630: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70 49  sizeof(char*)*pI
d640: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  dx->nColumn);.  
d650: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28  pIdx->azColl = (
d660: 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 7a 45 78  const char**)zEx
d670: 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d  tra;.  zExtra +=
d680: 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 4e   sizeof(char*)*N
d690: 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72  ;.  memcpy(zExtr
d6a0: 61 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  a, pIdx->aiColum
d6b0: 6e 2c 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 70  n, sizeof(i16)*p
d6c0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Idx->nColumn);. 
d6d0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20   pIdx->aiColumn 
d6e0: 3d 20 28 69 31 36 2a 29 7a 45 78 74 72 61 3b 0a  = (i16*)zExtra;.
d6f0: 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a 65    zExtra += size
d700: 6f 66 28 69 31 36 29 2a 4e 3b 0a 20 20 6d 65 6d  of(i16)*N;.  mem
d710: 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78  cpy(zExtra, pIdx
d720: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 70 49  ->aSortOrder, pI
d730: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  dx->nColumn);.  
d740: 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
d750: 20 3d 20 28 75 38 2a 29 7a 45 78 74 72 61 3b 0a   = (u8*)zExtra;.
d760: 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20    pIdx->nColumn 
d770: 3d 20 4e 3b 0a 20 20 70 49 64 78 2d 3e 69 73 52  = N;.  pIdx->isR
d780: 65 73 69 7a 65 64 20 3d 20 31 3b 0a 20 20 72 65  esized = 1;.  re
d790: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d7a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  }../*.** Estimat
d7b0: 65 20 74 68 65 20 74 6f 74 61 6c 20 72 6f 77 20  e the total row 
d7c0: 77 69 64 74 68 20 66 6f 72 20 61 20 74 61 62 6c  width for a tabl
d7d0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
d7e0: 64 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57  d estimateTableW
d7f0: 69 64 74 68 28 54 61 62 6c 65 20 2a 70 54 61 62  idth(Table *pTab
d800: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77 54  ){.  unsigned wT
d810: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 63 6f 6e 73  able = 0;.  cons
d820: 74 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f  t Column *pTabCo
d830: 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  l;.  int i;.  fo
d840: 72 28 69 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  r(i=pTab->nCol, 
d850: 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43  pTabCol=pTab->aC
d860: 6f 6c 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54  ol; i>0; i--, pT
d870: 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 77 54  abCol++){.    wT
d880: 61 62 6c 65 20 2b 3d 20 70 54 61 62 43 6f 6c 2d  able += pTabCol-
d890: 3e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 69 66  >szEst;.  }.  if
d8a0: 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20  ( pTab->iPKey<0 
d8b0: 29 20 77 54 61 62 6c 65 2b 2b 3b 0a 20 20 70 54  ) wTable++;.  pT
d8c0: 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73  ab->szTabRow = s
d8d0: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77 54 61  qlite3LogEst(wTa
d8e0: 62 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ble*4);.}../*.**
d8f0: 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 61 76   Estimate the av
d900: 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20 61 20  erage size of a 
d910: 72 6f 77 20 66 6f 72 20 61 6e 20 69 6e 64 65 78  row for an index
d920: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d930: 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69   estimateIndexWi
d940: 64 74 68 28 49 6e 64 65 78 20 2a 70 49 64 78 29  dth(Index *pIdx)
d950: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77 49 6e  {.  unsigned wIn
d960: 64 65 78 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  dex = 0;.  int i
d970: 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e  ;.  const Column
d980: 20 2a 61 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 70   *aCol = pIdx->p
d990: 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a 20 20 66  Table->aCol;.  f
d9a0: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
d9b0: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
d9c0: 20 20 20 69 31 36 20 78 20 3d 20 70 49 64 78 2d     i16 x = pIdx-
d9d0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
d9e0: 20 20 61 73 73 65 72 74 28 20 78 3c 70 49 64 78    assert( x<pIdx
d9f0: 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 29  ->pTable->nCol )
da00: 3b 0a 20 20 20 20 77 49 6e 64 65 78 20 2b 3d 20  ;.    wIndex += 
da10: 78 3c 30 20 3f 20 31 20 3a 20 61 43 6f 6c 5b 70  x<0 ? 1 : aCol[p
da20: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
da30: 5d 2e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 70  ].szEst;.  }.  p
da40: 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 20 3d 20  Idx->szIdxRow = 
da50: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77 49  sqlite3LogEst(wI
da60: 6e 64 65 78 2a 34 29 3b 0a 7d 0a 0a 2f 2a 20 52  ndex*4);.}../* R
da70: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 76 61  eturn true if va
da80: 6c 75 65 20 78 20 69 73 20 66 6f 75 6e 64 20 61  lue x is found a
da90: 6e 79 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ny of the first 
daa0: 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20 6f 66 20  nCol entries of 
dab0: 61 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74 61 74 69  aiCol[].*/.stati
dac0: 63 20 69 6e 74 20 68 61 73 43 6f 6c 75 6d 6e 28  c int hasColumn(
dad0: 63 6f 6e 73 74 20 69 31 36 20 2a 61 69 43 6f 6c  const i16 *aiCol
dae0: 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 6e 74 20  , int nCol, int 
daf0: 78 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 43 6f  x){.  while( nCo
db00: 6c 2d 2d 20 3e 20 30 20 29 20 69 66 28 20 78 3d  l-- > 0 ) if( x=
db10: 3d 2a 28 61 69 43 6f 6c 2b 2b 29 20 29 20 72 65  =*(aiCol++) ) re
db20: 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
db30: 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 63 6f 6d 70   0;.}../* Recomp
db40: 75 74 65 20 74 68 65 20 63 6f 6c 4e 6f 74 49 64  ute the colNotId
db50: 78 65 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65  xed field of the
db60: 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 63 6f   Index..**.** co
db70: 6c 4e 6f 74 49 64 78 65 64 20 69 73 20 61 20 62  lNotIdxed is a b
db80: 69 74 6d 61 73 6b 20 74 68 61 74 20 68 61 73 20  itmask that has 
db90: 61 20 30 20 62 69 74 20 72 65 70 72 65 73 65 6e  a 0 bit represen
dba0: 74 69 6e 67 20 65 61 63 68 20 69 6e 64 65 78 65  ting each indexe
dbb0: 64 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61  d.** columns tha
dbc0: 74 20 61 72 65 20 77 69 74 68 69 6e 20 74 68 65  t are within the
dbd0: 20 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e   first 63 column
dbe0: 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  s of the table. 
dbf0: 20 54 68 65 0a 2a 2a 20 68 69 67 68 2d 6f 72 64   The.** high-ord
dc00: 65 72 20 62 69 74 20 6f 66 20 63 6f 6c 4e 6f 74  er bit of colNot
dc10: 49 64 78 65 64 20 69 73 20 61 6c 77 61 79 73 20  Idxed is always 
dc20: 31 2e 20 20 41 6c 6c 20 75 6e 69 6e 64 65 78 65  1.  All unindexe
dc30: 64 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20  d columns.** of 
dc40: 74 68 65 20 74 61 62 6c 65 20 68 61 76 65 20 61  the table have a
dc50: 20 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f   1..**.** The co
dc60: 6c 4e 6f 74 49 64 78 65 64 20 6d 61 73 6b 20 69  lNotIdxed mask i
dc70: 73 20 41 4e 44 2d 65 64 20 77 69 74 68 20 74 68  s AND-ed with th
dc80: 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f  e SrcList.a[].co
dc90: 6c 55 73 65 64 20 6d 61 73 6b 0a 2a 2a 20 74 6f  lUsed mask.** to
dca0: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
dcb0: 65 20 69 6e 64 65 78 20 69 73 20 63 6f 76 65 72  e index is cover
dcc0: 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  ing index..*/.st
dcd0: 61 74 69 63 20 76 6f 69 64 20 72 65 63 6f 6d 70  atic void recomp
dce0: 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74 49 6e 64  uteColumnsNotInd
dcf0: 65 78 65 64 28 49 6e 64 65 78 20 2a 70 49 64 78  exed(Index *pIdx
dd00: 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d  ){.  Bitmask m =
dd10: 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66   0;.  int j;.  f
dd20: 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  or(j=pIdx->nColu
dd30: 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29  mn-1; j>=0; j--)
dd40: 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70 49  {.    int x = pI
dd50: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  dx->aiColumn[j];
dd60: 0a 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29 7b  .    if( x>=0 ){
dd70: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
dd80: 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20   x==BMS-1 );.   
dd90: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
dda0: 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20 20 69  BMS-2 );.      i
ddb0: 66 28 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c  f( x<BMS-1 ) m |
ddc0: 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20 20  = MASKBIT(x);.  
ddd0: 20 20 7d 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e    }.  }.  pIdx->
dde0: 63 6f 6c 4e 6f 74 49 64 78 65 64 20 3d 20 7e 6d  colNotIdxed = ~m
ddf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 64  ;.  assert( (pId
de00: 78 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65 64 3e 3e  x->colNotIdxed>>
de10: 36 33 29 3d 3d 31 20 29 3b 0a 7d 0a 0a 2f 2a 0a  63)==1 );.}../*.
de20: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
de30: 72 75 6e 73 20 61 74 20 74 68 65 20 65 6e 64 20  runs at the end 
de40: 6f 66 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  of parsing a CRE
de50: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
de60: 65 6e 74 20 74 68 61 74 0a 2a 2a 20 68 61 73 20  ent that.** has 
de70: 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  a WITHOUT ROWID 
de80: 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6a 6f 62  clause.  The job
de90: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
dea0: 20 69 73 20 74 6f 20 63 6f 6e 76 65 72 74 20 62   is to convert b
deb0: 6f 74 68 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20  oth.** internal 
dec0: 73 63 68 65 6d 61 20 64 61 74 61 20 73 74 72 75  schema data stru
ded0: 63 74 75 72 65 73 20 61 6e 64 20 74 68 65 20 67  ctures and the g
dee0: 65 6e 65 72 61 74 65 64 20 56 44 42 45 20 63 6f  enerated VDBE co
def0: 64 65 20 73 6f 20 74 68 61 74 20 74 68 65 79 0a  de so that they.
df00: 2a 2a 20 61 72 65 20 61 70 70 72 6f 70 72 69 61  ** are appropria
df10: 74 65 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54  te for a WITHOUT
df20: 20 52 4f 57 49 44 20 74 61 62 6c 65 20 69 6e 73   ROWID table ins
df30: 74 65 61 64 20 6f 66 20 61 20 72 6f 77 69 64 20  tead of a rowid 
df40: 74 61 62 6c 65 2e 0a 2a 2a 20 43 68 61 6e 67 65  table..** Change
df50: 73 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a  s include:.**.**
df60: 20 20 20 20 20 28 31 29 20 20 53 65 74 20 61 6c       (1)  Set al
df70: 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  l columns of the
df80: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 73 63 68   PRIMARY KEY sch
df90: 65 6d 61 20 6f 62 6a 65 63 74 20 74 6f 20 62 65  ema object to be
dfa0: 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a 20 20 20   NOT NULL..**   
dfb0: 20 20 28 32 29 20 20 43 6f 6e 76 65 72 74 20 50    (2)  Convert P
dfc0: 33 20 70 61 72 61 6d 65 74 65 72 20 6f 66 20 74  3 parameter of t
dfd0: 68 65 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65  he OP_CreateBtre
dfe0: 65 20 66 72 6f 6d 20 42 54 52 45 45 5f 49 4e 54  e from BTREE_INT
dff0: 4b 45 59 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  KEY .**         
e000: 20 69 6e 74 6f 20 42 54 52 45 45 5f 42 4c 4f 42   into BTREE_BLOB
e010: 4b 45 59 2e 0a 2a 2a 20 20 20 20 20 28 33 29 20  KEY..**     (3) 
e020: 20 42 79 70 61 73 73 20 74 68 65 20 63 72 65 61   Bypass the crea
e030: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69  tion of the sqli
e040: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
e050: 65 6e 74 72 79 0a 2a 2a 20 20 20 20 20 20 20 20  entry.**        
e060: 20 20 66 6f 72 20 74 68 65 20 50 52 49 4d 41 52    for the PRIMAR
e070: 59 20 4b 45 59 20 61 73 20 74 68 65 20 70 72 69  Y KEY as the pri
e080: 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 69  mary key index i
e090: 73 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  s now.**        
e0a0: 20 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20    identified by 
e0b0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
e0c0: 72 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6f 66  r table entry of
e0d0: 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c   the table itsel
e0e0: 66 2e 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 53  f..**     (4)  S
e0f0: 65 74 20 74 68 65 20 49 6e 64 65 78 2e 74 6e 75  et the Index.tnu
e100: 6d 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59  m of the PRIMARY
e110: 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63   KEY Index objec
e120: 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  t in the.**     
e130: 20 20 20 20 20 73 63 68 65 6d 61 20 74 6f 20 74       schema to t
e140: 68 65 20 72 6f 6f 74 70 61 67 65 20 66 72 6f 6d  he rootpage from
e150: 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e   the main table.
e160: 0a 2a 2a 20 20 20 20 20 28 35 29 20 20 41 64 64  .**     (5)  Add
e170: 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d   all table colum
e180: 6e 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52  ns to the PRIMAR
e190: 59 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65  Y KEY Index obje
e1a0: 63 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73  ct.**          s
e1b0: 6f 20 74 68 61 74 20 74 68 65 20 50 52 49 4d 41  o that the PRIMA
e1c0: 52 59 20 4b 45 59 20 69 73 20 61 20 63 6f 76 65  RY KEY is a cove
e1d0: 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 54 68 65  ring index.  The
e1e0: 20 73 75 72 70 6c 75 73 0a 2a 2a 20 20 20 20 20   surplus.**     
e1f0: 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 61 72 65       columns are
e200: 20 70 61 72 74 20 6f 66 20 4b 65 79 49 6e 66 6f   part of KeyInfo
e210: 2e 6e 41 6c 6c 46 69 65 6c 64 20 61 6e 64 20 61  .nAllField and a
e220: 72 65 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 0a  re not used for.
e230: 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f 72 74  **          sort
e240: 69 6e 67 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72  ing or lookup or
e250: 20 75 6e 69 71 75 65 6e 65 73 73 20 63 68 65 63   uniqueness chec
e260: 6b 73 2e 0a 2a 2a 20 20 20 20 20 28 36 29 20 20  ks..**     (6)  
e270: 52 65 70 6c 61 63 65 20 74 68 65 20 72 6f 77 69  Replace the rowi
e280: 64 20 74 61 69 6c 20 6f 6e 20 61 6c 6c 20 61 75  d tail on all au
e290: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65  tomatically gene
e2a0: 72 61 74 65 64 20 55 4e 49 51 55 45 0a 2a 2a 20  rated UNIQUE.** 
e2b0: 20 20 20 20 20 20 20 20 20 69 6e 64 69 63 65 73           indices
e2c0: 20 77 69 74 68 20 74 68 65 20 50 52 49 4d 41 52   with the PRIMAR
e2d0: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a  Y KEY columns..*
e2e0: 2a 0a 2a 2a 20 46 6f 72 20 76 69 72 74 75 61 6c  *.** For virtual
e2f0: 20 74 61 62 6c 65 73 2c 20 6f 6e 6c 79 20 28 31   tables, only (1
e300: 29 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a  ) is performed..
e310: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
e320: 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52  onvertToWithoutR
e330: 6f 77 69 64 54 61 62 6c 65 28 50 61 72 73 65 20  owidTable(Parse 
e340: 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
e350: 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a  pTab){.  Index *
e360: 70 49 64 78 3b 0a 20 20 49 6e 64 65 78 20 2a 70  pIdx;.  Index *p
e370: 50 6b 3b 0a 20 20 69 6e 74 20 6e 50 6b 3b 0a 20  Pk;.  int nPk;. 
e380: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c   int i, j;.  sql
e390: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
e3a0: 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
e3b0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
e3c0: 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 65 76 65  ;..  /* Mark eve
e3d0: 72 79 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ry PRIMARY KEY c
e3e0: 6f 6c 75 6d 6e 20 61 73 20 4e 4f 54 20 4e 55 4c  olumn as NOT NUL
e3f0: 4c 20 28 65 78 63 65 70 74 20 66 6f 72 20 69 6d  L (except for im
e400: 70 6f 73 74 65 72 20 74 61 62 6c 65 73 29 0a 20  poster tables). 
e410: 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   */.  if( !db->i
e420: 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c  nit.imposterTabl
e430: 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e ){.    for(i=0
e440: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
e450: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
e460: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 63  (pTab->aCol[i].c
e470: 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41  olFlags & COLFLA
e480: 47 5f 50 52 49 4d 4b 45 59 29 21 3d 30 20 29 7b  G_PRIMKEY)!=0 ){
e490: 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61  .        pTab->a
e4a0: 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d  Col[i].notNull =
e4b0: 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20   OE_Abort;.     
e4c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
e4d0: 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 50  /* Convert the P
e4e0: 33 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68 65  3 operand of the
e4f0: 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65 20   OP_CreateBtree 
e500: 6f 70 63 6f 64 65 20 66 72 6f 6d 20 42 54 52 45  opcode from BTRE
e510: 45 5f 49 4e 54 4b 45 59 0a 20 20 2a 2a 20 69 6e  E_INTKEY.  ** in
e520: 74 6f 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59  to BTREE_BLOBKEY
e530: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
e540: 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 20 29  rse->addrCrTab )
e550: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 20  {.    assert( v 
e560: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
e570: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 70 50  beChangeP3(v, pP
e580: 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 2c  arse->addrCrTab,
e590: 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 29 3b   BTREE_BLOBKEY);
e5a0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  .  }..  /* Locat
e5b0: 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  e the PRIMARY KE
e5c0: 59 20 69 6e 64 65 78 2e 20 20 4f 72 2c 20 69 66  Y index.  Or, if
e5d0: 20 74 68 69 73 20 74 61 62 6c 65 20 77 61 73 20   this table was 
e5e0: 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20  originally.  ** 
e5f0: 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
e600: 52 59 20 4b 45 59 20 74 61 62 6c 65 2c 20 63 72  RY KEY table, cr
e610: 65 61 74 65 20 61 20 6e 65 77 20 50 52 49 4d 41  eate a new PRIMA
e620: 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 0a 20  RY KEY index. . 
e630: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e   */.  if( pTab->
e640: 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20  iPKey>=0 ){.    
e650: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
e660: 0a 20 20 20 20 54 6f 6b 65 6e 20 69 70 6b 54 6f  .    Token ipkTo
e670: 6b 65 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ken;.    sqlite3
e680: 54 6f 6b 65 6e 49 6e 69 74 28 26 69 70 6b 54 6f  TokenInit(&ipkTo
e690: 6b 65 6e 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ken, pTab->aCol[
e6a0: 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61  pTab->iPKey].zNa
e6b0: 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  me);.    pList =
e6c0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
e6d0: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
e6e0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
e6f0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
e700: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c  Alloc(db, TK_ID,
e710: 20 26 69 70 6b 54 6f 6b 65 6e 2c 20 30 29 29 3b   &ipkToken, 0));
e720: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
e730: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
e740: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74  pList->a[0].sort
e750: 4f 72 64 65 72 20 3d 20 70 50 61 72 73 65 2d 3e  Order = pParse->
e760: 69 50 6b 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  iPkSortOrder;.  
e770: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
e780: 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 70 54 61  ->pNewTable==pTa
e790: 62 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  b );.    sqlite3
e7a0: 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72  CreateIndex(pPar
e7b0: 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69  se, 0, 0, 0, pLi
e7c0: 73 74 2c 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e  st, pTab->keyCon
e7d0: 66 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  f, 0, 0, 0, 0,. 
e7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7f0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 44 58        SQLITE_IDX
e800: 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 29  TYPE_PRIMARYKEY)
e810: 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
e820: 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
e830: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
e840: 75 72 6e 3b 0a 20 20 20 20 70 50 6b 20 3d 20 73  urn;.    pPk = s
e850: 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
e860: 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20  Index(pTab);.   
e870: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
e880: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
e890: 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
e8a0: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
e8b0: 62 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  b);..    /*.    
e8c0: 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65  ** Remove all re
e8d0: 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 20  dundant columns 
e8e0: 66 72 6f 6d 20 74 68 65 20 50 52 49 4d 41 52 59  from the PRIMARY
e8f0: 20 4b 45 59 2e 20 20 46 6f 72 20 65 78 61 6d 70   KEY.  For examp
e900: 6c 65 2c 20 63 68 61 6e 67 65 0a 20 20 20 20 2a  le, change.    *
e910: 2a 20 22 50 52 49 4d 41 52 59 20 4b 45 59 28 61  * "PRIMARY KEY(a
e920: 2c 62 2c 61 2c 62 2c 63 2c 62 2c 63 2c 64 29 22  ,b,a,b,c,b,c,d)"
e930: 20 69 6e 74 6f 20 6a 75 73 74 20 22 50 52 49 4d   into just "PRIM
e940: 41 52 59 20 4b 45 59 28 61 2c 62 2c 63 2c 64 29  ARY KEY(a,b,c,d)
e950: 22 2e 20 20 4c 61 74 65 72 0a 20 20 20 20 2a 2a  ".  Later.    **
e960: 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68   code assumes th
e970: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  e PRIMARY KEY co
e980: 6e 74 61 69 6e 73 20 6e 6f 20 72 65 70 65 61 74  ntains no repeat
e990: 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20  ed columns..    
e9a0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d 31  */.    for(i=j=1
e9b0: 3b 20 69 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  ; i<pPk->nKeyCol
e9c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
e9d0: 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d  ( hasColumn(pPk-
e9e0: 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 70 50  >aiColumn, j, pP
e9f0: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20  k->aiColumn[i]) 
ea00: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e  ){.        pPk->
ea10: 6e 43 6f 6c 75 6d 6e 2d 2d 3b 0a 20 20 20 20 20  nColumn--;.     
ea20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ea30: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 2b  pPk->aiColumn[j+
ea40: 2b 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  +] = pPk->aiColu
ea50: 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  mn[i];.      }. 
ea60: 20 20 20 7d 0a 20 20 20 20 70 50 6b 2d 3e 6e 4b     }.    pPk->nK
ea70: 65 79 43 6f 6c 20 3d 20 6a 3b 0a 20 20 7d 0a 20  eyCol = j;.  }. 
ea80: 20 61 73 73 65 72 74 28 20 70 50 6b 21 3d 30 20   assert( pPk!=0 
ea90: 29 3b 0a 20 20 70 50 6b 2d 3e 69 73 43 6f 76 65  );.  pPk->isCove
eaa0: 72 69 6e 67 20 3d 20 31 3b 0a 20 20 69 66 28 20  ring = 1;.  if( 
eab0: 21 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74  !db->init.impost
eac0: 65 72 54 61 62 6c 65 20 29 20 70 50 6b 2d 3e 75  erTable ) pPk->u
ead0: 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a  niqNotNull = 1;.
eae0: 20 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65    nPk = pPk->nKe
eaf0: 79 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 42 79 70 61  yCol;..  /* Bypa
eb00: 73 73 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20  ss the creation 
eb10: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
eb20: 45 59 20 62 74 72 65 65 20 61 6e 64 20 74 68 65  EY btree and the
eb30: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20   sqlite_master. 
eb40: 20 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e   ** table entry.
eb50: 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 72 65   This is only re
eb60: 71 75 69 72 65 64 20 69 66 20 63 75 72 72 65 6e  quired if curren
eb70: 74 6c 79 20 67 65 6e 65 72 61 74 69 6e 67 20 56  tly generating V
eb80: 44 42 45 0a 20 20 2a 2a 20 63 6f 64 65 20 66 6f  DBE.  ** code fo
eb90: 72 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  r a CREATE TABLE
eba0: 20 28 6e 6f 74 20 77 68 65 6e 20 70 61 72 73 69   (not when parsi
ebb0: 6e 67 20 6f 6e 65 20 61 73 20 70 61 72 74 20 6f  ng one as part o
ebc0: 66 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61  f reading.  ** a
ebd0: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
ebe0: 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26  ).  */.  if( v &
ebf0: 26 20 70 50 6b 2d 3e 74 6e 75 6d 3e 30 20 29 7b  & pPk->tnum>0 ){
ec00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
ec10: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b  >init.busy==0 );
ec20: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ec30: 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20  ChangeOpcode(v, 
ec40: 70 50 6b 2d 3e 74 6e 75 6d 2c 20 4f 50 5f 47 6f  pPk->tnum, OP_Go
ec50: 74 6f 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  to);.  }..  /* T
ec60: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
ec70: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
ec80: 69 73 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f  is the table roo
ec90: 74 20 70 61 67 65 20 2a 2f 0a 20 20 70 50 6b 2d  t page */.  pPk-
eca0: 3e 74 6e 75 6d 20 3d 20 70 54 61 62 2d 3e 74 6e  >tnum = pTab->tn
ecb0: 75 6d 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65  um;..  /* Update
ecc0: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
ecd0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
ece0: 20 61 6c 6c 20 55 4e 49 51 55 45 20 69 6e 64 69   all UNIQUE indi
ecf0: 63 65 73 20 62 79 20 63 6f 6e 76 65 72 74 69 6e  ces by convertin
ed00: 67 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c  g.  ** the final
ed10: 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 69 6e   rowid column in
ed20: 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63  to one or more c
ed30: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52  olumns of the PR
ed40: 49 4d 41 52 59 20 4b 45 59 2e 0a 20 20 2a 2f 0a  IMARY KEY..  */.
ed50: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
ed60: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
ed70: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
ed80: 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
ed90: 20 69 66 28 20 49 73 50 72 69 6d 61 72 79 4b 65   if( IsPrimaryKe
eda0: 79 49 6e 64 65 78 28 70 49 64 78 29 20 29 20 63  yIndex(pIdx) ) c
edb0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72  ontinue;.    for
edc0: 28 69 3d 6e 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69  (i=n=0; i<nPk; i
edd0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  ++){.      if( !
ede0: 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e  hasColumn(pIdx->
edf0: 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e  aiColumn, pIdx->
ee00: 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69  nKeyCol, pPk->ai
ee10: 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 20 6e 2b 2b  Column[i]) ) n++
ee20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ee30: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  n==0 ){.      /*
ee40: 20 54 68 69 73 20 69 6e 64 65 78 20 69 73 20 61   This index is a
ee50: 20 73 75 70 65 72 73 65 74 20 6f 66 20 74 68 65   superset of the
ee60: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a   primary key */.
ee70: 20 20 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c        pIdx->nCol
ee80: 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79  umn = pIdx->nKey
ee90: 43 6f 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  Col;.      conti
eea0: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
eeb0: 66 28 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62  f( resizeIndexOb
eec0: 6a 65 63 74 28 64 62 2c 20 70 49 64 78 2c 20 70  ject(db, pIdx, p
eed0: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 29 20  Idx->nKeyCol+n) 
eee0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f  ) return;.    fo
eef0: 72 28 69 3d 30 2c 20 6a 3d 70 49 64 78 2d 3e 6e  r(i=0, j=pIdx->n
ef00: 4b 65 79 43 6f 6c 3b 20 69 3c 6e 50 6b 3b 20 69  KeyCol; i<nPk; i
ef10: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  ++){.      if( !
ef20: 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e  hasColumn(pIdx->
ef30: 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e  aiColumn, pIdx->
ef40: 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69  nKeyCol, pPk->ai
ef50: 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20  Column[i]) ){.  
ef60: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
ef70: 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61  lumn[j] = pPk->a
ef80: 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20  iColumn[i];.    
ef90: 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
efa0: 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c  [j] = pPk->azCol
efb0: 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 6a 2b  l[i];.        j+
efc0: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
efd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64  .    assert( pId
efe0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 49 64 78  x->nColumn>=pIdx
eff0: 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 20 29 3b 0a 20  ->nKeyCol+n );. 
f000: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
f010: 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 3b 0a 20  >nColumn>=j );. 
f020: 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c 6c   }..  /* Add all
f030: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74   table columns t
f040: 6f 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  o the PRIMARY KE
f050: 59 20 69 6e 64 65 78 0a 20 20 2a 2f 0a 20 20 69  Y index.  */.  i
f060: 66 28 20 6e 50 6b 3c 70 54 61 62 2d 3e 6e 43 6f  f( nPk<pTab->nCo
f070: 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65 73  l ){.    if( res
f080: 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64  izeIndexObject(d
f090: 62 2c 20 70 50 6b 2c 20 70 54 61 62 2d 3e 6e 43  b, pPk, pTab->nC
f0a0: 6f 6c 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ol) ) return;.  
f0b0: 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 6e 50 6b    for(i=0, j=nPk
f0c0: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
f0d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
f0e0: 21 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e  !hasColumn(pPk->
f0f0: 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 69 29 20  aiColumn, j, i) 
f100: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
f110: 74 28 20 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c 75 6d  t( j<pPk->nColum
f120: 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 6b  n );.        pPk
f130: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20  ->aiColumn[j] = 
f140: 69 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e  i;.        pPk->
f150: 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 73 71 6c 69  azColl[j] = sqli
f160: 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20  te3StrBINARY;.  
f170: 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
f180: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
f190: 65 72 74 28 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d  ert( pPk->nColum
f1a0: 6e 3d 3d 6a 20 29 3b 0a 20 20 20 20 61 73 73 65  n==j );.    asse
f1b0: 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d  rt( pTab->nCol==
f1c0: 6a 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  j );.  }else{.  
f1d0: 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d    pPk->nColumn =
f1e0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d   pTab->nCol;.  }
f1f0: 0a 20 20 72 65 63 6f 6d 70 75 74 65 43 6f 6c 75  .  recomputeColu
f200: 6d 6e 73 4e 6f 74 49 6e 64 65 78 65 64 28 70 50  mnsNotIndexed(pP
f210: 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  k);.}../*.** Thi
f220: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
f230: 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  led to report th
f240: 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74  e final ")" that
f250: 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61   terminates.** a
f260: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
f270: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
f280: 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  he table structu
f290: 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63  re that other ac
f2a0: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61  tion routines ha
f2b0: 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67  ve been building
f2c0: 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20  .** is added to 
f2d0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  the internal has
f2e0: 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69  h tables, assumi
f2f0: 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76  ng no errors hav
f300: 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a  e.** occurred..*
f310: 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f  *.** An entry fo
f320: 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d  r the table is m
f330: 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65  ade in the maste
f340: 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c  r table on disk,
f350: 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20   unless.** this 
f360: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  is a temporary t
f370: 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74  able or db->init
f380: 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20  .busy==1.  When 
f390: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
f3a0: 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20  .** it means we 
f3b0: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
f3c0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
f3d0: 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a  ble because we j
f3e0: 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64  ust.** connected
f3f0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
f400: 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20   or because the 
f410: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
f420: 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e  ble has.** recen
f430: 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20  tly changed, so 
f440: 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
f450: 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  is table already
f460: 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68   exists in.** th
f470: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
f480: 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f  table.  We do no
f490: 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65  t want to create
f4a0: 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a   it again..**.**
f4b0: 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20   If the pSelect 
f4c0: 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
f4d0: 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74  NULL, it means t
f4e0: 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hat this routine
f4f0: 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74  .** was called t
f500: 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65  o create a table
f510: 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
f520: 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41  a .** "CREATE TA
f530: 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43  BLE ... AS SELEC
f540: 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74  T ..." statement
f550: 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  .  The column na
f560: 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  mes of.** the ne
f570: 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74  w table will mat
f580: 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ch the result se
f590: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  t of the SELECT.
f5a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
f5b0: 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73  EndTable(.  Pars
f5c0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
f5d0: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
f5e0: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
f5f0: 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20  *pCons,         
f600: 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b    /* The ',' tok
f610: 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61 73  en after the las
f620: 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a  t column defn. *
f630: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c  /.  Token *pEnd,
f640: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f650: 68 65 20 27 29 27 20 62 65 66 6f 72 65 20 6f 70  he ')' before op
f660: 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 43 52 45  tions in the CRE
f670: 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 75  ATE TABLE */.  u
f680: 38 20 74 61 62 4f 70 74 73 2c 20 20 20 20 20 20  8 tabOpts,      
f690: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
f6a0: 74 61 62 6c 65 20 6f 70 74 69 6f 6e 73 2e 20 55  table options. U
f6b0: 73 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a 20 20 53  sually 0. */.  S
f6c0: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20  elect *pSelect  
f6d0: 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74         /* Select
f6e0: 20 66 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20   from a "CREATE 
f6f0: 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a  ... AS SELECT" *
f700: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
f710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f720: 20 2f 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c   /* The new tabl
f730: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
f740: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
f750: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
f760: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
f770: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
f780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
f790: 74 61 62 61 73 65 20 69 6e 20 77 68 69 63 68 20  tabase in which 
f7a0: 74 68 65 20 74 61 62 6c 65 20 6c 69 76 65 73 20  the table lives 
f7b0: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
f7c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
f7d0: 2a 20 41 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64  * An implied ind
f7e0: 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ex of the table 
f7f0: 2a 2f 0a 0a 20 20 69 66 28 20 70 45 6e 64 3d 3d  */..  if( pEnd==
f800: 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 20  0 && pSelect==0 
f810: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
f820: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 64 62   }.  assert( !db
f830: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
f840: 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
f850: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
f860: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
f870: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d  .  /* If the db-
f880: 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20  >init.busy is 1 
f890: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
f8a0: 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20  reading the SQL 
f8b0: 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71  off the.  ** "sq
f8c0: 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20  lite_master" or 
f8d0: 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73  "sqlite_temp_mas
f8e0: 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68  ter" table on th
f8f0: 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20  e disk..  ** So 
f900: 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  do not write to 
f910: 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20  the disk again. 
f920: 20 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f   Extract the roo
f930: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  t page number.  
f940: 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ** for the table
f950: 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e   from the db->in
f960: 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64  it.newTnum field
f970: 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d  .  (The page num
f980: 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  ber.  ** should 
f990: 68 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68  have been put th
f9a0: 65 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74  ere by the sqlit
f9b0: 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e  eOpenCb routine.
f9c0: 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ).  **.  ** If t
f9d0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
f9e0: 62 65 72 20 69 73 20 31 2c 20 74 68 61 74 20 6d  ber is 1, that m
f9f0: 65 61 6e 73 20 74 68 69 73 20 69 73 20 74 68 65  eans this is the
fa00: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20   sqlite_master. 
fa10: 20 2a 2a 20 74 61 62 6c 65 20 69 74 73 65 6c 66   ** table itself
fa20: 2e 20 20 53 6f 20 6d 61 72 6b 20 69 74 20 72 65  .  So mark it re
fa30: 61 64 2d 6f 6e 6c 79 2e 0a 20 20 2a 2f 0a 20 20  ad-only..  */.  
fa40: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
fa50: 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 65  y ){.    if( pSe
fa60: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71  lect ){.      sq
fa70: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
fa80: 61 72 73 65 2c 20 22 22 29 3b 0a 20 20 20 20 20  arse, "");.     
fa90: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
faa0: 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d     p->tnum = db-
fab0: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20  >init.newTnum;. 
fac0: 20 20 20 69 66 28 20 70 2d 3e 74 6e 75 6d 3d 3d     if( p->tnum==
fad0: 31 20 29 20 70 2d 3e 74 61 62 46 6c 61 67 73 20  1 ) p->tabFlags 
fae0: 7c 3d 20 54 46 5f 52 65 61 64 6f 6e 6c 79 3b 0a  |= TF_Readonly;.
faf0: 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61    }..  /* Specia
fb00: 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  l processing for
fb10: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 54   WITHOUT ROWID T
fb20: 61 62 6c 65 73 20 2a 2f 0a 20 20 69 66 28 20 74  ables */.  if( t
fb30: 61 62 4f 70 74 73 20 26 20 54 46 5f 57 69 74 68  abOpts & TF_With
fb40: 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  outRowid ){.    
fb50: 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73  if( (p->tabFlags
fb60: 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
fb70: 65 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ent) ){.      sq
fb80: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
fb90: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
fba0: 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6e  "AUTOINCREMENT n
fbb0: 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 57 49  ot allowed on WI
fbc0: 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
fbd0: 65 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  es");.      retu
fbe0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rn;.    }.    if
fbf0: 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26  ( (p->tabFlags &
fc00: 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
fc10: 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  y)==0 ){.      s
fc20: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
fc30: 50 61 72 73 65 2c 20 22 50 52 49 4d 41 52 59 20  Parse, "PRIMARY 
fc40: 4b 45 59 20 6d 69 73 73 69 6e 67 20 6f 6e 20 74  KEY missing on t
fc50: 61 62 6c 65 20 25 73 22 2c 20 70 2d 3e 7a 4e 61  able %s", p->zNa
fc60: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
fc70: 20 20 20 20 20 20 70 2d 3e 74 61 62 46 6c 61 67        p->tabFlag
fc80: 73 20 7c 3d 20 54 46 5f 57 69 74 68 6f 75 74 52  s |= TF_WithoutR
fc90: 6f 77 69 64 20 7c 20 54 46 5f 4e 6f 56 69 73 69  owid | TF_NoVisi
fca0: 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  bleRowid;.      
fcb0: 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74  convertToWithout
fcc0: 52 6f 77 69 64 54 61 62 6c 65 28 70 50 61 72 73  RowidTable(pPars
fcd0: 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, p);.    }.  }
fce0: 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  ..  iDb = sqlite
fcf0: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
fd00: 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  b, p->pSchema);.
fd10: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
fd20: 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20  OMIT_CHECK.  /* 
fd30: 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e  Resolve names in
fd40: 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74   all CHECK const
fd50: 72 61 69 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  raint expression
fd60: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
fd70: 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 73  >pCheck ){.    s
fd80: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
fd90: 66 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73  fReference(pPars
fda0: 65 2c 20 70 2c 20 4e 43 5f 49 73 43 68 65 63 6b  e, p, NC_IsCheck
fdb0: 2c 20 30 2c 20 70 2d 3e 70 43 68 65 63 6b 29 3b  , 0, p->pCheck);
fdc0: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  .  }.#endif /* !
fdd0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
fde0: 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20  MIT_CHECK) */.. 
fdf0: 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65   /* Estimate the
fe00: 20 61 76 65 72 61 67 65 20 72 6f 77 20 73 69 7a   average row siz
fe10: 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  e for the table 
fe20: 61 6e 64 20 66 6f 72 20 61 6c 6c 20 69 6d 70 6c  and for all impl
fe30: 69 65 64 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20  ied indices */. 
fe40: 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69   estimateTableWi
fe50: 64 74 68 28 70 29 3b 0a 20 20 66 6f 72 28 70 49  dth(p);.  for(pI
fe60: 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49  dx=p->pIndex; pI
fe70: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
fe80: 4e 65 78 74 29 7b 0a 20 20 20 20 65 73 74 69 6d  Next){.    estim
fe90: 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 70 49  ateIndexWidth(pI
fea0: 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  dx);.  }..  /* I
feb0: 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69  f not initializi
fec0: 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  ng, then create 
fed0: 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65  a record for the
fee0: 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20   new table.  ** 
fef0: 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  in the SQLITE_MA
ff00: 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68  STER table of th
ff10: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a  e database..  **
ff20: 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73  .  ** If this is
ff30: 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62   a TEMPORARY tab
ff40: 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e  le, write the en
ff50: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78  try into the aux
ff60: 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65  iliary.  ** file
ff70: 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f   instead of into
ff80: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
ff90: 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  se file..  */.  
ffa0: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
ffb0: 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  sy ){.    int n;
ffc0: 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
ffd0: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20    char *zType;  
ffe0: 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72 20 22    /* "view" or "
fff0: 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68  table" */.    ch
10000 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a  ar *zType2;   /*
10010 20 22 56 49 45 57 22 20 6f 72 20 22 54 41 42 4c   "VIEW" or "TABL
10020 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  E" */.    char *
10030 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78  zStmt;    /* Tex
10040 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
10050 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20  TABLE or CREATE 
10060 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2a  VIEW statement *
10070 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  /..    v = sqlit
10080 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
10090 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  );.    if( NEVER
100a0 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  (v==0) ) return;
100b0 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ..    sqlite3Vdb
100c0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
100d0 6f 73 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  ose, 0);..    /*
100e0 20 0a 20 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c   .    ** Initial
100f0 69 7a 65 20 7a 54 79 70 65 20 66 6f 72 20 74 68  ize zType for th
10100 65 20 6e 65 77 20 76 69 65 77 20 6f 72 20 74 61  e new view or ta
10110 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
10120 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d  if( p->pSelect==
10130 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  0 ){.      /* A 
10140 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f  regular table */
10150 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
10160 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54  table";.      zT
10170 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a  ype2 = "TABLE";.
10180 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10190 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c  MIT_VIEW.    }el
101a0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76  se{.      /* A v
101b0 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79  iew */.      zTy
101c0 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20 20  pe = "view";.   
101d0 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49 45     zType2 = "VIE
101e0 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  W";.#endif.    }
101f0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
10200 20 69 73 20 61 20 43 52 45 41 54 45 20 54 41 42   is a CREATE TAB
10210 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43 54 20  LE xx AS SELECT 
10220 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65  ..., execute the
10230 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73   SELECT.    ** s
10240 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75  tatement to popu
10250 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74 61 62  late the new tab
10260 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67  le. The root-pag
10270 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  e number for the
10280 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c  .    ** new tabl
10290 65 20 69 73 20 69 6e 20 72 65 67 69 73 74 65 72  e is in register
102a0 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
102b0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
102c0 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54 20  Once the SELECT 
102d0 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62  has been coded b
102e0 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  y sqlite3Select(
102f0 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20  ), it is in a.  
10300 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74    ** suitable st
10310 61 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72  ate to query for
10320 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
10330 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62  s and types to b
10340 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79  e used.    ** by
10350 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a   the new table..
10360 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20      **.    ** A 
10370 73 68 61 72 65 64 2d 63 61 63 68 65 20 77 72 69  shared-cache wri
10380 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  te-lock is not r
10390 65 71 75 69 72 65 64 20 74 6f 20 77 72 69 74 65  equired to write
103a0 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c   to the new tabl
103b0 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 73  e,.    ** as a s
103c0 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20  chema-lock must 
103d0 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
103e0 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20 63 72  n obtained to cr
103f0 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65 0a 20  eate it. Since. 
10400 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c     ** a schema-l
10410 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61 6c 6c  ock excludes all
10420 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
10430 75 73 65 72 73 2c 20 74 68 65 20 77 72 69 74 65  users, the write
10440 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20  -lock would.    
10450 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e 74 2e  ** be redundant.
10460 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
10470 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
10480 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
10490 3b 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 68  ;    /* Where th
104a0 65 20 53 45 4c 45 43 54 20 73 68 6f 75 6c 64 20  e SELECT should 
104b0 73 74 6f 72 65 20 72 65 73 75 6c 74 73 20 2a 2f  store results */
104c0 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 59 69  .      int regYi
104d0 65 6c 64 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  eld;       /* Re
104e0 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63  gister holding c
104f0 6f 2d 72 6f 75 74 69 6e 65 20 65 6e 74 72 79 2d  o-routine entry-
10500 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69  point */.      i
10510 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20  nt addrTop;     
10520 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
10530 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   co-routine */. 
10540 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 3b       int regRec;
10550 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65           /* A re
10560 63 6f 72 64 20 74 6f 20 62 65 20 69 6e 73 65 72  cord to be inser
10570 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 74  t into the new t
10580 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  able */.      in
10590 74 20 72 65 67 52 6f 77 69 64 3b 20 20 20 20 20  t regRowid;     
105a0 20 20 2f 2a 20 52 6f 77 69 64 20 6f 66 20 74 68    /* Rowid of th
105b0 65 20 6e 65 78 74 20 72 6f 77 20 74 6f 20 69 6e  e next row to in
105c0 73 65 72 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  sert */.      in
105d0 74 20 61 64 64 72 49 6e 73 4c 6f 6f 70 3b 20 20  t addrInsLoop;  
105e0 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
105f0 6c 6f 6f 70 20 66 6f 72 20 69 6e 73 65 72 74 69  loop for inserti
10600 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20  ng rows */.     
10610 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b   Table *pSelTab;
10620 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
10630 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
10640 68 65 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74  he SELECT result
10650 73 20 2a 2f 0a 0a 20 20 20 20 20 20 72 65 67 59  s */..      regY
10660 69 65 6c 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ield = ++pParse-
10670 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67  >nMem;.      reg
10680 52 65 63 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Rec = ++pParse->
10690 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52  nMem;.      regR
106a0 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  owid = ++pParse-
106b0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73 73  >nMem;.      ass
106c0 65 72 74 28 70 50 61 72 73 65 2d 3e 6e 54 61 62  ert(pParse->nTab
106d0 3d 3d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ==1);.      sqli
106e0 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
106f0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
10700 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
10710 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c  OP_OpenWrite, 1,
10720 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
10730 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
10740 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
10750 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 32 49 53  5(v, OPFLAG_P2IS
10760 52 45 47 29 3b 0a 20 20 20 20 20 20 70 50 61 72  REG);.      pPar
10770 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20  se->nTab = 2;.  
10780 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71      addrTop = sq
10790 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
107a0 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 20  Addr(v) + 1;.   
107b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
107c0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
107d0 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65  oroutine, regYie
107e0 6c 64 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b  ld, 0, addrTop);
107f0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
10800 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
10810 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 20  ;.      pSelTab 
10820 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  = sqlite3ResultS
10830 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
10840 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  e, pSelect);.   
10850 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d     if( pSelTab==
10860 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
10870 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f    assert( p->aCo
10880 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d  l==0 );.      p-
10890 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >nCol = pSelTab-
108a0 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e  >nCol;.      p->
108b0 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  aCol = pSelTab->
108c0 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c  aCol;.      pSel
108d0 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->nCol = 0;. 
108e0 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43       pSelTab->aC
108f0 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  ol = 0;.      sq
10900 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
10910 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20  (db, pSelTab);. 
10920 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
10930 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
10940 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
10950 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20   regYield);.    
10960 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
10970 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
10980 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69   &dest);.      i
10990 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
109a0 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
109b0 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f  sqlite3VdbeEndCo
109c0 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 59 69  routine(v, regYi
109d0 65 6c 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eld);.      sqli
109e0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
109f0 76 2c 20 61 64 64 72 54 6f 70 20 2d 20 31 29 3b  v, addrTop - 1);
10a00 0a 20 20 20 20 20 20 61 64 64 72 49 6e 73 4c 6f  .      addrInsLo
10a10 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
10a20 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
10a30 6c 64 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d  ld, dest.iSDParm
10a40 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
10a50 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
10a60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10a70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
10a80 72 64 2c 20 64 65 73 74 2e 69 53 64 73 74 2c 20  rd, dest.iSdst, 
10a90 64 65 73 74 2e 6e 53 64 73 74 2c 20 72 65 67 52  dest.nSdst, regR
10aa0 65 63 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ec);.      sqlit
10ab0 65 33 54 61 62 6c 65 41 66 66 69 6e 69 74 79 28  e3TableAffinity(
10ac0 76 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20  v, p, 0);.      
10ad0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10ae0 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
10af0 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  , 1, regRowid);.
10b00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10b10 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
10b20 73 65 72 74 2c 20 31 2c 20 72 65 67 52 65 63 2c  sert, 1, regRec,
10b30 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
10b40 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
10b50 6f 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70  o(v, addrInsLoop
10b60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10b70 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
10b80 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20  addrInsLoop);.  
10b90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10ba0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
10bb0 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  e, 1);.    }..  
10bc0 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
10bd0 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   complete text o
10be0 66 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61  f the CREATE sta
10bf0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66  tement */.    if
10c00 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
10c10 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61 74     zStmt = creat
10c20 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c 20 70  eTableStmt(db, p
10c30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
10c40 20 20 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 32      Token *pEnd2
10c50 20 3d 20 74 61 62 4f 70 74 73 20 3f 20 26 70 50   = tabOpts ? &pP
10c60 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
10c70 20 3a 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 6e   : pEnd;.      n
10c80 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 32 2d 3e   = (int)(pEnd2->
10c90 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d  z - pParse->sNam
10ca0 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20  eToken.z);.     
10cb0 20 69 66 28 20 70 45 6e 64 32 2d 3e 7a 5b 30 5d   if( pEnd2->z[0]
10cc0 21 3d 27 3b 27 20 29 20 6e 20 2b 3d 20 70 45 6e  !=';' ) n += pEn
10cd0 64 32 2d 3e 6e 3b 0a 20 20 20 20 20 20 7a 53 74  d2->n;.      zSt
10ce0 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
10cf0 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20 20  ntf(db, .       
10d00 20 20 20 22 43 52 45 41 54 45 20 25 73 20 25 2e     "CREATE %s %.
10d10 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20  *s", zType2, n, 
10d20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
10d30 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20  en.z.      );.  
10d40 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c    }..    /* A sl
10d50 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72  ot for the recor
10d60 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  d has already be
10d70 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20  en allocated in 
10d80 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49  the .    ** SQLI
10d90 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e  TE_MASTER table.
10da0 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74    We just need t
10db0 6f 20 75 70 64 61 74 65 20 74 68 61 74 20 73 6c  o update that sl
10dc0 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20  ot with all.    
10dd0 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  ** the informati
10de0 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74  on we've collect
10df0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
10e00 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
10e10 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
10e20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 22 0a  "UPDATE %Q.%s ".
10e30 20 20 20 20 20 20 20 20 20 22 53 45 54 20 74 79           "SET ty
10e40 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51  pe='%s', name=%Q
10e50 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72  , tbl_name=%Q, r
10e60 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20 73 71 6c  ootpage=#%d, sql
10e70 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22 57 48  =%Q ".       "WH
10e80 45 52 45 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a  ERE rowid=#%d",.
10e90 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
10ea0 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53  b].zDbSName, MAS
10eb0 54 45 52 5f 4e 41 4d 45 2c 0a 20 20 20 20 20 20  TER_NAME,.      
10ec0 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e  zType,.      p->
10ed0 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e  zName,.      p->
10ee0 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 50 61  zName,.      pPa
10ef0 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20  rse->regRoot,.  
10f00 20 20 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20      zStmt,.     
10f10 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69   pParse->regRowi
10f20 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  d.    );.    sql
10f30 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
10f40 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Stmt);.    sqlit
10f50 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
10f60 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69  Parse, iDb);..#i
10f70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10f80 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
10f90 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
10fa0 73 65 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  see if we need t
10fb0 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69  o create an sqli
10fc0 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
10fd0 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65  e for.    ** kee
10fe0 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75  ping track of au
10ff0 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73  toincrement keys
11000 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
11010 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20   (p->tabFlags & 
11020 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  TF_Autoincrement
11030 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 44 62  )!=0 ){.      Db
11040 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
11050 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20 61 73 73  [iDb];.      ass
11060 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
11070 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
11080 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 20  iDb, 0) );.     
11090 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
110a0 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b  a->pSeqTab==0 ){
110b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
110c0 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
110d0 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43  se,.          "C
110e0 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73  REATE TABLE %Q.s
110f0 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e  qlite_sequence(n
11100 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20  ame,seq)",.     
11110 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61       pDb->zDbSNa
11120 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  me.        );.  
11130 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
11140 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61 72  if..    /* Repar
11150 73 65 20 65 76 65 72 79 74 68 69 6e 67 20 74 6f  se everything to
11160 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65   update our inte
11170 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63 74  rnal data struct
11180 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ures */.    sqli
11190 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53  te3VdbeAddParseS
111a0 63 68 65 6d 61 4f 70 28 70 50 61 72 73 65 2c 20  chemaOp(pParse, 
111b0 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  iDb,.           
111c0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
111d0 62 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71  b, "tbl_name='%q
111e0 27 20 41 4e 44 20 74 79 70 65 21 3d 27 74 72 69  ' AND type!='tri
111f0 67 67 65 72 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65  gger'", p->zName
11200 29 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41  ));.  }...  /* A
11210 64 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  dd the table to 
11220 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
11230 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
11240 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
11250 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
11260 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 54 61  t.busy ){.    Ta
11270 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 53  ble *pOld;.    S
11280 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
11290 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20   p->pSchema;.   
112a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
112b0 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
112c0 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
112d0 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65     pOld = sqlite
112e0 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 53 63  3HashInsert(&pSc
112f0 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70  hema->tblHash, p
11300 2d 3e 7a 4e 61 6d 65 2c 20 70 29 3b 0a 20 20 20  ->zName, p);.   
11310 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20   if( pOld ){.   
11320 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f     assert( p==pO
11330 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ld );  /* Malloc
11340 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
11350 64 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73  d inside HashIns
11360 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 73  ert() */.      s
11370 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
11380 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  b);.      return
11390 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
113a0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
113b0 30 3b 0a 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c  0;.    db->mDbFl
113c0 61 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63  ags |= DBFLAG_Sc
113d0 68 65 6d 61 43 68 61 6e 67 65 3b 0a 0a 23 69 66  hemaChange;..#if
113e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
113f0 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20  _ALTERTABLE.    
11400 69 66 28 20 21 70 2d 3e 70 53 65 6c 65 63 74 20  if( !p->pSelect 
11410 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
11420 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f  har *zName = (co
11430 6e 73 74 20 63 68 61 72 20 2a 29 70 50 61 72 73  nst char *)pPars
11440 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b  e->sNameToken.z;
11450 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65  .      int nName
11460 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
11470 21 70 53 65 6c 65 63 74 20 26 26 20 70 43 6f 6e  !pSelect && pCon
11480 73 20 26 26 20 70 45 6e 64 20 29 3b 0a 20 20 20  s && pEnd );.   
11490 20 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d     if( pCons->z=
114a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  =0 ){.        pC
114b0 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20  ons = pEnd;.    
114c0 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20    }.      nName 
114d0 3d 20 28 69 6e 74 29 28 28 63 6f 6e 73 74 20 63  = (int)((const c
114e0 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d  har *)pCons->z -
114f0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70   zName);.      p
11500 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d  ->addColOffset =
11510 20 31 33 20 2b 20 73 71 6c 69 74 65 33 55 74 66   13 + sqlite3Utf
11520 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20  8CharLen(zName, 
11530 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65  nName);.    }.#e
11540 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  ndif.  }.}..#ifn
11550 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11560 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  VIEW./*.** The p
11570 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
11580 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65   routine in orde
11590 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  r to create a ne
115a0 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73  w VIEW.*/.void s
115b0 71 6c 69 74 65 33 43 72 65 61 74 65 56 69 65 77  qlite3CreateView
115c0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
115d0 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  e,     /* The pa
115e0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
115f0 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e  .  Token *pBegin
11600 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45  ,     /* The CRE
11610 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
11620 65 67 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d  egins the statem
11630 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ent */.  Token *
11640 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54  pName1,     /* T
11650 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f  he token that ho
11660 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  lds the name of 
11670 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f  the view */.  To
11680 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
11690 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68   /* The token th
116a0 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  at holds the nam
116b0 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f  e of the view */
116c0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43 4e  .  ExprList *pCN
116d0 61 6d 65 73 2c 20 2f 2a 20 4f 70 74 69 6f 6e 61  ames, /* Optiona
116e0 6c 20 6c 69 73 74 20 6f 66 20 76 69 65 77 20 63  l list of view c
116f0 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
11700 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
11710 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20  ,   /* A SELECT 
11720 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77  statement that w
11730 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e  ill become the n
11740 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  ew view */.  int
11750 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20   isTemp,        
11760 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54 45  /* TRUE for a TE
11770 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a  MPORARY view */.
11780 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20    int noErr     
11790 20 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73       /* Suppress
117a0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
117b0 69 66 20 56 49 45 57 20 61 6c 72 65 61 64 79 20  if VIEW already 
117c0 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54  exists */.){.  T
117d0 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  able *p;.  int n
117e0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
117f0 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b  z;.  Token sEnd;
11800 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b  .  DbFixer sFix;
11810 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20  .  Token *pName 
11820 3d 20 30 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  = 0;.  int iDb;.
11830 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
11840 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
11850 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e  f( pParse->nVar>
11860 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
11870 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11880 20 22 70 61 72 61 6d 65 74 65 72 73 20 61 72 65   "parameters are
11890 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20   not allowed in 
118a0 76 69 65 77 73 22 29 3b 0a 20 20 20 20 67 6f 74  views");.    got
118b0 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61  o create_view_fa
118c0 69 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  il;.  }.  sqlite
118d0 33 53 74 61 72 74 54 61 62 6c 65 28 70 50 61 72  3StartTable(pPar
118e0 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
118f0 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30  e2, isTemp, 1, 0
11900 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20  , noErr);.  p = 
11910 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
11920 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  e;.  if( p==0 ||
11930 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
11940 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77  goto create_view
11950 5f 66 61 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33  _fail;.  sqlite3
11960 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
11970 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
11980 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69  e2, &pName);.  i
11990 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
119a0 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d  maToIndex(db, p-
119b0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c  >pSchema);.  sql
119c0 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69  ite3FixInit(&sFi
119d0 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20  x, pParse, iDb, 
119e0 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 3b 0a  "view", pName);.
119f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78    if( sqlite3Fix
11a00 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53  Select(&sFix, pS
11a10 65 6c 65 63 74 29 20 29 20 67 6f 74 6f 20 63 72  elect) ) goto cr
11a20 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a  eate_view_fail;.
11a30 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70  .  /* Make a cop
11a40 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  y of the entire 
11a50 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
11a60 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
11a70 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69  e view..  ** Thi
11a80 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c  s will force all
11a90 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e   the Expr.token.
11aa0 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64  z values to be d
11ab0 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20  ynamically.  ** 
11ac0 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72  allocated rather
11ad0 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74   than point to t
11ae0 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20  he input string 
11af0 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68  - which means th
11b00 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c  at.  ** they wil
11b10 6c 20 70 65 72 73 69 73 74 20 61 66 74 65 72 20  l persist after 
11b20 74 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69  the current sqli
11b30 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20  te3_exec() call 
11b40 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20  returns..  */.  
11b50 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
11b60 4a 45 43 54 20 29 7b 0a 20 20 20 20 70 2d 3e 70  JECT ){.    p->p
11b70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
11b80 3b 0a 20 20 20 20 70 53 65 6c 65 63 74 20 3d 20  ;.    pSelect = 
11b90 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
11ba0 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  p->pSelect = sql
11bb0 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
11bc0 2c 20 70 53 65 6c 65 63 74 2c 20 45 58 50 52 44  , pSelect, EXPRD
11bd0 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 7d 0a  UP_REDUCE);.  }.
11be0 20 20 70 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71    p->pCheck = sq
11bf0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
11c00 28 64 62 2c 20 70 43 4e 61 6d 65 73 2c 20 45 58  (db, pCNames, EX
11c10 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
11c20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
11c30 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 63 72 65  ailed ) goto cre
11c40 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a  ate_view_fail;..
11c50 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
11c60 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54  end of the CREAT
11c70 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74  E VIEW statement
11c80 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69  .  Make sEnd poi
11c90 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65  nt to.  ** the e
11ca0 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20  nd..  */.  sEnd 
11cb0 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54  = pParse->sLastT
11cc0 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  oken;.  assert( 
11cd0 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 7c 7c 20  sEnd.z[0]!=0 || 
11ce0 73 45 6e 64 2e 6e 3d 3d 30 20 29 3b 0a 20 20 69  sEnd.n==0 );.  i
11cf0 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b  f( sEnd.z[0]!=';
11d00 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20  ' ){.    sEnd.z 
11d10 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20  += sEnd.n;.  }. 
11d20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e   sEnd.n = 0;.  n
11d30 20 3d 20 28 69 6e 74 29 28 73 45 6e 64 2e 7a 20   = (int)(sEnd.z 
11d40 2d 20 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20  - pBegin->z);.  
11d50 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20  assert( n>0 );. 
11d60 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a   z = pBegin->z;.
11d70 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
11d80 49 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 20  Isspace(z[n-1]) 
11d90 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64  ){ n--; }.  sEnd
11da0 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20  .z = &z[n-1];.  
11db0 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f  sEnd.n = 1;..  /
11dc0 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64  * Use sqlite3End
11dd0 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74  Table() to add t
11de0 68 65 20 76 69 65 77 20 74 6f 20 74 68 65 20 53  he view to the S
11df0 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
11e00 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  le */.  sqlite3E
11e10 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  ndTable(pParse, 
11e20 30 2c 20 26 73 45 6e 64 2c 20 30 2c 20 30 29 3b  0, &sEnd, 0, 0);
11e30 0a 0a 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61  ..create_view_fa
11e40 69 6c 3a 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  il:.  sqlite3Sel
11e50 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
11e60 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 49 4e  elect);.  if( IN
11e70 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29  _RENAME_OBJECT )
11e80 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e  {.    sqlite3Ren
11e90 61 6d 65 45 78 70 72 6c 69 73 74 55 6e 6d 61 70  ameExprlistUnmap
11ea0 28 70 50 61 72 73 65 2c 20 70 43 4e 61 6d 65 73  (pParse, pCNames
11eb0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
11ec0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
11ed0 62 2c 20 70 43 4e 61 6d 65 73 29 3b 0a 20 20 72  b, pCNames);.  r
11ee0 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20  eturn;.}.#endif 
11ef0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
11f00 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  IEW */..#if !def
11f10 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
11f20 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
11f30 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
11f40 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a  IRTUALTABLE)./*.
11f50 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72  ** The Table str
11f60 75 63 74 75 72 65 20 70 54 61 62 6c 65 20 69 73  ucture pTable is
11f70 20 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20   really a VIEW. 
11f80 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d   Fill in the nam
11f90 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c  es of.** the col
11fa0 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77  umns of the view
11fb0 20 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73   in the pTable s
11fc0 74 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72  tructure.  Retur
11fd0 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20  n the number.** 
11fe0 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61  of errors.  If a
11ff0 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20  n error is seen 
12000 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
12010 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
12020 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e  ->zErrMsg..*/.in
12030 74 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  t sqlite3ViewGet
12040 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73  ColumnNames(Pars
12050 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
12060 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54 61 62   *pTable){.  Tab
12070 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f  le *pSelTab;   /
12080 2a 20 41 20 66 61 6b 65 20 74 61 62 6c 65 20 66  * A fake table f
12090 72 6f 6d 20 77 68 69 63 68 20 77 65 20 67 65 74  rom which we get
120a0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
120b0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
120c0 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f  l;     /* Copy o
120d0 66 20 74 68 65 20 53 45 4c 45 43 54 20 74 68 61  f the SELECT tha
120e0 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
120f0 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e   view */.  int n
12100 45 72 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Err = 0;     /* 
12110 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  Number of errors
12120 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a   encountered */.
12130 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
12140 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69      /* Temporari
12150 6c 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d  ly holds the num
12160 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 61  ber of cursors a
12170 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c  ssigned */.  sql
12180 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
12190 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62  e->db;  /* Datab
121a0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  ase connection f
121b0 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  or malloc errors
121c0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
121d0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
121e0 41 42 4c 45 0a 20 20 69 6e 74 20 72 63 3b 0a 23  ABLE.  int rc;.#
121f0 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
12200 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
12210 49 5a 41 54 49 4f 4e 0a 20 20 73 71 6c 69 74 65  IZATION.  sqlite
12220 33 5f 78 61 75 74 68 20 78 41 75 74 68 3b 20 20  3_xauth xAuth;  
12230 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 78 41       /* Saved xA
12240 75 74 68 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 23  uth pointer */.#
12250 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
12260 20 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e   pTable );..#ifn
12270 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12280 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 64  VIRTUALTABLE.  d
12290 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 2b 2b  b->nSchemaLock++
122a0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
122b0 56 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28  VtabCallConnect(
122c0 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29 3b  pParse, pTable);
122d0 0a 20 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f  .  db->nSchemaLo
122e0 63 6b 2d 2d 3b 0a 20 20 69 66 28 20 72 63 20 29  ck--;.  if( rc )
122f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
12300 20 20 7d 0a 20 20 69 66 28 20 49 73 56 69 72 74    }.  if( IsVirt
12310 75 61 6c 28 70 54 61 62 6c 65 29 20 29 20 72 65  ual(pTable) ) re
12320 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  turn 0;.#endif..
12330 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12340 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41 20  MIT_VIEW.  /* A 
12350 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65  positive nCol me
12360 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  ans the columns 
12370 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76  names for this v
12380 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72  iew are.  ** alr
12390 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f  eady known..  */
123a0 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e  .  if( pTable->n
123b0 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30  Col>0 ) return 0
123c0 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69  ;..  /* A negati
123d0 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65  ve nCol is a spe
123e0 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e  cial marker mean
123f0 69 6e 67 20 74 68 61 74 20 77 65 20 61 72 65 20  ing that we are 
12400 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74  currently.  ** t
12410 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65  rying to compute
12420 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
12430 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72 20  s.  If we enter 
12440 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74  this routine wit
12450 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76  h.  ** a negativ
12460 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73  e nCol, it means
12470 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65   two or more vie
12480 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20  ws form a loop, 
12490 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a  like this:.  **.
124a0 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
124b0 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45  VIEW one AS SELE
124c0 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20  CT * FROM two;. 
124d0 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56   **     CREATE V
124e0 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43  IEW two AS SELEC
124f0 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20  T * FROM one;.  
12500 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79  **.  ** Actually
12510 2c 20 74 68 65 20 65 72 72 6f 72 20 61 62 6f 76  , the error abov
12520 65 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20  e is now caught 
12530 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69 6e  prior to reachin
12540 67 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20  g this point..  
12550 2a 2a 20 42 75 74 20 74 68 65 20 66 6f 6c 6c 6f  ** But the follo
12560 77 69 6e 67 20 74 65 73 74 20 69 73 20 73 74 69  wing test is sti
12570 6c 6c 20 69 6d 70 6f 72 74 61 6e 74 20 61 73 20  ll important as 
12580 69 74 20 64 6f 65 73 20 63 6f 6d 65 20 75 70 0a  it does come up.
12590 20 20 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c    ** in the foll
125a0 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20 20 2a  owing:.  ** .  *
125b0 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
125c0 4c 45 20 6d 61 69 6e 2e 65 78 31 28 61 29 3b 0a  LE main.ex1(a);.
125d0 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
125e0 54 45 4d 50 20 56 49 45 57 20 65 78 31 20 41 53  TEMP VIEW ex1 AS
125f0 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 65   SELECT a FROM e
12600 78 31 3b 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c  x1;.  **     SEL
12610 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 6d 70 2e  ECT * FROM temp.
12620 65 78 31 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ex1;.  */.  if( 
12630 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29  pTable->nCol<0 )
12640 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
12650 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
12660 69 65 77 20 25 73 20 69 73 20 63 69 72 63 75 6c  iew %s is circul
12670 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 70  arly defined", p
12680 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  Table->zName);. 
12690 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
126a0 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
126b0 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20  e->nCol>=0 );.. 
126c0 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68   /* If we get th
126d0 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73  is far, it means
126e0 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70   we need to comp
126f0 75 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ute the table na
12700 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74  mes..  ** Note t
12710 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  hat the call to 
12720 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
12730 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20  OfSelect() will 
12740 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20  expand any.  ** 
12750 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20  "*" elements in 
12760 74 68 65 20 72 65 73 75 6c 74 73 20 73 65 74 20  the results set 
12770 6f 66 20 74 68 65 20 76 69 65 77 20 61 6e 64 20  of the view and 
12780 77 69 6c 6c 20 61 73 73 69 67 6e 20 63 75 72 73  will assign curs
12790 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ors.  ** to the 
127a0 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
127b0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42 75  FROM clause.  Bu
127c0 74 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74  t we do not want
127d0 20 74 68 65 73 65 20 63 68 61 6e 67 65 73 0a 20   these changes. 
127e0 20 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d 61 6e   ** to be perman
127f0 65 6e 74 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d  ent.  So the com
12800 70 75 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65  putation is done
12810 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68   on a copy of th
12820 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74  e SELECT.  ** st
12830 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66  atement that def
12840 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20  ines the view.. 
12850 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54   */.  assert( pT
12860 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b  able->pSelect );
12870 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c 69 74 65  .  pSel = sqlite
12880 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
12890 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 2c 20  Table->pSelect, 
128a0 30 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 20 29  0);.  if( pSel )
128b0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
128c0 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45  _OMIT_ALTERTABLE
128d0 0a 20 20 20 20 75 38 20 65 50 61 72 73 65 4d 6f  .    u8 eParseMo
128e0 64 65 20 3d 20 70 50 61 72 73 65 2d 3e 65 50 61  de = pParse->ePa
128f0 72 73 65 4d 6f 64 65 3b 0a 20 20 20 20 70 50 61  rseMode;.    pPa
12900 72 73 65 2d 3e 65 50 61 72 73 65 4d 6f 64 65 20  rse->eParseMode 
12910 3d 20 50 41 52 53 45 5f 4d 4f 44 45 5f 4e 4f 52  = PARSE_MODE_NOR
12920 4d 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  MAL;.#endif.    
12930 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  n = pParse->nTab
12940 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63  ;.    sqlite3Src
12950 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
12960 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e  s(pParse, pSel->
12970 70 53 72 63 29 3b 0a 20 20 20 20 70 54 61 62 6c  pSrc);.    pTabl
12980 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20  e->nCol = -1;.  
12990 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
129a0 62 44 69 73 61 62 6c 65 2b 2b 3b 0a 23 69 66 6e  bDisable++;.#ifn
129b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
129c0 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
129d0 20 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78 41    xAuth = db->xA
129e0 75 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75  uth;.    db->xAu
129f0 74 68 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c  th = 0;.    pSel
12a00 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
12a10 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
12a20 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 20 20  Parse, pSel);.  
12a30 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 78 41    db->xAuth = xA
12a40 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70  uth;.#else.    p
12a50 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
12a60 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
12a70 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b  t(pParse, pSel);
12a80 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 72  .#endif.    pPar
12a90 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20  se->nTab = n;.  
12aa0 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 70 43    if( pTable->pC
12ab0 68 65 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  heck ){.      /*
12ac0 20 43 52 45 41 54 45 20 56 49 45 57 20 6e 61 6d   CREATE VIEW nam
12ad0 65 28 61 72 67 6c 69 73 74 29 20 41 53 20 2e 2e  e(arglist) AS ..
12ae0 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6e  ..      ** The n
12af0 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75  ames of the colu
12b00 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  mns in the table
12b10 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 0a   are taken from.
12b20 20 20 20 20 20 20 2a 2a 20 61 72 67 6c 69 73 74        ** arglist
12b30 20 77 68 69 63 68 20 69 73 20 73 74 6f 72 65 64   which is stored
12b40 20 69 6e 20 70 54 61 62 6c 65 2d 3e 70 43 68 65   in pTable->pChe
12b50 63 6b 2e 20 20 54 68 65 20 70 43 68 65 63 6b 20  ck.  The pCheck 
12b60 66 69 65 6c 64 0a 20 20 20 20 20 20 2a 2a 20 6e  field.      ** n
12b70 6f 72 6d 61 6c 6c 79 20 68 6f 6c 64 73 20 43 48  ormally holds CH
12b80 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ECK constraints 
12b90 6f 6e 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 74  on an ordinary t
12ba0 61 62 6c 65 2c 20 62 75 74 20 66 6f 72 0a 20 20  able, but for.  
12bb0 20 20 20 20 2a 2a 20 61 20 56 49 45 57 20 69 74      ** a VIEW it
12bc0 20 68 6f 6c 64 73 20 74 68 65 20 6c 69 73 74 20   holds the list 
12bd0 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e  of column names.
12be0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
12bf0 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72  sqlite3ColumnsFr
12c00 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
12c10 65 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63  e, pTable->pChec
12c20 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  k, .            
12c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c40 20 20 20 20 20 26 70 54 61 62 6c 65 2d 3e 6e 43       &pTable->nC
12c50 6f 6c 2c 20 26 70 54 61 62 6c 65 2d 3e 61 43 6f  ol, &pTable->aCo
12c60 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  l);.      if( db
12c70 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
12c80 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 50 61  0 .       && pPa
12c90 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 0a 20 20 20  rse->nErr==0.   
12ca0 20 20 20 20 26 26 20 70 54 61 62 6c 65 2d 3e 6e      && pTable->n
12cb0 43 6f 6c 3d 3d 70 53 65 6c 2d 3e 70 45 4c 69 73  Col==pSel->pELis
12cc0 74 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 29  t->nExpr.      )
12cd0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
12ce0 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e  3SelectAddColumn
12cf0 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
12d00 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 2c  (pParse, pTable,
12d10 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a   pSel);.      }.
12d20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53      }else if( pS
12d30 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20 2f  elTab ){.      /
12d40 2a 20 43 52 45 41 54 45 20 56 49 45 57 20 6e 61  * CREATE VIEW na
12d50 6d 65 20 41 53 2e 2e 2e 20 20 77 69 74 68 6f 75  me AS...  withou
12d60 74 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 6c 69  t an argument li
12d70 73 74 2e 20 20 43 6f 6e 73 74 72 75 63 74 0a 20  st.  Construct. 
12d80 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6c 75       ** the colu
12d90 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74 68  mn names from th
12da0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
12db0 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  nt that defines 
12dc0 74 68 65 20 76 69 65 77 2e 0a 20 20 20 20 20 20  the view..      
12dd0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
12de0 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30   pTable->aCol==0
12df0 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65   );.      pTable
12e00 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->nCol = pSelTab
12e10 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54  ->nCol;.      pT
12e20 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65  able->aCol = pSe
12e30 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  lTab->aCol;.    
12e40 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20    pSelTab->nCol 
12e50 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54  = 0;.      pSelT
12e60 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
12e70 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
12e80 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
12e90 6c 64 28 64 62 2c 20 30 2c 20 70 54 61 62 6c 65  ld(db, 0, pTable
12ea0 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
12eb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
12ec0 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
12ed0 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20  .      nErr++;. 
12ee0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
12ef0 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
12f00 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 73 71  pSelTab);.    sq
12f10 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
12f20 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20  e(db, pSel);.   
12f30 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
12f40 44 69 73 61 62 6c 65 2d 2d 3b 0a 23 69 66 6e 64  Disable--;.#ifnd
12f50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
12f60 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20 70 50  LTERTABLE.    pP
12f70 61 72 73 65 2d 3e 65 50 61 72 73 65 4d 6f 64 65  arse->eParseMode
12f80 20 3d 20 65 50 61 72 73 65 4d 6f 64 65 3b 0a 23   = eParseMode;.#
12f90 65 6e 64 69 66 0a 20 20 7d 20 65 6c 73 65 20 7b  endif.  } else {
12fa0 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d  .    nErr++;.  }
12fb0 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65  .  pTable->pSche
12fc0 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 20  ma->schemaFlags 
12fd0 7c 3d 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  |= DB_UnresetVie
12fe0 77 73 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ws;.  if( db->ma
12ff0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
13000 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 43    sqlite3DeleteC
13010 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70  olumnNames(db, p
13020 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 54 61 62  Table);.    pTab
13030 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->aCol = 0;.  
13040 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
13050 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f   0;.  }.#endif /
13060 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
13070 45 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e  EW */.  return n
13080 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20  Err;  .}.#endif 
13090 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
130a0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
130b0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
130c0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
130d0 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  LE) */..#ifndef 
130e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
130f0 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
13100 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72   column names fr
13110 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20 69 6e  om every VIEW in
13120 20 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a   database idx..*
13130 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
13140 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
13150 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
13160 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c  t idx){.  HashEl
13170 65 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72 74 28  em *i;.  assert(
13180 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
13190 74 65 78 48 65 6c 64 28 64 62 2c 20 69 64 78 2c  texHeld(db, idx,
131a0 20 30 29 20 29 3b 0a 20 20 69 66 28 20 21 44 62   0) );.  if( !Db
131b0 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20  HasProperty(db, 
131c0 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56  idx, DB_UnresetV
131d0 69 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a  iews) ) return;.
131e0 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
131f0 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62  shFirst(&db->aDb
13200 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74  [idx].pSchema->t
13210 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c  blHash); i;i=sql
13220 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
13230 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
13240 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
13250 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54  a(i);.    if( pT
13260 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
13270 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65       sqlite3Dele
13280 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62  teColumnNames(db
13290 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 70  , pTab);.      p
132a0 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
132b0 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20       pTab->nCol 
132c0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
132d0 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79   DbClearProperty
132e0 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72  (db, idx, DB_Unr
132f0 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65  esetViews);.}.#e
13300 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c  lse.# define sql
13310 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
13320 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  A,B).#endif /* S
13330 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20  QLITE_OMIT_VIEW 
13340 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  */../*.** This f
13350 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
13360 64 20 62 79 20 74 68 65 20 56 44 42 45 20 74 6f  d by the VDBE to
13370 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65   adjust the inte
13380 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75  rnal schema.** u
13390 73 65 64 20 62 79 20 53 51 4c 69 74 65 20 77 68  sed by SQLite wh
133a0 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  en the btree lay
133b0 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65  er moves a table
133c0 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a   root page. The.
133d0 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20  ** root-page of 
133e0 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  a table or index
133f0 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   in database iDb
13400 20 68 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f   has changed fro
13410 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54  m iFrom.** to iT
13420 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20  o..**.** Ticket 
13430 23 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d 62  #1728:  The symb
13440 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 73  ol table might s
13450 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66  till contain inf
13460 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74  ormation.** on t
13470 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64  ables and/or ind
13480 69 63 65 73 20 74 68 61 74 20 61 72 65 20 74 68  ices that are th
13490 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69  e process of bei
134a0 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49  ng deleted..** I
134b0 66 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b  f you are unluck
134c0 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  y, one of those 
134d0 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 20  deleted indices 
134e0 6f 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74 0a  or tables might.
134f0 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ** have the same
13500 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72   rootpage number
13510 20 61 73 20 74 68 65 20 72 65 61 6c 20 74 61 62   as the real tab
13520 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61 74  le or index that
13530 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76   is.** being mov
13540 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f  ed.  So we canno
13550 74 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e 67  t stop searching
13560 20 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74   after the first
13570 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61 75   match .** becau
13580 73 65 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  se the first mat
13590 63 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72 20  ch might be for 
135a0 6f 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65 74  one of the delet
135b0 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72  ed indices.** or
135c0 20 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20   tables and not 
135d0 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20  the table/index 
135e0 74 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c 79  that is actually
135f0 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a   being moved..**
13600 20 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75   We must continu
13610 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20  e looping until 
13620 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69  all tables and i
13630 6e 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20 72  ndices with.** r
13640 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68  ootpage==iFrom h
13650 61 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72 74  ave been convert
13660 65 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f 6f  ed to have a roo
13670 74 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20  tpage of iTo.** 
13680 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63  in order to be c
13690 65 72 74 61 69 6e 20 74 68 61 74 20 77 65 20 67  ertain that we g
136a0 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e 65  ot the right one
136b0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
136c0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
136d0 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  UUM.void sqlite3
136e0 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 73 71  RootPageMoved(sq
136f0 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
13700 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  Db, int iFrom, i
13710 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45  nt iTo){.  HashE
13720 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61  lem *pElem;.  Ha
13730 73 68 20 2a 70 48 61 73 68 3b 0a 20 20 44 62 20  sh *pHash;.  Db 
13740 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pDb;..  assert(
13750 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
13760 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
13770 20 30 29 20 29 3b 0a 20 20 70 44 62 20 3d 20 26   0) );.  pDb = &
13780 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
13790 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53  pHash = &pDb->pS
137a0 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a  chema->tblHash;.
137b0 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69    for(pElem=sqli
137c0 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73  teHashFirst(pHas
137d0 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  h); pElem; pElem
137e0 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
137f0 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62  pElem)){.    Tab
13800 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
13810 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
13820 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
13830 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  tnum==iFrom ){. 
13840 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20       pTab->tnum 
13850 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  = iTo;.    }.  }
13860 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d  .  pHash = &pDb-
13870 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  >pSchema->idxHas
13880 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  h;.  for(pElem=s
13890 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70  qliteHashFirst(p
138a0 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
138b0 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
138c0 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
138d0 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71  Index *pIdx = sq
138e0 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
138f0 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  em);.    if( pId
13900 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29  x->tnum==iFrom )
13910 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e  {.      pIdx->tn
13920 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a  um = iTo;.    }.
13930 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
13940 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74  .** Write code t
13950 6f 20 65 72 61 73 65 20 74 68 65 20 74 61 62 6c  o erase the tabl
13960 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
13970 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74   iTable from dat
13980 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c  abase iDb..** Al
13990 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f  so write code to
139a0 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69   modify the sqli
139b0 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
139c0 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  and internal sch
139d0 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74  ema.** if a root
139e0 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72  -page of another
139f0 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20   table is moved 
13a00 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79  by the btree-lay
13a10 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61  er whilst.** era
13a20 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69  sing iTable (thi
13a30 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74  s can happen wit
13a40 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  h an auto-vacuum
13a50 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a   database)..*/ .
13a60 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74  static void dest
13a70 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73  royRootPage(Pars
13a80 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
13a90 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b  Table, int iDb){
13aa0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
13ab0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
13ac0 73 65 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20  se);.  int r1 = 
13ad0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
13ae0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  g(pParse);.  if(
13af0 20 69 54 61 62 6c 65 3c 32 20 29 20 73 71 6c 69   iTable<2 ) sqli
13b00 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
13b10 73 65 2c 20 22 63 6f 72 72 75 70 74 20 73 63 68  se, "corrupt sch
13b20 65 6d 61 22 29 3b 0a 20 20 73 71 6c 69 74 65 33  ema");.  sqlite3
13b30 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
13b40 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65  _Destroy, iTable
13b50 2c 20 72 31 2c 20 69 44 62 29 3b 0a 20 20 73 71  , r1, iDb);.  sq
13b60 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50  lite3MayAbort(pP
13b70 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53  arse);.#ifndef S
13b80 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
13b90 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65  ACUUM.  /* OP_De
13ba0 73 74 72 6f 79 20 73 74 6f 72 65 73 20 61 6e 20  stroy stores an 
13bb0 69 6e 20 69 6e 74 65 67 65 72 20 72 31 2e 20 49  in integer r1. I
13bc0 66 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20  f this integer. 
13bd0 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c   ** is non-zero,
13be0 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
13bf0 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
13c00 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65   of a table move
13c10 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69  d to.  ** locati
13c20 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66  on iTable. The f
13c30 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f  ollowing code mo
13c40 64 69 66 69 65 73 20 74 68 65 20 73 71 6c 69 74  difies the sqlit
13c50 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74  e_master table t
13c60 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74  o.  ** reflect t
13c70 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  his..  **.  ** T
13c80 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65  he "#NNN" in the
13c90 20 53 51 4c 20 69 73 20 61 20 73 70 65 63 69 61   SQL is a specia
13ca0 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20  l constant that 
13cb0 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72 20 76  means whatever v
13cc0 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20  alue.  ** is in 
13cd0 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53  register NNN.  S
13ce0 65 65 20 67 72 61 6d 6d 61 72 20 72 75 6c 65 73  ee grammar rules
13cf0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
13d00 20 74 68 65 20 54 4b 5f 52 45 47 49 53 54 45 52   the TK_REGISTER
13d10 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72 20  .  ** token for 
13d20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
13d30 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73  mation..  */.  s
13d40 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
13d50 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
13d60 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 53 45  "UPDATE %Q.%s SE
13d70 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48  T rootpage=%d WH
13d80 45 52 45 20 23 25 64 20 41 4e 44 20 72 6f 6f 74  ERE #%d AND root
13d90 70 61 67 65 3d 23 25 64 22 2c 0a 20 20 20 20 20  page=#%d",.     
13da0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
13db0 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d  iDb].zDbSName, M
13dc0 41 53 54 45 52 5f 4e 41 4d 45 2c 20 69 54 61 62  ASTER_NAME, iTab
13dd0 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23 65 6e  le, r1, r1);.#en
13de0 64 69 66 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  dif.  sqlite3Rel
13df0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
13e00 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  se, r1);.}../*.*
13e10 2a 20 57 72 69 74 65 20 56 44 42 45 20 63 6f 64  * Write VDBE cod
13e20 65 20 74 6f 20 65 72 61 73 65 20 74 61 62 6c 65  e to erase table
13e30 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20 61 73   pTab and all as
13e40 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63 65 73  sociated indices
13e50 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64   on disk..** Cod
13e60 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  e to update the 
13e70 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
13e80 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72 6e 61  bles and interna
13e90 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e 69 74  l schema definit
13ea0 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20  ions.** in case 
13eb0 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f  a root-page belo
13ec0 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72  nging to another
13ed0 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20   table is moved 
13ee0 62 79 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  by the btree lay
13ef0 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64  er.** is also ad
13f00 64 65 64 20 28 74 68 69 73 20 63 61 6e 20 68 61  ded (this can ha
13f10 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74  ppen with an aut
13f20 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
13f30 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  e)..*/.static vo
13f40 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28  id destroyTable(
13f50 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
13f60 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 2f  able *pTab){.  /
13f70 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
13f80 65 20 6d 61 79 20 62 65 20 61 75 74 6f 2d 76 61  e may be auto-va
13f90 63 75 75 6d 20 63 61 70 61 62 6c 65 20 28 69 66  cuum capable (if
13fa0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
13fb0 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20  OVACUUM.  ** is 
13fc0 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c 20 74 68  not defined), th
13fd0 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61  en it is importa
13fe0 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65  nt to call OP_De
13ff0 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a  stroy on the.  *
14000 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65  * table and inde
14010 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20  x root-pages in 
14020 6f 72 64 65 72 2c 20 73 74 61 72 74 69 6e 67 20  order, starting 
14030 77 69 74 68 20 74 68 65 20 6e 75 6d 65 72 69 63  with the numeric
14040 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65  ally .  ** large
14050 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  st root-page num
14060 62 65 72 2e 20 54 68 69 73 20 67 75 61 72 61 6e  ber. This guaran
14070 74 65 65 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f  tees that none o
14080 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 73  f the root-pages
14090 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 65 73 74  .  ** to be dest
140a0 72 6f 79 65 64 20 69 73 20 72 65 6c 6f 63 61 74  royed is relocat
140b0 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
140c0 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65   OP_Destroy. i.e
140d0 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f  . if the.  ** fo
140e0 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 63 6f 64  llowing were cod
140f0 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50  ed:.  **.  ** OP
14100 5f 44 65 73 74 72 6f 79 20 34 20 30 0a 20 20 2a  _Destroy 4 0.  *
14110 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65  * ....  ** OP_De
14120 73 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20  stroy 5 0.  **. 
14130 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61 67   ** and root pag
14140 65 20 35 20 68 61 70 70 65 6e 65 64 20 74 6f 20  e 5 happened to 
14150 62 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  be the largest r
14160 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20  oot-page number 
14170 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  in the.  ** data
14180 62 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20  base, then root 
14190 70 61 67 65 20 35 20 77 6f 75 6c 64 20 62 65 20  page 5 would be 
141a0 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 20 34 20  moved to page 4 
141b0 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50  by the .  ** "OP
141c0 5f 44 65 73 74 72 6f 79 20 34 20 30 22 20 6f 70  _Destroy 4 0" op
141d0 63 6f 64 65 2e 20 54 68 65 20 73 75 62 73 65 71  code. The subseq
141e0 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f 79  uent "OP_Destroy
141f0 20 35 20 30 22 20 77 6f 75 6c 64 20 68 69 74 0a   5 0" would hit.
14200 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74    ** a free-list
14210 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e   page..  */.  in
14220 74 20 69 54 61 62 20 3d 20 70 54 61 62 2d 3e 74  t iTab = pTab->t
14230 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73 74  num;.  int iDest
14240 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68  royed = 0;..  wh
14250 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 49 6e  ile( 1 ){.    In
14260 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69  dex *pIdx;.    i
14270 6e 74 20 69 4c 61 72 67 65 73 74 20 3d 20 30 3b  nt iLargest = 0;
14280 0a 0a 20 20 20 20 69 66 28 20 69 44 65 73 74 72  ..    if( iDestr
14290 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c  oyed==0 || iTab<
142a0 69 44 65 73 74 72 6f 79 65 64 20 29 7b 0a 20 20  iDestroyed ){.  
142b0 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69      iLargest = i
142c0 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  Tab;.    }.    f
142d0 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
142e0 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
142f0 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
14300 20 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20       int iIdx = 
14310 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20  pIdx->tnum;.    
14320 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
14330 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
14340 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20  Schema );.      
14350 69 66 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d  if( (iDestroyed=
14360 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73  =0 || (iIdx<iDes
14370 74 72 6f 79 65 64 29 29 20 26 26 20 69 49 64 78  troyed)) && iIdx
14380 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20  >iLargest ){.   
14390 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20       iLargest = 
143a0 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iIdx;.      }.  
143b0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72    }.    if( iLar
143c0 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  gest==0 ){.     
143d0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c   return;.    }el
143e0 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44  se{.      int iD
143f0 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
14400 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
14410 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
14420 6d 61 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ma);.      asser
14430 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
14440 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62  <pParse->db->nDb
14450 20 29 3b 0a 20 20 20 20 20 20 64 65 73 74 72 6f   );.      destro
14460 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65  yRootPage(pParse
14470 2c 20 69 4c 61 72 67 65 73 74 2c 20 69 44 62 29  , iLargest, iDb)
14480 3b 0a 20 20 20 20 20 20 69 44 65 73 74 72 6f 79  ;.      iDestroy
14490 65 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20  ed = iLargest;. 
144a0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
144b0 2a 20 52 65 6d 6f 76 65 20 65 6e 74 72 69 65 73  * Remove entries
144c0 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65   from the sqlite
144d0 5f 73 74 61 74 4e 20 74 61 62 6c 65 73 20 28 66  _statN tables (f
144e0 6f 72 20 4e 20 69 6e 20 28 31 2c 32 2c 33 29 29  or N in (1,2,3))
144f0 0a 2a 2a 20 61 66 74 65 72 20 61 20 44 52 4f 50  .** after a DROP
14500 20 49 4e 44 45 58 20 6f 72 20 44 52 4f 50 20 54   INDEX or DROP T
14510 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f  ABLE command..*/
14520 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
14530 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62  ite3ClearStatTab
14540 6c 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  les(.  Parse *pP
14550 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
14560 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
14570 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44  text */.  int iD
14580 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
14590 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
145a0 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 6f 6e   number */.  con
145b0 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20  st char *zType, 
145c0 20 20 20 20 2f 2a 20 22 69 64 78 22 20 6f 72 20      /* "idx" or 
145d0 22 74 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e 73 74  "tbl" */.  const
145e0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20   char *zName    
145f0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 69 6e 64    /* Name of ind
14600 65 78 20 6f 72 20 74 61 62 6c 65 20 2a 2f 0a 29  ex or table */.)
14610 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  {.  int i;.  con
14620 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
14630 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61   = pParse->db->a
14640 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
14650 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d  ;.  for(i=1; i<=
14660 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  4; i++){.    cha
14670 72 20 7a 54 61 62 5b 32 34 5d 3b 0a 20 20 20 20  r zTab[24];.    
14680 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
14690 28 73 69 7a 65 6f 66 28 7a 54 61 62 29 2c 7a 54  (sizeof(zTab),zT
146a0 61 62 2c 22 73 71 6c 69 74 65 5f 73 74 61 74 25  ab,"sqlite_stat%
146b0 64 22 2c 69 29 3b 0a 20 20 20 20 69 66 28 20 73  d",i);.    if( s
146c0 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
146d0 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 54 61 62  pParse->db, zTab
146e0 2c 20 7a 44 62 4e 61 6d 65 29 20 29 7b 0a 20 20  , zDbName) ){.  
146f0 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
14700 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
14710 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
14720 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20  ROM %Q.%s WHERE 
14730 25 73 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20  %s=%Q",.        
14740 7a 44 62 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 7a  zDbName, zTab, z
14750 54 79 70 65 2c 20 7a 4e 61 6d 65 0a 20 20 20 20  Type, zName.    
14760 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d    );.    }.  }.}
14770 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
14780 20 63 6f 64 65 20 74 6f 20 64 72 6f 70 20 61 20   code to drop a 
14790 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
147a0 71 6c 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61  qlite3CodeDropTa
147b0 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
147c0 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
147d0 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 69 73 56  int iDb, int isV
147e0 69 65 77 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  iew){.  Vdbe *v;
147f0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
14800 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 54   pParse->db;.  T
14810 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
14820 3b 0a 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64  ;.  Db *pDb = &d
14830 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20  b->aDb[iDb];..  
14840 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
14850 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  be(pParse);.  as
14860 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
14870 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
14880 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
14890 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66  e, 1, iDb);..#if
148a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
148b0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
148c0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
148d0 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ab) ){.    sqlit
148e0 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
148f0 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 7d 0a  OP_VBegin);.  }.
14900 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f  #endif..  /* Dro
14910 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61  p all triggers a
14920 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
14930 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
14940 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 2a  ropped. Code.  *
14950 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74  * is generated t
14960 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73  o remove entries
14970 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73   from sqlite_mas
14980 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20  ter and/or.  ** 
14990 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
149a0 65 72 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a  er if required..
149b0 20 20 2a 2f 0a 20 20 70 54 72 69 67 67 65 72 20    */.  pTrigger 
149c0 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72  = sqlite3Trigger
149d0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 54 61  List(pParse, pTa
149e0 62 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 54 72  b);.  while( pTr
149f0 69 67 67 65 72 20 29 7b 0a 20 20 20 20 61 73 73  igger ){.    ass
14a00 65 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 70  ert( pTrigger->p
14a10 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
14a20 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20  chema || .      
14a30 20 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68    pTrigger->pSch
14a40 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e  ema==db->aDb[1].
14a50 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73  pSchema );.    s
14a60 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65  qlite3DropTrigge
14a70 72 50 74 72 28 70 50 61 72 73 65 2c 20 70 54 72  rPtr(pParse, pTr
14a80 69 67 67 65 72 29 3b 0a 20 20 20 20 70 54 72 69  igger);.    pTri
14a90 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d  gger = pTrigger-
14aa0 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 23 69 66  >pNext;.  }..#if
14ab0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14ac0 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
14ad0 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65   /* Remove any e
14ae0 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20 73 71  ntries of the sq
14af0 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
14b00 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
14b10 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 74 61 62  ith.  ** the tab
14b20 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
14b30 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62  . This is done b
14b40 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c 65 20  efore the table 
14b50 69 73 20 64 72 6f 70 70 65 64 0a 20 20 2a 2a 20  is dropped.  ** 
14b60 61 74 20 74 68 65 20 62 74 72 65 65 20 6c 65 76  at the btree lev
14b70 65 6c 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20  el, in case the 
14b80 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
14b90 74 61 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20  table needs to. 
14ba0 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65   ** move as a re
14bb0 73 75 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70  sult of the drop
14bc0 20 28 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20   (can happen in 
14bd0 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
14be0 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  )..  */.  if( pT
14bf0 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
14c00 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  F_Autoincrement 
14c10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  ){.    sqlite3Ne
14c20 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
14c30 2c 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 20  ,.      "DELETE 
14c40 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73  FROM %Q.sqlite_s
14c50 65 71 75 65 6e 63 65 20 57 48 45 52 45 20 6e 61  equence WHERE na
14c60 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 70 44  me=%Q",.      pD
14c70 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 70 54 61  b->zDbSName, pTa
14c80 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a  b->zName.    );.
14c90 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
14ca0 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45   Drop all SQLITE
14cb0 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e  _MASTER table an
14cc0 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  d index entries 
14cd0 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68  that refer to th
14ce0 65 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68  e.  ** table. Th
14cf0 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c  e program name l
14d00 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68 65  oops through the
14d10 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e   master table an
14d20 64 20 64 65 6c 65 74 65 73 0a 20 20 2a 2a 20 65  d deletes.  ** e
14d30 76 65 72 79 20 72 6f 77 20 74 68 61 74 20 72 65  very row that re
14d40 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20  fers to a table 
14d50 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  of the same name
14d60 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69 6e   as the one bein
14d70 67 0a 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20  g.  ** dropped. 
14d80 54 72 69 67 67 65 72 73 20 61 72 65 20 68 61 6e  Triggers are han
14d90 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 20  dled separately 
14da0 62 65 63 61 75 73 65 20 61 20 74 72 69 67 67 65  because a trigge
14db0 72 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 63 72  r can be.  ** cr
14dc0 65 61 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d  eated in the tem
14dd0 70 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  p database that 
14de0 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
14df0 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 2a  e in another.  *
14e00 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  * database..  */
14e10 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  .  sqlite3Nested
14e20 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
14e30 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
14e40 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 74 62  M %Q.%s WHERE tb
14e50 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79  l_name=%Q and ty
14e60 70 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a  pe!='trigger'",.
14e70 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e        pDb->zDbSN
14e80 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45  ame, MASTER_NAME
14e90 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
14ea0 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26    if( !isView &&
14eb0 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
14ec0 29 20 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79  ) ){.    destroy
14ed0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
14ee0 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ab);.  }..  /* R
14ef0 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20  emove the table 
14f00 65 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74  entry from SQLit
14f10 65 27 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  e's internal sch
14f20 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20  ema and modify. 
14f30 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 63   ** the schema c
14f40 6f 6f 6b 69 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  ookie..  */.  if
14f50 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
14f60 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
14f70 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
14f80 5f 56 44 65 73 74 72 6f 79 2c 20 69 44 62 2c 20  _VDestroy, iDb, 
14f90 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  0, 0, pTab->zNam
14fa0 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  e, 0);.  }.  sql
14fb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
14fc0 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20  , OP_DropTable, 
14fd0 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d  iDb, 0, 0, pTab-
14fe0 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71  >zName, 0);.  sq
14ff0 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
15000 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
15010 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65    sqliteViewRese
15020 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 7d  tAll(db, iDb);.}
15030 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
15040 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
15050 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66  o do the work of
15060 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74   a DROP TABLE st
15070 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d  atement..** pNam
15080 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
15090 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
150a0 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69   dropped..*/.voi
150b0 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62  d sqlite3DropTab
150c0 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
150d0 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65  , SrcList *pName
150e0 2c 20 69 6e 74 20 69 73 56 69 65 77 2c 20 69 6e  , int isView, in
150f0 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62 6c  t noErr){.  Tabl
15100 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20  e *pTab;.  Vdbe 
15110 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
15120 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
15130 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66    int iDb;..  if
15140 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
15150 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  ed ){.    goto e
15160 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
15170 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
15180 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b  arse->nErr==0 );
15190 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65  .  assert( pName
151a0 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69  ->nSrc==1 );.  i
151b0 66 28 20 73 71 6c 69 74 65 33 52 65 61 64 53 63  f( sqlite3ReadSc
151c0 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67  hema(pParse) ) g
151d0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
151e0 62 6c 65 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72  ble;.  if( noErr
151f0 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45   ) db->suppressE
15200 72 72 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20  rr++;.  assert( 
15210 69 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56  isView==0 || isV
15220 69 65 77 3d 3d 4c 4f 43 41 54 45 5f 56 49 45 57  iew==LOCATE_VIEW
15230 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c   );.  pTab = sql
15240 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49  ite3LocateTableI
15250 74 65 6d 28 70 50 61 72 73 65 2c 20 69 73 56 69  tem(pParse, isVi
15260 65 77 2c 20 26 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ew, &pName->a[0]
15270 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29  );.  if( noErr )
15280 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72   db->suppressErr
15290 2d 2d 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d  --;..  if( pTab=
152a0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f  =0 ){.    if( no
152b0 45 72 72 20 29 20 73 71 6c 69 74 65 33 43 6f 64  Err ) sqlite3Cod
152c0 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65  eVerifyNamedSche
152d0 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  ma(pParse, pName
152e0 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
152f0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
15300 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
15310 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
15320 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
15330 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
15340 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
15350 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
15360 62 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63  b );.  sqlite3Sc
15370 68 65 6d 61 57 72 69 74 61 62 6c 65 28 70 50 61  hemaWritable(pPa
15380 72 73 65 2c 20 69 44 62 29 3b 0a 0a 20 20 2f 2a  rse, iDb);..  /*
15390 20 49 66 20 70 54 61 62 20 69 73 20 61 20 76 69   If pTab is a vi
153a0 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c  rtual table, cal
153b0 6c 20 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  l ViewGetColumnN
153c0 61 6d 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65  ames() to ensure
153d0 0a 20 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74  .  ** it is init
153e0 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
153f0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
15400 61 62 29 20 26 26 20 73 71 6c 69 74 65 33 56 69  ab) && sqlite3Vi
15410 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
15420 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29  (pParse, pTab) )
15430 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
15440 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
15450 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15460 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
15470 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  N.  {.    int co
15480 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  de;.    const ch
15490 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d  ar *zTab = SCHEM
154a0 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20  A_TABLE(iDb);.  
154b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
154c0 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
154d0 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63  .zDbSName;.    c
154e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32  onst char *zArg2
154f0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
15500 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
15510 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
15520 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a  LETE, zTab, 0, z
15530 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  Db)){.      goto
15540 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
15550 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
15560 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
15570 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
15580 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20   && iDb==1 ){.  
15590 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
155a0 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49  ITE_DROP_TEMP_VI
155b0 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EW;.      }else{
155c0 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
155d0 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57  SQLITE_DROP_VIEW
155e0 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
155f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
15600 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d  RTUALTABLE.    }
15610 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75  else if( IsVirtu
15620 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
15630 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
15640 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20  DROP_VTABLE;.   
15650 20 20 20 7a 41 72 67 32 20 3d 20 73 71 6c 69 74     zArg2 = sqlit
15660 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20  e3GetVTable(db, 
15670 70 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61  pTab)->pMod->zNa
15680 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  me;.#endif.    }
15690 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
156a0 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
156b0 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
156c0 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
156d0 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b  DROP_TEMP_TABLE;
156e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
156f0 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
15700 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a  ITE_DROP_TABLE;.
15710 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15720 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
15730 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
15740 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ode, pTab->zName
15750 2c 20 7a 41 72 67 32 2c 20 7a 44 62 29 20 29 7b  , zArg2, zDb) ){
15760 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
15770 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
15780 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
15790 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
157a0 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
157b0 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  E, pTab->zName, 
157c0 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
157d0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
157e0 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  table;.    }.  }
157f0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71  .#endif.  if( sq
15800 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54  lite3StrNICmp(pT
15810 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  ab->zName, "sqli
15820 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20  te_", 7)==0 .   
15830 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
15840 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  Cmp(pTab->zName,
15850 20 22 73 71 6c 69 74 65 5f 73 74 61 74 22 2c 20   "sqlite_stat", 
15860 31 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  11)!=0 ){.    sq
15870 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
15880 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
15890 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70  may not be dropp
158a0 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ed", pTab->zName
158b0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
158c0 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
158d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
158e0 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20  _OMIT_VIEW.  /* 
158f0 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c  Ensure DROP TABL
15900 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e  E is not used on
15910 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f   a view, and DRO
15920 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73  P VIEW is not us
15930 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62  ed.  ** on a tab
15940 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  le..  */.  if( i
15950 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70  sView && pTab->p
15960 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
15970 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
15980 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52  (pParse, "use DR
15990 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65  OP TABLE to dele
159a0 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54  te table %s", pT
159b0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
159c0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
159d0 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  able;.  }.  if( 
159e0 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d  !isView && pTab-
159f0 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
15a00 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15a10 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f  pParse, "use DRO
15a20 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65  P VIEW to delete
15a30 20 76 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d   view %s", pTab-
15a40 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
15a50 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
15a60 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  e;.  }.#endif.. 
15a70 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
15a80 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  e to remove the 
15a90 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d  table from the m
15aa0 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a  aster table.  **
15ab0 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   on disk..  */. 
15ac0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
15ad0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
15ae0 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
15af0 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
15b00 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
15b10 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , iDb);.    if( 
15b20 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20  !isView ){.     
15b30 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61   sqlite3ClearSta
15b40 74 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20  tTables(pParse, 
15b50 69 44 62 2c 20 22 74 62 6c 22 2c 20 70 54 61 62  iDb, "tbl", pTab
15b60 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
15b70 73 71 6c 69 74 65 33 46 6b 44 72 6f 70 54 61 62  sqlite3FkDropTab
15b80 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  le(pParse, pName
15b90 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  , pTab);.    }. 
15ba0 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72     sqlite3CodeDr
15bb0 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  opTable(pParse, 
15bc0 70 54 61 62 2c 20 69 44 62 2c 20 69 73 56 69 65  pTab, iDb, isVie
15bd0 77 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72  w);.  }..exit_dr
15be0 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69  op_table:.  sqli
15bf0 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
15c00 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  (db, pName);.}..
15c10 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
15c20 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
15c30 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72  create a new for
15c40 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20  eign key on the 
15c50 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74  table.** current
15c60 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
15c70 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c  ction.  pFromCol
15c80 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63   determines whic
15c90 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  h columns.** in 
15ca0 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
15cb0 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  e point to the f
15cc0 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20  oreign key.  If 
15cd0 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e  pFromCol==0 then
15ce0 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20  .** connect the 
15cf0 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20  key to the last 
15d00 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e  column inserted.
15d10 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d    pTo is the nam
15d20 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  e of.** the tabl
15d30 65 20 72 65 66 65 72 72 65 64 20 74 6f 20 28 61  e referred to (a
15d40 2e 6b 2e 61 20 74 68 65 20 22 70 61 72 65 6e 74  .k.a the "parent
15d50 22 20 74 61 62 6c 65 29 2e 20 20 70 54 6f 43 6f  " table).  pToCo
15d60 6c 20 69 73 20 61 20 6c 69 73 74 0a 2a 2a 20 6f  l is a list.** o
15d70 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  f tables in the 
15d80 70 61 72 65 6e 74 20 70 54 6f 20 74 61 62 6c 65  parent pTo table
15d90 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e  .  flags contain
15da0 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  s all.** informa
15db0 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63  tion about the c
15dc0 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
15dd0 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70  on algorithms sp
15de0 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68  ecified.** in th
15df0 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20  e ON DELETE, ON 
15e00 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e  UPDATE and ON IN
15e10 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  SERT clauses..**
15e20 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75  .** An FKey stru
15e30 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64  cture is created
15e40 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68   and added to th
15e50 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
15e60 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74  y.** under const
15e70 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ruction in the p
15e80 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
15e90 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   field..**.** Th
15ea0 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73  e foreign key is
15eb0 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41   set for IMMEDIA
15ec0 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  TE processing.  
15ed0 41 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  A subsequent cal
15ee0 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44  l.** to sqlite3D
15ef0 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29  eferForeignKey()
15f00 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
15f10 69 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a  is to DEFERRED..
15f20 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
15f30 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28  reateForeignKey(
15f40 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
15f50 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
15f60 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
15f70 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43  ExprList *pFromC
15f80 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  ol,  /* Columns 
15f90 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68  in this table th
15fa0 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65  at point to othe
15fb0 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b  r table */.  Tok
15fc0 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20  en *pTo,        
15fd0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
15fe0 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
15ff0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43    ExprList *pToC
16000 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ol,    /* Column
16010 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74  s in the other t
16020 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  able */.  int fl
16030 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
16040 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  * Conflict resol
16050 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
16060 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  . */.){.  sqlite
16070 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
16080 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
16090 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
160a0 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  KEY.  FKey *pFKe
160b0 79 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70  y = 0;.  FKey *p
160c0 4e 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20  NextTo;.  Table 
160d0 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  *p = pParse->pNe
160e0 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42  wTable;.  int nB
160f0 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  yte;.  int i;.  
16100 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72  int nCol;.  char
16110 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *z;..  assert( 
16120 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  pTo!=0 );.  if( 
16130 70 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41  p==0 || IN_DECLA
16140 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66  RE_VTAB ) goto f
16150 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72  k_end;.  if( pFr
16160 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  omCol==0 ){.    
16170 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43  int iCol = p->nC
16180 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e 45  ol-1;.    if( NE
16190 56 45 52 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f  VER(iCol<0) ) go
161a0 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69  to fk_end;.    i
161b0 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
161c0 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b  Col->nExpr!=1 ){
161d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
161e0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
161f0 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25  foreign key on %
16200 73 22 0a 20 20 20 20 20 20 20 20 20 22 20 73 68  s".         " sh
16210 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f  ould reference o
16220 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f  nly one column o
16230 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20  f table %T",.   
16240 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43        p->aCol[iC
16250 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b  ol].zName, pTo);
16260 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  .      goto fk_e
16270 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43  nd;.    }.    nC
16280 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  ol = 1;.  }else 
16290 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54  if( pToCol && pT
162a0 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72  oCol->nExpr!=pFr
162b0 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a  omCol->nExpr ){.
162c0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
162d0 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
162e0 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63      "number of c
162f0 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67  olumns in foreig
16300 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d  n key does not m
16310 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20  atch the number 
16320 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f  of ".        "co
16330 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66  lumns in the ref
16340 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b  erenced table");
16350 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  .    goto fk_end
16360 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
16370 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e  Col = pFromCol->
16380 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79  nExpr;.  }.  nBy
16390 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b  te = sizeof(*pFK
163a0 65 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73  ey) + (nCol-1)*s
163b0 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f  izeof(pFKey->aCo
163c0 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b  l[0]) + pTo->n +
163d0 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c   1;.  if( pToCol
163e0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
163f0 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72   i<pToCol->nExpr
16400 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42  ; i++){.      nB
16410 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  yte += sqlite3St
16420 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61  rlen30(pToCol->a
16430 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a  [i].zName) + 1;.
16440 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65      }.  }.  pFKe
16450 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  y = sqlite3DbMal
16460 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
16470 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79  e );.  if( pFKey
16480 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ==0 ){.    goto 
16490 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46  fk_end;.  }.  pF
164a0 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a  Key->pFrom = p;.
164b0 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72    pFKey->pNextFr
164c0 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20  om = p->pFKey;. 
164d0 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b   z = (char*)&pFK
164e0 65 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a  ey->aCol[nCol];.
164f0 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a    pFKey->zTo = z
16500 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d  ;.  if( IN_RENAM
16510 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20  E_OBJECT ){.    
16520 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b  sqlite3RenameTok
16530 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76  enMap(pParse, (v
16540 6f 69 64 2a 29 7a 2c 20 70 54 6f 29 3b 0a 20 20  oid*)z, pTo);.  
16550 7d 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54  }.  memcpy(z, pT
16560 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20  o->z, pTo->n);. 
16570 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a   z[pTo->n] = 0;.
16580 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
16590 28 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d  (z);.  z += pTo-
165a0 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e  >n+1;.  pFKey->n
165b0 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66  Col = nCol;.  if
165c0 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b  ( pFromCol==0 ){
165d0 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c  .    pFKey->aCol
165e0 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e  [0].iFrom = p->n
165f0 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Col-1;.  }else{.
16600 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
16610 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
16620 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
16630 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c  r(j=0; j<p->nCol
16640 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
16650 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
16660 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  mp(p->aCol[j].zN
16670 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61  ame, pFromCol->a
16680 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
16690 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79  .          pFKey
166a0 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20  ->aCol[i].iFrom 
166b0 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = j;.          b
166c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
166d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
166e0 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a  ( j>=p->nCol ){.
166f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
16700 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
16710 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e  .          "unkn
16720 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c  own column \"%s\
16730 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79  " in foreign key
16740 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20   definition", . 
16750 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f           pFromCo
16760 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  l->a[i].zName);.
16770 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f          goto fk_
16780 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
16790 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45     if( IN_RENAME
167a0 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20  _OBJECT ){.     
167b0 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65     sqlite3Rename
167c0 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61 72 73  TokenRemap(pPars
167d0 65 2c 20 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b  e, &pFKey->aCol[
167e0 69 5d 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b  i], pFromCol->a[
167f0 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
16800 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
16810 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20  f( pToCol ){.   
16820 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
16830 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
16840 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t n = sqlite3Str
16850 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b  len30(pToCol->a[
16860 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
16870 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e   pFKey->aCol[i].
16880 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20  zCol = z;.      
16890 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
168a0 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20  JECT ){.        
168b0 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b  sqlite3RenameTok
168c0 65 6e 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20  enRemap(pParse, 
168d0 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  z, pToCol->a[i].
168e0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
168f0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20        memcpy(z, 
16900 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
16910 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b  me, n);.      z[
16920 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20  n] = 0;.      z 
16930 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  += n+1;.    }.  
16940 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  }.  pFKey->isDef
16950 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b  erred = 0;.  pFK
16960 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 20 3d  ey->aAction[0] =
16970 20 28 75 38 29 28 66 6c 61 67 73 20 26 20 30 78   (u8)(flags & 0x
16980 66 66 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ff);            
16990 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20 61 63 74  /* ON DELETE act
169a0 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e  ion */.  pFKey->
169b0 61 41 63 74 69 6f 6e 5b 31 5d 20 3d 20 28 75 38  aAction[1] = (u8
169c0 29 28 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20  )((flags >> 8 ) 
169d0 26 20 30 78 66 66 29 3b 20 20 20 20 2f 2a 20 4f  & 0xff);    /* O
169e0 4e 20 55 50 44 41 54 45 20 61 63 74 69 6f 6e 20  N UPDATE action 
169f0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
16a00 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
16a10 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 2d 3e 70  Held(db, 0, p->p
16a20 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 70 4e 65  Schema) );.  pNe
16a30 78 74 54 6f 20 3d 20 28 46 4b 65 79 20 2a 29 73  xtTo = (FKey *)s
16a40 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
16a50 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6b  (&p->pSchema->fk
16a60 65 79 48 61 73 68 2c 20 0a 20 20 20 20 20 20 70  eyHash, .      p
16a70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 28 76 6f 69 64  FKey->zTo, (void
16a80 20 2a 29 70 46 4b 65 79 0a 20 20 29 3b 0a 20 20   *)pFKey.  );.  
16a90 69 66 28 20 70 4e 65 78 74 54 6f 3d 3d 70 46 4b  if( pNextTo==pFK
16aa0 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
16ab0 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
16ac0 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
16ad0 20 20 7d 0a 20 20 69 66 28 20 70 4e 65 78 74 54    }.  if( pNextT
16ae0 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  o ){.    assert(
16af0 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54   pNextTo->pPrevT
16b00 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 4b 65  o==0 );.    pFKe
16b10 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 4e 65  y->pNextTo = pNe
16b20 78 74 54 6f 3b 0a 20 20 20 20 70 4e 65 78 74 54  xtTo;.    pNextT
16b30 6f 2d 3e 70 50 72 65 76 54 6f 20 3d 20 70 46 4b  o->pPrevTo = pFK
16b40 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69  ey;.  }..  /* Li
16b50 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  nk the foreign k
16b60 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ey to the table 
16b70 61 73 20 74 68 65 20 6c 61 73 74 20 73 74 65 70  as the last step
16b80 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65  ..  */.  p->pFKe
16b90 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b  y = pFKey;.  pFK
16ba0 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a  ey = 0;..fk_end:
16bb0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
16bc0 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a 23 65 6e  (db, pFKey);.#en
16bd0 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
16be0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
16bf0 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71  IGN_KEY) */.  sq
16c00 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
16c10 65 74 65 28 64 62 2c 20 70 46 72 6f 6d 43 6f 6c  ete(db, pFromCol
16c20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
16c30 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
16c40 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ToCol);.}../*.**
16c50 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
16c60 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
16c70 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49  INITIALLY IMMEDI
16c80 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59  ATE or INITIALLY
16c90 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61   DEFERRED.** cla
16ca0 75 73 65 20 69 73 20 73 65 65 6e 20 61 73 20 70  use is seen as p
16cb0 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e  art of a foreign
16cc0 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e   key definition.
16cd0 20 20 54 68 65 20 69 73 44 65 66 65 72 72 65 64    The isDeferred
16ce0 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
16cf0 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   1 for INITIALLY
16d00 20 44 45 46 45 52 52 45 44 20 61 6e 64 20 30 20   DEFERRED and 0 
16d10 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d  for INITIALLY IM
16d20 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20  MEDIATE..** The 
16d30 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20  behavior of the 
16d40 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72  most recently cr
16d50 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65  eated foreign ke
16d60 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a  y is adjusted.**
16d70 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f   accordingly..*/
16d80 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66  .void sqlite3Def
16d90 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72  erForeignKey(Par
16da0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
16db0 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69 66  isDeferred){.#if
16dc0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16dd0 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54  _FOREIGN_KEY.  T
16de0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b  able *pTab;.  FK
16df0 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28  ey *pFKey;.  if(
16e00 20 28 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   (pTab = pParse-
16e10 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c  >pNewTable)==0 |
16e20 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d  | (pFKey = pTab-
16e30 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74  >pFKey)==0 ) ret
16e40 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 69  urn;.  assert( i
16e50 73 44 65 66 65 72 72 65 64 3d 3d 30 20 7c 7c 20  sDeferred==0 || 
16e60 69 73 44 65 66 65 72 72 65 64 3d 3d 31 20 29 3b  isDeferred==1 );
16e70 20 2f 2a 20 45 56 3a 20 52 2d 33 30 33 32 33 2d   /* EV: R-30323-
16e80 32 31 39 31 37 20 2a 2f 0a 20 20 70 46 4b 65 79  21917 */.  pFKey
16e90 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 28  ->isDeferred = (
16ea0 75 38 29 69 73 44 65 66 65 72 72 65 64 3b 0a 23  u8)isDeferred;.#
16eb0 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  endif.}../*.** G
16ec0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
16ed0 74 20 77 69 6c 6c 20 65 72 61 73 65 20 61 6e 64  t will erase and
16ee0 20 72 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70   refill index *p
16ef0 49 64 78 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a  Idx.  This is.**
16f00 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c   used to initial
16f10 69 7a 65 20 61 20 6e 65 77 6c 79 20 63 72 65 61  ize a newly crea
16f20 74 65 64 20 69 6e 64 65 78 20 6f 72 20 74 6f 20  ted index or to 
16f30 72 65 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  recompute the.**
16f40 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69   content of an i
16f50 6e 64 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65  ndex in response
16f60 20 74 6f 20 61 20 52 45 49 4e 44 45 58 20 63 6f   to a REINDEX co
16f70 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20  mmand..**.** if 
16f80 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e  memRootPage is n
16f90 6f 74 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20  ot negative, it 
16fa0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 69  means that the i
16fb0 6e 64 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a  ndex is newly.**
16fc0 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 72   created.  The r
16fd0 65 67 69 73 74 65 72 20 73 70 65 63 69 66 69 65  egister specifie
16fe0 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65  d by memRootPage
16ff0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a   contains the.**
17000 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
17010 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  r of the index. 
17020 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20   If memRootPage 
17030 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
17040 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 61  n.** the index a
17050 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61 6e  lready exists an
17060 64 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72 65  d must be cleare
17070 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72  d before being r
17080 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74  efilled and.** t
17090 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
170a0 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ber of the index
170b0 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70   is taken from p
170c0 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a  Index->tnum..*/.
170d0 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
170e0 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 50  te3RefillIndex(P
170f0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e  arse *pParse, In
17100 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74  dex *pIndex, int
17110 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20   memRootPage){. 
17120 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
17130 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20  Index->pTable;  
17140 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68 61  /* The table tha
17150 74 20 69 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a  t is indexed */.
17160 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61    int iTab = pPa
17170 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20  rse->nTab++;    
17180 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72   /* Btree cursor
17190 20 75 73 65 64 20 66 6f 72 20 70 54 61 62 20 2a   used for pTab *
171a0 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70  /.  int iIdx = p
171b0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
171c0 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73     /* Btree curs
171d0 6f 72 20 75 73 65 64 20 66 6f 72 20 70 49 6e 64  or used for pInd
171e0 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72  ex */.  int iSor
171f0 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
17200 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
17210 20 6f 70 65 6e 65 64 20 62 79 20 4f 70 65 6e 53   opened by OpenS
17220 6f 72 74 65 72 20 28 69 66 20 69 6e 20 75 73 65  orter (if in use
17230 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31  ) */.  int addr1
17240 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17250 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
17260 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20   of top of loop 
17270 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 32 3b 20  */.  int addr2; 
17280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17290 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 74      /* Address t
172a0 6f 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20 6e 65  o jump to for ne
172b0 78 74 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a  xt iteration */.
172c0 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20    int tnum;     
172d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172e0 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
172f0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
17300 69 50 61 72 74 49 64 78 4c 61 62 65 6c 3b 20 20  iPartIdxLabel;  
17310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
17320 6d 70 20 74 6f 20 74 68 69 73 20 6c 61 62 65 6c  mp to this label
17330 20 74 6f 20 73 6b 69 70 20 61 20 72 6f 77 20 2a   to skip a row *
17340 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
17350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17360 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
17370 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69  ode into this vi
17380 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f  rtual machine */
17390 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
173a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
173b0 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72    /* KeyInfo for
173c0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
173d0 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20  regRecord;      
173e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
173f0 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61  gister holding a
17400 73 73 65 6d 62 6c 65 64 20 69 6e 64 65 78 20 72  ssembled index r
17410 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74  ecord */.  sqlit
17420 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
17430 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  >db;      /* The
17440 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
17450 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44  tion */.  int iD
17460 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
17470 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  aToIndex(db, pIn
17480 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a  dex->pSchema);..
17490 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
174a0 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
174b0 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  N.  if( sqlite3A
174c0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
174d0 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c   SQLITE_REINDEX,
174e0 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
174f0 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  0,.      db->aDb
17500 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 29  [iDb].zDbSName )
17510 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
17520 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
17530 20 52 65 71 75 69 72 65 20 61 20 77 72 69 74 65   Require a write
17540 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62  -lock on the tab
17550 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68  le to perform th
17560 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  is operation */.
17570 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
17580 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
17590 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70  pTab->tnum, 1, p
175a0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
175b0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
175c0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
175d0 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
175e0 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61  .  if( memRootPa
175f0 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75  ge>=0 ){.    tnu
17600 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b  m = memRootPage;
17610 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e  .  }else{.    tn
17620 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75  um = pIndex->tnu
17630 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20  m;.  }.  pKey = 
17640 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66  sqlite3KeyInfoOf
17650 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
17660 6e 64 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  ndex);.  assert(
17670 20 70 4b 65 79 21 3d 30 20 7c 7c 20 64 62 2d 3e   pKey!=0 || db->
17680 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
17690 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a  pParse->nErr );.
176a0 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73  .  /* Open the s
176b0 6f 72 74 65 72 20 63 75 72 73 6f 72 20 69 66 20  orter cursor if 
176c0 77 65 20 61 72 65 20 74 6f 20 75 73 65 20 6f 6e  we are to use on
176d0 65 2e 20 2a 2f 0a 20 20 69 53 6f 72 74 65 72 20  e. */.  iSorter 
176e0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
176f0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
17700 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp4(v, OP_Sort
17710 65 72 4f 70 65 6e 2c 20 69 53 6f 72 74 65 72 2c  erOpen, iSorter,
17720 20 30 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79   0, pIndex->nKey
17730 43 6f 6c 2c 20 28 63 68 61 72 2a 29 0a 20 20 20  Col, (char*).   
17740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17750 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52   sqlite3KeyInfoR
17760 65 66 28 70 4b 65 79 29 2c 20 50 34 5f 4b 45 59  ef(pKey), P4_KEY
17770 49 4e 46 4f 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65  INFO);..  /* Ope
17780 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 4c 6f 6f  n the table. Loo
17790 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 72 6f  p through all ro
177a0 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2c  ws of the table,
177b0 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 64 65 78   inserting index
177c0 0a 20 20 2a 2a 20 72 65 63 6f 72 64 73 20 69 6e  .  ** records in
177d0 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a  to the sorter. *
177e0 2f 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54  /.  sqlite3OpenT
177f0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61  able(pParse, iTa
17800 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  b, iDb, pTab, OP
17810 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 61 64  _OpenRead);.  ad
17820 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
17830 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
17840 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 20  wind, iTab, 0); 
17850 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
17860 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73  .  regRecord = s
17870 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
17880 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
17890 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28 70 50  te3MultiWrite(pP
178a0 61 72 73 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65  arse);..  sqlite
178b0 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65  3GenerateIndexKe
178c0 79 28 70 50 61 72 73 65 2c 70 49 6e 64 65 78 2c  y(pParse,pIndex,
178d0 69 54 61 62 2c 72 65 67 52 65 63 6f 72 64 2c 30  iTab,regRecord,0
178e0 2c 26 69 50 61 72 74 49 64 78 4c 61 62 65 6c 2c  ,&iPartIdxLabel,
178f0 30 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  0,0);.  sqlite3V
17900 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17910 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 69 53  SorterInsert, iS
17920 6f 72 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64  orter, regRecord
17930 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f  );.  sqlite3Reso
17940 6c 76 65 50 61 72 74 49 64 78 4c 61 62 65 6c 28  lvePartIdxLabel(
17950 70 50 61 72 73 65 2c 20 69 50 61 72 74 49 64 78  pParse, iPartIdx
17960 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65  Label);.  sqlite
17970 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17980 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  P_Next, iTab, ad
17990 64 72 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65  dr1+1); VdbeCove
179a0 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
179b0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
179c0 2c 20 61 64 64 72 31 29 3b 0a 20 20 69 66 28 20  , addr1);.  if( 
179d0 6d 65 6d 52 6f 6f 74 50 61 67 65 3c 30 20 29 20  memRootPage<0 ) 
179e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
179f0 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74  2(v, OP_Clear, t
17a00 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c  num, iDb);.  sql
17a10 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
17a20 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
17a30 69 49 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c  iIdx, tnum, iDb,
17a40 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
17a50 20 20 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b        (char *)pK
17a60 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  ey, P4_KEYINFO);
17a70 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
17a80 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
17a90 5f 42 55 4c 4b 43 53 52 7c 28 28 6d 65 6d 52 6f  _BULKCSR|((memRo
17aa0 6f 74 50 61 67 65 3e 3d 30 29 3f 4f 50 46 4c 41  otPage>=0)?OPFLA
17ab0 47 5f 50 32 49 53 52 45 47 3a 30 29 29 3b 0a 0a  G_P2ISREG:0));..
17ac0 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
17ad0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17ae0 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 53  P_SorterSort, iS
17af0 6f 72 74 65 72 2c 20 30 29 3b 20 56 64 62 65 43  orter, 0); VdbeC
17b00 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66  overage(v);.  if
17b10 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28  ( IsUniqueIndex(
17b20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69  pIndex) ){.    i
17b30 6e 74 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56  nt j2 = sqlite3V
17b40 64 62 65 47 6f 74 6f 28 76 2c 20 31 29 3b 0a 20  dbeGoto(v, 1);. 
17b50 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74     addr2 = sqlit
17b60 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
17b70 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(v);.    sqlite
17b80 33 56 64 62 65 56 65 72 69 66 79 41 62 6f 72 74  3VdbeVerifyAbort
17b90 61 62 6c 65 28 76 2c 20 4f 45 5f 41 62 6f 72 74  able(v, OE_Abort
17ba0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
17bb0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
17bc0 50 5f 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 2c  P_SorterCompare,
17bd0 20 69 53 6f 72 74 65 72 2c 20 6a 32 2c 20 72 65   iSorter, j2, re
17be0 67 52 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 20  gRecord,.       
17bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c00 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f    pIndex->nKeyCo
17c10 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  l); VdbeCoverage
17c20 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
17c30 55 6e 69 71 75 65 43 6f 6e 73 74 72 61 69 6e 74  UniqueConstraint
17c40 28 70 50 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72  (pParse, OE_Abor
17c50 74 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  t, pIndex);.    
17c60 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
17c70 65 72 65 28 76 2c 20 6a 32 29 3b 0a 20 20 7d 65  ere(v, j2);.  }e
17c80 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 32 20 3d  lse{.    addr2 =
17c90 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
17ca0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 7d 0a  entAddr(v);.  }.
17cb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17cc0 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op3(v, OP_Sorter
17cd0 44 61 74 61 2c 20 69 53 6f 72 74 65 72 2c 20 72  Data, iSorter, r
17ce0 65 67 52 65 63 6f 72 64 2c 20 69 49 64 78 29 3b  egRecord, iIdx);
17cf0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
17d00 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65 65 6b 45  dOp1(v, OP_SeekE
17d10 6e 64 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c  nd, iIdx);.  sql
17d20 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17d30 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
17d40 69 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29  iIdx, regRecord)
17d50 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
17d60 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
17d70 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
17d80 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
17d90 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
17da0 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
17db0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17dc0 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65  2(v, OP_SorterNe
17dd0 78 74 2c 20 69 53 6f 72 74 65 72 2c 20 61 64 64  xt, iSorter, add
17de0 72 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  r2); VdbeCoverag
17df0 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
17e00 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
17e10 64 64 72 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65  ddr1);..  sqlite
17e20 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
17e30 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a  P_Close, iTab);.
17e40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17e50 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
17e60 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65   iIdx);.  sqlite
17e70 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
17e80 50 5f 43 6c 6f 73 65 2c 20 69 53 6f 72 74 65 72  P_Close, iSorter
17e90 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  );.}../*.** Allo
17ea0 63 61 74 65 20 68 65 61 70 20 73 70 61 63 65 20  cate heap space 
17eb0 74 6f 20 68 6f 6c 64 20 61 6e 20 49 6e 64 65 78  to hold an Index
17ec0 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 43 6f   object with nCo
17ed0 6c 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a  l columns..**.**
17ee0 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c   Increase the al
17ef0 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 74 6f  location size to
17f00 20 70 72 6f 76 69 64 65 20 61 6e 20 65 78 74 72   provide an extr
17f10 61 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a  a nExtra bytes.*
17f20 2a 20 6f 66 20 38 2d 62 79 74 65 20 61 6c 69 67  * of 8-byte alig
17f30 6e 65 64 20 73 70 61 63 65 20 61 66 74 65 72 20  ned space after 
17f40 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
17f50 20 61 6e 64 20 72 65 74 75 72 6e 20 61 0a 2a 2a   and return a.**
17f60 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
17f70 20 65 78 74 72 61 20 73 70 61 63 65 20 69 6e 20   extra space in 
17f80 2a 70 70 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e 64  *ppExtra..*/.Ind
17f90 65 78 20 2a 73 71 6c 69 74 65 33 41 6c 6c 6f 63  ex *sqlite3Alloc
17fa0 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 0a  ateIndexObject(.
17fb0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
17fc0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
17fd0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
17fe0 0a 20 20 69 31 36 20 6e 43 6f 6c 2c 20 20 20 20  .  i16 nCol,    
17ff0 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
18000 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
18010 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  ns in the index 
18020 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
18030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
18040 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
18050 65 78 74 72 61 20 73 70 61 63 65 20 74 6f 20 61  extra space to a
18060 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lloc */.  char *
18070 2a 70 70 45 78 74 72 61 20 20 20 20 20 20 20 2f  *ppExtra       /
18080 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
18090 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20 2a   "extra" space *
180a0 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b  /.){.  Index *p;
180b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
180c0 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78 20 6f  llocated index o
180d0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  bject */.  int n
180e0 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
180f0 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63  /* Bytes of spac
18100 65 20 66 6f 72 20 49 6e 64 65 78 20 6f 62 6a 65  e for Index obje
18110 63 74 20 2b 20 61 72 72 61 79 73 20 2a 2f 0a 0a  ct + arrays */..
18120 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
18130 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 20  (sizeof(Index)) 
18140 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  +              /
18150 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  * Index structur
18160 65 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e  */.          
18170 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68  ROUND8(sizeof(ch
18180 61 72 2a 29 2a 6e 43 6f 6c 29 20 2b 20 20 20 20  ar*)*nCol) +    
18190 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a       /* Index.az
181a0 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20  Coll     */.    
181b0 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a        ROUND8(siz
181c0 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f  eof(LogEst)*(nCo
181d0 6c 2b 31 29 20 2b 20 20 20 20 20 2f 2a 20 49 6e  l+1) +     /* In
181e0 64 65 78 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20  dex.aiRowLogEst 
181f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
18200 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 31 36        sizeof(i16
18210 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20  )*nCol +        
18220 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43      /* Index.aiC
18230 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20  olumn   */.     
18240 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
18250 6f 66 28 75 38 29 2a 6e 43 6f 6c 29 3b 20 20 20  of(u8)*nCol);   
18260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
18270 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f  ex.aSortOrder */
18280 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62  .  p = sqlite3Db
18290 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
182a0 42 79 74 65 20 2b 20 6e 45 78 74 72 61 29 3b 0a  Byte + nExtra);.
182b0 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63    if( p ){.    c
182c0 68 61 72 20 2a 70 45 78 74 72 61 20 3d 20 28 28  har *pExtra = ((
182d0 63 68 61 72 2a 29 70 29 2b 52 4f 55 4e 44 38 28  char*)p)+ROUND8(
182e0 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a  sizeof(Index));.
182f0 20 20 20 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d 20      p->azColl = 
18300 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 70 45  (const char**)pE
18310 78 74 72 61 3b 20 70 45 78 74 72 61 20 2b 3d 20  xtra; pExtra += 
18320 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68  ROUND8(sizeof(ch
18330 61 72 2a 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20  ar*)*nCol);.    
18340 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d  p->aiRowLogEst =
18350 20 28 4c 6f 67 45 73 74 2a 29 70 45 78 74 72 61   (LogEst*)pExtra
18360 3b 20 70 45 78 74 72 61 20 2b 3d 20 73 69 7a 65  ; pExtra += size
18370 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c  of(LogEst)*(nCol
18380 2b 31 29 3b 0a 20 20 20 20 70 2d 3e 61 69 43 6f  +1);.    p->aiCo
18390 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29 70 45 78  lumn = (i16*)pEx
183a0 74 72 61 3b 20 20 20 20 20 20 20 70 45 78 74 72  tra;       pExtr
183b0 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36 29  a += sizeof(i16)
183c0 2a 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61 53  *nCol;.    p->aS
183d0 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
183e0 70 45 78 74 72 61 3b 0a 20 20 20 20 70 2d 3e 6e  pExtra;.    p->n
183f0 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a 20  Column = nCol;. 
18400 20 20 20 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20     p->nKeyCol = 
18410 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 2a 70  nCol - 1;.    *p
18420 70 45 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a  pExtra = ((char*
18430 29 70 29 20 2b 20 6e 42 79 74 65 3b 0a 20 20 7d  )p) + nByte;.  }
18440 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
18450 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
18460 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20  ew index for an 
18470 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d  SQL table.  pNam
18480 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68 65  e1.pName2 is the
18490 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
184a0 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c  ex .** and pTblL
184b0 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ist is the name 
184c0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  of the table tha
184d0 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
184e0 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a  ed.  Both will .
184f0 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61  ** be NULL for a
18500 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
18510 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  an index that is
18520 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69   created to sati
18530 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20  sfy a.** UNIQUE 
18540 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20  constraint.  If 
18550 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65  pTable and pInde
18560 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20  x are NULL, use 
18570 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
18580 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c  e.** as the tabl
18590 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  e to be indexed.
185a0 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
185b0 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74  ble is a table t
185c0 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e  hat is.** curren
185d0 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
185e0 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54  ucted by a CREAT
185f0 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
18600 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69  t..**.** pList i
18610 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  s a list of colu
18620 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
18630 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62  d.  pList will b
18640 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a  e NULL if this.*
18650 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b  * is a primary k
18660 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e  ey or unique-con
18670 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d  straint on the m
18680 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d  ost recent colum
18690 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68  n added.** to th
186a0 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
186b0 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
186c0 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20  tion.  .*/.void 
186d0 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
186e0 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
186f0 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20  rse,     /* All 
18700 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
18710 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a  t this parse */.
18720 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
18730 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
18740 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65  rt of index name
18750 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
18760 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
18770 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  ,     /* Second 
18780 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61  part of index na
18790 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  me. May be NULL 
187a0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
187b0 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65  blName, /* Table
187c0 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70   to index. Use p
187d0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
187e0 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c   if 0 */.  ExprL
187f0 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
18800 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   A list of colum
18810 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
18820 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
18830 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41  r,       /* OE_A
18840 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  bort, OE_Ignore,
18850 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20   OE_Replace, or 
18860 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b  OE_None */.  Tok
18870 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20  en *pStart,     
18880 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
18890 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
188a0 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a  this statement *
188b0 2f 0a 20 20 45 78 70 72 20 2a 70 50 49 57 68 65  /.  Expr *pPIWhe
188c0 72 65 2c 20 20 20 20 2f 2a 20 57 48 45 52 45 20  re,    /* WHERE 
188d0 63 6c 61 75 73 65 20 66 6f 72 20 70 61 72 74 69  clause for parti
188e0 61 6c 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  al indices */.  
188f0 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20 20  int sortOrder,  
18900 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72     /* Sort order
18910 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20   of primary key 
18920 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c  when pList==NULL
18930 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45   */.  int ifNotE
18940 78 69 73 74 2c 20 20 20 20 2f 2a 20 4f 6d 69 74  xist,    /* Omit
18950 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78 20   error if index 
18960 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
18970 2f 0a 20 20 75 38 20 69 64 78 54 79 70 65 20 20  /.  u8 idxType  
18980 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
18990 64 65 78 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  dex type */.){. 
189a0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30   Table *pTab = 0
189b0 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74  ;     /* Table t
189c0 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
189d0 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20    Index *pIndex 
189e0 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e  = 0;   /* The in
189f0 64 65 78 20 74 6f 20 62 65 20 63 72 65 61 74 65  dex to be create
18a00 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  d */.  char *zNa
18a10 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e  me = 0;     /* N
18a20 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
18a30 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
18a40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
18a50 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
18a60 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20  rs in zName */. 
18a70 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 44 62 46   int i, j;.  DbF
18a80 69 78 65 72 20 73 46 69 78 3b 20 20 20 20 20 20  ixer sFix;      
18a90 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69    /* For assigni
18aa0 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ng database name
18ab0 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20  s to pTable */. 
18ac0 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d 61   int sortOrderMa
18ad0 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f  sk;   /* 1 to ho
18ae0 6e 6f 72 20 44 45 53 43 20 69 6e 20 69 6e 64 65  nor DESC in inde
18af0 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e  x.  0 to ignore.
18b00 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
18b10 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
18b20 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20    Db *pDb;      
18b30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70         /* The sp
18b40 65 63 69 66 69 63 20 74 61 62 6c 65 20 63 6f 6e  ecific table con
18b50 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65  taining the inde
18b60 78 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  xed database */.
18b70 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
18b80 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
18b90 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
18ba0 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 77 72  that is being wr
18bb0 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  itten */.  Token
18bc0 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20   *pName = 0;    
18bd0 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e  /* Unqualified n
18be0 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
18bf0 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20 20   to create */.  
18c00 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
18c10 69 74 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b  item *pListItem;
18c20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
18c30 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20  over pList */.  
18c40 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 20  int nExtra = 0; 
18c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c60 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61   /* Space alloca
18c70 74 65 64 20 66 6f 72 20 7a 45 78 74 72 61 5b 5d  ted for zExtra[]
18c80 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
18c90 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
18ca0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
18cb0 20 6f 66 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e   of extra column
18cc0 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 63 68  s needed */.  ch
18cd0 61 72 20 2a 7a 45 78 74 72 61 20 3d 20 30 3b 20  ar *zExtra = 0; 
18ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18cf0 2a 20 45 78 74 72 61 20 73 70 61 63 65 20 61 66  * Extra space af
18d00 74 65 72 20 74 68 65 20 49 6e 64 65 78 20 6f 62  ter the Index ob
18d10 6a 65 63 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ject */.  Index 
18d20 2a 70 50 6b 20 3d 20 30 3b 20 20 20 20 20 20 2f  *pPk = 0;      /
18d30 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  * PRIMARY KEY in
18d40 64 65 78 20 66 6f 72 20 57 49 54 48 4f 55 54 20  dex for WITHOUT 
18d50 52 4f 57 49 44 20 74 61 62 6c 65 73 20 2a 2f 0a  ROWID tables */.
18d60 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
18d70 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
18d80 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20  e->nErr>0 ){.   
18d90 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
18da0 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  e_index;.  }.  i
18db0 66 28 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  f( IN_DECLARE_VT
18dc0 41 42 20 26 26 20 69 64 78 54 79 70 65 21 3d 53  AB && idxType!=S
18dd0 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52  QLITE_IDXTYPE_PR
18de0 49 4d 41 52 59 4b 45 59 20 29 7b 0a 20 20 20 20  IMARYKEY ){.    
18df0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
18e00 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66  _index;.  }.  if
18e10 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
18e20 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
18e30 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f  Parse) ){.    go
18e40 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18e50 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  ndex;.  }..  /*.
18e60 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61    ** Find the ta
18e70 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62  ble that is to b
18e80 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75  e indexed.  Retu
18e90 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20  rn early if not 
18ea0 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  found..  */.  if
18eb0 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  ( pTblName!=0 ){
18ec0 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65  ..    /* Use the
18ed0 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20   two-part index 
18ee0 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  name to determin
18ef0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  e the database .
18f00 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68      ** to search
18f10 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20   for the table. 
18f20 27 46 69 78 27 20 74 68 65 20 74 61 62 6c 65 20  'Fix' the table 
18f30 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a  name to this db.
18f40 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f      ** before lo
18f50 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61 62  oking up the tab
18f60 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  le..    */.    a
18f70 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26  ssert( pName1 &&
18f80 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69   pName2 );.    i
18f90 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
18fa0 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
18fb0 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
18fc0 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  &pName);.    if(
18fd0 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78   iDb<0 ) goto ex
18fe0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
18ff0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
19000 6d 65 20 26 26 20 70 4e 61 6d 65 2d 3e 7a 20 29  me && pName->z )
19010 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
19020 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20  E_OMIT_TEMPDB.  
19030 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65    /* If the inde
19040 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61  x name was unqua
19050 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66  lified, check if
19060 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a   the table.    *
19070 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c  * is a temp tabl
19080 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68  e. If so, set th
19090 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e  e database to 1.
190a0 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a   Do not do this.
190b0 20 20 20 20 2a 2a 20 69 66 20 69 6e 69 74 69 61      ** if initia
190c0 6c 69 73 69 6e 67 20 61 20 64 61 74 61 62 61 73  lising a databas
190d0 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f  e schema..    */
190e0 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
190f0 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20  it.busy ){.     
19100 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53   pTab = sqlite3S
19110 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61  rcListLookup(pPa
19120 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a  rse, pTblName);.
19130 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32        if( pName2
19140 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26  ->n==0 && pTab &
19150 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d  & pTab->pSchema=
19160 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68  =db->aDb[1].pSch
19170 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ema ){.        i
19180 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  Db = 1;.      }.
19190 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
191a0 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74    sqlite3FixInit
191b0 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20  (&sFix, pParse, 
191c0 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e  iDb, "index", pN
191d0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 73 71  ame);.    if( sq
191e0 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28  lite3FixSrcList(
191f0 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29  &sFix, pTblName)
19200 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63   ){.      /* Bec
19210 61 75 73 65 20 74 68 65 20 70 61 72 73 65 72 20  ause the parser 
19220 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e  constructs pTblN
19230 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c  ame from a singl
19240 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20  e identifier,.  
19250 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69      ** sqlite3Fi
19260 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76  xSrcList can nev
19270 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20  er fail. */.    
19280 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20    assert(0);.   
19290 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71   }.    pTab = sq
192a0 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
192b0 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20  Item(pParse, 0, 
192c0 26 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 29  &pTblName->a[0])
192d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
192e0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
192f0 30 20 7c 7c 20 70 54 61 62 3d 3d 30 20 29 3b 0a  0 || pTab==0 );.
19300 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
19310 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
19320 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66  te_index;.    if
19330 28 20 69 44 62 3d 3d 31 20 26 26 20 64 62 2d 3e  ( iDb==1 && db->
19340 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
19350 21 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  !=pTab->pSchema 
19360 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
19370 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
19380 20 0a 20 20 20 20 20 20 20 20 20 20 20 22 63 61   .           "ca
19390 6e 6e 6f 74 20 63 72 65 61 74 65 20 61 20 54 45  nnot create a TE
193a0 4d 50 20 69 6e 64 65 78 20 6f 6e 20 6e 6f 6e 2d  MP index on non-
193b0 54 45 4d 50 20 74 61 62 6c 65 20 5c 22 25 73 5c  TEMP table \"%s\
193c0 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  "",.           p
193d0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
193e0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
193f0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
19400 0a 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77  .    if( !HasRow
19410 69 64 28 70 54 61 62 29 20 29 20 70 50 6b 20 3d  id(pTab) ) pPk =
19420 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
19430 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
19440 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
19450 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a  rt( pName==0 );.
19460 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61      assert( pSta
19470 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61  rt==0 );.    pTa
19480 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
19490 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 21  Table;.    if( !
194a0 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74  pTab ) goto exit
194b0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
194c0 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
194d0 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
194e0 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
194f0 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26 64  ;.  }.  pDb = &d
19500 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20  b->aDb[iDb];..  
19510 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
19520 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
19530 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a  rse->nErr==0 );.
19540 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
19550 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d  NICmp(pTab->zNam
19560 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29  e, "sqlite_", 7)
19570 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 64  ==0 .       && d
19580 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 0a  b->init.busy==0.
19590 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  #if SQLITE_USER_
195a0 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20  AUTHENTICATION. 
195b0 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
195c0 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 70 54  UserAuthTable(pT
195d0 61 62 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 0a 23 65  ab->zName)==0.#e
195e0 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
195f0 54 45 5f 41 4c 4c 4f 57 5f 53 51 4c 49 54 45 5f  TE_ALLOW_SQLITE_
19600 4d 41 53 54 45 52 5f 49 4e 44 45 58 0a 20 20 20  MASTER_INDEX.   
19610 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
19620 72 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61  rICmp(&pTab->zNa
19630 6d 65 5b 37 5d 2c 22 6d 61 73 74 65 72 22 29 21  me[7],"master")!
19640 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  =0.#endif.      
19650 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
19660 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65  Cmp(&pTab->zName
19670 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c  [7],"altertab_",
19680 39 29 21 3d 30 0a 20 29 7b 0a 20 20 20 20 73 71  9)!=0. ){.    sq
19690 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
196a0 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
196b0 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
196c0 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ed", pTab->zName
196d0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
196e0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
196f0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
19700 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66  E_OMIT_VIEW.  if
19710 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
19720 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
19730 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
19740 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65  views may not be
19750 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20   indexed");.    
19760 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
19770 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64  _index;.  }.#end
19780 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
19790 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
197a0 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74  BLE.  if( IsVirt
197b0 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
197c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
197d0 28 70 50 61 72 73 65 2c 20 22 76 69 72 74 75 61  (pParse, "virtua
197e0 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  l tables may not
197f0 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20   be indexed");. 
19800 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
19810 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
19820 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  endif..  /*.  **
19830 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f   Find the name o
19840 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61  f the index.  Ma
19850 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
19860 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f   not already ano
19870 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ther.  ** index 
19880 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  or table with th
19890 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20  e same name.  . 
198a0 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69   **.  ** Excepti
198b0 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72  on:  If we are r
198c0 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73  eading the names
198d0 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e   of permanent in
198e0 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20  dices from the. 
198f0 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   ** sqlite_maste
19900 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65  r table (because
19910 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
19920 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20  ess changed the 
19930 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a  schema) and.  **
19940 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65   one of the inde
19950 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73  x names collides
19960 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f   with the name o
19970 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  f a temporary ta
19980 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65  ble or.  ** inde
19990 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  x, then we will 
199a0 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63  continue to proc
199b0 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a  ess this index..
199c0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61    **.  ** If pNa
199d0 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  me==0 it means t
199e0 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20  hat we are.  ** 
199f0 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70  dealing with a p
19a00 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e  rimary key or UN
19a10 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
19a20 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76    We have to inv
19a30 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e  ent our.  ** own
19a40 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   name..  */.  if
19a50 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a  ( pName ){.    z
19a60 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
19a70 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
19a80 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
19a90 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20  zName==0 ) goto 
19aa0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
19ab0 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  x;.    assert( p
19ac0 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  Name->z!=0 );.  
19ad0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
19ae0 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
19af0 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
19b00 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
19b10 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
19b20 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
19b30 20 20 69 66 28 20 21 49 4e 5f 52 45 4e 41 4d 45    if( !IN_RENAME
19b40 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20  _OBJECT ){.     
19b50 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
19b60 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69  usy ){.        i
19b70 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  f( sqlite3FindTa
19b80 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30  ble(db, zName, 0
19b90 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
19ba0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
19bb0 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
19bc0 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61   is already a ta
19bd0 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  ble named %s", z
19be0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
19bf0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
19c00 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 20  e_index;.       
19c10 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
19c20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
19c30 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
19c40 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 21   pDb->zDbSName)!
19c50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
19c60 28 20 21 69 66 4e 6f 74 45 78 69 73 74 20 29 7b  ( !ifNotExist ){
19c70 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
19c80 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
19c90 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72  e, "index %s alr
19ca0 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e  eady exists", zN
19cb0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ame);.        }e
19cc0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
19cd0 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
19ce0 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 20 20 20  .busy );.       
19cf0 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
19d00 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
19d10 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  e, iDb);.       
19d20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20   }.        goto 
19d30 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
19d40 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
19d50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
19d60 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  t n;.    Index *
19d70 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70  pLoop;.    for(p
19d80 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65  Loop=pTab->pInde
19d90 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70  x, n=1; pLoop; p
19da0 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78  Loop=pLoop->pNex
19db0 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e  t, n++){}.    zN
19dc0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
19dd0 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65  intf(db, "sqlite
19de0 5f 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25 64  _autoindex_%s_%d
19df0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
19e00 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  n);.    if( zNam
19e10 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  e==0 ){.      go
19e20 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
19e30 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ndex;.    }..   
19e40 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e   /* Automatic in
19e50 64 65 78 20 6e 61 6d 65 73 20 67 65 6e 65 72 61  dex names genera
19e60 74 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  ted from within 
19e70 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f  sqlite3_declare_
19e80 76 74 61 62 28 29 0a 20 20 20 20 2a 2a 20 6d 75  vtab().    ** mu
19e90 73 74 20 68 61 76 65 20 6e 61 6d 65 73 20 74 68  st have names th
19ea0 61 74 20 61 72 65 20 64 69 73 74 69 6e 63 74 20  at are distinct 
19eb0 66 72 6f 6d 20 6e 6f 72 6d 61 6c 20 61 75 74 6f  from normal auto
19ec0 6d 61 74 69 63 20 69 6e 64 65 78 20 6e 61 6d 65  matic index name
19ed0 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  s..    ** The fo
19ee0 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e  llowing statemen
19ef0 74 20 63 6f 6e 76 65 72 74 73 20 22 73 71 6c 69  t converts "sqli
19f00 74 65 33 5f 61 75 74 6f 69 6e 64 65 78 2e 2e 2e  te3_autoindex...
19f10 22 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 22 73  " into.    ** "s
19f20 71 6c 69 74 65 33 5f 62 75 74 6f 69 6e 64 65 78  qlite3_butoindex
19f30 2e 2e 2e 22 20 69 6e 20 6f 72 64 65 72 20 74 6f  ..." in order to
19f40 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 73 20   make the names 
19f50 64 69 73 74 69 6e 63 74 2e 0a 20 20 20 20 2a 2a  distinct..    **
19f60 20 54 68 65 20 22 76 74 61 62 5f 65 72 72 2e 74   The "vtab_err.t
19f70 65 73 74 22 20 74 65 73 74 20 64 65 6d 6f 6e 73  est" test demons
19f80 74 72 61 74 65 73 20 74 68 65 20 6e 65 65 64 20  trates the need 
19f90 6f 66 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  of this statemen
19fa0 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 4e  t. */.    if( IN
19fb0 5f 53 50 45 43 49 41 4c 5f 50 41 52 53 45 20 29  _SPECIAL_PARSE )
19fc0 20 7a 4e 61 6d 65 5b 37 5d 2b 2b 3b 0a 20 20 7d   zName[7]++;.  }
19fd0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
19fe0 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   authorization t
19ff0 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65  o create an inde
1a000 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  x..  */.#ifndef 
1a010 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
1a020 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  ORIZATION.  if( 
1a030 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43  !IN_RENAME_OBJEC
1a040 54 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  T ){.    const c
1a050 68 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e  har *zDb = pDb->
1a060 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69 66  zDbSName;.    if
1a070 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
1a080 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
1a090 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41  E_INSERT, SCHEMA
1a0a0 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 30 2c 20  _TABLE(iDb), 0, 
1a0b0 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
1a0c0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1a0d0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
1a0e0 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  i = SQLITE_CREAT
1a0f0 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  E_INDEX;.    if(
1a100 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
1a110 20 69 44 62 3d 3d 31 20 29 20 69 20 3d 20 53 51   iDb==1 ) i = SQ
1a120 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
1a130 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
1a140 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
1a150 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d  (pParse, i, zNam
1a160 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
1a170 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
1a180 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1a190 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
1a1a0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
1a1b0 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61  pList==0, it mea
1a1c0 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ns this routine 
1a1d0 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61  was called to ma
1a1e0 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a  ke a primary.  *
1a1f0 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65  * key out of the
1a200 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64   last column add
1a210 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ed to the table 
1a220 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
1a230 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61  on..  ** So crea
1a240 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74  te a fake list t
1a250 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e  o simulate this.
1a260 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73  .  */.  if( pLis
1a270 74 3d 3d 30 20 29 7b 0a 20 20 20 20 54 6f 6b 65  t==0 ){.    Toke
1a280 6e 20 70 72 65 76 43 6f 6c 3b 0a 20 20 20 20 43  n prevCol;.    C
1a290 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 26 70  olumn *pCol = &p
1a2a0 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e  Tab->aCol[pTab->
1a2b0 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 20 20 70 43 6f  nCol-1];.    pCo
1a2c0 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l->colFlags |= C
1a2d0 4f 4c 46 4c 41 47 5f 55 4e 49 51 55 45 3b 0a 20  OLFLAG_UNIQUE;. 
1a2e0 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49     sqlite3TokenI
1a2f0 6e 69 74 28 26 70 72 65 76 43 6f 6c 2c 20 70 43  nit(&prevCol, pC
1a300 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
1a310 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
1a320 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
1a330 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20 20 20  arse, 0,.       
1a340 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1a350 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49  prAlloc(db, TK_I
1a360 44 2c 20 26 70 72 65 76 43 6f 6c 2c 20 30 29 29  D, &prevCol, 0))
1a370 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
1a380 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
1a390 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
1a3a0 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
1a3b0 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20  nExpr==1 );.    
1a3c0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
1a3d0 65 74 53 6f 72 74 4f 72 64 65 72 28 70 4c 69 73  etSortOrder(pLis
1a3e0 74 2c 20 73 6f 72 74 4f 72 64 65 72 29 3b 0a 20  t, sortOrder);. 
1a3f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
1a400 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b  te3ExprListCheck
1a410 4c 65 6e 67 74 68 28 70 50 61 72 73 65 2c 20 70  Length(pParse, p
1a420 4c 69 73 74 2c 20 22 69 6e 64 65 78 22 29 3b 0a  List, "index");.
1a430 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65    }..  /* Figure
1a440 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79   out how many by
1a450 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 72 65  tes of space are
1a460 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
1a470 72 65 20 65 78 70 6c 69 63 69 74 6c 79 0a 20 20  re explicitly.  
1a480 2a 2a 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c  ** specified col
1a490 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1a4a0 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  names..  */.  fo
1a4b0 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
1a4c0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1a4d0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
1a4e0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
1a4f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
1a500 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  xpr!=0 );.    if
1a510 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1a520 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20  COLLATE ){.     
1a530 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20 2b 20   nExtra += (1 + 
1a540 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1a550 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
1a560 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1a570 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74  /* .  ** Allocat
1a580 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75  e the index stru
1a590 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e  cture. .  */.  n
1a5a0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
1a5b0 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
1a5c0 20 6e 45 78 74 72 61 43 6f 6c 20 3d 20 70 50 6b   nExtraCol = pPk
1a5d0 20 3f 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20   ? pPk->nKeyCol 
1a5e0 3a 20 31 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20  : 1;.  pIndex = 
1a5f0 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49  sqlite3AllocateI
1a600 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70  ndexObject(db, p
1a610 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 6e 45  List->nExpr + nE
1a620 78 74 72 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20  xtraCol,.       
1a630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
1a650 4e 61 6d 65 20 2b 20 6e 45 78 74 72 61 20 2b 20  Name + nExtra + 
1a660 31 2c 20 26 7a 45 78 74 72 61 29 3b 0a 20 20 69  1, &zExtra);.  i
1a670 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
1a680 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
1a690 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1a6a0 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  x;.  }.  assert(
1a6b0 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
1a6c0 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 69  NMENT(pIndex->ai
1a6d0 52 6f 77 4c 6f 67 45 73 74 29 20 29 3b 0a 20 20  RowLogEst) );.  
1a6e0 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
1a6f0 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e  TE_ALIGNMENT(pIn
1a700 64 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20 29 3b 0a  dex->azColl) );.
1a710 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20    pIndex->zName 
1a720 3d 20 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74  = zExtra;.  zExt
1a730 72 61 20 2b 3d 20 6e 4e 61 6d 65 20 2b 20 31 3b  ra += nName + 1;
1a740 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e 64 65 78  .  memcpy(pIndex
1a750 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  ->zName, zName, 
1a760 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64  nName+1);.  pInd
1a770 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61  ex->pTable = pTa
1a780 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  b;.  pIndex->onE
1a790 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72 72  rror = (u8)onErr
1a7a0 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 75 6e  or;.  pIndex->un
1a7b0 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72  iqNotNull = onEr
1a7c0 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20  ror!=OE_None;.  
1a7d0 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 20  pIndex->idxType 
1a7e0 3d 20 69 64 78 54 79 70 65 3b 0a 20 20 70 49 6e  = idxType;.  pIn
1a7f0 64 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64  dex->pSchema = d
1a800 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
1a810 65 6d 61 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e  ema;.  pIndex->n
1a820 4b 65 79 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e  KeyCol = pList->
1a830 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 70 50 49  nExpr;.  if( pPI
1a840 57 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c  Where ){.    sql
1a850 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52  ite3ResolveSelfR
1a860 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c  eference(pParse,
1a870 20 70 54 61 62 2c 20 4e 43 5f 50 61 72 74 49 64   pTab, NC_PartId
1a880 78 2c 20 70 50 49 57 68 65 72 65 2c 20 30 29 3b  x, pPIWhere, 0);
1a890 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 50 61  .    pIndex->pPa
1a8a0 72 74 49 64 78 57 68 65 72 65 20 3d 20 70 50 49  rtIdxWhere = pPI
1a8b0 57 68 65 72 65 3b 0a 20 20 20 20 70 50 49 57 68  Where;.    pPIWh
1a8c0 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  ere = 0;.  }.  a
1a8d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
1a8e0 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
1a8f0 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 0a 20 20  , iDb, 0) );..  
1a900 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
1a910 69 66 20 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e  if we should hon
1a920 6f 72 20 44 45 53 43 20 72 65 71 75 65 73 74 73  or DESC requests
1a930 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   on index column
1a940 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 62  s.  */.  if( pDb
1a950 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f  ->pSchema->file_
1a960 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20  format>=4 ){.   
1a970 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d   sortOrderMask =
1a980 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20   -1;   /* Honor 
1a990 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  DESC */.  }else{
1a9a0 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61  .    sortOrderMa
1a9b0 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67  sk = 0;    /* Ig
1a9c0 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d  nore DESC */.  }
1a9d0 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 74  ..  /* Analyze t
1a9e0 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65  he list of expre
1a9f0 73 73 69 6f 6e 73 20 74 68 61 74 20 66 6f 72 6d  ssions that form
1aa00 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68   the terms of th
1aa10 65 20 69 6e 64 65 78 20 61 6e 64 0a 20 20 2a 2a  e index and.  **
1aa20 20 72 65 70 6f 72 74 20 61 6e 79 20 65 72 72 6f   report any erro
1aa30 72 73 2e 20 20 49 6e 20 74 68 65 20 63 6f 6d 6d  rs.  In the comm
1aa40 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
1aa50 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1aa60 65 78 61 63 74 6c 79 0a 20 20 2a 2a 20 61 20 74  exactly.  ** a t
1aa70 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 73 74 6f  able column, sto
1aa80 72 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69  re that column i
1aa90 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 20 20 46  n aiColumn[].  F
1aaa0 6f 72 20 67 65 6e 65 72 61 6c 20 65 78 70 72 65  or general expre
1aab0 73 73 69 6f 6e 73 2c 0a 20 20 2a 2a 20 70 6f 70  ssions,.  ** pop
1aac0 75 6c 61 74 65 20 70 49 6e 64 65 78 2d 3e 61 43  ulate pIndex->aC
1aad0 6f 6c 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65  olExpr and store
1aae0 20 58 4e 5f 45 58 50 52 20 28 2d 32 29 20 69 6e   XN_EXPR (-2) in
1aaf0 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 0a 20 20 2a   aiColumn[]..  *
1ab00 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73  *.  ** TODO: Iss
1ab10 75 65 20 61 20 77 61 72 6e 69 6e 67 20 69 66 20  ue a warning if 
1ab20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75  two or more colu
1ab30 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
1ab40 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 0a   are identical..
1ab50 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75 65    ** TODO: Issue
1ab60 20 61 20 77 61 72 6e 69 6e 67 20 69 66 20 74 68   a warning if th
1ab70 65 20 74 61 62 6c 65 20 70 72 69 6d 61 72 79 20  e table primary 
1ab80 6b 65 79 20 69 73 20 75 73 65 64 20 61 73 20 70  key is used as p
1ab90 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  art of the.  ** 
1aba0 69 6e 64 65 78 20 6b 65 79 2e 0a 20 20 2a 2f 0a  index key..  */.
1abb0 20 20 70 4c 69 73 74 49 74 65 6d 20 3d 20 70 4c    pListItem = pL
1abc0 69 73 74 2d 3e 61 3b 0a 20 20 69 66 28 20 49 4e  ist->a;.  if( IN
1abd0 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29  _RENAME_OBJECT )
1abe0 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 43  {.    pIndex->aC
1abf0 6f 6c 45 78 70 72 20 3d 20 70 4c 69 73 74 3b 0a  olExpr = pList;.
1ac00 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20      pList = 0;. 
1ac10 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
1ac20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  pIndex->nKeyCol;
1ac30 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b   i++, pListItem+
1ac40 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 43  +){.    Expr *pC
1ac50 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
1ac60 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d         /* The i-
1ac70 74 68 20 69 6e 64 65 78 20 65 78 70 72 65 73 73  th index express
1ac80 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  ion */.    int r
1ac90 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65  equestedSortOrde
1aca0 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 53 43  r;        /* ASC
1acb0 20 6f 72 20 44 45 53 43 20 6f 6e 20 74 68 65 20   or DESC on the 
1acc0 69 2d 74 68 20 65 78 70 72 65 73 73 69 6f 6e 20  i-th expression 
1acd0 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
1ace0 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20  r *zColl;       
1acf0 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
1ad00 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
1ad10 20 2a 2f 0a 0a 20 20 20 20 73 71 6c 69 74 65 33   */..    sqlite3
1ad20 53 74 72 69 6e 67 54 6f 49 64 28 70 4c 69 73 74  StringToId(pList
1ad30 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
1ad40 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
1ad50 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50  SelfReference(pP
1ad60 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f 49  arse, pTab, NC_I
1ad70 64 78 45 78 70 72 2c 20 70 4c 69 73 74 49 74 65  dxExpr, pListIte
1ad80 6d 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  m->pExpr, 0);.  
1ad90 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
1ada0 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  rr ) goto exit_c
1adb0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
1adc0 20 70 43 45 78 70 72 20 3d 20 73 71 6c 69 74 65   pCExpr = sqlite
1add0 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
1ade0 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70  (pListItem->pExp
1adf0 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 45 78  r);.    if( pCEx
1ae00 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
1ae10 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  N ){.      if( p
1ae20 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65  Tab==pParse->pNe
1ae30 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  wTable ){.      
1ae40 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1ae50 67 28 70 50 61 72 73 65 2c 20 22 65 78 70 72 65  g(pParse, "expre
1ae60 73 73 69 6f 6e 73 20 70 72 6f 68 69 62 69 74 65  ssions prohibite
1ae70 64 20 69 6e 20 50 52 49 4d 41 52 59 20 4b 45 59  d in PRIMARY KEY
1ae80 20 61 6e 64 20 22 0a 20 20 20 20 20 20 20 20 20   and ".         
1ae90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aea0 20 20 20 20 20 20 20 22 55 4e 49 51 55 45 20 63         "UNIQUE c
1aeb0 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a 20 20  onstraints");.  
1aec0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1aed0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1aee0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1aef0 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72  pIndex->aColExpr
1af00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
1af10 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20  Index->aColExpr 
1af20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  = pList;.       
1af30 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20   pList = 0;.    
1af40 20 20 7d 0a 20 20 20 20 20 20 6a 20 3d 20 58 4e    }.      j = XN
1af50 5f 45 58 50 52 3b 0a 20 20 20 20 20 20 70 49 6e  _EXPR;.      pIn
1af60 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
1af70 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20   = XN_EXPR;.    
1af80 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f    pIndex->uniqNo
1af90 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d  tNull = 0;.    }
1afa0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 20 3d 20  else{.      j = 
1afb0 70 43 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b  pCExpr->iColumn;
1afc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
1afd0 3c 3d 30 78 37 66 66 66 20 29 3b 0a 20 20 20 20  <=0x7fff );.    
1afe0 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20 20    if( j<0 ){.   
1aff0 20 20 20 20 20 6a 20 3d 20 70 54 61 62 2d 3e 69       j = pTab->i
1b000 50 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73  PKey;.      }els
1b010 65 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c  e if( pTab->aCol
1b020 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29  [j].notNull==0 )
1b030 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  {.        pIndex
1b040 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20  ->uniqNotNull = 
1b050 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1b060 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
1b070 6e 5b 69 5d 20 3d 20 28 69 31 36 29 6a 3b 0a 20  n[i] = (i16)j;. 
1b080 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d     }.    zColl =
1b090 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   0;.    if( pLis
1b0a0 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70  tItem->pExpr->op
1b0b0 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a  ==TK_COLLATE ){.
1b0c0 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b        int nColl;
1b0d0 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70  .      zColl = p
1b0e0 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d  ListItem->pExpr-
1b0f0 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
1b100 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   nColl = sqlite3
1b110 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 20  Strlen30(zColl) 
1b120 2b 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  + 1;.      asser
1b130 74 28 20 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c 6c  t( nExtra>=nColl
1b140 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
1b150 28 7a 45 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c 20  (zExtra, zColl, 
1b160 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7a 43  nColl);.      zC
1b170 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20  oll = zExtra;.  
1b180 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 43      zExtra += nC
1b190 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  oll;.      nExtr
1b1a0 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20  a -= nColl;.    
1b1b0 7d 65 6c 73 65 20 69 66 28 20 6a 3e 3d 30 20 29  }else if( j>=0 )
1b1c0 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  {.      zColl = 
1b1d0 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43  pTab->aCol[j].zC
1b1e0 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  oll;.    }.    i
1b1f0 66 28 20 21 7a 43 6f 6c 6c 20 29 20 7a 43 6f 6c  f( !zColl ) zCol
1b200 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49  l = sqlite3StrBI
1b210 4e 41 52 59 3b 0a 20 20 20 20 69 66 28 20 21 64  NARY;.    if( !d
1b220 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
1b230 21 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f  !sqlite3LocateCo
1b240 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43  llSeq(pParse, zC
1b250 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  oll) ){.      go
1b260 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1b270 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
1b280 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
1b290 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72  ] = zColl;.    r
1b2a0 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65  equestedSortOrde
1b2b0 72 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73  r = pListItem->s
1b2c0 6f 72 74 4f 72 64 65 72 20 26 20 73 6f 72 74 4f  ortOrder & sortO
1b2d0 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49  rderMask;.    pI
1b2e0 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
1b2f0 5b 69 5d 20 3d 20 28 75 38 29 72 65 71 75 65 73  [i] = (u8)reques
1b300 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  tedSortOrder;.  
1b310 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74  }..  /* Append t
1b320 68 65 20 74 61 62 6c 65 20 6b 65 79 20 74 6f 20  he table key to 
1b330 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
1b340 6e 64 65 78 2e 20 20 46 6f 72 20 57 49 54 48 4f  ndex.  For WITHO
1b350 55 54 20 52 4f 57 49 44 0a 20 20 2a 2a 20 74 61  UT ROWID.  ** ta
1b360 62 6c 65 73 20 28 77 68 65 6e 20 70 50 6b 21 3d  bles (when pPk!=
1b370 30 29 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20  0) this will be 
1b380 74 68 65 20 64 65 63 6c 61 72 65 64 20 50 52 49  the declared PRI
1b390 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f 72 0a 20  MARY KEY.  For. 
1b3a0 20 2a 2a 20 6e 6f 72 6d 61 6c 20 74 61 62 6c 65   ** normal table
1b3b0 73 20 28 77 68 65 6e 20 70 50 6b 3d 3d 30 29 20  s (when pPk==0) 
1b3c0 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65  this will be the
1b3d0 20 72 6f 77 69 64 2e 0a 20 20 2a 2f 0a 20 20 69   rowid..  */.  i
1b3e0 66 28 20 70 50 6b 20 29 7b 0a 20 20 20 20 66 6f  f( pPk ){.    fo
1b3f0 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b  r(j=0; j<pPk->nK
1b400 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  eyCol; j++){.   
1b410 20 20 20 69 6e 74 20 78 20 3d 20 70 50 6b 2d 3e     int x = pPk->
1b420 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
1b430 20 20 20 61 73 73 65 72 74 28 20 78 3e 3d 30 20     assert( x>=0 
1b440 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 61 73  );.      if( has
1b450 43 6f 6c 75 6d 6e 28 70 49 6e 64 65 78 2d 3e 61  Column(pIndex->a
1b460 69 43 6f 6c 75 6d 6e 2c 20 70 49 6e 64 65 78 2d  iColumn, pIndex-
1b470 3e 6e 4b 65 79 43 6f 6c 2c 20 78 29 20 29 7b 0a  >nKeyCol, x) ){.
1b480 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
1b490 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20 20 20 20  nColumn--; .    
1b4a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b4b0 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
1b4c0 6e 5b 69 5d 20 3d 20 78 3b 0a 20 20 20 20 20 20  n[i] = x;.      
1b4d0 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c    pIndex->azColl
1b4e0 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c  [i] = pPk->azCol
1b4f0 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 49  l[j];.        pI
1b500 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
1b510 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 53 6f 72 74  [i] = pPk->aSort
1b520 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20  Order[j];.      
1b530 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    i++;.      }. 
1b540 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1b550 20 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c   i==pIndex->nCol
1b560 75 6d 6e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  umn );.  }else{.
1b570 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
1b580 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 52 4f 57  lumn[i] = XN_ROW
1b590 49 44 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  ID;.    pIndex->
1b5a0 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69  azColl[i] = sqli
1b5b0 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20  te3StrBINARY;.  
1b5c0 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 66 61 75  }.  sqlite3Defau
1b5d0 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65 78 29  ltRowEst(pIndex)
1b5e0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1b5f0 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 20 65  pNewTable==0 ) e
1b600 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74  stimateIndexWidt
1b610 68 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a  h(pIndex);..  /*
1b620 20 49 66 20 74 68 69 73 20 69 6e 64 65 78 20 63   If this index c
1b630 6f 6e 74 61 69 6e 73 20 65 76 65 72 79 20 63 6f  ontains every co
1b640 6c 75 6d 6e 20 6f 66 20 69 74 73 20 74 61 62 6c  lumn of its tabl
1b650 65 2c 20 74 68 65 6e 20 6d 61 72 6b 0a 20 20 2a  e, then mark.  *
1b660 2a 20 69 74 20 61 73 20 61 20 63 6f 76 65 72 69  * it as a coveri
1b670 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 61 73  ng index */.  as
1b680 73 65 72 74 28 20 48 61 73 52 6f 77 69 64 28 70  sert( HasRowid(p
1b690 54 61 62 29 20 0a 20 20 20 20 20 20 7c 7c 20 70  Tab) .      || p
1b6a0 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20  Tab->iPKey<0 || 
1b6b0 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49  sqlite3ColumnOfI
1b6c0 6e 64 65 78 28 70 49 6e 64 65 78 2c 20 70 54 61  ndex(pIndex, pTa
1b6d0 62 2d 3e 69 50 4b 65 79 29 3e 3d 30 20 29 3b 0a  b->iPKey)>=0 );.
1b6e0 20 20 72 65 63 6f 6d 70 75 74 65 43 6f 6c 75 6d    recomputeColum
1b6f0 6e 73 4e 6f 74 49 6e 64 65 78 65 64 28 70 49 6e  nsNotIndexed(pIn
1b700 64 65 78 29 3b 0a 20 20 69 66 28 20 70 54 62 6c  dex);.  if( pTbl
1b710 4e 61 6d 65 21 3d 30 20 26 26 20 70 49 6e 64 65  Name!=0 && pInde
1b720 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 54 61 62  x->nColumn>=pTab
1b730 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 70 49  ->nCol ){.    pI
1b740 6e 64 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67  ndex->isCovering
1b750 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 6a 3d   = 1;.    for(j=
1b760 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
1b770 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
1b780 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20   j==pTab->iPKey 
1b790 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1b7a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6c    if( sqlite3Col
1b7b0 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 6e 64 65  umnOfIndex(pInde
1b7c0 78 2c 6a 29 3e 3d 30 20 29 20 63 6f 6e 74 69 6e  x,j)>=0 ) contin
1b7d0 75 65 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78  ue;.      pIndex
1b7e0 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 30  ->isCovering = 0
1b7f0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1b800 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1b810 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e  pTab==pParse->pN
1b820 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f  ewTable ){.    /
1b830 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
1b840 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74  as been called t
1b850 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f  o create an auto
1b860 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73 20 61  matic index as a
1b870 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f  .    ** result o
1b880 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  f a PRIMARY KEY 
1b890 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65  or UNIQUE clause
1b8a0 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66   on a column def
1b8b0 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20  inition, or.    
1b8c0 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  ** a PRIMARY KEY
1b8d0 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73   or UNIQUE claus
1b8e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  e following the 
1b8f0 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f  column definitio
1b900 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20  ns..    ** i.e. 
1b910 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  one of:.    **. 
1b920 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42     ** CREATE TAB
1b930 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b  LE t(x PRIMARY K
1b940 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43  EY, y);.    ** C
1b950 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c  REATE TABLE t(x,
1b960 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29   y, UNIQUE(x, y)
1b970 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
1b980 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 68 65   Either way, che
1b990 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
1b9a0 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68   table already h
1b9b0 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78  as such an index
1b9c0 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20  . If.    ** so, 
1b9d0 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65  don't bother cre
1b9e0 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20  ating this one. 
1b9f0 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65  This only applie
1ba00 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f  s to.    ** auto
1ba10 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65  matically create
1ba20 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73  d indices. Users
1ba30 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20   can do as they 
1ba40 77 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a  wish with.    **
1ba50 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65   explicit indice
1ba60 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s..    **.    **
1ba70 20 54 77 6f 20 55 4e 49 51 55 45 20 6f 72 20 50   Two UNIQUE or P
1ba80 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
1ba90 72 61 69 6e 74 73 20 61 72 65 20 63 6f 6e 73 69  raints are consi
1baa0 64 65 72 65 64 20 65 71 75 69 76 61 6c 65 6e 74  dered equivalent
1bab0 0a 20 20 20 20 2a 2a 20 28 61 6e 64 20 74 68 75  .    ** (and thu
1bac0 73 20 73 75 70 70 72 65 73 73 69 6e 67 20 74 68  s suppressing th
1bad0 65 20 73 65 63 6f 6e 64 20 6f 6e 65 29 20 65 76  e second one) ev
1bae0 65 6e 20 69 66 20 74 68 65 79 20 68 61 76 65 20  en if they have 
1baf0 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20 2a 2a  different.    **
1bb00 20 73 6f 72 74 20 6f 72 64 65 72 73 2e 0a 20 20   sort orders..  
1bb10 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
1bb20 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65  here are differe
1bb30 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  nt collating seq
1bb40 75 65 6e 63 65 73 20 6f 72 20 69 66 20 74 68 65  uences or if the
1bb50 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20   columns of.    
1bb60 2a 2a 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  ** the constrain
1bb70 74 20 6f 63 63 75 72 20 69 6e 20 64 69 66 66 65  t occur in diffe
1bb80 72 65 6e 74 20 6f 72 64 65 72 73 2c 20 74 68 65  rent orders, the
1bb90 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  n the constraint
1bba0 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 63 6f 6e  s are.    ** con
1bbb0 73 69 64 65 72 65 64 20 64 69 73 74 69 6e 63 74  sidered distinct
1bbc0 20 61 6e 64 20 62 6f 74 68 20 72 65 73 75 6c 74   and both result
1bbd0 20 69 6e 20 73 65 70 61 72 61 74 65 20 69 6e 64   in separate ind
1bbe0 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ices..    */.   
1bbf0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
1bc00 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
1bc10 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
1bc20 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
1bc30 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20  {.      int k;. 
1bc40 20 20 20 20 20 61 73 73 65 72 74 28 20 49 73 55       assert( IsU
1bc50 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29  niqueIndex(pIdx)
1bc60 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1bc70 28 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65 21  ( pIdx->idxType!
1bc80 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f  =SQLITE_IDXTYPE_
1bc90 41 50 50 44 45 46 20 29 3b 0a 20 20 20 20 20 20  APPDEF );.      
1bca0 61 73 73 65 72 74 28 20 49 73 55 6e 69 71 75 65  assert( IsUnique
1bcb0 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20 29 3b  Index(pIndex) );
1bcc0 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ..      if( pIdx
1bcd0 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e 64 65  ->nKeyCol!=pInde
1bce0 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e  x->nKeyCol ) con
1bcf0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72  tinue;.      for
1bd00 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 4b  (k=0; k<pIdx->nK
1bd10 65 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20  eyCol; k++){.   
1bd20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1bd30 2a 7a 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  *z1;.        con
1bd40 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 20  st char *z2;.   
1bd50 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
1bd60 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 3e 3d  x->aiColumn[k]>=
1bd70 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
1bd80 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
1bd90 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f  k]!=pIndex->aiCo
1bda0 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b  lumn[k] ) break;
1bdb0 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 49  .        z1 = pI
1bdc0 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20  dx->azColl[k];. 
1bdd0 20 20 20 20 20 20 20 7a 32 20 3d 20 70 49 6e 64         z2 = pInd
1bde0 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20  ex->azColl[k];. 
1bdf0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1be00 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32  e3StrICmp(z1, z2
1be10 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ) ) break;.     
1be20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d   }.      if( k==
1be30 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b  pIdx->nKeyCol ){
1be40 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
1be50 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64  x->onError!=pInd
1be60 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20  ex->onError ){. 
1be70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
1be80 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61   constraint crea
1be90 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64  tes the same ind
1bea0 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75 73  ex as a previous
1beb0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
1bec0 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66 69  nstraint specifi
1bed0 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20  ed somewhere in 
1bee0 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
1bef0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
1bf00 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72        ** However
1bf10 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54   the ON CONFLICT
1bf20 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69 66   clauses are dif
1bf30 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20  ferent. If both 
1bf40 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20  this .          
1bf50 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e  ** constraint an
1bf60 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  d the previous e
1bf70 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72  quivalent constr
1bf80 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63  aint have explic
1bf90 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  it.          ** 
1bfa0 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
1bfb0 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20 65  ses this is an e
1bfc0 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c  rror. Otherwise,
1bfd0 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 20   use the.       
1bfe0 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79     ** explicitly
1bff0 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61 76   specified behav
1c000 69 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65  ior for the inde
1c010 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  x..          */.
1c020 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28            if( !(
1c030 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
1c040 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e  E_Default || pIn
1c050 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  dex->onError==OE
1c060 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20  _Default) ){.   
1c070 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1c080 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1c090 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1c0a0 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f    "conflicting O
1c0b0 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
1c0c0 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30  es specified", 0
1c0d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1c0e0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
1c0f0 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
1c100 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
1c110 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72        pIdx->onEr
1c120 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e  ror = pIndex->on
1c130 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  Error;.         
1c140 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1c150 20 20 20 20 20 69 66 28 20 69 64 78 54 79 70 65       if( idxType
1c160 3d 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  ==SQLITE_IDXTYPE
1c170 5f 50 52 49 4d 41 52 59 4b 45 59 20 29 20 70 49  _PRIMARYKEY ) pI
1c180 64 78 2d 3e 69 64 78 54 79 70 65 20 3d 20 69 64  dx->idxType = id
1c190 78 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 67  xType;.        g
1c1a0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1c1b0 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
1c1c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1c1d0 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43  !IN_RENAME_OBJEC
1c1e0 54 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e  T ){..    /* Lin
1c1f0 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20  k the new Index 
1c200 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73  structure to its
1c210 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68   table and to th
1c220 65 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 69  e other.    ** i
1c230 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1c240 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20  e structures. . 
1c250 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
1c260 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
1c270 30 20 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  0 );.    if( db-
1c280 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
1c290 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
1c2a0 20 20 20 20 61 73 73 65 72 74 28 20 21 49 4e 5f      assert( !IN_
1c2b0 53 50 45 43 49 41 4c 5f 50 41 52 53 45 20 29 3b  SPECIAL_PARSE );
1c2c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
1c2d0 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
1c2e0 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e  xHeld(db, 0, pIn
1c2f0 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b  dex->pSchema) );
1c300 0a 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69 74  .      p = sqlit
1c310 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 49  e3HashInsert(&pI
1c320 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69  ndex->pSchema->i
1c330 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20  dxHash, .       
1c340 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
1c350 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20  , pIndex);.     
1c360 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
1c370 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e    assert( p==pIn
1c380 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  dex );  /* Mallo
1c390 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
1c3a0 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  ed */.        sq
1c3b0 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
1c3c0 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
1c3d0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1c3e0 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  x;.      }.     
1c3f0 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d   db->mDbFlags |=
1c400 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68   DBFLAG_SchemaCh
1c410 61 6e 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20  ange;.      if( 
1c420 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20  pTblName!=0 ){. 
1c430 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74         pIndex->t
1c440 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e  num = db->init.n
1c450 65 77 54 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  ewTnum;.      }.
1c460 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1c470 20 74 68 69 73 20 69 73 20 74 68 65 20 69 6e 69   this is the ini
1c480 74 69 61 6c 20 43 52 45 41 54 45 20 49 4e 44 45  tial CREATE INDE
1c490 58 20 73 74 61 74 65 6d 65 6e 74 20 28 6f 72 20  X statement (or 
1c4a0 43 52 45 41 54 45 20 54 41 42 4c 45 20 69 66 20  CREATE TABLE if 
1c4b0 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78  the.    ** index
1c4c0 20 69 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 69   is an implied i
1c4d0 6e 64 65 78 20 66 6f 72 20 61 20 55 4e 49 51 55  ndex for a UNIQU
1c4e0 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59  E or PRIMARY KEY
1c4f0 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 74 68 65   constraint) the
1c500 6e 0a 20 20 20 20 2a 2a 20 65 6d 69 74 20 63 6f  n.    ** emit co
1c510 64 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74  de to allocate t
1c520 68 65 20 69 6e 64 65 78 20 72 6f 6f 74 70 61 67  he index rootpag
1c530 65 20 6f 6e 20 64 69 73 6b 20 61 6e 64 20 6d 61  e on disk and ma
1c540 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 0a  ke an entry for.
1c550 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78      ** the index
1c560 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   in the sqlite_m
1c570 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
1c580 70 6f 70 75 6c 61 74 65 20 74 68 65 20 69 6e 64  populate the ind
1c590 65 78 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 63  ex with.    ** c
1c5a0 6f 6e 74 65 6e 74 2e 20 20 42 75 74 2c 20 64 6f  ontent.  But, do
1c5b0 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 69 66 20   not do this if 
1c5c0 77 65 20 61 72 65 20 73 69 6d 70 6c 79 20 72 65  we are simply re
1c5d0 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  ading the sqlite
1c5e0 5f 6d 61 73 74 65 72 0a 20 20 20 20 2a 2a 20 74  _master.    ** t
1c5f0 61 62 6c 65 20 74 6f 20 70 61 72 73 65 20 74 68  able to parse th
1c600 65 20 73 63 68 65 6d 61 2c 20 6f 72 20 69 66 20  e schema, or if 
1c610 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 74 68  this index is th
1c620 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  e PRIMARY KEY in
1c630 64 65 78 0a 20 20 20 20 2a 2a 20 6f 66 20 61 20  dex.    ** of a 
1c640 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
1c650 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ble..    **.    
1c660 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d  ** If pTblName==
1c670 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  0 it means this 
1c680 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61 74  index is generat
1c690 65 64 20 61 73 20 61 6e 20 69 6d 70 6c 69 65 64  ed as an implied
1c6a0 20 50 52 49 4d 41 52 59 20 4b 45 59 0a 20 20 20   PRIMARY KEY.   
1c6b0 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 69 6e   ** or UNIQUE in
1c6c0 64 65 78 20 69 6e 20 61 20 43 52 45 41 54 45 20  dex in a CREATE 
1c6d0 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
1c6e0 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c    Since the tabl
1c6f0 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6a 75 73  e.    ** has jus
1c700 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20  t been created, 
1c710 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64  it contains no d
1c720 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ata and the inde
1c730 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  x initialization
1c740 0a 20 20 20 20 2a 2a 20 73 74 65 70 20 63 61 6e  .    ** step can
1c750 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 20   be skipped..   
1c760 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28   */.    else if(
1c770 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
1c780 7c 7c 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  || pTblName!=0 )
1c790 7b 0a 20 20 20 20 20 20 56 64 62 65 20 2a 76 3b  {.      Vdbe *v;
1c7a0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 74  .      char *zSt
1c7b0 6d 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d  mt;.      int iM
1c7c0 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
1c7d0 4d 65 6d 3b 0a 0a 20 20 20 20 20 20 76 20 3d 20  Mem;..      v = 
1c7e0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1c7f0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66  Parse);.      if
1c800 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ( v==0 ) goto ex
1c810 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1c820 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ..      sqlite3B
1c830 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
1c840 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
1c850 62 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72  b);..      /* Cr
1c860 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67  eate the rootpag
1c870 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20  e for the index 
1c880 75 73 69 6e 67 20 43 72 65 61 74 65 49 6e 64 65  using CreateInde
1c890 78 2e 20 42 75 74 20 62 65 66 6f 72 65 0a 20 20  x. But before.  
1c8a0 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 73 6f 2c      ** doing so,
1c8b0 20 63 6f 64 65 20 61 20 4e 6f 6f 70 20 69 6e 73   code a Noop ins
1c8c0 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 73 74 6f  truction and sto
1c8d0 72 65 20 69 74 73 20 61 64 64 72 65 73 73 20 69  re its address i
1c8e0 6e 20 0a 20 20 20 20 20 20 2a 2a 20 49 6e 64 65  n .      ** Inde
1c8f0 78 2e 74 6e 75 6d 2e 20 54 68 69 73 20 69 73 20  x.tnum. This is 
1c900 72 65 71 75 69 72 65 64 20 69 6e 20 63 61 73 65  required in case
1c910 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 61   this index is a
1c920 63 74 75 61 6c 6c 79 20 61 20 0a 20 20 20 20 20  ctually a .     
1c930 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   ** PRIMARY KEY 
1c940 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 69 73  and the table is
1c950 20 61 63 74 75 61 6c 6c 79 20 61 20 57 49 54 48   actually a WITH
1c960 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e  OUT ROWID table.
1c970 20 49 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74 68   In .      ** th
1c980 61 74 20 63 61 73 65 20 74 68 65 20 63 6f 6e 76  at case the conv
1c990 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69  ertToWithoutRowi
1c9a0 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65  dTable() routine
1c9b0 20 77 69 6c 6c 20 72 65 70 6c 61 63 65 0a 20 20   will replace.  
1c9c0 20 20 20 20 2a 2a 20 74 68 65 20 4e 6f 6f 70 20      ** the Noop 
1c9d0 77 69 74 68 20 61 20 47 6f 74 6f 20 74 6f 20 6a  with a Goto to j
1c9e0 75 6d 70 20 6f 76 65 72 20 74 68 65 20 56 44 42  ump over the VDB
1c9f0 45 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  E code generated
1ca00 20 62 65 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20   below. */.     
1ca10 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20   pIndex->tnum = 
1ca20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ca30 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20  0(v, OP_Noop);. 
1ca40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ca50 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 72 65  AddOp3(v, OP_Cre
1ca60 61 74 65 42 74 72 65 65 2c 20 69 44 62 2c 20 69  ateBtree, iDb, i
1ca70 4d 65 6d 2c 20 42 54 52 45 45 5f 42 4c 4f 42 4b  Mem, BTREE_BLOBK
1ca80 45 59 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  EY);..      /* G
1ca90 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65  ather the comple
1caa0 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43  te text of the C
1cab0 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
1cac0 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 20  ement into.     
1cad0 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61   ** the zStmt va
1cae0 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a 2f 0a  riable.      */.
1caf0 20 20 20 20 20 20 69 66 28 20 70 53 74 61 72 74        if( pStart
1cb00 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
1cb10 6e 20 3d 20 28 69 6e 74 29 28 70 50 61 72 73 65  n = (int)(pParse
1cb20 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d  ->sLastToken.z -
1cb30 20 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70 50 61   pName->z) + pPa
1cb40 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e  rse->sLastToken.
1cb50 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  n;.        if( p
1cb60 4e 61 6d 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b  Name->z[n-1]==';
1cb70 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 20  ' ) n--;.       
1cb80 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64 65   /* A named inde
1cb90 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c 69 63  x with an explic
1cba0 69 74 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  it CREATE INDEX 
1cbb0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
1cbc0 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c       zStmt = sql
1cbd0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
1cbe0 22 43 52 45 41 54 45 25 73 20 49 4e 44 45 58 20  "CREATE%s INDEX 
1cbf0 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 20  %.*s",.         
1cc00 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e     onError==OE_N
1cc10 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49  one ? "" : " UNI
1cc20 51 55 45 22 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e  QUE", n, pName->
1cc30 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  z);.      }else{
1cc40 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 61  .        /* An a
1cc50 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63  utomatic index c
1cc60 72 65 61 74 65 64 20 62 79 20 61 20 50 52 49 4d  reated by a PRIM
1cc70 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
1cc80 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  E constraint */.
1cc90 20 20 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74          /* zStmt
1cca0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
1ccb0 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20  f(""); */.      
1ccc0 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20    zStmt = 0;.   
1ccd0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41     }..      /* A
1cce0 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73  dd an entry in s
1ccf0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72  qlite_master for
1cd00 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20   this index.    
1cd10 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
1cd20 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
1cd30 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
1cd40 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51   "INSERT INTO %Q
1cd50 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e 64 65  .%s VALUES('inde
1cd60 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c 25 51 29  x',%Q,%Q,#%d,%Q)
1cd70 3b 22 2c 0a 20 20 20 20 20 20 20 20 20 20 64 62  ;",.          db
1cd80 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
1cd90 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45  ame, MASTER_NAME
1cda0 2c 0a 20 20 20 20 20 20 20 20 20 20 70 49 6e 64  ,.          pInd
1cdb0 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ex->zName,.     
1cdc0 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
1cdd0 2c 0a 20 20 20 20 20 20 20 20 20 20 69 4d 65 6d  ,.          iMem
1cde0 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74 6d  ,.          zStm
1cdf0 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  t.          );. 
1ce00 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
1ce10 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a  ee(db, zStmt);..
1ce20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68        /* Fill th
1ce30 65 20 69 6e 64 65 78 20 77 69 74 68 20 64 61 74  e index with dat
1ce40 61 20 61 6e 64 20 72 65 70 61 72 73 65 20 74 68  a and reparse th
1ce50 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20 61  e schema. Code a
1ce60 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20 20  n OP_Expire.    
1ce70 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61    ** to invalida
1ce80 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69  te all pre-compi
1ce90 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  led statements..
1cea0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1ceb0 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20  f( pTblName ){. 
1cec0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
1ced0 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65  fillIndex(pParse
1cee0 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b  , pIndex, iMem);
1cef0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1cf00 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
1cf10 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
1cf20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1cf30 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 70  dParseSchemaOp(p
1cf40 50 61 72 73 65 2c 20 69 44 62 2c 0a 20 20 20 20  Parse, iDb,.    
1cf50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
1cf60 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65  Printf(db, "name
1cf70 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65 3d 27  ='%q' AND type='
1cf80 69 6e 64 65 78 27 22 2c 20 70 49 6e 64 65 78 2d  index'", pIndex-
1cf90 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
1cfa0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cfb0 4f 70 32 28 76 2c 20 4f 50 5f 45 78 70 69 72 65  Op2(v, OP_Expire
1cfc0 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  , 0, 1);.      }
1cfd0 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
1cfe0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
1cff0 49 6e 64 65 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20  Index->tnum);.  
1d000 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68    }.  }..  /* Wh
1d010 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64  en adding an ind
1d020 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  ex to the list o
1d030 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20  f indices for a 
1d040 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a  table, make.  **
1d050 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65   sure all indice
1d060 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70  s labeled OE_Rep
1d070 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20  lace come after 
1d080 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65  all those labele
1d090 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65  d.  ** OE_Ignore
1d0a0 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
1d0b0 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72  sary for the cor
1d0c0 72 65 63 74 20 63 6f 6e 73 74 72 61 69 6e 74 20  rect constraint 
1d0d0 63 68 65 63 6b 0a 20 20 2a 2a 20 70 72 6f 63 65  check.  ** proce
1d0e0 73 73 69 6e 67 20 28 69 6e 20 73 71 6c 69 74 65  ssing (in sqlite
1d0f0 33 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61  3GenerateConstra
1d100 69 6e 74 43 68 65 63 6b 73 28 29 29 20 61 73 20  intChecks()) as 
1d110 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 55 50 44  part of.  ** UPD
1d120 41 54 45 20 61 6e 64 20 49 4e 53 45 52 54 20 73  ATE and INSERT s
1d130 74 61 74 65 6d 65 6e 74 73 2e 20 20 0a 20 20 2a  tatements.  .  *
1d140 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
1d150 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d  .busy || pTblNam
1d160 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  e==0 ){.    if( 
1d170 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
1d180 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e  ace || pTab->pIn
1d190 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  dex==0.         
1d1a0 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d  || pTab->pIndex-
1d1b0 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70  >onError==OE_Rep
1d1c0 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e  lace){.      pIn
1d1d0 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61  dex->pNext = pTa
1d1e0 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
1d1f0 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20   pTab->pIndex = 
1d200 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73  pIndex;.    }els
1d210 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
1d220 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70  pOther = pTab->p
1d230 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69  Index;.      whi
1d240 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  le( pOther->pNex
1d250 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65  t && pOther->pNe
1d260 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  xt->onError!=OE_
1d270 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20  Replace ){.     
1d280 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68     pOther = pOth
1d290 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  er->pNext;.     
1d2a0 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d   }.      pIndex-
1d2b0 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d  >pNext = pOther-
1d2c0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f  >pNext;.      pO
1d2d0 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49  ther->pNext = pI
1d2e0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
1d2f0 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a  pIndex = 0;.  }.
1d300 20 20 65 6c 73 65 20 69 66 28 20 49 4e 5f 52 45    else if( IN_RE
1d310 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20  NAME_OBJECT ){. 
1d320 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
1d330 65 2d 3e 70 4e 65 77 49 6e 64 65 78 3d 3d 30 20  e->pNewIndex==0 
1d340 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  );.    pParse->p
1d350 4e 65 77 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  NewIndex = pInde
1d360 78 3b 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20  x;.    pIndex = 
1d370 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65  0;.  }..  /* Cle
1d380 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78 69  an up before exi
1d390 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65  ting */.exit_cre
1d3a0 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28  ate_index:.  if(
1d3b0 20 70 49 6e 64 65 78 20 29 20 73 71 6c 69 74 65   pIndex ) sqlite
1d3c0 33 46 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70  3FreeIndex(db, p
1d3d0 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69 74 65  Index);.  sqlite
1d3e0 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
1d3f0 70 50 49 57 68 65 72 65 29 3b 0a 20 20 73 71 6c  pPIWhere);.  sql
1d400 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
1d410 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
1d420 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
1d430 65 6c 65 74 65 28 64 62 2c 20 70 54 62 6c 4e 61  elete(db, pTblNa
1d440 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
1d450 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
1d460 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74  .}../*.** Fill t
1d470 68 65 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73  he Index.aiRowEs
1d480 74 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20 64  t[] array with d
1d490 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69  efault informati
1d4a0 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  on - information
1d4b0 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65 64 20 77  .** to be used w
1d4c0 68 65 6e 20 77 65 20 68 61 76 65 20 6e 6f 74 20  hen we have not 
1d4d0 72 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45 20  run the ANALYZE 
1d4e0 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61  command..**.** a
1d4f0 69 52 6f 77 45 73 74 5b 30 5d 20 69 73 20 73 75  iRowEst[0] is su
1d500 70 70 6f 73 65 64 20 74 6f 20 63 6f 6e 74 61 69  pposed to contai
1d510 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1d520 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
1d530 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20  index..** Since 
1d540 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20  we do not know, 
1d550 67 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e  guess 1 million.
1d560 20 20 61 69 52 6f 77 45 73 74 5b 31 5d 20 69 73    aiRowEst[1] is
1d570 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20   an estimate of 
1d580 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
1d590 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
1d5a0 6c 65 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e  le that match an
1d5b0 79 20 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c  y particular val
1d5c0 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72  ue of the.** fir
1d5d0 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
1d5e0 20 69 6e 64 65 78 2e 20 20 61 69 52 6f 77 45 73   index.  aiRowEs
1d5f0 74 5b 32 5d 20 69 73 20 61 6e 20 65 73 74 69 6d  t[2] is an estim
1d600 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
1d610 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68 61  r.** of rows tha
1d620 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74  t match any part
1d630 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 61 74 69  icular combinati
1d640 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  on of the first 
1d650 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20  2 columns.** of 
1d660 74 68 65 20 69 6e 64 65 78 2e 20 20 41 6e 64 20  the index.  And 
1d670 73 6f 20 66 6f 72 74 68 2e 20 20 49 74 20 6d 75  so forth.  It mu
1d680 73 74 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  st always be the
1d690 20 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20   case that.*.** 
1d6a0 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45            aiRowE
1d6b0 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b  st[N]<=aiRowEst[
1d6c0 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20  N-1].**         
1d6d0 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31    aiRowEst[N]>=1
1d6e0 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f  .**.** Apart fro
1d6f0 6d 20 74 68 61 74 2c 20 77 65 20 68 61 76 65 20  m that, we have 
1d700 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20  little to go on 
1d710 62 65 73 69 64 65 73 20 69 6e 74 75 69 74 69 6f  besides intuitio
1d720 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61  n as to.** how a
1d730 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64  iRowEst[] should
1d740 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
1d750 20 20 54 68 65 20 6e 75 6d 62 65 72 73 20 67 65    The numbers ge
1d760 6e 65 72 61 74 65 64 20 68 65 72 65 0a 2a 2a 20  nerated here.** 
1d770 61 72 65 20 62 61 73 65 64 20 6f 6e 20 74 79 70  are based on typ
1d780 69 63 61 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e  ical values foun
1d790 64 20 69 6e 20 61 63 74 75 61 6c 20 69 6e 64 69  d in actual indi
1d7a0 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ces..*/.void sql
1d7b0 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73  ite3DefaultRowEs
1d7c0 74 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  t(Index *pIdx){.
1d7d0 20 20 2f 2a 20 20 20 20 20 20 20 20 20 20 20 20    /*            
1d7e0 20 20 20 20 31 30 2c 20 20 39 2c 20 20 38 2c 20      10,  9,  8, 
1d7f0 20 37 2c 20 20 36 20 2a 2f 0a 20 20 4c 6f 67 45   7,  6 */.  LogE
1d800 73 74 20 61 56 61 6c 5b 5d 20 3d 20 7b 20 33 33  st aVal[] = { 33
1d810 2c 20 33 32 2c 20 33 30 2c 20 32 38 2c 20 32 36  , 32, 30, 28, 26
1d820 20 7d 3b 0a 20 20 4c 6f 67 45 73 74 20 2a 61 20   };.  LogEst *a 
1d830 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67  = pIdx->aiRowLog
1d840 45 73 74 3b 0a 20 20 69 6e 74 20 6e 43 6f 70 79  Est;.  int nCopy
1d850 20 3d 20 4d 49 4e 28 41 72 72 61 79 53 69 7a 65   = MIN(ArraySize
1d860 28 61 56 61 6c 29 2c 20 70 49 64 78 2d 3e 6e 4b  (aVal), pIdx->nK
1d870 65 79 43 6f 6c 29 3b 0a 20 20 69 6e 74 20 69 3b  eyCol);.  int i;
1d880 0a 0a 20 20 2f 2a 20 49 6e 64 65 78 65 73 20 77  ..  /* Indexes w
1d890 69 74 68 20 64 65 66 61 75 6c 74 20 72 6f 77 20  ith default row 
1d8a0 65 73 74 69 6d 61 74 65 73 20 73 68 6f 75 6c 64  estimates should
1d8b0 20 6e 6f 74 20 68 61 76 65 20 73 74 61 74 31 20   not have stat1 
1d8c0 64 61 74 61 20 2a 2f 0a 20 20 61 73 73 65 72 74  data */.  assert
1d8d0 28 20 21 70 49 64 78 2d 3e 68 61 73 53 74 61 74  ( !pIdx->hasStat
1d8e0 31 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  1 );..  /* Set t
1d8f0 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 28  he first entry (
1d900 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
1d910 6e 20 74 68 65 20 69 6e 64 65 78 29 20 74 6f 20  n the index) to 
1d920 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 0a 20  the estimated . 
1d930 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f   ** number of ro
1d940 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c  ws in the table,
1d950 20 6f 72 20 68 61 6c 66 20 74 68 65 20 6e 75 6d   or half the num
1d960 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
1d970 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 66 6f  he table.  ** fo
1d980 72 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65  r a partial inde
1d990 78 2e 20 20 20 42 75 74 20 64 6f 20 6e 6f 74 20  x.   But do not 
1d9a0 6c 65 74 20 74 68 65 20 65 73 74 69 6d 61 74 65  let the estimate
1d9b0 20 64 72 6f 70 20 62 65 6c 6f 77 20 31 30 2e 20   drop below 10. 
1d9c0 2a 2f 0a 20 20 61 5b 30 5d 20 3d 20 70 49 64 78  */.  a[0] = pIdx
1d9d0 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f  ->pTable->nRowLo
1d9e0 67 45 73 74 3b 0a 20 20 69 66 28 20 70 49 64 78  gEst;.  if( pIdx
1d9f0 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21  ->pPartIdxWhere!
1da00 3d 30 20 29 20 61 5b 30 5d 20 2d 3d 20 31 30 3b  =0 ) a[0] -= 10;
1da10 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71    assert( 10==sq
1da20 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29  lite3LogEst(2) )
1da30 3b 0a 20 20 69 66 28 20 61 5b 30 5d 3c 33 33 20  ;.  if( a[0]<33 
1da40 29 20 61 5b 30 5d 20 3d 20 33 33 3b 20 20 20 20  ) a[0] = 33;    
1da50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
1da60 73 65 72 74 28 20 33 33 3d 3d 73 71 6c 69 74 65  sert( 33==sqlite
1da70 33 4c 6f 67 45 73 74 28 31 30 29 20 29 3b 0a 0a  3LogEst(10) );..
1da80 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68    /* Estimate th
1da90 61 74 20 61 5b 31 5d 20 69 73 20 31 30 2c 20 61  at a[1] is 10, a
1daa0 5b 32 5d 20 69 73 20 39 2c 20 61 5b 33 5d 20 69  [2] is 9, a[3] i
1dab0 73 20 38 2c 20 61 5b 34 5d 20 69 73 20 37 2c 20  s 8, a[4] is 7, 
1dac0 61 5b 35 5d 20 69 73 0a 20 20 2a 2a 20 36 20 61  a[5] is.  ** 6 a
1dad0 6e 64 20 65 61 63 68 20 73 75 62 73 65 71 75 65  nd each subseque
1dae0 6e 74 20 76 61 6c 75 65 20 28 69 66 20 61 6e 79  nt value (if any
1daf0 29 20 69 73 20 35 2e 20 20 2a 2f 0a 20 20 6d 65  ) is 5.  */.  me
1db00 6d 63 70 79 28 26 61 5b 31 5d 2c 20 61 56 61 6c  mcpy(&a[1], aVal
1db10 2c 20 6e 43 6f 70 79 2a 73 69 7a 65 6f 66 28 4c  , nCopy*sizeof(L
1db20 6f 67 45 73 74 29 29 3b 0a 20 20 66 6f 72 28 69  ogEst));.  for(i
1db30 3d 6e 43 6f 70 79 2b 31 3b 20 69 3c 3d 70 49 64  =nCopy+1; i<=pId
1db40 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29  x->nKeyCol; i++)
1db50 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 32 33 3b  {.    a[i] = 23;
1db60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db70 20 20 20 20 61 73 73 65 72 74 28 20 32 33 3d 3d      assert( 23==
1db80 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 35 29  sqlite3LogEst(5)
1db90 20 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72   );.  }..  asser
1dba0 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  t( 0==sqlite3Log
1dbb0 45 73 74 28 31 29 20 29 3b 0a 20 20 69 66 28 20  Est(1) );.  if( 
1dbc0 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
1dbd0 64 78 29 20 29 20 61 5b 70 49 64 78 2d 3e 6e 4b  dx) ) a[pIdx->nK
1dbe0 65 79 43 6f 6c 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f  eyCol] = 0;.}../
1dbf0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1dc00 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65  e will drop an e
1dc10 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e  xisting named in
1dc20 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69  dex.  This routi
1dc30 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73  ne.** implements
1dc40 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20   the DROP INDEX 
1dc50 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
1dc60 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e  id sqlite3DropIn
1dc70 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
1dc80 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d  e, SrcList *pNam
1dc90 65 2c 20 69 6e 74 20 69 66 45 78 69 73 74 73 29  e, int ifExists)
1dca0 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
1dcb0 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  x;.  Vdbe *v;.  
1dcc0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1dcd0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
1dce0 69 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  iDb;..  assert( 
1dcf0 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
1dd00 29 3b 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61  );   /* Never ca
1dd10 6c 6c 65 64 20 77 69 74 68 20 70 72 69 6f 72 20  lled with prior 
1dd20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20  errors */.  if( 
1dd30 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1dd40 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
1dd50 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1dd60 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d  }.  assert( pNam
1dd70 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20  e->nSrc==1 );.  
1dd80 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
1dd90 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
1dda0 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
1ddb0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
1ddc0 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64  ndex;.  }.  pInd
1ddd0 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ex = sqlite3Find
1dde0 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d  Index(db, pName-
1ddf0 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61  >a[0].zName, pNa
1de00 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
1de10 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65  se);.  if( pInde
1de20 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  x==0 ){.    if( 
1de30 21 69 66 45 78 69 73 74 73 20 29 7b 0a 20 20 20  !ifExists ){.   
1de40 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1de50 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
1de60 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20  uch index: %S", 
1de70 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d  pName, 0);.    }
1de80 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
1de90 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d  te3CodeVerifyNam
1dea0 65 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  edSchema(pParse,
1deb0 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61   pName->a[0].zDa
1dec0 74 61 62 61 73 65 29 3b 0a 20 20 20 20 7d 0a 20  tabase);.    }. 
1ded0 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
1dee0 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20  Schema = 1;.    
1def0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
1df00 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndex;.  }.  if( 
1df10 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 21  pIndex->idxType!
1df20 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f  =SQLITE_IDXTYPE_
1df30 41 50 50 44 45 46 20 29 7b 0a 20 20 20 20 73 71  APPDEF ){.    sq
1df40 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1df50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73  arse, "index ass
1df60 6f 63 69 61 74 65 64 20 77 69 74 68 20 55 4e 49  ociated with UNI
1df70 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20  QUE ".      "or 
1df80 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
1df90 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65  traint cannot be
1dfa0 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20   dropped", 0);. 
1dfb0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1dfc0 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  p_index;.  }.  i
1dfd0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
1dfe0 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49  maToIndex(db, pI
1dff0 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  ndex->pSchema);.
1e000 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 57    sqlite3SchemaW
1e010 72 69 74 61 62 6c 65 28 70 50 61 72 73 65 2c 20  ritable(pParse, 
1e020 69 44 62 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  iDb);.#ifndef SQ
1e030 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
1e040 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
1e050 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54  int code = SQLIT
1e060 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20  E_DROP_INDEX;.  
1e070 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
1e080 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a  pIndex->pTable;.
1e090 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1e0a0 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
1e0b0 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20  b].zDbSName;.   
1e0c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
1e0d0 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
1e0e0 28 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73  (iDb);.    if( s
1e0f0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1e100 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
1e110 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
1e120 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
1e130 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1e140 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
1e150 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
1e160 26 20 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53  & iDb ) code = S
1e170 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
1e180 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73  INDEX;.    if( s
1e190 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1e1a0 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49  pParse, code, pI
1e1b0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61  ndex->zName, pTa
1e1c0 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b->zName, zDb) )
1e1d0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
1e1e0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1e1f0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
1e200 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1e210 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
1e220 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20   index and from 
1e230 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
1e240 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
1e250 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1e260 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
1e270 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
1e280 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
1e290 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20  se, 1, iDb);.   
1e2a0 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
1e2b0 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
1e2c0 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
1e2d0 25 51 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65  %Q.%s WHERE name
1e2e0 3d 25 51 20 41 4e 44 20 74 79 70 65 3d 27 69 6e  =%Q AND type='in
1e2f0 64 65 78 27 22 2c 0a 20 20 20 20 20 20 20 64 62  dex'",.       db
1e300 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
1e310 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45  ame, MASTER_NAME
1e320 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a  , pIndex->zName.
1e330 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
1e340 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65  e3ClearStatTable
1e350 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  s(pParse, iDb, "
1e360 69 64 78 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  idx", pIndex->zN
1e370 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
1e380 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
1e390 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
1e3a0 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
1e3b0 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e  pParse, pIndex->
1e3c0 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20  tnum, iDb);.    
1e3d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e3e0 34 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65  4(v, OP_DropInde
1e3f0 78 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 49  x, iDb, 0, 0, pI
1e400 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  ndex->zName, 0);
1e410 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f  .  }..exit_drop_
1e420 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33  index:.  sqlite3
1e430 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
1e440 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  , pName);.}../*.
1e450 2a 2a 20 70 41 72 72 61 79 20 69 73 20 61 20 70  ** pArray is a p
1e460 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 61 72 72  ointer to an arr
1e470 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 45  ay of objects. E
1e480 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68  ach object in th
1e490 65 0a 2a 2a 20 61 72 72 61 79 20 69 73 20 73 7a  e.** array is sz
1e4a0 45 6e 74 72 79 20 62 79 74 65 73 20 69 6e 20 73  Entry bytes in s
1e4b0 69 7a 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ize. This routin
1e4c0 65 20 75 73 65 73 20 73 71 6c 69 74 65 33 44 62  e uses sqlite3Db
1e4d0 52 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20 74 6f 20  Realloc().** to 
1e4e0 65 78 74 65 6e 64 20 74 68 65 20 61 72 72 61 79  extend the array
1e4f0 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 69   so that there i
1e500 73 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65  s space for a ne
1e510 77 20 6f 62 6a 65 63 74 20 61 74 20 74 68 65 20  w object at the 
1e520 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  end..**.** When 
1e530 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1e540 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 45 6e 74 72   called, *pnEntr
1e550 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63  y contains the c
1e560 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 2a  urrent size of.*
1e570 2a 20 74 68 65 20 61 72 72 61 79 20 28 69 6e 20  * the array (in 
1e580 65 6e 74 72 69 65 73 20 2d 20 73 6f 20 74 68 65  entries - so the
1e590 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 28   allocation is (
1e5a0 28 2a 70 6e 45 6e 74 72 79 29 20 2a 20 73 7a 45  (*pnEntry) * szE
1e5b0 6e 74 72 79 29 20 62 79 74 65 73 0a 2a 2a 20 69  ntry) bytes.** i
1e5c0 6e 20 74 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20  n total)..**.** 
1e5d0 49 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29  If the realloc()
1e5e0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 20 28   is successful (
1e5f0 69 2e 65 2e 20 69 66 20 6e 6f 20 4f 4f 4d 20 63  i.e. if no OOM c
1e600 6f 6e 64 69 74 69 6f 6e 20 6f 63 63 75 72 73 29  ondition occurs)
1e610 2c 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 61  , the.** space a
1e620 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
1e630 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 73 20 7a   new object is z
1e640 65 72 6f 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20  eroed, *pnEntry 
1e650 75 70 64 61 74 65 64 20 74 6f 0a 2a 2a 20 72 65  updated to.** re
1e660 66 6c 65 63 74 20 74 68 65 20 6e 65 77 20 73 69  flect the new si
1e670 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20  ze of the array 
1e680 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  and a pointer to
1e690 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74   the new allocat
1e6a0 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e  ion.** returned.
1e6b0 20 2a 70 49 64 78 20 69 73 20 73 65 74 20 74 6f   *pIdx is set to
1e6c0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
1e6d0 65 20 6e 65 77 20 61 72 72 61 79 20 65 6e 74 72  e new array entr
1e6e0 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
1e6f0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
1e700 20 69 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 28   if the realloc(
1e710 29 20 66 61 69 6c 73 2c 20 2a 70 49 64 78 20 69  ) fails, *pIdx i
1e720 73 20 73 65 74 20 74 6f 20 2d 31 2c 20 2a 70 6e  s set to -1, *pn
1e730 45 6e 74 72 79 20 72 65 6d 61 69 6e 73 0a 2a 2a  Entry remains.**
1e740 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61   unchanged and a
1e750 20 63 6f 70 79 20 6f 66 20 70 41 72 72 61 79 20   copy of pArray 
1e760 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 76 6f 69  returned..*/.voi
1e770 64 20 2a 73 71 6c 69 74 65 33 41 72 72 61 79 41  d *sqlite3ArrayA
1e780 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c 69 74  llocate(.  sqlit
1e790 65 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20  e3 *db,      /* 
1e7a0 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f  Connection to no
1e7b0 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66  tify of malloc f
1e7c0 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69  ailures */.  voi
1e7d0 64 20 2a 70 41 72 72 61 79 2c 20 20 20 20 20 2f  d *pArray,     /
1e7e0 2a 20 41 72 72 61 79 20 6f 66 20 6f 62 6a 65 63  * Array of objec
1e7f0 74 73 2e 20 20 4d 69 67 68 74 20 62 65 20 72 65  ts.  Might be re
1e800 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69  allocated */.  i
1e810 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20 20 20 20  nt szEntry,     
1e820 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61 63 68   /* Size of each
1e830 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 61   object in the a
1e840 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  rray */.  int *p
1e850 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e  nEntry,     /* N
1e860 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73  umber of objects
1e870 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
1e880 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49 64 78  e */.  int *pIdx
1e890 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1e8a0 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  e the index of a
1e8b0 20 6e 65 77 20 73 6c 6f 74 20 68 65 72 65 20 2a   new slot here *
1e8c0 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  /.){.  char *z;.
1e8d0 20 20 69 6e 74 20 6e 20 3d 20 2a 70 6e 45 6e 74    int n = *pnEnt
1e8e0 72 79 3b 0a 20 20 69 66 28 20 28 6e 20 26 20 28  ry;.  if( (n & (
1e8f0 6e 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  n-1))==0 ){.    
1e900 69 6e 74 20 73 7a 20 3d 20 28 6e 3d 3d 30 29 20  int sz = (n==0) 
1e910 3f 20 31 20 3a 20 32 2a 6e 3b 0a 20 20 20 20 76  ? 1 : 2*n;.    v
1e920 6f 69 64 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  oid *pNew = sqli
1e930 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
1e940 20 70 41 72 72 61 79 2c 20 73 7a 2a 73 7a 45 6e   pArray, sz*szEn
1e950 74 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  try);.    if( pN
1e960 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a  ew==0 ){.      *
1e970 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pIdx = -1;.     
1e980 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a   return pArray;.
1e990 20 20 20 20 7d 0a 20 20 20 20 70 41 72 72 61 79      }.    pArray
1e9a0 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a   = pNew;.  }.  z
1e9b0 20 3d 20 28 63 68 61 72 2a 29 70 41 72 72 61 79   = (char*)pArray
1e9c0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b 6e 20  ;.  memset(&z[n 
1e9d0 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73  * szEntry], 0, s
1e9e0 7a 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49 64 78  zEntry);.  *pIdx
1e9f0 20 3d 20 6e 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74   = n;.  ++*pnEnt
1ea00 72 79 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72  ry;.  return pAr
1ea10 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  ray;.}../*.** Ap
1ea20 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65  pend a new eleme
1ea30 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  nt to the given 
1ea40 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  IdList.  Create 
1ea50 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a  a new IdList if.
1ea60 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a  ** need be..**.*
1ea70 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69  * A new IdList i
1ea80 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e  s returned, or N
1ea90 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20  ULL if malloc() 
1eaa0 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74  fails..*/.IdList
1eab0 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41   *sqlite3IdListA
1eac0 70 70 65 6e 64 28 50 61 72 73 65 20 2a 70 50 61  ppend(Parse *pPa
1ead0 72 73 65 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69  rse, IdList *pLi
1eae0 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  st, Token *pToke
1eaf0 6e 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  n){.  sqlite3 *d
1eb00 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1eb10 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1eb20 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
1eb30 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62  List = sqlite3Db
1eb40 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
1eb50 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b  izeof(IdList) );
1eb60 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
1eb70 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1eb80 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73  }.  pList->a = s
1eb90 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
1eba0 61 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a 20  ate(.      db,. 
1ebb0 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20       pList->a,. 
1ebc0 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69 73       sizeof(pLis
1ebd0 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20  t->a[0]),.      
1ebe0 26 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20  &pList->nId,.   
1ebf0 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28     &i.  );.  if(
1ec00 20 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69   i<0 ){.    sqli
1ec10 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
1ec20 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  db, pList);.    
1ec30 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1ec40 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1ec50 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
1ec60 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f  romToken(db, pTo
1ec70 6b 65 6e 29 3b 0a 20 20 69 66 28 20 49 4e 5f 52  ken);.  if( IN_R
1ec80 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 26 26 20  ENAME_OBJECT && 
1ec90 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1eca0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
1ecb0 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70  RenameTokenMap(p
1ecc0 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 70 4c  Parse, (void*)pL
1ecd0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
1ece0 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20   pToken);.  }.  
1ecf0 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
1ed00 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
1ed10 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64   IdList..*/.void
1ed20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
1ed30 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
1ed40 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29  , IdList *pList)
1ed50 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
1ed60 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1ed70 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
1ed80 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  <pList->nId; i++
1ed90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
1eda0 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Free(db, pList->
1edb0 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  a[i].zName);.  }
1edc0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1edd0 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a  (db, pList->a);.
1ede0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
1edf0 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  N(db, pList);.}.
1ee00 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1ee10 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74  e index in pList
1ee20 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69   of the identifi
1ee30 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52  er named zId.  R
1ee40 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e  eturn -1.** if n
1ee50 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74  ot found..*/.int
1ee60 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
1ee70 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  dex(IdList *pLis
1ee80 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
1ee90 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Name){.  int i;.
1eea0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1eeb0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f   return -1;.  fo
1eec0 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
1eed0 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nId; i++){.    i
1eee0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
1eef0 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
1ef00 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
1ef10 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
1ef20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
1ef30 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68 65 20  *.** Expand the 
1ef40 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
1ef50 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 72  for the given Sr
1ef60 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 62 79 0a  cList object by.
1ef70 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e 45 78 74  ** creating nExt
1ef80 72 61 20 6e 65 77 20 73 6c 6f 74 73 20 62 65 67  ra new slots beg
1ef90 69 6e 6e 69 6e 67 20 61 74 20 69 53 74 61 72 74  inning at iStart
1efa0 2e 20 20 69 53 74 61 72 74 20 69 73 20 7a 65 72  .  iStart is zer
1efb0 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77 20  o based..** New 
1efc0 73 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f 65 64  slots are zeroed
1efd0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1efe0 70 6c 65 2c 20 73 75 70 70 6f 73 65 20 61 20 53  ple, suppose a S
1eff0 72 63 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79  rcList initially
1f000 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65 6e   contains two en
1f010 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54  tries: A,B..** T
1f020 6f 20 61 70 70 65 6e 64 20 33 20 6e 65 77 20 65  o append 3 new e
1f030 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74 68 65 20  ntries onto the 
1f040 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a 2a  end, do this:.**
1f050 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 53 72  .**    sqlite3Sr
1f060 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c  cListEnlarge(db,
1f070 20 70 53 72 63 6c 69 73 74 2c 20 33 2c 20 32 29   pSrclist, 3, 2)
1f080 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ;.**.** After th
1f090 65 20 63 61 6c 6c 20 61 62 6f 76 65 20 69 74 20  e call above it 
1f0a0 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20 20  would contain:  
1f0b0 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20  A, B, nil, nil, 
1f0c0 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69  nil..** If the i
1f0d0 53 74 61 72 74 20 61 72 67 75 6d 65 6e 74 20 68  Start argument h
1f0e0 61 64 20 62 65 65 6e 20 31 20 69 6e 73 74 65 61  ad been 1 instea
1f0f0 64 20 6f 66 20 32 2c 20 74 68 65 6e 20 74 68 65  d of 2, then the
1f100 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64   result.** would
1f110 20 68 61 76 65 20 62 65 65 6e 3a 20 20 41 2c 20   have been:  A, 
1f120 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42  nil, nil, nil, B
1f130 2e 20 20 54 6f 20 70 72 65 70 65 6e 64 20 74 68  .  To prepend th
1f140 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20  e new slots,.** 
1f150 74 68 65 20 69 53 74 61 72 74 20 76 61 6c 75 65  the iStart value
1f160 20 77 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68   would be 0.  Th
1f170 65 20 72 65 73 75 6c 74 20 74 68 65 6e 20 77 6f  e result then wo
1f180 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20  uld.** be: nil, 
1f190 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a  nil, nil, A, B..
1f1a0 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
1f1b0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
1f1c0 6c 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 69  ls the SrcList i
1f1d0 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 20 54 68  s unchanged.  Th
1f1e0 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  e.** db->mallocF
1f1f0 61 69 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c 20  ailed flag will 
1f200 62 65 20 73 65 74 20 74 6f 20 74 72 75 65 2e 0a  be set to true..
1f210 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
1f220 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
1f230 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
1f240 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ,       /* Datab
1f250 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  ase connection t
1f260 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d 20  o notify of OOM 
1f270 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63 4c  errors */.  SrcL
1f280 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 2f  ist *pSrc,     /
1f290 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20 74 6f  * The SrcList to
1f2a0 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a   be enlarged */.
1f2b0 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
1f2c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1f2d0 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20 61  f new slots to a
1f2e0 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d 20  dd to pSrc->a[] 
1f2f0 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 20  */.  int iStart 
1f300 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1f310 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f 66   in pSrc->a[] of
1f320 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f 74 20   first new slot 
1f330 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  */.){.  int i;..
1f340 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
1f350 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67 20  king on calling 
1f360 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
1f370 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d  assert( iStart>=
1f380 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
1f390 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61 73  Extra>=1 );.  as
1f3a0 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b  sert( pSrc!=0 );
1f3b0 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72  .  assert( iStar
1f3c0 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b  t<=pSrc->nSrc );
1f3d0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
1f3e0 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61 63 65  additional space
1f3f0 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20   if needed */.  
1f400 69 66 28 20 28 75 33 32 29 70 53 72 63 2d 3e 6e  if( (u32)pSrc->n
1f410 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d  Src+nExtra>pSrc-
1f420 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53  >nAlloc ){.    S
1f430 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
1f440 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70    int nAlloc = p
1f450 53 72 63 2d 3e 6e 53 72 63 2a 32 2b 6e 45 78 74  Src->nSrc*2+nExt
1f460 72 61 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74  ra;.    int nGot
1f470 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
1f480 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
1f490 2c 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20  , pSrc,.        
1f4a0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70         sizeof(*p
1f4b0 53 72 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31  Src) + (nAlloc-1
1f4c0 29 2a 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61  )*sizeof(pSrc->a
1f4d0 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
1f4e0 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
1f4f0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
1f500 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
1f510 20 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a     return pSrc;.
1f520 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d      }.    pSrc =
1f530 20 70 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20   pNew;.    nGot 
1f540 3d 20 28 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  = (sqlite3DbMall
1f550 6f 63 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29  ocSize(db, pNew)
1f560 20 2d 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29   - sizeof(*pSrc)
1f570 29 2f 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61  )/sizeof(pSrc->a
1f580 5b 30 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72 63  [0])+1;.    pSrc
1f590 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 47 6f 74 3b  ->nAlloc = nGot;
1f5a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  .  }..  /* Move 
1f5b0 65 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74  existing slots t
1f5c0 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74  hat come after t
1f5d0 68 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65  he newly inserte
1f5e0 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74  d slots.  ** out
1f5f0 20 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20   of the way */. 
1f600 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72   for(i=pSrc->nSr
1f610 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20  c-1; i>=iStart; 
1f620 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e  i--){.    pSrc->
1f630 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53  a[i+nExtra] = pS
1f640 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20  rc->a[i];.  }.  
1f650 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 6e 45  pSrc->nSrc += nE
1f660 78 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f  xtra;..  /* Zero
1f670 20 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63   the newly alloc
1f680 61 74 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20 20  ated slots */.  
1f690 6d 65 6d 73 65 74 28 26 70 53 72 63 2d 3e 61 5b  memset(&pSrc->a[
1f6a0 69 53 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65  iStart], 0, size
1f6b0 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e  of(pSrc->a[0])*n
1f6c0 45 78 74 72 61 29 3b 0a 20 20 66 6f 72 28 69 3d  Extra);.  for(i=
1f6d0 69 53 74 61 72 74 3b 20 69 3c 69 53 74 61 72 74  iStart; i<iStart
1f6e0 2b 6e 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a 20  +nExtra; i++){. 
1f6f0 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43     pSrc->a[i].iC
1f700 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a  ursor = -1;.  }.
1f710 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  .  /* Return a p
1f720 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 65 6e  ointer to the en
1f730 6c 61 72 67 65 64 20 53 72 63 4c 69 73 74 20 2a  larged SrcList *
1f740 2f 0a 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b  /.  return pSrc;
1f750 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  .}.../*.** Appen
1f760 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  d a new table na
1f770 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  me to the given 
1f780 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65  SrcList.  Create
1f790 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69   a new SrcList i
1f7a0 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41  f.** need be.  A
1f7b0 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72   new entry is cr
1f7c0 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63  eated in the Src
1f7d0 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 61  List even if pTa
1f7e0 62 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  ble is NULL..**.
1f7f0 2a 2a 20 41 20 53 72 63 4c 69 73 74 20 69 73 20  ** A SrcList is 
1f800 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c  returned, or NUL
1f810 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  L if there is an
1f820 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 54 68 65   OOM error.  The
1f830 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72 63   returned.** Src
1f840 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 74 68  List might be th
1f850 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 53 72  e same as the Sr
1f860 63 4c 69 73 74 20 74 68 61 74 20 77 61 73 20 69  cList that was i
1f870 6e 70 75 74 20 6f 72 20 69 74 20 6d 69 67 68 74  nput or it might
1f880 20 62 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65   be.** a new one
1f890 2e 20 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  .  If an OOM err
1f8a0 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 73 2c 20  or does occurs, 
1f8b0 74 68 65 6e 20 74 68 65 20 70 72 69 6f 72 20 76  then the prior v
1f8c0 61 6c 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a 2a  alue of pList.**
1f8d0 20 74 68 61 74 20 69 73 20 69 6e 70 75 74 20 74   that is input t
1f8e0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
1f8f0 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  s automatically 
1f900 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  freed..**.** If 
1f910 70 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74  pDatabase is not
1f920 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20   null, it means 
1f930 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 68  that the table h
1f940 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a  as an optional.*
1f950 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  * database name 
1f960 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68  prefix.  Like th
1f970 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74  is:  "database.t
1f980 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74  able".  The pDat
1f990 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20  abase.** points 
1f9a0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  to the table nam
1f9b0 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65  e and the pTable
1f9c0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64   points to the d
1f9d0 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a  atabase name..**
1f9e0 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d   The SrcList.a[]
1f9f0 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20  .zName field is 
1fa00 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  filled with the 
1fa10 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68  table name which
1fa20 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66   might.** come f
1fa30 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70  rom pTable (if p
1fa40 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c  Database is NULL
1fa50 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62  ) or from pDatab
1fa60 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73  ase.  .** SrcLis
1fa70 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20  t.a[].zDatabase 
1fa80 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  is filled with t
1fa90 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
1faa0 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a   from pTable,.**
1fab0 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66   or with NULL if
1fac0 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73 20   no database is 
1fad0 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  specified..**.**
1fae0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1faf0 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68   if call like th
1fb00 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
1fb10 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1fb20 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b  Append(D,A,B,0);
1fb30 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73  .**.** Then B is
1fb40 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e   a table name an
1fb50 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  d the database n
1fb60 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69  ame is unspecifi
1fb70 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a  ed.  If called.*
1fb80 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  * like this:.**.
1fb90 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
1fba0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
1fbb0 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20  D,A,B,C);.**.** 
1fbc0 54 68 65 6e 20 43 20 69 73 20 74 68 65 20 74 61  Then C is the ta
1fbd0 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69  ble name and B i
1fbe0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  s the database n
1fbf0 61 6d 65 2e 20 20 49 66 20 43 20 69 73 20 64 65  ame.  If C is de
1fc00 66 69 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73 6f  fined.** then so
1fc10 20 69 73 20 42 2e 20 20 49 6e 20 6f 74 68 65 72   is B.  In other
1fc20 20 77 6f 72 64 73 2c 20 77 65 20 6e 65 76 65 72   words, we never
1fc30 20 68 61 76 65 20 61 20 63 61 73 65 20 77 68 65   have a case whe
1fc40 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  re:.**.**       
1fc50 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1fc60 41 70 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29 3b  Append(D,A,0,C);
1fc70 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61 62  .**.** Both pTab
1fc80 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65  le and pDatabase
1fc90 20 61 72 65 20 61 73 73 75 6d 65 64 20 74 6f 20   are assumed to 
1fca0 62 65 20 71 75 6f 74 65 64 2e 20 20 54 68 65 79  be quoted.  They
1fcb0 20 61 72 65 20 64 65 71 75 6f 74 65 64 0a 2a 2a   are dequoted.**
1fcc0 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 61 64   before being ad
1fcd0 64 65 64 20 74 6f 20 74 68 65 20 53 72 63 4c 69  ded to the SrcLi
1fce0 73 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a  st..*/.SrcList *
1fcf0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1fd00 70 65 6e 64 28 0a 20 20 73 71 6c 69 74 65 33 20  pend(.  sqlite3 
1fd10 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  *db,        /* C
1fd20 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74  onnection to not
1fd30 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61  ify of malloc fa
1fd40 69 6c 75 72 65 73 20 2a 2f 0a 20 20 53 72 63 4c  ilures */.  SrcL
1fd50 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
1fd60 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69  /* Append to thi
1fd70 73 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20  s SrcList. NULL 
1fd80 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 53 72  creates a new Sr
1fd90 63 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  cList */.  Token
1fda0 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 2f   *pTable,      /
1fdb0 2a 20 54 61 62 6c 65 20 74 6f 20 61 70 70 65 6e  * Table to appen
1fdc0 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44  d */.  Token *pD
1fdd0 61 74 61 62 61 73 65 20 20 20 20 2f 2a 20 44 61  atabase    /* Da
1fde0 74 61 62 61 73 65 20 6f 66 20 74 68 65 20 74 61  tabase of the ta
1fdf0 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ble */.){.  stru
1fe00 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1fe10 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74  *pItem;.  assert
1fe20 28 20 70 44 61 74 61 62 61 73 65 3d 3d 30 20 7c  ( pDatabase==0 |
1fe30 7c 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 20 20  | pTable!=0 );  
1fe40 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 76 65 20 43  /* Cannot have C
1fe50 20 77 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20 20   without B */.  
1fe60 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
1fe70 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1fe80 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
1fe90 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
1fea0 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 53  wNN(db, sizeof(S
1feb0 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  rcList) );.    i
1fec0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
1fed0 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73  turn 0;.    pLis
1fee0 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20  t->nAlloc = 1;. 
1fef0 20 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20 3d     pList->nSrc =
1ff00 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   1;.    memset(&
1ff10 70 4c 69 73 74 2d 3e 61 5b 30 5d 2c 20 30 2c 20  pList->a[0], 0, 
1ff20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
1ff30 30 5d 29 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d  0]));.    pList-
1ff40 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20  >a[0].iCursor = 
1ff50 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  -1;.  }else{.   
1ff60 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
1ff70 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64  SrcListEnlarge(d
1ff80 62 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c 69  b, pList, 1, pLi
1ff90 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 7d 0a 20  st->nSrc);.  }. 
1ffa0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1ffb0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ailed ){.    sql
1ffc0 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
1ffd0 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
1ffe0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1fff0 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74    pItem = &pList
20000 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d  ->a[pList->nSrc-
20010 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62  1];.  if( pDatab
20020 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65  ase && pDatabase
20030 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44  ->z==0 ){.    pD
20040 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d  atabase = 0;.  }
20050 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
20060 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a   ){.    pItem->z
20070 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
20080 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
20090 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  pDatabase);.    
200a0 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
200b0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
200c0 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62  omToken(db, pTab
200d0 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  le);.  }else{.  
200e0 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
200f0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
20100 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65  Token(db, pTable
20110 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 44  );.    pItem->zD
20120 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d  atabase = 0;.  }
20130 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
20140 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
20150 20 56 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65   VdbeCursor inde
20160 78 20 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c  x numbers to all
20170 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63   tables in a Src
20180 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  List.*/.void sql
20190 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
201a0 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a  nCursors(Parse *
201b0 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
201c0 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
201d0 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
201e0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
201f0 20 20 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c    assert(pList |
20200 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
20210 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
20220 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
20230 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
20240 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73  pList->a; i<pLis
20250 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
20260 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  tem++){.      if
20270 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ( pItem->iCursor
20280 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  >=0 ) break;.   
20290 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f     pItem->iCurso
202a0 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
202b0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  ++;.      if( pI
202c0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  tem->pSelect ){.
202d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
202e0 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
202f0 6f 72 73 28 70 50 61 72 73 65 2c 20 70 49 74 65  ors(pParse, pIte
20300 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63  m->pSelect->pSrc
20310 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
20320 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
20330 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53  lete an entire S
20340 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67  rcList including
20350 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75   all its substru
20360 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  cture..*/.void s
20370 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
20380 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
20390 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29   SrcList *pList)
203a0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
203b0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
203c0 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70   *pItem;.  if( p
203d0 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
203e0 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
203f0 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
20400 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
20410 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
20420 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
20430 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
20440 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
20450 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
20460 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
20470 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
20480 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
20490 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
204a0 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 20 73  .isIndexedBy ) s
204b0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
204c0 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65   pItem->u1.zInde
204d0 78 65 64 42 79 29 3b 0a 20 20 20 20 69 66 28 20  xedBy);.    if( 
204e0 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46  pItem->fg.isTabF
204f0 75 6e 63 20 29 20 73 71 6c 69 74 65 33 45 78 70  unc ) sqlite3Exp
20500 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
20510 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  pItem->u1.pFuncA
20520 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
20530 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
20540 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20  pItem->pTab);.  
20550 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
20560 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
20570 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73  >pSelect);.    s
20580 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
20590 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29  (db, pItem->pOn)
205a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  ;.    sqlite3IdL
205b0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49  istDelete(db, pI
205c0 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
205d0 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
205e0 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  eNN(db, pList);.
205f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
20600 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
20610 62 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f  by the parser to
20620 20 61 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20   add a new term 
20630 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66  to the.** end of
20640 20 61 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20   a growing FROM 
20650 63 6c 61 75 73 65 2e 20 20 54 68 65 20 22 70 22  clause.  The "p"
20660 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
20670 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  e part of.** the
20680 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61   FROM clause tha
20690 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
206a0 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20  en constructed. 
206b0 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20   "p" is NULL.** 
206c0 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
206d0 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65  irst term of the
206e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70   FROM clause.  p
206f0 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62  Table and pDatab
20700 61 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e  ase.** are the n
20710 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
20720 20 61 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61   and database na
20730 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  med in the FROM 
20740 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20  clause term..** 
20750 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c  pDatabase is NUL
20760 4c 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  L if the databas
20770 65 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72  e name qualifier
20780 20 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68   is missing - th
20790 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e  e.** usual case.
207a0 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 68 61    If the term ha
207b0 73 20 61 6e 20 61 6c 69 61 73 2c 20 74 68 65 6e  s an alias, then
207c0 20 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74   pAlias points t
207d0 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74  o the.** alias t
207e0 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65  oken.  If the te
207f0 72 6d 20 69 73 20 61 20 73 75 62 71 75 65 72 79  rm is a subquery
20800 2c 20 74 68 65 6e 20 70 53 75 62 71 75 65 72 79  , then pSubquery
20810 20 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43   is the.** SELEC
20820 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
20830 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65 6e   the subquery en
20840 63 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61 62  codes.  The pTab
20850 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62  le and.** pDatab
20860 61 73 65 20 70 61 72 61 6d 65 74 65 72 73 20 61  ase parameters a
20870 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71  re NULL for subq
20880 75 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e  ueries.  The pOn
20890 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70   and pUsing.** p
208a0 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 74 68  arameters are th
208b0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
208c0 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
208d0 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  auses..**.** Ret
208e0 75 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73  urn a new SrcLis
208f0 74 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20  t which encodes 
20900 69 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68  is the FROM with
20910 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d   the new.** term
20920 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69   added..*/.SrcLi
20930 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
20940 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d  stAppendFromTerm
20950 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
20960 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
20970 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
20980 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20  /.  SrcList *p, 
20990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
209a0 68 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20  he left part of 
209b0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
209c0 61 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a  already seen */.
209d0 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c    Token *pTable,
209e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
209f0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
20a00 6f 20 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f  o add to the FRO
20a10 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f  M clause */.  To
20a20 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20  ken *pDatabase, 
20a30 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
20a40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
20a50 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20  ntaining pTable 
20a60 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69  */.  Token *pAli
20a70 61 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  as,          /* 
20a80 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
20a90 69 64 65 20 6f 66 20 74 68 65 20 41 53 20 73 75  ide of the AS su
20aa0 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20  bexpression */. 
20ab0 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65   Select *pSubque
20ac0 72 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75  ry,      /* A su
20ad0 62 71 75 65 72 79 20 75 73 65 64 20 69 6e 20 70  bquery used in p
20ae0 6c 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20  lace of a table 
20af0 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  name */.  Expr *
20b00 70 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pOn,            
20b10 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75    /* The ON clau
20b20 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a  se of a join */.
20b30 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67    IdList *pUsing
20b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
20b50 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
20b60 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20   a join */.){.  
20b70 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
20b80 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71  tem *pItem;.  sq
20b90 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
20ba0 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21 70  se->db;.  if( !p
20bb0 20 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69   && (pOn || pUsi
20bc0 6e 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ng) ){.    sqlit
20bd0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
20be0 65 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73  e, "a JOIN claus
20bf0 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  e is required be
20c00 66 6f 72 65 20 25 73 22 2c 20 0a 20 20 20 20 20  fore %s", .     
20c10 20 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22   (pOn ? "ON" : "
20c20 55 53 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20  USING").    );. 
20c30 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66     goto append_f
20c40 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  rom_error;.  }. 
20c50 20 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c   p = sqlite3SrcL
20c60 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 70 2c  istAppend(db, p,
20c70 20 70 54 61 62 6c 65 2c 20 70 44 61 74 61 62 61   pTable, pDataba
20c80 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  se);.  if( p==0 
20c90 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65  ){.    goto appe
20ca0 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20  nd_from_error;. 
20cb0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
20cc0 6e 53 72 63 3e 30 20 29 3b 0a 20 20 70 49 74 65  nSrc>0 );.  pIte
20cd0 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72  m = &p->a[p->nSr
20ce0 63 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  c-1];.  assert( 
20cf0 28 70 54 61 62 6c 65 3d 3d 30 29 3d 3d 28 70 44  (pTable==0)==(pD
20d00 61 74 61 62 61 73 65 3d 3d 30 29 20 29 3b 0a 20  atabase==0) );. 
20d10 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
20d20 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 70 44 61 74  zName==0 || pDat
20d30 61 62 61 73 65 21 3d 30 20 29 3b 0a 20 20 69 66  abase!=0 );.  if
20d40 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  ( IN_RENAME_OBJE
20d50 43 54 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61  CT && pItem->zNa
20d60 6d 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20  me ){.    Token 
20d70 2a 70 54 6f 6b 65 6e 20 3d 20 28 41 4c 57 41 59  *pToken = (ALWAY
20d80 53 28 70 44 61 74 61 62 61 73 65 29 20 26 26 20  S(pDatabase) && 
20d90 70 44 61 74 61 62 61 73 65 2d 3e 7a 29 20 3f 20  pDatabase->z) ? 
20da0 70 44 61 74 61 62 61 73 65 20 3a 20 70 54 61 62  pDatabase : pTab
20db0 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  le;.    sqlite3R
20dc0 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50  enameTokenMap(pP
20dd0 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  arse, pItem->zNa
20de0 6d 65 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d  me, pToken);.  }
20df0 0a 20 20 61 73 73 65 72 74 28 20 70 41 6c 69 61  .  assert( pAlia
20e00 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 41  s!=0 );.  if( pA
20e10 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70  lias->n ){.    p
20e20 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73  Item->zAlias = s
20e30 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
20e40 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b  ken(db, pAlias);
20e50 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53  .  }.  pItem->pS
20e60 65 6c 65 63 74 20 3d 20 70 53 75 62 71 75 65 72  elect = pSubquer
20e70 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20  y;.  pItem->pOn 
20e80 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e  = pOn;.  pItem->
20e90 70 55 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b  pUsing = pUsing;
20ea0 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61  .  return p;.. a
20eb0 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72  ppend_from_error
20ec0 3a 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  :.  assert( p==0
20ed0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
20ee0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29  rDelete(db, pOn)
20ef0 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73  ;.  sqlite3IdLis
20f00 74 44 65 6c 65 74 65 28 64 62 2c 20 70 55 73 69  tDelete(db, pUsi
20f10 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ng);.  sqlite3Se
20f20 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
20f30 53 75 62 71 75 65 72 79 29 3b 0a 20 20 72 65 74  Subquery);.  ret
20f40 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
20f50 41 64 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42  Add an INDEXED B
20f60 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44  Y or NOT INDEXED
20f70 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d   clause to the m
20f80 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
20f90 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f  ed .** element o
20fa0 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73  f the source-lis
20fb0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
20fc0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
20fd0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
20fe0 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79  SrcListIndexedBy
20ff0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
21000 53 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65  SrcList *p, Toke
21010 6e 20 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a  n *pIndexedBy){.
21020 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
21030 65 64 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28  edBy!=0 );.  if(
21040 20 70 20 26 26 20 70 49 6e 64 65 78 65 64 42 79   p && pIndexedBy
21050 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 73 74 72  ->n>0 ){.    str
21060 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
21070 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73   *pItem;.    ass
21080 65 72 74 28 20 70 2d 3e 6e 53 72 63 3e 30 20 29  ert( p->nSrc>0 )
21090 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70  ;.    pItem = &p
210a0 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a  ->a[p->nSrc-1];.
210b0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
210c0 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64  m->fg.notIndexed
210d0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
210e0 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49  t( pItem->fg.isI
210f0 6e 64 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20  ndexedBy==0 );. 
21100 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
21110 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d  ->fg.isTabFunc==
21120 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  0 );.    if( pIn
21130 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26  dexedBy->n==1 &&
21140 20 21 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20   !pIndexedBy->z 
21150 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 4e  ){.      /* A "N
21160 4f 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75  OT INDEXED" clau
21170 73 65 20 77 61 73 20 73 75 70 70 6c 69 65 64 2e  se was supplied.
21180 20 53 65 65 20 70 61 72 73 65 2e 79 20 0a 20 20   See parse.y .  
21190 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74      ** construct
211a0 20 22 69 6e 64 65 78 65 64 5f 6f 70 74 22 20 66   "indexed_opt" f
211b0 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20  or details. */. 
211c0 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 6e       pItem->fg.n
211d0 6f 74 49 6e 64 65 78 65 64 20 3d 20 31 3b 0a 20  otIndexed = 1;. 
211e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
211f0 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  pItem->u1.zIndex
21200 65 64 42 79 20 3d 20 73 71 6c 69 74 65 33 4e 61  edBy = sqlite3Na
21210 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
21220 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78 65 64  se->db, pIndexed
21230 42 79 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  By);.      pItem
21240 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79  ->fg.isIndexedBy
21250 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
21260 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65  }../*.** Add the
21270 20 6c 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f   list of functio
21280 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  n arguments to t
21290 68 65 20 53 72 63 4c 69 73 74 20 65 6e 74 72 79  he SrcList entry
212a0 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 2d   for a.** table-
212b0 76 61 6c 75 65 64 2d 66 75 6e 63 74 69 6f 6e 2e  valued-function.
212c0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
212d0 53 72 63 4c 69 73 74 46 75 6e 63 41 72 67 73 28  SrcListFuncArgs(
212e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
212f0 72 63 4c 69 73 74 20 2a 70 2c 20 45 78 70 72 4c  rcList *p, ExprL
21300 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
21310 66 28 20 70 20 29 7b 0a 20 20 20 20 73 74 72 75  f( p ){.    stru
21320 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
21330 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70  *pItem = &p->a[p
21340 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61  ->nSrc-1];.    a
21350 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
21360 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29  .notIndexed==0 )
21370 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
21380 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65  tem->fg.isIndexe
21390 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  dBy==0 );.    as
213a0 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e  sert( pItem->fg.
213b0 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a  isTabFunc==0 );.
213c0 20 20 20 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46      pItem->u1.pF
213d0 75 6e 63 41 72 67 20 3d 20 70 4c 69 73 74 3b 0a  uncArg = pList;.
213e0 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73      pItem->fg.is
213f0 54 61 62 46 75 6e 63 20 3d 20 31 3b 0a 20 20 7d  TabFunc = 1;.  }
21400 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
21410 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
21420 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73  pParse->db, pLis
21430 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
21440 20 57 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 75   When building u
21450 70 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  p a FROM clause 
21460 69 6e 20 74 68 65 20 70 61 72 73 65 72 2c 20 74  in the parser, t
21470 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
21480 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  .** is initially
21490 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
214a0 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 2e 20 20   left operand.  
214b0 42 75 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e  But the code gen
214c0 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74  erator.** expect
214d0 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  s the join opera
214e0 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20 74 68 65  tor to be on the
214f0 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e 20   right operand. 
21500 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
21510 20 53 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e   Shifts all join
21520 20 6f 70 65 72 61 74 6f 72 73 20 66 72 6f 6d 20   operators from 
21530 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 66 6f  left to right fo
21540 72 20 61 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d  r an entire FROM
21550 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  .** clause..**.*
21560 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f  * Example: Suppo
21570 73 65 20 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c  se the join is l
21580 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
21590 20 20 20 20 20 20 20 20 20 20 41 20 6e 61 74 75            A natu
215a0 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42  ral cross join B
215b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61  .**.** The opera
215c0 74 6f 72 20 69 73 20 22 6e 61 74 75 72 61 6c 20  tor is "natural 
215d0 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68  cross join".  Th
215e0 65 20 41 20 61 6e 64 20 42 20 6f 70 65 72 61 6e  e A and B operan
215f0 64 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a  ds are stored.**
21600 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20   in p->a[0] and 
21610 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63 74  p->a[1], respect
21620 69 76 65 6c 79 2e 20 20 54 68 65 20 70 61 72 73  ively.  The pars
21630 65 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f  er initially sto
21640 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61  res the.** opera
21650 74 6f 72 20 77 69 74 68 20 41 2e 20 20 54 68 69  tor with A.  Thi
21660 73 20 72 6f 75 74 69 6e 65 20 73 68 69 66 74 73  s routine shifts
21670 20 74 68 61 74 20 6f 70 65 72 61 74 6f 72 20 6f   that operator o
21680 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69  ver to B..*/.voi
21690 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
216a0 53 68 69 66 74 4a 6f 69 6e 54 79 70 65 28 53 72  ShiftJoinType(Sr
216b0 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 69 66 28  cList *p){.  if(
216c0 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b   p ){.    int i;
216d0 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53  .    for(i=p->nS
216e0 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  rc-1; i>0; i--){
216f0 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 66  .      p->a[i].f
21700 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d 3e  g.jointype = p->
21710 61 5b 69 2d 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79  a[i-1].fg.jointy
21720 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  pe;.    }.    p-
21730 3e 61 5b 30 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70  >a[0].fg.jointyp
21740 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  e = 0;.  }.}../*
21750 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
21760 45 20 63 6f 64 65 20 66 6f 72 20 61 20 42 45 47  E code for a BEG
21770 49 4e 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  IN statement..*/
21780 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67  .void sqlite3Beg
21790 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  inTransaction(Pa
217a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
217b0 20 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65   type){.  sqlite
217c0 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
217d0 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73  ;.  int i;..  as
217e0 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20  sert( pParse!=0 
217f0 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  );.  db = pParse
21800 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
21810 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  db!=0 );.  if( s
21820 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
21830 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
21840 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47  RANSACTION, "BEG
21850 49 4e 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  IN", 0, 0) ){.  
21860 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
21870 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
21880 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
21890 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( !v ) return;. 
218a0 20 69 66 28 20 74 79 70 65 21 3d 54 4b 5f 44 45   if( type!=TK_DE
218b0 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20 66 6f  FERRED ){.    fo
218c0 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
218d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
218e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
218f0 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  v, OP_Transactio
21900 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f  n, i, (type==TK_
21910 45 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20  EXCLUSIVE)+1);. 
21920 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21930 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 29 3b  UsesBtree(v, i);
21940 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
21950 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
21960 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 29  , OP_AutoCommit)
21970 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
21980 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 66 6f  ate VDBE code fo
21990 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f  r a COMMIT or RO
219a0 4c 4c 42 41 43 4b 20 73 74 61 74 65 6d 65 6e 74  LLBACK statement
219b0 2e 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 52 4f  ..** Code for RO
219c0 4c 4c 42 41 43 4b 20 69 73 20 67 65 6e 65 72 61  LLBACK is genera
219d0 74 65 64 20 69 66 20 65 54 79 70 65 3d 3d 54 4b  ted if eType==TK
219e0 5f 52 4f 4c 4c 42 41 43 4b 2e 20 20 4f 74 68 65  _ROLLBACK.  Othe
219f0 72 77 69 73 65 0a 2a 2a 20 63 6f 64 65 20 69 73  rwise.** code is
21a00 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 61   generated for a
21a10 20 43 4f 4d 4d 49 54 2e 0a 2a 2f 0a 76 6f 69 64   COMMIT..*/.void
21a20 20 73 71 6c 69 74 65 33 45 6e 64 54 72 61 6e 73   sqlite3EndTrans
21a30 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
21a40 61 72 73 65 2c 20 69 6e 74 20 65 54 79 70 65 29  arse, int eType)
21a50 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  {.  Vdbe *v;.  i
21a60 6e 74 20 69 73 52 6f 6c 6c 62 61 63 6b 3b 0a 0a  nt isRollback;..
21a70 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
21a80 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a90 20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20 29   pParse->db!=0 )
21aa0 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  ;.  assert( eTyp
21ab0 65 3d 3d 54 4b 5f 43 4f 4d 4d 49 54 20 7c 7c 20  e==TK_COMMIT || 
21ac0 65 54 79 70 65 3d 3d 54 4b 5f 45 4e 44 20 7c 7c  eType==TK_END ||
21ad0 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c 42   eType==TK_ROLLB
21ae0 41 43 4b 20 29 3b 0a 20 20 69 73 52 6f 6c 6c 62  ACK );.  isRollb
21af0 61 63 6b 20 3d 20 65 54 79 70 65 3d 3d 54 4b 5f  ack = eType==TK_
21b00 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 69 66 28 20  ROLLBACK;.  if( 
21b10 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
21b20 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
21b30 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 0a 20 20  TRANSACTION, .  
21b40 20 20 20 20 20 69 73 52 6f 6c 6c 62 61 63 6b 20       isRollback 
21b50 3f 20 22 52 4f 4c 4c 42 41 43 4b 22 20 3a 20 22  ? "ROLLBACK" : "
21b60 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29  COMMIT", 0, 0) )
21b70 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
21b80 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  }.  v = sqlite3G
21b90 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
21ba0 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
21bb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21bc0 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  (v, OP_AutoCommi
21bd0 74 2c 20 31 2c 20 69 73 52 6f 6c 6c 62 61 63 6b  t, 1, isRollback
21be0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
21bf0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
21c00 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
21c10 61 72 73 65 72 20 77 68 65 6e 20 69 74 20 70 61  arser when it pa
21c20 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e 64 20 74  rses a command t
21c30 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20 72 65 6c  o create,.** rel
21c40 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
21c50 20 61 6e 20 53 51 4c 20 73 61 76 65 70 6f 69 6e   an SQL savepoin
21c60 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  t. .*/.void sqli
21c70 74 65 33 53 61 76 65 70 6f 69 6e 74 28 50 61 72  te3Savepoint(Par
21c80 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
21c90 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  op, Token *pName
21ca0 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  ){.  char *zName
21cb0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
21cc0 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
21cd0 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  db, pName);.  if
21ce0 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 56  ( zName ){.    V
21cf0 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
21d00 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
21d10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21d20 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
21d30 4f 4e 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  ON.    static co
21d40 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  nst char * const
21d50 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45 47 49 4e   az[] = { "BEGIN
21d60 22 2c 20 22 52 45 4c 45 41 53 45 22 2c 20 22 52  ", "RELEASE", "R
21d70 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20 20 20 20  OLLBACK" };.    
21d80 61 73 73 65 72 74 28 20 21 53 41 56 45 50 4f 49  assert( !SAVEPOI
21d90 4e 54 5f 42 45 47 49 4e 20 26 26 20 53 41 56 45  NT_BEGIN && SAVE
21da0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3d 3d 31  POINT_RELEASE==1
21db0 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f   && SAVEPOINT_RO
21dc0 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e  LLBACK==2 );.#en
21dd0 64 69 66 0a 20 20 20 20 69 66 28 20 21 76 20 7c  dif.    if( !v |
21de0 7c 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  | sqlite3AuthChe
21df0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
21e00 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20 61 7a 5b  E_SAVEPOINT, az[
21e10 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29 20 29  op], zName, 0) )
21e20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
21e30 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
21e40 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
21e50 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
21e60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21e70 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76 65 70 6f  Op4(v, OP_Savepo
21e80 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 7a  int, op, 0, 0, z
21e90 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43  Name, P4_DYNAMIC
21ea0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
21eb0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 54 45  Make sure the TE
21ec0 4d 50 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  MP database is o
21ed0 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62 6c  pen and availabl
21ee0 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74 75  e for use.  Retu
21ef0 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
21f00 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65 61   of errors.  Lea
21f10 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  ve any error mes
21f20 73 61 67 65 73 20 69 6e 20 74 68 65 20 70 50 61  sages in the pPa
21f30 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
21f40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65  /.int sqlite3Ope
21f50 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50 61  nTempDatabase(Pa
21f60 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
21f70 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
21f80 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
21f90 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d  db->aDb[1].pBt==
21fa0 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78  0 && !pParse->ex
21fb0 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74  plain ){.    int
21fc0 20 72 63 3b 0a 20 20 20 20 42 74 72 65 65 20 2a   rc;.    Btree *
21fd0 70 42 74 3b 0a 20 20 20 20 73 74 61 74 69 63 20  pBt;.    static 
21fe0 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
21ff0 3d 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  = .          SQL
22000 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
22010 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  TE |.          S
22020 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
22030 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  E |.          SQ
22040 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
22050 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  IVE |.          
22060 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
22070 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20  TEONCLOSE |.    
22080 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
22090 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20 20  N_TEMP_DB;..    
220a0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
220b0 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20  eOpen(db->pVfs, 
220c0 30 2c 20 64 62 2c 20 26 70 42 74 2c 20 30 2c 20  0, db, &pBt, 0, 
220d0 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  flags);.    if( 
220e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
220f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
22100 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
22110 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61  unable to open a
22120 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
22130 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22 66  ase ".        "f
22140 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ile for storing 
22150 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
22160 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ");.      pParse
22170 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
22180 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
22190 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  .    db->aDb[1].
221a0 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 61  pBt = pBt;.    a
221b0 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 31  ssert( db->aDb[1
221c0 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ].pSchema );.   
221d0 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   if( SQLITE_NOME
221e0 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 53  M==sqlite3BtreeS
221f0 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 2c 20  etPageSize(pBt, 
22200 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65  db->nextPagesize
22210 2c 20 2d 31 2c 20 30 29 20 29 7b 0a 20 20 20 20  , -1, 0) ){.    
22220 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
22230 74 28 64 62 29 3b 0a 20 20 20 20 20 20 72 65 74  t(db);.      ret
22240 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
22250 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
22260 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65  /*.** Record the
22270 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 73   fact that the s
22280 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 77 69 6c  chema cookie wil
22290 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 76 65 72  l need to be ver
222a0 69 66 69 65 64 0a 2a 2a 20 66 6f 72 20 64 61 74  ified.** for dat
222b0 61 62 61 73 65 20 69 44 62 2e 20 20 54 68 65 20  abase iDb.  The 
222c0 63 6f 64 65 20 74 6f 20 61 63 74 75 61 6c 6c 79  code to actually
222d0 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65   verify the sche
222e0 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a 20 77 69 6c  ma cookie.** wil
222f0 6c 20 6f 63 63 75 72 20 61 74 20 74 68 65 20 65  l occur at the e
22300 6e 64 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65  nd of the top-le
22310 76 65 6c 20 56 44 42 45 20 61 6e 64 20 77 69 6c  vel VDBE and wil
22320 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  l be generated.*
22330 2a 20 6c 61 74 65 72 2c 20 62 79 20 73 71 6c 69  * later, by sqli
22340 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28  te3FinishCoding(
22350 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
22360 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
22370 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
22380 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61  , int iDb){.  Pa
22390 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
223a0 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
223b0 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a  level(pParse);..
223c0 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
223d0 20 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d 3e   && iDb<pParse->
223e0 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
223f0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
22400 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30  >aDb[iDb].pBt!=0
22410 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20   || iDb==1 );.  
22420 61 73 73 65 72 74 28 20 69 44 62 3c 53 51 4c 49  assert( iDb<SQLI
22430 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2b  TE_MAX_ATTACHED+
22440 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  2 );.  assert( s
22450 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
22460 78 48 65 6c 64 28 70 50 61 72 73 65 2d 3e 64 62  xHeld(pParse->db
22470 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 69  , iDb, 0) );.  i
22480 66 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 54  f( DbMaskTest(pT
22490 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d  oplevel->cookieM
224a0 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20 29 7b 0a  ask, iDb)==0 ){.
224b0 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70 54      DbMaskSet(pT
224c0 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d  oplevel->cookieM
224d0 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 20 20 69  ask, iDb);.    i
224e0 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
224f0 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
22500 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65     sqlite3OpenTe
22510 6d 70 44 61 74 61 62 61 73 65 28 70 54 6f 70 6c  mpDatabase(pTopl
22520 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  evel);.    }.  }
22530 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72 67  .}../*.** If arg
22540 75 6d 65 6e 74 20 7a 44 62 20 69 73 20 4e 55 4c  ument zDb is NUL
22550 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20 73 71 6c  L, then call sql
22560 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
22570 68 65 6d 61 28 29 20 66 6f 72 20 65 61 63 68 20  hema() for each 
22580 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74  .** attached dat
22590 61 62 61 73 65 2e 20 4f 74 68 65 72 77 69 73 65  abase. Otherwise
225a0 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66 6f 72 20  , invoke it for 
225b0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
225c0 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ed zDb only..*/.
225d0 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65  void sqlite3Code
225e0 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d  VerifyNamedSchem
225f0 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  a(Parse *pParse,
22600 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
22610 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
22620 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
22630 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
22640 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
22650 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20  +){.    Db *pDb 
22660 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
22670 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20     if( pDb->pBt 
22680 26 26 20 28 21 7a 44 62 20 7c 7c 20 30 3d 3d 73  && (!zDb || 0==s
22690 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44  qlite3StrICmp(zD
226a0 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65  b, pDb->zDbSName
226b0 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  )) ){.      sqli
226c0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
226d0 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a  ema(pParse, i);.
226e0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
226f0 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
22700 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61   code that prepa
22710 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e  res for doing an
22720 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a   operation that.
22730 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ** might change 
22740 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
22750 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
22760 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72   starts a new tr
22770 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20  ansaction if we 
22780 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  are not already 
22790 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e  within.** a tran
227a0 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20  saction.  If we 
227b0 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68  are already with
227c0 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
227d0 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f  , then a checkpo
227e0 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66  int.** is set if
227f0 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e   the setStatemen
22800 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
22810 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69  rue.  A checkpoi
22820 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nt should.** be 
22830 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f  set for operatio
22840 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61  ns that might fa
22850 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e  il (due to a con
22860 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66  straint) part of
22870 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f  .** the way thro
22880 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69  ugh and which wi
22890 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20  ll need to undo 
228a0 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68  some writes with
228b0 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a  out having to.**
228c0 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68   rollback the wh
228d0 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ole transaction.
228e0 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73    For operations
228f0 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74   where all const
22900 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65  raints.** can be
22910 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20   checked before 
22920 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20  any changes are 
22930 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
22940 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65  base, it is neve
22950 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74  r.** necessary t
22960 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61  o undo a write a
22970 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  nd the checkpoin
22980 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
22990 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
229a0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
229b0 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  eration(Parse *p
229c0 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74  Parse, int setSt
229d0 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62  atement, int iDb
229e0 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70  ){.  Parse *pTop
229f0 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
22a00 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
22a10 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  rse);.  sqlite3C
22a20 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
22a30 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
22a40 44 62 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c 65  DbMaskSet(pTople
22a50 76 65 6c 2d 3e 77 72 69 74 65 4d 61 73 6b 2c 20  vel->writeMask, 
22a60 69 44 62 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  iDb);.  pTopleve
22a70 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20  l->isMultiWrite 
22a80 7c 3d 20 73 65 74 53 74 61 74 65 6d 65 6e 74 3b  |= setStatement;
22a90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61  .}../*.** Indica
22aa0 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74  te that the stat
22ab0 65 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20  ement currently 
22ac0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
22ad0 6f 6e 20 6d 69 67 68 74 20 77 72 69 74 65 0a 2a  on might write.*
22ae0 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  * more than one 
22af0 65 6e 74 72 79 20 28 65 78 61 6d 70 6c 65 3a 20  entry (example: 
22b00 64 65 6c 65 74 69 6e 67 20 6f 6e 65 20 72 6f 77  deleting one row
22b10 20 74 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20   then inserting 
22b20 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e 73 65  another,.** inse
22b30 72 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 72  rting multiple r
22b40 6f 77 73 20 69 6e 20 61 20 74 61 62 6c 65 2c 20  ows in a table, 
22b50 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 61 20 72  or inserting a r
22b60 6f 77 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74  ow and index ent
22b70 72 69 65 73 2e 29 0a 2a 2a 20 49 66 20 61 6e 20  ries.).** If an 
22b80 61 62 6f 72 74 20 6f 63 63 75 72 73 20 61 66 74  abort occurs aft
22b90 65 72 20 73 6f 6d 65 20 6f 66 20 74 68 65 73 65  er some of these
22ba0 20 77 72 69 74 65 73 20 68 61 76 65 20 63 6f 6d   writes have com
22bb0 70 6c 65 74 65 64 2c 20 74 68 65 6e 20 69 74 20  pleted, then it 
22bc0 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63 65 73  will.** be neces
22bd0 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 74 68 65  sary to undo the
22be0 20 63 6f 6d 70 6c 65 74 65 64 20 77 72 69 74 65   completed write
22bf0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
22c00 65 33 4d 75 6c 74 69 57 72 69 74 65 28 50 61 72  e3MultiWrite(Par
22c10 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50  se *pParse){.  P
22c20 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
22c30 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
22c40 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
22c50 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d    pToplevel->isM
22c60 75 6c 74 69 57 72 69 74 65 20 3d 20 31 3b 0a 7d  ultiWrite = 1;.}
22c70 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 64  ../* .** The cod
22c80 65 20 67 65 6e 65 72 61 74 6f 72 20 63 61 6c 6c  e generator call
22c90 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  s this routine i
22ca0 66 20 69 73 20 64 69 73 63 6f 76 65 72 73 20 74  f is discovers t
22cb0 68 61 74 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73  hat it is.** pos
22cc0 73 69 62 6c 65 20 74 6f 20 61 62 6f 72 74 20 61  sible to abort a
22cd0 20 73 74 61 74 65 6d 65 6e 74 20 70 72 69 6f 72   statement prior
22ce0 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20   to completion. 
22cf0 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 0a 2a 2a   In order to .**
22d00 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 61 62   perform this ab
22d10 6f 72 74 20 77 69 74 68 6f 75 74 20 63 6f 72 72  ort without corr
22d20 75 70 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  upting the datab
22d30 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  ase, we need to 
22d40 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 74 68 61  make.** sure tha
22d50 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
22d60 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79 20  is protected by 
22d70 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
22d80 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  saction..**.** T
22d90 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6f  echnically, we o
22da0 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 65 74 20  nly need to set 
22db0 74 68 65 20 6d 61 79 41 62 6f 72 74 20 66 6c 61  the mayAbort fla
22dc0 67 20 69 66 20 74 68 65 0a 2a 2a 20 69 73 4d 75  g if the.** isMu
22dd0 6c 74 69 57 72 69 74 65 20 66 6c 61 67 20 77 61  ltiWrite flag wa
22de0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74  s previously set
22df0 2e 20 20 54 68 65 72 65 20 69 73 20 61 20 74 69  .  There is a ti
22e00 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a  me dependency.**
22e10 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 61   such that the a
22e20 62 6f 72 74 20 6d 75 73 74 20 6f 63 63 75 72 20  bort must occur 
22e30 61 66 74 65 72 20 74 68 65 20 6d 75 6c 74 69 77  after the multiw
22e40 72 69 74 65 2e 20 20 54 68 69 73 20 6d 61 6b 65  rite.  This make
22e50 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 61 74 65 6d  s.** some statem
22e60 65 6e 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 74  ents involving t
22e70 68 65 20 52 45 50 4c 41 43 45 20 63 6f 6e 66 6c  he REPLACE confl
22e80 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
22e90 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f 20 61  lgorithm.** go a
22ea0 20 6c 69 74 74 6c 65 20 66 61 73 74 65 72 2e 20   little faster. 
22eb0 20 42 75 74 20 74 61 6b 69 6e 67 20 61 64 76 61   But taking adva
22ec0 6e 74 61 67 65 20 6f 66 20 74 68 69 73 20 74 69  ntage of this ti
22ed0 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a  me dependency.**
22ee0 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72 65 20 64   makes it more d
22ef0 69 66 66 69 63 75 6c 74 20 74 6f 20 70 72 6f 76  ifficult to prov
22f00 65 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20  e that the code 
22f10 69 73 20 63 6f 72 72 65 63 74 20 28 69 6e 20 0a  is correct (in .
22f20 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 2c 20 69  ** particular, i
22f30 74 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72  t prevents us fr
22f40 6f 6d 20 77 72 69 74 69 6e 67 20 61 6e 20 65 66  om writing an ef
22f50 66 65 63 74 69 76 65 0a 2a 2a 20 69 6d 70 6c 65  fective.** imple
22f60 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71 6c  mentation of sql
22f70 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
22f80 72 74 28 29 29 20 61 6e 64 20 73 6f 20 77 65 20  rt()) and so we 
22f90 68 61 76 65 20 63 68 6f 73 65 6e 0a 2a 2a 20 74  have chosen.** t
22fa0 6f 20 74 61 6b 65 20 74 68 65 20 73 61 66 65 20  o take the safe 
22fb0 72 6f 75 74 65 20 61 6e 64 20 73 6b 69 70 20 74  route and skip t
22fc0 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  he optimization.
22fd0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22fe0 4d 61 79 41 62 6f 72 74 28 50 61 72 73 65 20 2a  MayAbort(Parse *
22ff0 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65  pParse){.  Parse
23000 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
23010 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
23020 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54  el(pParse);.  pT
23030 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41 62 6f 72  oplevel->mayAbor
23040 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 1;.}../*.** 
23050 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20  Code an OP_Halt 
23060 74 68 61 74 20 63 61 75 73 65 73 20 74 68 65 20  that causes the 
23070 76 64 62 65 20 74 6f 20 72 65 74 75 72 6e 20 61  vdbe to return a
23080 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
23090 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e 20 54 68  INT.** error. Th
230a0 65 20 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d 65  e onError parame
230b0 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ter determines w
230c0 68 69 63 68 20 28 69 66 20 61 6e 79 29 20 6f 66  hich (if any) of
230d0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   the statement.*
230e0 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72 65 6e 74  * and/or current
230f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
23100 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a  rolled back..*/.
23110 76 6f 69 64 20 73 71 6c 69 74 65 33 48 61 6c 74  void sqlite3Halt
23120 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61  Constraint(.  Pa
23130 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
23140 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
23150 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43  xt */.  int errC
23160 6f 64 65 2c 20 20 20 20 20 20 2f 2a 20 65 78 74  ode,      /* ext
23170 65 6e 64 65 64 20 65 72 72 6f 72 20 63 6f 64 65  ended error code
23180 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
23190 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74  r,      /* Const
231a0 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20  raint type */.  
231b0 63 68 61 72 20 2a 70 34 2c 20 20 20 20 20 20 20  char *p4,       
231c0 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61    /* Error messa
231d0 67 65 20 2a 2f 0a 20 20 69 38 20 70 34 74 79 70  ge */.  i8 p4typ
231e0 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 34 5f  e,        /* P4_
231f0 53 54 41 54 49 43 20 6f 72 20 50 34 5f 54 52 41  STATIC or P4_TRA
23200 4e 53 49 45 4e 54 20 2a 2f 0a 20 20 75 38 20 70  NSIENT */.  u8 p
23210 35 45 72 72 6d 73 67 20 20 20 20 20 20 20 2f 2a  5Errmsg       /*
23220 20 50 35 5f 45 72 72 4d 73 67 20 74 79 70 65 20   P5_ErrMsg type 
23230 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
23240 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
23250 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
23260 72 74 28 20 28 65 72 72 43 6f 64 65 26 30 78 66  rt( (errCode&0xf
23270 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  f)==SQLITE_CONST
23280 52 41 49 4e 54 20 29 3b 0a 20 20 69 66 28 20 6f  RAINT );.  if( o
23290 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74  nError==OE_Abort
232a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d   ){.    sqlite3M
232b0 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
232c0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
232d0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48  beAddOp4(v, OP_H
232e0 61 6c 74 2c 20 65 72 72 43 6f 64 65 2c 20 6f 6e  alt, errCode, on
232f0 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70 34  Error, 0, p4, p4
23300 74 79 70 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  type);.  sqlite3
23310 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
23320 70 35 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a  p5Errmsg);.}../*
23330 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48  .** Code an OP_H
23340 61 6c 74 20 64 75 65 20 74 6f 20 55 4e 49 51 55  alt due to UNIQU
23350 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59  E or PRIMARY KEY
23360 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c   constraint viol
23370 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
23380 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73  qlite3UniqueCons
23390 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20  traint(.  Parse 
233a0 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
233b0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
233c0 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
233d0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61        /* Constra
233e0 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20 49 6e  int type */.  In
233f0 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
23400 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68 61  /* The index tha
23410 74 20 74 72 69 67 67 65 72 73 20 74 68 65 20 63  t triggers the c
23420 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a  onstraint */.){.
23430 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20    char *zErr;.  
23440 69 6e 74 20 6a 3b 0a 20 20 53 74 72 41 63 63 75  int j;.  StrAccu
23450 6d 20 65 72 72 4d 73 67 3b 0a 20 20 54 61 62 6c  m errMsg;.  Tabl
23460 65 20 2a 70 54 61 62 20 3d 20 70 49 64 78 2d 3e  e *pTab = pIdx->
23470 70 54 61 62 6c 65 3b 0a 0a 20 20 73 71 6c 69 74  pTable;..  sqlit
23480 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26  e3StrAccumInit(&
23490 65 72 72 4d 73 67 2c 20 70 50 61 72 73 65 2d 3e  errMsg, pParse->
234a0 64 62 2c 20 30 2c 20 30 2c 20 32 30 30 29 3b 0a  db, 0, 0, 200);.
234b0 20 20 69 66 28 20 70 49 64 78 2d 3e 61 43 6f 6c    if( pIdx->aCol
234c0 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  Expr ){.    sqli
234d0 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
234e0 26 65 72 72 4d 73 67 2c 20 22 69 6e 64 65 78 20  &errMsg, "index 
234f0 27 25 71 27 22 2c 20 70 49 64 78 2d 3e 7a 4e 61  '%q'", pIdx->zNa
23500 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me);.  }else{.  
23510 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64    for(j=0; j<pId
23520 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29  x->nKeyCol; j++)
23530 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  {.      char *zC
23540 6f 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ol;.      assert
23550 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
23560 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  [j]>=0 );.      
23570 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  zCol = pTab->aCo
23580 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  l[pIdx->aiColumn
23590 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  [j]].zName;.    
235a0 20 20 69 66 28 20 6a 20 29 20 73 71 6c 69 74 65    if( j ) sqlite
235b0 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 26 65 72  3_str_append(&er
235c0 72 4d 73 67 2c 20 22 2c 20 22 2c 20 32 29 3b 0a  rMsg, ", ", 2);.
235d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
235e0 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26 65 72 72  r_appendall(&err
235f0 4d 73 67 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  Msg, pTab->zName
23600 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
23610 5f 73 74 72 5f 61 70 70 65 6e 64 28 26 65 72 72  _str_append(&err
23620 4d 73 67 2c 20 22 2e 22 2c 20 31 29 3b 0a 20 20  Msg, ".", 1);.  
23630 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
23640 61 70 70 65 6e 64 61 6c 6c 28 26 65 72 72 4d 73  appendall(&errMs
23650 67 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a  g, zCol);.    }.
23660 20 20 7d 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c    }.  zErr = sql
23670 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69  ite3StrAccumFini
23680 73 68 28 26 65 72 72 4d 73 67 29 3b 0a 20 20 73  sh(&errMsg);.  s
23690 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72  qlite3HaltConstr
236a0 61 69 6e 74 28 70 50 61 72 73 65 2c 20 0a 20 20  aint(pParse, .  
236b0 20 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e    IsPrimaryKeyIn
236c0 64 65 78 28 70 49 64 78 29 20 3f 20 53 51 4c 49  dex(pIdx) ? SQLI
236d0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52  TE_CONSTRAINT_PR
236e0 49 4d 41 52 59 4b 45 59 20 0a 20 20 20 20 20 20  IMARYKEY .      
236f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23700 20 20 20 20 20 20 3a 20 53 51 4c 49 54 45 5f 43        : SQLITE_C
23710 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45  ONSTRAINT_UNIQUE
23720 2c 0a 20 20 20 20 6f 6e 45 72 72 6f 72 2c 20 7a  ,.    onError, z
23730 45 72 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c  Err, P4_DYNAMIC,
23740 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e   P5_ConstraintUn
23750 69 71 75 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ique);.}.../*.**
23760 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74   Code an OP_Halt
23770 20 64 75 65 20 74 6f 20 6e 6f 6e 2d 75 6e 69 71   due to non-uniq
23780 75 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f 69  ue rowid..*/.voi
23790 64 20 73 71 6c 69 74 65 33 52 6f 77 69 64 43 6f  d sqlite3RowidCo
237a0 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
237b0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
237c0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
237d0 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
237e0 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c  r,      /* Confl
237f0 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
23800 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 54 61  lgorithm */.  Ta
23810 62 6c 65 20 2a 70 54 61 62 20 20 20 20 20 20 20  ble *pTab       
23820 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 77 69 74  /* The table wit
23830 68 20 74 68 65 20 6e 6f 6e 2d 75 6e 69 71 75 65  h the non-unique
23840 20 72 6f 77 69 64 20 2a 2f 20 0a 29 7b 0a 20 20   rowid */ .){.  
23850 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 69 6e  char *zMsg;.  in
23860 74 20 72 63 3b 0a 20 20 69 66 28 20 70 54 61 62  t rc;.  if( pTab
23870 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20  ->iPKey>=0 ){.  
23880 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
23890 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
238a0 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61  db, "%s.%s", pTa
238b0 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
238c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238d0 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70      pTab->aCol[p
238e0 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d  Tab->iPKey].zNam
238f0 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  e);.    rc = SQL
23900 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50  ITE_CONSTRAINT_P
23910 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20 7d 65 6c  RIMARYKEY;.  }el
23920 73 65 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73  se{.    zMsg = s
23930 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50  qlite3MPrintf(pP
23940 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 72 6f  arse->db, "%s.ro
23950 77 69 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  wid", pTab->zNam
23960 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  e);.    rc = SQL
23970 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52  ITE_CONSTRAINT_R
23980 4f 57 49 44 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  OWID;.  }.  sqli
23990 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
239a0 74 28 70 50 61 72 73 65 2c 20 72 63 2c 20 6f 6e  t(pParse, rc, on
239b0 45 72 72 6f 72 2c 20 7a 4d 73 67 2c 20 50 34 5f  Error, zMsg, P4_
239c0 44 59 4e 41 4d 49 43 2c 0a 20 20 20 20 20 20 20  DYNAMIC,.       
239d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239e0 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e   P5_ConstraintUn
239f0 69 71 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ique);.}../*.** 
23a00 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
23a10 70 49 6e 64 65 78 20 75 73 65 73 20 74 68 65 20  pIndex uses the 
23a20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
23a30 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72  ce pColl.  Retur
23a40 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20  n.** true if it 
23a50 64 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69  does and false i
23a60 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a  f it does not..*
23a70 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
23a80 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74  _OMIT_REINDEX.st
23a90 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69  atic int collati
23aa0 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68  onMatch(const ch
23ab0 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78  ar *zColl, Index
23ac0 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74   *pIndex){.  int
23ad0 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43   i;.  assert( zC
23ae0 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28  oll!=0 );.  for(
23af0 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e  i=0; i<pIndex->n
23b00 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
23b10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
23b20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  = pIndex->azColl
23b30 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [i];.    assert(
23b40 20 7a 21 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d   z!=0 || pIndex-
23b50 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3c 30 20 29  >aiColumn[i]<0 )
23b60 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  ;.    if( pIndex
23b70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30  ->aiColumn[i]>=0
23b80 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
23b90 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20  rICmp(z, zColl) 
23ba0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
23bb0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
23bc0 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
23bd0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75  f../*.** Recompu
23be0 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
23bf0 66 20 70 54 61 62 20 74 68 61 74 20 75 73 65 20  f pTab that use 
23c00 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
23c10 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a  quence pColl..**
23c20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65   If pColl==0 the
23c30 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  n recompute all 
23c40 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e  indices of pTab.
23c50 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
23c60 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
23c70 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e  static void rein
23c80 64 65 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a  dexTable(Parse *
23c90 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
23ca0 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73 74 20  Tab, char const 
23cb0 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78  *zColl){.  Index
23cc0 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
23cd0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
23ce0 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
23cf0 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f  th pTab */..  fo
23d00 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70  r(pIndex=pTab->p
23d10 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70  Index; pIndex; p
23d20 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e  Index=pIndex->pN
23d30 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 7a 43  ext){.    if( zC
23d40 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74  oll==0 || collat
23d50 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20  ionMatch(zColl, 
23d60 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20  pIndex) ){.     
23d70 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
23d80 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
23d90 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
23da0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
23db0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
23dc0 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
23dd0 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20  rse, 0, iDb);.  
23de0 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
23df0 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
23e00 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20  Index, -1);.    
23e10 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
23e20 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20  /*.** Recompute 
23e30 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 61  all indices of a
23e40 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c  ll tables in all
23e50 20 64 61 74 61 62 61 73 65 73 20 77 68 65 72 65   databases where
23e60 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20   the.** indices 
23e70 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  use the collatin
23e80 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
23e90 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74  .  If pColl==0 t
23ea0 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a  hen recompute.**
23eb0 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76 65   all indices eve
23ec0 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e  rywhere..*/.#ifn
23ed0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
23ee0 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76  REINDEX.static v
23ef0 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74 61 62  oid reindexDatab
23f00 61 73 65 73 28 50 61 72 73 65 20 2a 70 50 61 72  ases(Parse *pPar
23f10 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  se, char const *
23f20 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44  zColl){.  Db *pD
23f30 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
23f40 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
23f50 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
23f60 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
23f70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
23f80 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  he database inde
23f90 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71  x number */.  sq
23fa0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
23fb0 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65  se->db;   /* The
23fc0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
23fd0 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c  tion */.  HashEl
23fe0 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20  em *k;          
23ff0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
24000 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73  ping over tables
24010 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62   in pDb */.  Tab
24020 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
24030 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61           /* A ta
24040 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
24050 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ase */..  assert
24060 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
24070 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62  ldsAllMutexes(db
24080 29 20 29 3b 20 20 2f 2a 20 4e 65 65 64 65 64 20  ) );  /* Needed 
24090 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65 73  for schema acces
240a0 73 20 2a 2f 0a 20 20 66 6f 72 28 69 44 62 3d 30  s */.  for(iDb=0
240b0 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69  , pDb=db->aDb; i
240c0 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
240d0 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 61  +, pDb++){.    a
240e0 73 73 65 72 74 28 20 70 44 62 21 3d 30 20 29 3b  ssert( pDb!=0 );
240f0 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74  .    for(k=sqlit
24100 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d  eHashFirst(&pDb-
24110 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
24120 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65  h);  k; k=sqlite
24130 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20  HashNext(k)){.  
24140 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c      pTab = (Tabl
24150 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74  e*)sqliteHashDat
24160 61 28 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e  a(k);.      rein
24170 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c  dexTable(pParse,
24180 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20   pTab, zColl);. 
24190 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
241a0 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
241b0 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52  e code for the R
241c0 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a  EINDEX command..
241d0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49  **.**        REI
241e0 4e 44 45 58 20 20 20 20 20 20 20 20 20 20 20 20  NDEX            
241f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24200 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 1.**        R
24210 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69  EINDEX  <collati
24220 6f 6e 3e 20 20 20 20 20 20 20 20 20 20 20 20 20  on>             
24230 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20    -- 2.**       
24240 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61   REINDEX  ?<data
24250 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d  base>.?<tablenam
24260 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20  e>  -- 3.**     
24270 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61     REINDEX  ?<da
24280 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e  tabase>.?<indexn
24290 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a  ame>  -- 4.**.**
242a0 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61   Form 1 causes a
242b0 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c  ll indices in al
242c0 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  l attached datab
242d0 61 73 65 73 20 74 6f 20 62 65 20 72 65 62 75 69  ases to be rebui
242e0 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65  lt..** Form 2 re
242f0 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63  builds all indic
24300 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61  es in all databa
24310 73 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65  ses that use the
24320 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74   named.** collat
24330 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46  ing function.  F
24340 6f 72 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62  orms 3 and 4 reb
24350 75 69 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69  uild the named i
24360 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69  ndex or all.** i
24370 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65  ndices associate
24380 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64  d with the named
24390 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64   table..*/.#ifnd
243a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
243b0 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69  EINDEX.void sqli
243c0 74 65 33 52 65 69 6e 64 65 78 28 50 61 72 73 65  te3Reindex(Parse
243d0 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
243e0 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a  *pName1, Token *
243f0 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53  pName2){.  CollS
24400 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20  eq *pColl;      
24410 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
24420 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20  ing sequence to 
24430 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72  be reindexed, or
24440 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20   NULL */.  char 
24450 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *z;             
24460 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
24470 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  f a table or ind
24480 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ex */.  const ch
24490 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20  ar *zDb;        
244a0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
244b0 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
244c0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
244d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
244e0 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64  A table in the d
244f0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64  atabase */.  Ind
24500 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20  ex *pIndex;     
24510 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
24520 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
24530 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69  with pTab */.  i
24540 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
24550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
24560 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  e database index
24570 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c   number */.  sql
24580 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
24590 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20  e->db;   /* The 
245a0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
245b0 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ion */.  Token *
245c0 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20  pObjName;       
245d0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
245e0 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  the table or ind
245f0 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78  ex to be reindex
24600 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64  ed */..  /* Read
24610 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
24620 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f  hema. If an erro
24630 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
24640 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
24650 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69  .  ** and code i
24660 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
24670 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69  urn NULL. */.  i
24680 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
24690 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
246a0 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72  pParse) ){.    r
246b0 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66  eturn;.  }..  if
246c0 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20  ( pName1==0 ){. 
246d0 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61     reindexDataba
246e0 73 65 73 28 70 50 61 72 73 65 2c 20 30 29 3b 0a  ses(pParse, 0);.
246f0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65      return;.  }e
24700 6c 73 65 20 69 66 28 20 4e 45 56 45 52 28 70 4e  lse if( NEVER(pN
24710 61 6d 65 32 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d  ame2==0) || pNam
24720 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  e2->z==0 ){.    
24730 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20  char *zColl;.   
24740 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 2d   assert( pName1-
24750 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20  >z );.    zColl 
24760 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
24770 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
24780 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20  b, pName1);.    
24790 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74  if( !zColl ) ret
247a0 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  urn;.    pColl =
247b0 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
247c0 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
247d0 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20   zColl, 0);.    
247e0 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
247f0 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61     reindexDataba
24800 73 65 73 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  ses(pParse, zCol
24810 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
24820 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c  3DbFree(db, zCol
24830 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  l);.      return
24840 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
24850 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43  te3DbFree(db, zC
24860 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20  oll);.  }.  iDb 
24870 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
24880 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
24890 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f  me1, pName2, &pO
248a0 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69  bjName);.  if( i
248b0 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Db<0 ) return;. 
248c0 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65   z = sqlite3Name
248d0 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f  FromToken(db, pO
248e0 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  bjName);.  if( z
248f0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
24900 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
24910 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 70  b].zDbSName;.  p
24920 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Tab = sqlite3Fin
24930 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44  dTable(db, z, zD
24940 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29  b);.  if( pTab )
24950 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61 62  {.    reindexTab
24960 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  le(pParse, pTab,
24970 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
24980 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
24990 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
249a0 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
249b0 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
249c0 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , zDb);.  sqlite
249d0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a  3DbFree(db, z);.
249e0 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a    if( pIndex ){.
249f0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
24a00 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
24a10 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
24a20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
24a30 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
24a40 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20  Index, -1);.    
24a50 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
24a60 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
24a70 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f  arse, "unable to
24a80 20 69 64 65 6e 74 69 66 79 20 74 68 65 20 6f 62   identify the ob
24a90 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69 6e 64  ject to be reind
24aa0 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66  exed");.}.#endif
24ab0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
24ac0 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
24ad0 72 65 20 74 68 61 74 20 69 73 20 61 70 70 72 6f  re that is appro
24ae0 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67  priate for the g
24af0 69 76 65 6e 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a  iven Index..**.*
24b00 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f  * The caller sho
24b10 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74  uld invoke sqlit
24b20 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 29  e3KeyInfoUnref()
24b30 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64   on the returned
24b40 20 6f 62 6a 65 63 74 0a 2a 2a 20 77 68 65 6e 20   object.** when 
24b50 69 74 20 68 61 73 20 66 69 6e 69 73 68 65 64 20  it has finished 
24b60 75 73 69 6e 67 20 69 74 2e 0a 2a 2f 0a 4b 65 79  using it..*/.Key
24b70 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79  Info *sqlite3Key
24b80 49 6e 66 6f 4f 66 49 6e 64 65 78 28 50 61 72 73  InfoOfIndex(Pars
24b90 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78  e *pParse, Index
24ba0 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74 20 69   *pIdx){.  int i
24bb0 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70  ;.  int nCol = p
24bc0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Idx->nColumn;.  
24bd0 69 6e 74 20 6e 4b 65 79 20 3d 20 70 49 64 78 2d  int nKey = pIdx-
24be0 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 4b 65 79 49  >nKeyCol;.  KeyI
24bf0 6e 66 6f 20 2a 70 4b 65 79 3b 0a 20 20 69 66 28  nfo *pKey;.  if(
24c00 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
24c10 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
24c20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  pIdx->uniqNotNul
24c30 6c 20 29 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20  l ){.    pKey = 
24c40 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
24c50 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  loc(pParse->db, 
24c60 6e 4b 65 79 2c 20 6e 43 6f 6c 2d 6e 4b 65 79 29  nKey, nCol-nKey)
24c70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
24c80 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  Key = sqlite3Key
24c90 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65  InfoAlloc(pParse
24ca0 2d 3e 64 62 2c 20 6e 43 6f 6c 2c 20 30 29 3b 0a  ->db, nCol, 0);.
24cb0 20 20 7d 0a 20 20 69 66 28 20 70 4b 65 79 20 29    }.  if( pKey )
24cc0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
24cd0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
24ce0 69 74 65 61 62 6c 65 28 70 4b 65 79 29 20 29 3b  iteable(pKey) );
24cf0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
24d00 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
24d10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
24d20 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f  oll = pIdx->azCo
24d30 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 70 4b 65  ll[i];.      pKe
24d40 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43  y->aColl[i] = zC
24d50 6f 6c 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72 42  oll==sqlite3StrB
24d60 49 4e 41 52 59 20 3f 20 30 20 3a 0a 20 20 20 20  INARY ? 0 :.    
24d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d80 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61 74      sqlite3Locat
24d90 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
24da0 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 70   zColl);.      p
24db0 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Key->aSortOrder[
24dc0 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74  i] = pIdx->aSort
24dd0 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a  Order[i];.    }.
24de0 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
24df0 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20 61 73  nErr ){.      as
24e00 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 72 63  sert( pParse->rc
24e10 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5f 4d  ==SQLITE_ERROR_M
24e20 49 53 53 49 4e 47 5f 43 4f 4c 4c 53 45 51 20 29  ISSING_COLLSEQ )
24e30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
24e40 2d 3e 62 4e 6f 51 75 65 72 79 3d 3d 30 20 29 7b  ->bNoQuery==0 ){
24e50 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 65 61 63  .        /* Deac
24e60 74 69 76 61 74 65 20 74 68 65 20 69 6e 64 65 78  tivate the index
24e70 20 62 65 63 61 75 73 65 20 69 74 20 63 6f 6e 74   because it cont
24e80 61 69 6e 73 20 61 6e 20 75 6e 6b 6e 6f 77 6e 20  ains an unknown 
24e90 63 6f 6c 6c 61 74 69 6e 67 0a 20 20 20 20 20 20  collating.      
24ea0 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 20    ** sequence.  
24eb0 54 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20  The only way to 
24ec0 72 65 61 63 74 69 76 65 20 74 68 65 20 69 6e 64  reactive the ind
24ed0 65 78 20 69 73 20 74 6f 20 72 65 6c 6f 61 64 20  ex is to reload 
24ee0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  the.        ** s
24ef0 63 68 65 6d 61 2e 20 20 41 64 64 69 6e 67 20 74  chema.  Adding t
24f00 68 65 20 6d 69 73 73 69 6e 67 20 63 6f 6c 6c 61  he missing colla
24f10 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6c 61  ting sequence la
24f20 74 65 72 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20  ter does not.   
24f30 20 20 20 20 20 2a 2a 20 72 65 61 63 74 69 76 65       ** reactive
24f40 20 74 68 65 20 69 6e 64 65 78 2e 20 20 54 68 65   the index.  The
24f50 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 68 61 64   application had
24f60 20 74 68 65 20 63 68 61 6e 63 65 20 74 6f 20 72   the chance to r
24f70 65 67 69 73 74 65 72 0a 20 20 20 20 20 20 20 20  egister.        
24f80 2a 2a 20 74 68 65 20 6d 69 73 73 69 6e 67 20 69  ** the missing i
24f90 6e 64 65 78 20 75 73 69 6e 67 20 74 68 65 20 63  ndex using the c
24fa0 6f 6c 6c 61 74 69 6f 6e 2d 6e 65 65 64 65 64 20  ollation-needed 
24fb0 63 61 6c 6c 62 61 63 6b 2e 20 20 46 6f 72 0a 20  callback.  For. 
24fc0 20 20 20 20 20 20 20 2a 2a 20 73 69 6d 70 6c 69         ** simpli
24fd0 63 69 74 79 2c 20 53 51 4c 69 74 65 20 77 69 6c  city, SQLite wil
24fe0 6c 20 6e 6f 74 20 67 69 76 65 20 74 68 65 20 61  l not give the a
24ff0 70 70 6c 69 63 61 74 69 6f 6e 20 61 20 73 65 63  pplication a sec
25000 6f 6e 64 20 63 68 61 6e 63 65 2e 0a 20 20 20 20  ond chance..    
25010 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
25020 49 64 78 2d 3e 62 4e 6f 51 75 65 72 79 20 3d 20  Idx->bNoQuery = 
25030 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  1;.        pPars
25040 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
25050 52 52 4f 52 5f 52 45 54 52 59 3b 0a 20 20 20 20  RROR_RETRY;.    
25060 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
25070 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b  3KeyInfoUnref(pK
25080 65 79 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 20  ey);.      pKey 
25090 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
250a0 20 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a   return pKey;.}.
250b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
250c0 4f 4d 49 54 5f 43 54 45 0a 2f 2a 20 0a 2a 2a 20  OMIT_CTE./* .** 
250d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
250e0 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 70 65 72  invoked once per
250f0 20 43 54 45 20 62 79 20 74 68 65 20 70 61 72 73   CTE by the pars
25100 65 72 20 77 68 69 6c 65 20 70 61 72 73 69 6e 67  er while parsing
25110 20 61 20 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75   a .** WITH clau
25120 73 65 2e 20 0a 2a 2f 0a 57 69 74 68 20 2a 73 71  se. .*/.With *sq
25130 6c 69 74 65 33 57 69 74 68 41 64 64 28 0a 20 20  lite3WithAdd(.  
25140 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
25150 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
25160 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
25170 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20  With *pWith,    
25180 20 20 20 20 20 20 20 20 2f 2a 20 45 78 69 73 74          /* Exist
25190 69 6e 67 20 57 49 54 48 20 63 6c 61 75 73 65 2c  ing WITH clause,
251a0 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   or NULL */.  To
251b0 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20  ken *pName,     
251c0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
251d0 20 74 68 65 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c   the common-tabl
251e0 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
251f0 2a 70 41 72 67 6c 69 73 74 2c 20 20 20 20 20 2f  *pArglist,     /
25200 2a 20 4f 70 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  * Optional colum
25210 6e 20 6e 61 6d 65 20 6c 69 73 74 20 66 6f 72 20  n name list for 
25220 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53  the table */.  S
25230 65 6c 65 63 74 20 2a 70 51 75 65 72 79 20 20 20  elect *pQuery   
25240 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20         /* Query 
25250 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69  used to initiali
25260 7a 65 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  ze the table */.
25270 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
25280 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
25290 20 57 69 74 68 20 2a 70 4e 65 77 3b 0a 20 20 63   With *pNew;.  c
252a0 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 2f  har *zName;..  /
252b0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
252c0 20 43 54 45 20 6e 61 6d 65 20 69 73 20 75 6e 69   CTE name is uni
252d0 71 75 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  que within this 
252e0 57 49 54 48 20 63 6c 61 75 73 65 2e 20 49 66 0a  WITH clause. If.
252f0 20 20 2a 2a 20 6e 6f 74 2c 20 73 74 6f 72 65 20    ** not, store 
25300 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  an error in the 
25310 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
25320 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71   */.  zName = sq
25330 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
25340 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
25350 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
25360 6d 65 20 26 26 20 70 57 69 74 68 20 29 7b 0a 20  me && pWith ){. 
25370 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
25380 72 28 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e  r(i=0; i<pWith->
25390 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCte; i++){.    
253a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
253b0 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 57 69 74  ICmp(zName, pWit
253c0 68 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  h->a[i].zName)==
253d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
253e0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
253f0 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20  rse, "duplicate 
25400 57 49 54 48 20 74 61 62 6c 65 20 6e 61 6d 65 3a  WITH table name:
25410 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
25420 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
25430 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a  .  if( pWith ){.
25440 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
25450 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 20 2b  sizeof(*pWith) +
25460 20 28 73 69 7a 65 6f 66 28 70 57 69 74 68 2d 3e   (sizeof(pWith->
25470 61 5b 31 5d 29 20 2a 20 70 57 69 74 68 2d 3e 6e  a[1]) * pWith->n
25480 43 74 65 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d  Cte);.    pNew =
25490 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
254a0 63 28 64 62 2c 20 70 57 69 74 68 2c 20 6e 42 79  c(db, pWith, nBy
254b0 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  te);.  }else{.  
254c0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
254d0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
254e0 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 29   sizeof(*pWith))
254f0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
25500 28 70 4e 65 77 21 3d 30 20 26 26 20 7a 4e 61 6d  (pNew!=0 && zNam
25510 65 21 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c  e!=0) || db->mal
25520 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20  locFailed );..  
25530 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
25540 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
25550 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
25560 65 28 64 62 2c 20 70 41 72 67 6c 69 73 74 29 3b  e(db, pArglist);
25570 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
25580 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 51 75  ctDelete(db, pQu
25590 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ery);.    sqlite
255a0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
255b0 65 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 70  e);.    pNew = p
255c0 57 69 74 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  With;.  }else{. 
255d0 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
255e0 3e 6e 43 74 65 5d 2e 70 53 65 6c 65 63 74 20 3d  >nCte].pSelect =
255f0 20 70 51 75 65 72 79 3b 0a 20 20 20 20 70 4e 65   pQuery;.    pNe
25600 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d  w->a[pNew->nCte]
25610 2e 70 43 6f 6c 73 20 3d 20 70 41 72 67 6c 69 73  .pCols = pArglis
25620 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70  t;.    pNew->a[p
25630 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 4e 61 6d 65  New->nCte].zName
25640 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 70 4e   = zName;.    pN
25650 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65  ew->a[pNew->nCte
25660 5d 2e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a 20  ].zCteErr = 0;. 
25670 20 20 20 70 4e 65 77 2d 3e 6e 43 74 65 2b 2b 3b     pNew->nCte++;
25680 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
25690 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  New;.}../*.** Fr
256a0 65 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ee the contents 
256b0 6f 66 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65  of the With obje
256c0 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
256d0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
256e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
256f0 33 57 69 74 68 44 65 6c 65 74 65 28 73 71 6c 69  3WithDelete(sqli
25700 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70  te3 *db, With *p
25710 57 69 74 68 29 7b 0a 20 20 69 66 28 20 70 57 69  With){.  if( pWi
25720 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  th ){.    int i;
25730 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
25740 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b  pWith->nCte; i++
25750 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
25760 43 74 65 20 2a 70 43 74 65 20 3d 20 26 70 57 69  Cte *pCte = &pWi
25770 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  th->a[i];.      
25780 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
25790 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e  elete(db, pCte->
257a0 70 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73 71  pCols);.      sq
257b0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
257c0 65 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c  e(db, pCte->pSel
257d0 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ect);.      sqli
257e0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43  te3DbFree(db, pC
257f0 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  te->zName);.    
25800 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
25810 72 65 65 28 64 62 2c 20 70 57 69 74 68 29 3b 0a  ree(db, pWith);.
25820 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
25830 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
25840 4f 4d 49 54 5f 43 54 45 29 20 2a 2f 0a           OMIT_CTE) */.