/ Hex Artifact Content
Login

Artifact d8f6ac1e9e484eb3f3921a8336d3dc6c87273d9db8729702162ef045997a1463:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
03a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
03b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
03c0: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
03d0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20  */.  int iTab;  
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03f0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
0400: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0410: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0420: 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20 20 20 20  sWriteLock;     
0430: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 77     /* True for w
0440: 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c 73  rite lock.  Fals
0450: 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f 63  e for a read loc
0460: 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  k */.  const cha
0470: 72 20 2a 7a 4c 6f 63 6b 4e 61 6d 65 3b 20 2f 2a  r *zLockName; /*
0480: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
0490: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
04a0: 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
04b0: 74 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20  that we want to 
04c0: 6c 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20  lock a table at 
04d0: 72 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a  run-time.  .**.*
04e0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
04f0: 65 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f  e locked has roo
0500: 74 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20  t page iTab and 
0510: 69 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61  is found in data
0520: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72  base iDb..** A r
0530: 65 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c  ead or a write l
0540: 6f 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e  ock can be taken
0550: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73   depending on is
0560: 57 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  Writelock..**.**
0570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
0580: 73 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66  st records the f
0590: 61 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63  act that the loc
05a0: 6b 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54  k is desired.  T
05b0: 68 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61  he.** code to ma
05c0: 6b 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75  ke the lock occu
05d0: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  r is generated b
05e0: 79 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74  y a later call t
05f0: 6f 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f  o.** codeTableLo
0600: 63 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75  cks() which occu
0610: 72 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  rs during sqlite
0620: 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
0630: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0640: 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72  TableLock(.  Par
0650: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0660: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0670: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
0680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
0690: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
06a0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
06b0: 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  he table to lock
06c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
06d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
06e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
06f0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0700: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0710: 73 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f  sWriteLock,    /
0720: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69  * True for a wri
0730: 74 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e  te lock */.  con
0740: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
0750: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0760: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0770: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
0780: 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
0790: 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
07a0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  l(pParse);.  int
07b0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   i;.  int nBytes
07c0: 3b 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70  ;.  TableLock *p
07d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
07e0: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62  =0 );..  if( iDb
07f0: 3d 3d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==1 ) return;.  
0800: 69 66 28 20 21 73 71 6c 69 74 65 33 42 74 72 65  if( !sqlite3Btre
0810: 65 53 68 61 72 61 62 6c 65 28 70 50 61 72 73 65  eSharable(pParse
0820: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ->db->aDb[iDb].p
0830: 42 74 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Bt) ) return;.  
0840: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 70 6c  for(i=0; i<pTopl
0850: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0860: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
0870: 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62  &pToplevel->aTab
0880: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0890: 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20 26  f( p->iDb==iDb &
08a0: 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62 20  & p->iTab==iTab 
08b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57 72  ){.      p->isWr
08c0: 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69 73  iteLock = (p->is
08d0: 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73 57  WriteLock || isW
08e0: 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  riteLock);.     
08f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
0900: 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20 73   }..  nBytes = s
0910: 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b 29  izeof(TableLock)
0920: 20 2a 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e   * (pToplevel->n
0930: 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20  TableLock+1);.  
0940: 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c  pToplevel->aTabl
0950: 65 4c 6f 63 6b 20 3d 0a 20 20 20 20 20 20 73 71  eLock =.      sq
0960: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
0970: 46 72 65 65 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  Free(pToplevel->
0980: 64 62 2c 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61  db, pToplevel->a
0990: 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74 65  TableLock, nByte
09a0: 73 29 3b 0a 20 20 69 66 28 20 70 54 6f 70 6c 65  s);.  if( pTople
09b0: 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20  vel->aTableLock 
09c0: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 54 6f 70  ){.    p = &pTop
09d0: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
09e0: 6b 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61  k[pToplevel->nTa
09f0: 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20  bleLock++];.    
0a00: 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  p->iDb = iDb;.  
0a10: 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62    p->iTab = iTab
0a20: 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65  ;.    p->isWrite
0a30: 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f  Lock = isWriteLo
0a40: 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4c 6f 63 6b  ck;.    p->zLock
0a50: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
0a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 70 6c  }else{.    pTopl
0a70: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0a80: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
0a90: 33 4f 6f 6d 46 61 75 6c 74 28 70 54 6f 70 6c 65  3OomFault(pTople
0aa0: 76 65 6c 2d 3e 64 62 29 3b 0a 20 20 7d 0a 7d 0a  vel->db);.  }.}.
0ab0: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
0ac0: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74  P_TableLock inst
0ad0: 72 75 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68  ruction for each
0ae0: 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79   table locked by
0af0: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
0b00: 74 20 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79  t (configured by
0b10: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
0b20: 33 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a  3TableLock())..*
0b30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
0b40: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72  deTableLocks(Par
0b50: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
0b60: 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56  nt i;.  Vdbe *pV
0b70: 64 62 65 3b 20 0a 0a 20 20 70 56 64 62 65 20 3d  dbe; ..  pVdbe =
0b80: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
0b90: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
0ba0: 74 28 20 70 56 64 62 65 21 3d 30 20 29 3b 20 2f  t( pVdbe!=0 ); /
0bb0: 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  * sqlite3GetVdbe
0bc0: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 3a 20 56 44   cannot fail: VD
0bd0: 42 45 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  BE already alloc
0be0: 61 74 65 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  ated */..  for(i
0bf0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54  =0; i<pParse->nT
0c00: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0c10: 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70      TableLock *p
0c20: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62   = &pParse->aTab
0c30: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0c40: 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a  nt p1 = p->iDb;.
0c50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
0c60: 64 64 4f 70 34 28 70 56 64 62 65 2c 20 4f 50 5f  ddOp4(pVdbe, OP_
0c70: 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70  TableLock, p1, p
0c80: 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73 57 72 69  ->iTab, p->isWri
0c90: 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  teLock,.        
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
0cb0: 3e 7a 4c 6f 63 6b 4e 61 6d 65 2c 20 50 34 5f 53  >zLockName, P4_S
0cc0: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  TATIC);.  }.}.#e
0cd0: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f  lse.  #define co
0ce0: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a  deTableLocks(x).
0cf0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0d00: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0d10: 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20 6f   given yDbMask o
0d20: 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20 2d  bject is empty -
0d30: 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 20   if it contains 
0d40: 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20 54  no.** 1 bits.  T
0d50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0d60: 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61 73  sed by the DbMas
0d70: 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20 44  kAllZero() and D
0d80: 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a 2a  bMaskNotZero().*
0d90: 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53 51  * macros when SQ
0da0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0db0: 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  D is greater tha
0dc0: 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  n 30..*/.#if SQL
0dd0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
0de0: 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33 44  >30.int sqlite3D
0df0: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44 62  bMaskAllZero(yDb
0e00: 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20 69  Mask m){.  int i
0e10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
0e20: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b 20  izeof(yDbMask); 
0e30: 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29 20  i++) if( m[i] ) 
0e40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
0e50: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
0e60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0e70: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
0e80: 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  er a single SQL 
0e90: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ea0: 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64  en.** parsed and
0eb0: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20   a VDBE program 
0ec0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20  to execute that 
0ed0: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ee0: 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e 20  en.** prepared. 
0ef0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
0f00: 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e 67  ts the finishing
0f10: 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65 0a   touches on the.
0f20: 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  ** VDBE program 
0f30: 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 70  and resets the p
0f40: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20  Parse structure 
0f50: 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20  for the next.** 
0f60: 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  parse..**.** Not
0f70: 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72 72  e that if an err
0f80: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20  or occurred, it 
0f90: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
0fa0: 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42  e that.** no VDB
0fb0: 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72  E code was gener
0fc0: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
0fd0: 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
0fe0: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
0ff0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1000: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
1010: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
1020: 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a 20  Toplevel==0 );. 
1030: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1040: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1050: 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b  nested ) return;
1060: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1070: 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
1080: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 69  e->nErr ){.    i
1090: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
10a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 72 73  QLITE_OK ) pPars
10b0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
10c0: 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
10d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
10e0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
10f0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
1100: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
1110: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
1120: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
1130: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1140: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
1150: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
1160: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20  isMultiWrite .  
1170: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
1180: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
1190: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  t(v, pParse->may
11a0: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76  Abort));.  if( v
11b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11c0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
11d0: 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53 51 4c 49  Halt);..#if SQLI
11e0: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
11f0: 43 41 54 49 4f 4e 0a 20 20 20 20 69 66 28 20 70  CATION.    if( p
1200: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
1210: 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  k>0 && db->init.
1220: 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  busy==0 ){.     
1230: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
1240: 49 6e 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20  Init(db);.      
1250: 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74  if( db->auth.aut
1260: 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55 73 65  hLevel<UAUTH_Use
1270: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
1280: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1290: 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20 61  rse, "user not a
12a0: 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b 0a  uthenticated");.
12b0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
12c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 48  rc = SQLITE_AUTH
12d0: 5f 55 53 45 52 3b 0a 20 20 20 20 20 20 20 20 72  _USER;.        r
12e0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
12f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1300: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
1310: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
1320: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
1330: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
1340: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
1350: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
1360: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
1370: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
1380: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
1390: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
13a0: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
13b0: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
13c0: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
13d0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
13e0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
13f0: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
1400: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
1410: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
1420: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
1430: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1440: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1450: 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 26 26  iled==0 .     &&
1460: 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72 6f 28   (DbMaskNonZero(
1470: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1480: 73 6b 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70  sk) || pParse->p
1490: 43 6f 6e 73 74 45 78 70 72 29 0a 20 20 20 20 29  ConstExpr).    )
14a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 2c  {.      int iDb,
14b0: 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   i;.      assert
14c0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
14d0: 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f 64 65  Op(v, 0)->opcode
14e0: 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20 20 20  ==OP_Init );.   
14f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1500: 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a 20 20  mpHere(v, 0);.  
1510: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69      for(iDb=0; i
1520: 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
1530: 2b 29 7b 0a 20 20 20 20 20 20 20 20 53 63 68 65  +){.        Sche
1540: 6d 61 20 2a 70 53 63 68 65 6d 61 3b 0a 20 20 20  ma *pSchema;.   
1550: 20 20 20 20 20 69 66 28 20 44 62 4d 61 73 6b 54       if( DbMaskT
1560: 65 73 74 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  est(pParse->cook
1570: 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
1580: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
15a0: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
15b0: 3b 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d  ;.        pSchem
15c0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
15d0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  .pSchema;.      
15e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f0: 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20 20 20  Op4Int(v,.      
1600: 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63 74 69      OP_Transacti
1610: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
1620: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
1630: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 44   */.          iD
1640: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20 20   /* P1 */.      
1670: 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74 28 70      DbMaskTest(p
1680: 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
1690: 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a 2f 0a  ,iDb), /* P2 */.
16a0: 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d            pSchem
16b0: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
16c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
16d0: 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  P3 */.          
16e0: 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
16f0: 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
1700: 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20     /* P4 */.    
1710: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1720: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1730: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
1740: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b  eChangeP5(v, 1);
1750: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
1760: 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20 20 20  ment((v,.       
1770: 20 20 20 20 20 20 20 22 75 73 65 73 53 74 6d 74         "usesStmt
1780: 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70 50 61  Journal=%d", pPa
1790: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20 26 26  rse->mayAbort &&
17a0: 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69   pParse->isMulti
17b0: 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20 20 7d  Write));.      }
17c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
17e0: 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  E.      for(i=0;
17f0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61 62   i<pParse->nVtab
1800: 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Lock; i++){.    
1810: 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20 3d      char *vtab =
1820: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1830: 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 50  GetVTable(db, pP
1840: 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63 6b  arse->apVtabLock
1850: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [i]);.        sq
1860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1870: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c  v, OP_VBegin, 0,
1880: 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f   0, 0, vtab, P4_
1890: 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a 20  VTAB);.      }. 
18a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 74       pParse->nVt
18b0: 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e 64  abLock = 0;.#end
18c0: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 63  if..      /* Onc
18d0: 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69 65  e all the cookie
18e0: 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72 69  s have been veri
18f0: 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61 63  fied and transac
1900: 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a 20  tions opened, . 
1910: 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 74       ** obtain t
1920: 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
1930: 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69 73  e-locks. This is
1940: 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
1950: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 68  the .      ** sh
1960: 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75  ared-cache featu
1970: 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20  re is enabled.. 
1980: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
1990: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50 61  deTableLocks(pPa
19a0: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  rse);..      /* 
19b0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20 41  Initialize any A
19c0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61 74  UTOINCREMENT dat
19d0: 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65 71  a structures req
19e0: 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  uired..      */.
19f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74        sqlite3Aut
1a00: 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e 28  oincrementBegin(
1a10: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1a20: 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e 74  /* Code constant
1a30: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1a40: 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65 64  t where factored
1a50: 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c 6f   out of inner lo
1a60: 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ops */.      if(
1a70: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1a80: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45  xpr ){.        E
1a90: 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20 70  xprList *pEL = p
1aa0: 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
1ab0: 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  r;.        pPars
1ac0: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
1ad0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
1ae0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e 45  r(i=0; i<pEL->nE
1af0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1b00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b10: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
1b20: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  ->a[i].pExpr, pE
1b30: 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73 74  L->a[i].u.iConst
1b40: 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20 20  ExprReg);.      
1b50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
1b60: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a     /* Finally, j
1b70: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1b80: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1b90: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65   executable code
1ba0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1bb0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31 29  e3VdbeGoto(v, 1)
1bc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
1bd0: 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20  /* Get the VDBE 
1be0: 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f  program ready fo
1bf0: 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f  r execution.  */
1c00: 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72  .  if( v && pPar
1c10: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21  se->nErr==0 && !
1c20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c30: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1c40: 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1c50: 76 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 44 69  vel==0 );  /* Di
1c60: 73 61 62 6c 65 73 20 61 6e 64 20 72 65 2d 65 6e  sables and re-en
1c70: 61 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f 0a 20  ables match */. 
1c80: 20 20 20 2f 2a 20 41 20 6d 69 6e 69 6d 75 6d 20     /* A minimum 
1c90: 6f 66 20 6f 6e 65 20 63 75 72 73 6f 72 20 69 73  of one cursor is
1ca0: 20 72 65 71 75 69 72 65 64 20 69 66 20 61 75 74   required if aut
1cb0: 6f 69 6e 63 72 65 6d 65 6e 74 20 69 73 20 75 73  oincrement is us
1cc0: 65 64 0a 20 20 20 20 2a 20 20 53 65 65 20 74 69  ed.    *  See ti
1cd0: 63 6b 65 74 20 5b 61 36 39 36 33 37 39 63 31 66  cket [a696379c1f
1ce0: 30 38 38 36 36 5d 20 2a 2f 0a 20 20 20 20 69 66  08866] */.    if
1cf0: 28 20 70 50 61 72 73 65 2d 3e 70 41 69 6e 63 21  ( pParse->pAinc!
1d00: 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54  =0 && pParse->nT
1d10: 61 62 3d 3d 30 20 29 20 70 50 61 72 73 65 2d 3e  ab==0 ) pParse->
1d20: 6e 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 73 71  nTab = 1;.    sq
1d30: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
1d40: 64 79 28 76 2c 20 70 50 61 72 73 65 29 3b 0a 20  dy(v, pParse);. 
1d50: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
1d60: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
1d70: 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73 65  else{.    pParse
1d80: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
1d90: 52 4f 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ROR;.  }.}../*.*
1da0: 2a 20 52 75 6e 20 74 68 65 20 70 61 72 73 65 72  * Run the parser
1db0: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
1dc0: 74 6f 72 20 72 65 63 75 72 73 69 76 65 6c 79 20  tor recursively 
1dd0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65  in order to gene
1de0: 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72  rate.** code for
1df0: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
1e00: 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68  nt given onto th
1e10: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61  e end of the pPa
1e20: 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63  rse context.** c
1e30: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
1e40: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68  onstruction.  Wh
1e50: 65 6e 20 74 68 65 20 70 61 72 73 65 72 20 69 73  en the parser is
1e60: 20 72 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79   run recursively
1e70: 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68  .** this way, th
1e80: 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20  e final OP_Halt 
1e90: 69 73 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20  is not appended 
1ea0: 61 6e 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61  and other initia
1eb0: 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  lization.** and 
1ec0: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65  finalization ste
1ed0: 70 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62  ps are omitted b
1ee0: 65 63 61 75 73 65 20 74 68 6f 73 65 20 61 72 65  ecause those are
1ef0: 20 68 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65   handling by the
1f00: 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61  .** outermost pa
1f10: 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20  rser..**.** Not 
1f20: 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65  everything is ne
1f30: 73 74 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61  stable.  This fa
1f40: 63 69 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e  cility is design
1f50: 65 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20  ed to permit.** 
1f60: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20  INSERT, UPDATE, 
1f70: 61 6e 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61  and DELETE opera
1f80: 74 69 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51  tions against SQ
1f90: 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73  LITE_MASTER.  Us
1fa0: 65 0a 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75  e.** care if you
1fb0: 20 64 65 63 69 64 65 20 74 6f 20 74 72 79 20 74   decide to try t
1fc0: 6f 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69  o use this routi
1fd0: 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  ne for some othe
1fe0: 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76  r purposes..*/.v
1ff0: 6f 69 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65  oid sqlite3Neste
2000: 64 50 61 72 73 65 28 50 61 72 73 65 20 2a 70 50  dParse(Parse *pP
2010: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
2020: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
2030: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
2040: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63   char *zSql;.  c
2050: 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
2060: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2070: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
2080: 63 68 61 72 20 73 61 76 65 42 75 66 5b 50 41 52  char saveBuf[PAR
2090: 53 45 5f 54 41 49 4c 5f 53 5a 5d 3b 0a 0a 20 20  SE_TAIL_SZ];..  
20a0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
20b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
20c0: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73  ert( pParse->nes
20d0: 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65  ted<10 );  /* Ne
20e0: 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c  sting should onl
20f0: 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20  y be of limited 
2100: 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74  depth */.  va_st
2110: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
2120: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
2130: 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a  e3VMPrintf(db, z
2140: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
2150: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
2160: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
2170: 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d  return;   /* A m
2180: 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
2190: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20  failed */.  }.  
21a0: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b  pParse->nested++
21b0: 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42  ;.  memcpy(saveB
21c0: 75 66 2c 20 50 41 52 53 45 5f 54 41 49 4c 28 70  uf, PARSE_TAIL(p
21d0: 50 61 72 73 65 29 2c 20 50 41 52 53 45 5f 54 41  Parse), PARSE_TA
21e0: 49 4c 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74  IL_SZ);.  memset
21f0: 28 50 41 52 53 45 5f 54 41 49 4c 28 70 50 61 72  (PARSE_TAIL(pPar
2200: 73 65 29 2c 20 30 2c 20 50 41 52 53 45 5f 54 41  se), 0, PARSE_TA
2210: 49 4c 5f 53 5a 29 3b 0a 20 20 73 71 6c 69 74 65  IL_SZ);.  sqlite
2220: 33 52 75 6e 50 61 72 73 65 72 28 70 50 61 72 73  3RunParser(pPars
2230: 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72 4d 73  e, zSql, &zErrMs
2240: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
2250: 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
2260: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
2270: 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 6d  e(db, zSql);.  m
2280: 65 6d 63 70 79 28 50 41 52 53 45 5f 54 41 49 4c  emcpy(PARSE_TAIL
2290: 28 70 50 61 72 73 65 29 2c 20 73 61 76 65 42 75  (pParse), saveBu
22a0: 66 2c 20 50 41 52 53 45 5f 54 41 49 4c 5f 53 5a  f, PARSE_TAIL_SZ
22b0: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73  );.  pParse->nes
22c0: 74 65 64 2d 2d 3b 0a 7d 0a 0a 23 69 66 20 53 51  ted--;.}..#if SQ
22d0: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
22e0: 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 52  TICATION./*.** R
22f0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 7a 54  eturn TRUE if zT
2300: 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65  able is the name
2310: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 74   of the system t
2320: 61 62 6c 65 20 74 68 61 74 20 73 74 6f 72 65 73  able that stores
2330: 20 74 68 65 0a 2a 2a 20 6c 69 73 74 20 6f 66 20   the.** list of 
2340: 75 73 65 72 73 20 61 6e 64 20 74 68 65 69 72 20  users and their 
2350: 61 63 63 65 73 73 20 63 72 65 64 65 6e 74 69 61  access credentia
2360: 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ls..*/.int sqlit
2370: 65 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28  e3UserAuthTable(
2380: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
2390: 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  le){.  return sq
23a0: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54  lite3_stricmp(zT
23b0: 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 75 73  able, "sqlite_us
23c0: 65 72 22 29 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69  er")==0;.}.#endi
23d0: 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  f../*.** Locate 
23e0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
23f0: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
2400: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
2410: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
2420: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
2430: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
2440: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
2450: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
2460: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
2470: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
2480: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
2490: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
24a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
24b0: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
24c0: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
24d0: 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62  ched for the tab
24e0: 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69  le and the.** fi
24f0: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62  rst matching tab
2500: 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  le is returned. 
2510: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f   (No checking fo
2520: 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c  r duplicate tabl
2530: 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f  e.** names is do
2540: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
2550: 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66   order is TEMP f
2560: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
2570: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78   then any.** aux
2580: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
2590: 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65   added using the
25a0: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
25b0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
25c0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
25d0: 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  le()..*/.Table *
25e0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
25f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
2600: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
2610: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
2620: 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  tabase){.  Table
2630: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
2640: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65  ;..  /* All mute
2650: 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  xes are required
2660: 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65   for schema acce
2670: 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77  ss.  Make sure w
2680: 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a  e hold them. */.
2690: 20 20 61 73 73 65 72 74 28 20 7a 44 61 74 61 62    assert( zDatab
26a0: 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase!=0 || sqlite
26b0: 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
26c0: 74 65 78 65 73 28 64 62 29 20 29 3b 0a 23 69 66  texes(db) );.#if
26d0: 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
26e0: 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 2f 2a  HENTICATION.  /*
26f0: 20 4f 6e 6c 79 20 74 68 65 20 61 64 6d 69 6e 20   Only the admin 
2700: 75 73 65 72 20 69 73 20 61 6c 6c 6f 77 65 64 20  user is allowed 
2710: 74 6f 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  to know that the
2720: 20 73 71 6c 69 74 65 5f 75 73 65 72 20 74 61 62   sqlite_user tab
2730: 6c 65 0a 20 20 2a 2a 20 65 78 69 73 74 73 20 2a  le.  ** exists *
2740: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68  /.  if( db->auth
2750: 2e 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48  .authLevel<UAUTH
2760: 5f 41 64 6d 69 6e 20 26 26 20 73 71 6c 69 74 65  _Admin && sqlite
2770: 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 7a  3UserAuthTable(z
2780: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
2790: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
27a0: 6e 64 69 66 0a 20 20 77 68 69 6c 65 28 31 29 7b  ndif.  while(1){
27b0: 0a 20 20 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f  .    for(i=OMIT_
27c0: 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44  TEMPDB; i<db->nD
27d0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
27e0: 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69  nt j = (i<2) ? i
27f0: 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61  ^1 : i;   /* Sea
2800: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
2810: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 20 20 69 66  MAIN */.      if
2820: 28 20 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 7c  ( zDatabase==0 |
2830: 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  | sqlite3StrICmp
2840: 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e  (zDatabase, db->
2850: 61 44 62 5b 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29  aDb[j].zDbSName)
2860: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
2870: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
2880: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
2890: 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 20  , j, 0) );.     
28a0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
28b0: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b  shFind(&db->aDb[
28c0: 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  j].pSchema->tblH
28d0: 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ash, zName);.   
28e0: 20 20 20 20 20 69 66 28 20 70 20 29 20 72 65 74       if( p ) ret
28f0: 75 72 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20  urn p;.      }. 
2900: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4e 6f 74 20     }.    /* Not 
2910: 66 6f 75 6e 64 2e 20 20 49 66 20 74 68 65 20 6e  found.  If the n
2920: 61 6d 65 20 77 65 20 77 65 72 65 20 6c 6f 6f 6b  ame we were look
2930: 69 6e 67 20 66 6f 72 20 77 61 73 20 74 65 6d 70  ing for was temp
2940: 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20  .sqlite_master. 
2950: 20 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67     ** then chang
2960: 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 73 71  e the name to sq
2970: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
2980: 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20   and try again. 
2990: 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
29a0: 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c  e3StrICmp(zName,
29b0: 20 4d 41 53 54 45 52 5f 4e 41 4d 45 29 21 3d 30   MASTER_NAME)!=0
29c0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
29d0: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
29e0: 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d  p(zDatabase, db-
29f0: 3e 61 44 62 5b 31 5d 2e 7a 44 62 53 4e 61 6d 65  >aDb[1].zDbSName
2a00: 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )!=0 ) break;.  
2a10: 20 20 7a 4e 61 6d 65 20 3d 20 54 45 4d 50 5f 4d    zName = TEMP_M
2a20: 41 53 54 45 52 5f 4e 41 4d 45 3b 0a 20 20 7d 0a  ASTER_NAME;.  }.
2a30: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2a40: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
2a50: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
2a60: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
2a70: 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
2a80: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c  database.** tabl
2a90: 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  e given the name
2aa0: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61   of that table a
2ab0: 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
2ac0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
2ad0: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  ** database cont
2ae0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
2af0: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
2b00: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c  f not found.  Al
2b10: 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65  so leave an.** e
2b20: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
2b30: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
2b40: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
2b50: 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
2b60: 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73  is routine and s
2b70: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2b80: 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a  ) is that this.*
2b90: 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73  * routine leaves
2ba0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2bb0: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
2bc0: 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71  rMsg where.** sq
2bd0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29  lite3FindTable()
2be0: 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61   does not..*/.Ta
2bf0: 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61  ble *sqlite3Loca
2c00: 74 65 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  teTable(.  Parse
2c10: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2c20: 20 20 2f 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20    /* context in 
2c30: 77 68 69 63 68 20 74 6f 20 72 65 70 6f 72 74 20  which to report 
2c40: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75 33 32 20  errors */.  u32 
2c50: 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
2c60: 20 20 20 2f 2a 20 4c 4f 43 41 54 45 5f 56 49 45     /* LOCATE_VIE
2c70: 57 20 6f 72 20 4c 4f 43 41 54 45 5f 4e 4f 45 52  W or LOCATE_NOER
2c80: 52 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  R */.  const cha
2c90: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a  r *zName,     /*
2ca0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
2cb0: 6c 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e  le we are lookin
2cc0: 67 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  g for */.  const
2cd0: 20 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20   char *zDbase   
2ce0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2cf0: 20 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68   database.  Migh
2d00: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
2d10: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71    Table *p;.  sq
2d20: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
2d30: 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52 65  se->db;..  /* Re
2d40: 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
2d50: 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72  schema. If an er
2d60: 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76  ror occurs, leav
2d70: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
2d80: 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65  ge.  ** and code
2d90: 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
2da0: 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  eturn NULL. */. 
2db0: 20 69 66 28 20 28 64 62 2d 3e 6d 44 62 46 6c 61   if( (db->mDbFla
2dc0: 67 73 20 26 20 44 42 46 4c 41 47 5f 53 63 68 65  gs & DBFLAG_Sche
2dd0: 6d 61 4b 6e 6f 77 6e 4f 6b 29 3d 3d 30 20 0a 20  maKnownOk)==0 . 
2de0: 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    && SQLITE_OK!=
2df0: 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
2e00: 61 28 70 50 61 72 73 65 29 0a 20 20 29 7b 0a 20  a(pParse).  ){. 
2e10: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
2e20: 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46  ..  p = sqlite3F
2e30: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
2e40: 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 69  me, zDbase);.  i
2e50: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63  f( p==0 ){.    c
2e60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 20  onst char *zMsg 
2e70: 3d 20 66 6c 61 67 73 20 26 20 4c 4f 43 41 54 45  = flags & LOCATE
2e80: 5f 56 49 45 57 20 3f 20 22 6e 6f 20 73 75 63 68  _VIEW ? "no such
2e90: 20 76 69 65 77 22 20 3a 20 22 6e 6f 20 73 75 63   view" : "no suc
2ea0: 68 20 74 61 62 6c 65 22 3b 0a 23 69 66 6e 64 65  h table";.#ifnde
2eb0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2ec0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69  RTUALTABLE.    i
2ed0: 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62  f( sqlite3FindDb
2ee0: 4e 61 6d 65 28 64 62 2c 20 7a 44 62 61 73 65 29  Name(db, zDbase)
2ef0: 3c 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  <1 ){.      /* I
2f00: 66 20 7a 4e 61 6d 65 20 69 73 20 74 68 65 20 6e  f zName is the n
2f10: 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ot the name of a
2f20: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 73 63   table in the sc
2f30: 68 65 6d 61 20 63 72 65 61 74 65 64 20 75 73 69  hema created usi
2f40: 6e 67 0a 20 20 20 20 20 20 2a 2a 20 43 52 45 41  ng.      ** CREA
2f50: 54 45 2c 20 74 68 65 6e 20 63 68 65 63 6b 20 74  TE, then check t
2f60: 6f 20 73 65 65 20 69 66 20 69 74 20 69 73 20 74  o see if it is t
2f70: 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 76 69  he name of an vi
2f80: 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74  rtual table that
2f90: 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65  .      ** can be
2fa0: 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69   an eponymous vi
2fb0: 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a  rtual table. */.
2fc0: 20 20 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d        Module *pM
2fd0: 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 2a 29 73 71  od = (Module*)sq
2fe0: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64  lite3HashFind(&d
2ff0: 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20 7a 4e 61 6d  b->aModule, zNam
3000: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  e);.      if( pM
3010: 6f 64 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33  od==0 && sqlite3
3020: 5f 73 74 72 6e 69 63 6d 70 28 7a 4e 61 6d 65 2c  _strnicmp(zName,
3030: 20 22 70 72 61 67 6d 61 5f 22 2c 20 37 29 3d 3d   "pragma_", 7)==
3040: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 6f  0 ){.        pMo
3050: 64 20 3d 20 73 71 6c 69 74 65 33 50 72 61 67 6d  d = sqlite3Pragm
3060: 61 56 74 61 62 52 65 67 69 73 74 65 72 28 64 62  aVtabRegister(db
3070: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
3080: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4d 6f 64  }.      if( pMod
3090: 20 26 26 20 73 71 6c 69 74 65 33 56 74 61 62 45   && sqlite3VtabE
30a0: 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 49 6e 69  ponymousTableIni
30b0: 74 28 70 50 61 72 73 65 2c 20 70 4d 6f 64 29 20  t(pParse, pMod) 
30c0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
30d0: 6e 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 3b  n pMod->pEpoTab;
30e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
30f0: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 66  endif.    if( (f
3100: 6c 61 67 73 20 26 20 4c 4f 43 41 54 45 5f 4e 4f  lags & LOCATE_NO
3110: 45 52 52 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ERR)==0 ){.     
3120: 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b 0a 20   if( zDbase ){. 
3130: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
3140: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3150: 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a 4d 73 67  %s: %s.%s", zMsg
3160: 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29  , zDbase, zName)
3170: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
3180: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
3190: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
31a0: 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c 20 7a  %s: %s", zMsg, z
31b0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
31c0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65       pParse->che
31d0: 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
31e0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
31f0: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  n p;.}../*.** Lo
3200: 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69  cate the table i
3210: 64 65 6e 74 69 66 69 65 64 20 62 79 20 2a 70 2e  dentified by *p.
3220: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
3230: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
3240: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
3250: 6c 65 28 29 2e 20 54 68 65 20 64 69 66 66 65 72  le(). The differ
3260: 65 6e 63 65 20 62 65 74 77 65 65 6e 0a 2a 2a 20  ence between.** 
3270: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
3280: 6c 65 28 29 20 61 6e 64 20 74 68 69 73 20 66 75  le() and this fu
3290: 6e 63 74 69 6f 6e 20 69 73 20 74 68 61 74 20 74  nction is that t
32a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 73  his function res
32b0: 74 72 69 63 74 73 0a 2a 2a 20 74 68 65 20 73 65  tricts.** the se
32c0: 61 72 63 68 20 74 6f 20 73 63 68 65 6d 61 20 28  arch to schema (
32d0: 70 2d 3e 70 53 63 68 65 6d 61 29 20 69 66 20 69  p->pSchema) if i
32e0: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20 70  t is not NULL. p
32f0: 2d 3e 70 53 63 68 65 6d 61 20 6d 61 79 20 62 65  ->pSchema may be
3300: 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20  .** non-NULL if 
3310: 69 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  it is part of a 
3320: 76 69 65 77 20 6f 72 20 74 72 69 67 67 65 72 20  view or trigger 
3330: 70 72 6f 67 72 61 6d 20 64 65 66 69 6e 69 74 69  program definiti
3340: 6f 6e 2e 20 53 65 65 0a 2a 2a 20 73 71 6c 69 74  on. See.** sqlit
3350: 65 33 46 69 78 53 72 63 4c 69 73 74 28 29 20 66  e3FixSrcList() f
3360: 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 54  or details..*/.T
3370: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63  able *sqlite3Loc
3380: 61 74 65 54 61 62 6c 65 49 74 65 6d 28 0a 20 20  ateTableItem(.  
3390: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
33a0: 20 20 75 33 32 20 66 6c 61 67 73 2c 0a 20 20 73    u32 flags,.  s
33b0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
33c0: 65 6d 20 2a 70 0a 29 7b 0a 20 20 63 6f 6e 73 74  em *p.){.  const
33d0: 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 61 73   char *zDb;.  as
33e0: 73 65 72 74 28 20 70 2d 3e 70 53 63 68 65 6d 61  sert( p->pSchema
33f0: 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 61 74 61 62  ==0 || p->zDatab
3400: 61 73 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ase==0 );.  if( 
3410: 70 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  p->pSchema ){.  
3420: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
3430: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
3440: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
3450: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7a 44  pSchema);.    zD
3460: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  b = pParse->db->
3470: 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
3480: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
3490: 7a 44 62 20 3d 20 70 2d 3e 7a 44 61 74 61 62 61  zDb = p->zDataba
34a0: 73 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  se;.  }.  return
34b0: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
34c0: 62 6c 65 28 70 50 61 72 73 65 2c 20 66 6c 61 67  ble(pParse, flag
34d0: 73 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  s, p->zName, zDb
34e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  );.}../*.** Loca
34f0: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
3500: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
3510: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
3520: 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
3530: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
3540: 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a  of that index.**
3550: 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66   and the name of
3560: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
3570: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
3580: 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e  index..** Return
3590: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
35a0: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61  nd..**.** If zDa
35b0: 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c  tabase is 0, all
35c0: 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73   databases are s
35d0: 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a  earched for the.
35e0: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  ** table and the
35f0: 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20   first matching 
3600: 69 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e 65  index is returne
3610: 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67  d.  (No checking
3620: 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74  .** for duplicat
3630: 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69 73  e index names is
3640: 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61   done.)  The sea
3650: 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20  rch order is.** 
3660: 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e  TEMP first, then
3670: 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20   MAIN, then any 
3680: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
3690: 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69  ses added.** usi
36a0: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
36b0: 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20  mmand..*/.Index 
36c0: 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65  *sqlite3FindInde
36d0: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  x(sqlite3 *db, c
36e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
36f0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
3700: 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  b){.  Index *p =
3710: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 2f   0;.  int i;.  /
3720: 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72  * All mutexes ar
3730: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  e required for s
3740: 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d  chema access.  M
3750: 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64  ake sure we hold
3760: 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65   them. */.  asse
3770: 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20 73 71  rt( zDb!=0 || sq
3780: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
3790: 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b  llMutexes(db) );
37a0: 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45  .  for(i=OMIT_TE
37b0: 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  MPDB; i<db->nDb;
37c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
37d0: 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a   = (i<2) ? i^1 :
37e0: 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54   i;  /* Search T
37f0: 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20  EMP before MAIN 
3800: 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  */.    Schema *p
3810: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
3820: 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20  [j].pSchema;.   
3830: 20 61 73 73 65 72 74 28 20 70 53 63 68 65 6d 61   assert( pSchema
3840: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20   );.    if( zDb 
3850: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
3860: 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a  p(zDb, db->aDb[j
3870: 5d 2e 7a 44 62 53 4e 61 6d 65 29 20 29 20 63 6f  ].zDbSName) ) co
3880: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
3890: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
38a0: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a  aMutexHeld(db, j
38b0: 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 20 3d 20  , 0) );.    p = 
38c0: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
38d0: 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  &pSchema->idxHas
38e0: 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  h, zName);.    i
38f0: 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20  f( p ) break;.  
3900: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
3910: 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74  ./*.** Reclaim t
3920: 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  he memory used b
3930: 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73 74  y an index.*/.st
3940: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 49 6e  atic void freeIn
3950: 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dex(sqlite3 *db,
3960: 20 49 6e 64 65 78 20 2a 70 29 7b 0a 23 69 66 6e   Index *p){.#ifn
3970: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3980: 41 4e 41 4c 59 5a 45 0a 20 20 73 71 6c 69 74 65  ANALYZE.  sqlite
3990: 33 44 65 6c 65 74 65 49 6e 64 65 78 53 61 6d 70  3DeleteIndexSamp
39a0: 6c 65 73 28 64 62 2c 20 70 29 3b 0a 23 65 6e 64  les(db, p);.#end
39b0: 69 66 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  if.  sqlite3Expr
39c0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50  Delete(db, p->pP
39d0: 61 72 74 49 64 78 57 68 65 72 65 29 3b 0a 20 20  artIdxWhere);.  
39e0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
39f0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 61 43 6f  elete(db, p->aCo
3a00: 6c 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  lExpr);.  sqlite
3a10: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
3a20: 43 6f 6c 41 66 66 29 3b 0a 20 20 69 66 28 20 70  ColAff);.  if( p
3a30: 2d 3e 69 73 52 65 73 69 7a 65 64 20 29 20 73 71  ->isResized ) sq
3a40: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3a50: 28 76 6f 69 64 20 2a 29 70 2d 3e 61 7a 43 6f 6c  (void *)p->azCol
3a60: 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  l);.#ifdef SQLIT
3a70: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
3a80: 52 5f 53 54 41 54 34 0a 20 20 73 71 6c 69 74 65  R_STAT4.  sqlite
3a90: 33 5f 66 72 65 65 28 70 2d 3e 61 69 52 6f 77 45  3_free(p->aiRowE
3aa0: 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  st);.#endif.  sq
3ab0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3ac0: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  p);.}../*.** For
3ad0: 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c 6c 65   the index calle
3ae0: 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69 63 68  d zIdxName which
3af0: 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   is found in the
3b00: 20 64 61 74 61 62 61 73 65 20 69 44 62 2c 0a 2a   database iDb,.*
3b10: 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20 69 6e  * unlike that in
3b20: 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54 61 62  dex from its Tab
3b30: 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74  le then remove t
3b40: 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a 2a 2a  he index from.**
3b50: 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20   the index hash 
3b60: 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65 20 61  table and free a
3b70: 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  ll memory struct
3b80: 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a  ures associated.
3b90: 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 64 65  ** with the inde
3ba0: 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  x..*/.void sqlit
3bb0: 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  e3UnlinkAndDelet
3bc0: 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a  eIndex(sqlite3 *
3bd0: 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e  db, int iDb, con
3be0: 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e 61 6d  st char *zIdxNam
3bf0: 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  e){.  Index *pIn
3c00: 64 65 78 3b 0a 20 20 48 61 73 68 20 2a 70 48 61  dex;.  Hash *pHa
3c10: 73 68 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  sh;..  assert( s
3c20: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
3c30: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
3c40: 29 20 29 3b 0a 20 20 70 48 61 73 68 20 3d 20 26  ) );.  pHash = &
3c50: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
3c60: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20  hema->idxHash;. 
3c70: 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
3c80: 33 48 61 73 68 49 6e 73 65 72 74 28 70 48 61 73  3HashInsert(pHas
3c90: 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 30 29 3b  h, zIdxName, 0);
3ca0: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49  .  if( ALWAYS(pI
3cb0: 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69 66 28  ndex) ){.    if(
3cc0: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
3cd0: 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20  >pIndex==pIndex 
3ce0: 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
3cf0: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20  >pTable->pIndex 
3d00: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
3d10: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3d20: 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
3d30: 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69    /* Justificati
3d40: 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28 29 3b 20  on of ALWAYS(); 
3d50: 20 54 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20   The index must 
3d60: 62 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f  be on the list o
3d70: 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63  f.      ** indic
3d80: 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 20 3d  es. */.      p =
3d90: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
3da0: 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77  >pIndex;.      w
3db0: 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 29 20  hile( ALWAYS(p) 
3dc0: 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e  && p->pNext!=pIn
3dd0: 64 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e  dex ){ p = p->pN
3de0: 65 78 74 3b 20 7d 0a 20 20 20 20 20 20 69 66 28  ext; }.      if(
3df0: 20 41 4c 57 41 59 53 28 70 20 26 26 20 70 2d 3e   ALWAYS(p && p->
3e00: 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29 20 29  pNext==pIndex) )
3e10: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65  {.        p->pNe
3e20: 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  xt = pIndex->pNe
3e30: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
3e40: 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28  }.    freeIndex(
3e50: 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d  db, pIndex);.  }
3e60: 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20  .  db->mDbFlags 
3e70: 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61  |= DBFLAG_Schema
3e80: 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Change;.}../*.**
3e90: 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20 74 68   Look through th
3ea0: 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e 20 64  e list of open d
3eb0: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 69 6e  atabase files in
3ec0: 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e 64 20 69   db->aDb[] and i
3ed0: 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65 20 62 65  f.** any have be
3ee0: 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65 6d 6f 76  en closed, remov
3ef0: 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20  e them from the 
3f00: 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f 63 61 74  list.  Reallocat
3f10: 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 61 44 62  e the.** db->aDb
3f20: 5b 5d 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  [] structure to 
3f30: 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65 2c 20  a smaller size, 
3f40: 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a  if possible..**.
3f50: 2a 2a 20 45 6e 74 72 79 20 30 20 28 74 68 65 20  ** Entry 0 (the 
3f60: 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73 65 29  "main" database)
3f70: 20 61 6e 64 20 65 6e 74 72 79 20 31 20 28 74 68   and entry 1 (th
3f80: 65 20 22 74 65 6d 70 22 20 64 61 74 61 62 61 73  e "temp" databas
3f90: 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76 65 72 20  e).** are never 
3fa0: 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 62  candidates for b
3fb0: 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65 64 2e 0a  eing collapsed..
3fc0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
3fd0: 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65 41  ollapseDatabaseA
3fe0: 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62  rray(sqlite3 *db
3ff0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
4000: 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62   for(i=j=2; i<db
4010: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
4020: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
4030: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
4040: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d     if( pDb->pBt=
4050: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
4060: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
4070: 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 3b 0a 20 20  b->zDbSName);.  
4080: 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d      pDb->zDbSNam
4090: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e  e = 0;.      con
40a0: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
40b0: 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20   if( j<i ){.    
40c0: 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64    db->aDb[j] = d
40d0: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d  b->aDb[i];.    }
40e0: 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
40f0: 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69  db->nDb = j;.  i
4100: 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26  f( db->nDb<=2 &&
4110: 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44   db->aDb!=db->aD
4120: 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d  bStatic ){.    m
4130: 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61  emcpy(db->aDbSta
4140: 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a  tic, db->aDb, 2*
4150: 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30  sizeof(db->aDb[0
4160: 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ]));.    sqlite3
4170: 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61  DbFree(db, db->a
4180: 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Db);.    db->aDb
4190: 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
41a0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
41b0: 65 73 65 74 20 74 68 65 20 73 63 68 65 6d 61 20  eset the schema 
41c0: 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
41d0: 20 61 74 20 69 6e 64 65 78 20 69 44 62 2e 20 20   at index iDb.  
41e0: 41 6c 73 6f 20 72 65 73 65 74 20 74 68 65 0a 2a  Also reset the.*
41f0: 2a 20 54 45 4d 50 20 73 63 68 65 6d 61 2e 20 20  * TEMP schema.  
4200: 54 68 65 20 72 65 73 65 74 20 69 73 20 64 65 66  The reset is def
4210: 65 72 72 65 64 20 69 66 20 64 62 2d 3e 6e 53 63  erred if db->nSc
4220: 68 65 6d 61 4c 6f 63 6b 20 69 73 20 6e 6f 74 20  hemaLock is not 
4230: 7a 65 72 6f 2e 0a 2a 2a 20 44 65 66 65 72 72 65  zero..** Deferre
4240: 64 20 72 65 73 65 74 73 20 6d 61 79 20 62 65 20  d resets may be 
4250: 72 75 6e 20 62 79 20 63 61 6c 6c 69 6e 67 20 77  run by calling w
4260: 69 74 68 20 69 44 62 3c 30 2e 0a 2a 2f 0a 76 6f  ith iDb<0..*/.vo
4270: 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74 4f  id sqlite3ResetO
4280: 6e 65 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33  neSchema(sqlite3
4290: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a   *db, int iDb){.
42a0: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
42b0: 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  t( iDb<db->nDb )
42c0: 3b 0a 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20  ;..  if( iDb>=0 
42d0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
42e0: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
42f0: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
4300: 29 20 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72  ) );.    DbSetPr
4310: 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20  operty(db, iDb, 
4320: 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64 29 3b  DB_ResetWanted);
4330: 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72  .    DbSetProper
4340: 74 79 28 64 62 2c 20 31 2c 20 44 42 5f 52 65 73  ty(db, 1, DB_Res
4350: 65 74 57 61 6e 74 65 64 29 3b 0a 20 20 20 20 64  etWanted);.    d
4360: 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 3d 20 7e  b->mDbFlags &= ~
4370: 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 4b 6e 6f  DBFLAG_SchemaKno
4380: 77 6e 4f 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  wnOk;.  }..  if(
4390: 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b   db->nSchemaLock
43a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ==0 ){.    for(i
43b0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
43c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 44  ++){.      if( D
43d0: 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c  bHasProperty(db,
43e0: 20 69 2c 20 44 42 5f 52 65 73 65 74 57 61 6e 74   i, DB_ResetWant
43f0: 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ed) ){.        s
4400: 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61  qlite3SchemaClea
4410: 72 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63  r(db->aDb[i].pSc
4420: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20  hema);.      }. 
4430: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
4440: 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65  * Erase all sche
4450: 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ma information f
4460: 72 6f 6d 20 61 6c 6c 20 61 74 74 61 63 68 65 64  rom all attached
4470: 20 64 61 74 61 62 61 73 65 73 20 28 69 6e 63 6c   databases (incl
4480: 75 64 69 6e 67 0a 2a 2a 20 22 6d 61 69 6e 22 20  uding.** "main" 
4490: 61 6e 64 20 22 74 65 6d 70 22 29 20 66 6f 72 20  and "temp") for 
44a0: 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
44b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
44c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73  .void sqlite3Res
44d0: 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f  etAllSchemasOfCo
44e0: 6e 6e 65 63 74 69 6f 6e 28 73 71 6c 69 74 65 33  nnection(sqlite3
44f0: 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   *db){.  int i;.
4500: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
4510: 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 61 73  terAll(db);.  as
4520: 73 65 72 74 28 20 64 62 2d 3e 6e 53 63 68 65 6d  sert( db->nSchem
4530: 61 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 66 6f  aLock==0 );.  fo
4540: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
4550: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a  ; i++){.    Db *
4560: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
4570: 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
4580: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
4590: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c   sqlite3SchemaCl
45a0: 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61  ear(pDb->pSchema
45b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64  );.    }.  }.  d
45c0: 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 3d 20 7e  b->mDbFlags &= ~
45d0: 28 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68  (DBFLAG_SchemaCh
45e0: 61 6e 67 65 7c 44 42 46 4c 41 47 5f 53 63 68 65  ange|DBFLAG_Sche
45f0: 6d 61 4b 6e 6f 77 6e 4f 6b 29 3b 0a 20 20 73 71  maKnownOk);.  sq
4600: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c  lite3VtabUnlockL
4610: 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ist(db);.  sqlit
4620: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
4630: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  db);.  sqlite3Co
4640: 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65 41 72  llapseDatabaseAr
4650: 72 61 79 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ray(db);.}../*.*
4660: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4670: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
4680: 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a  commit occurs..*
4690: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
46a0: 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
46b0: 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ges(sqlite3 *db)
46c0: 7b 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73  {.  db->mDbFlags
46d0: 20 26 3d 20 7e 44 42 46 4c 41 47 5f 53 63 68 65   &= ~DBFLAG_Sche
46e0: 6d 61 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a  maChange;.}../*.
46f0: 2a 2a 20 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79  ** Delete memory
4700: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
4710: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
4720: 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69  of a table or vi
4730: 65 77 20 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65  ew (the.** Table
4740: 2e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a  .aCol[] array)..
4750: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
4760: 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
4770: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
4780: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
4790: 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20  int i;.  Column 
47a0: 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28  *pCol;.  assert(
47b0: 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20   pTable!=0 );.  
47c0: 69 66 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62  if( (pCol = pTab
47d0: 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a  le->aCol)!=0 ){.
47e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
47f0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  Table->nCol; i++
4800: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
4810: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4820: 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  b, pCol->zName);
4830: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
4840: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f  prDelete(db, pCo
4850: 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20  l->pDflt);.     
4860: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4870: 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b  b, pCol->zColl);
4880: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
4890: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
48a0: 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a  ble->aCol);.  }.
48b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
48c0: 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20  the memory data 
48d0: 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63  structures assoc
48e0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67  iated with the g
48f0: 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20  iven.** Table.  
4900: 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
4910: 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74  ade to disk by t
4920: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
4930: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4940: 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65  just deletes the
4950: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e   data structure.
4960: 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e    It does not un
4970: 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c  link.** the tabl
4980: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
4990: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
49a0: 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f  able.  But it do
49b0: 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65  es destroy.** me
49c0: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
49d0: 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61  of the indices a
49e0: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  nd foreign keys 
49f0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
4a00: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  .** the table..*
4a10: 2a 0a 2a 2a 20 54 68 65 20 64 62 20 70 61 72 61  *.** The db para
4a20: 6d 65 74 65 72 20 69 73 20 6f 70 74 69 6f 6e 61  meter is optiona
4a30: 6c 2e 20 20 49 74 20 69 73 20 6e 65 65 64 65 64  l.  It is needed
4a40: 20 69 66 20 74 68 65 20 54 61 62 6c 65 20 6f 62   if the Table ob
4a50: 6a 65 63 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e  ject .** contain
4a60: 73 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  s lookaside memo
4a70: 72 79 2e 20 20 28 54 61 62 6c 65 20 6f 62 6a 65  ry.  (Table obje
4a80: 63 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d  cts in the schem
4a90: 61 20 64 6f 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  a do not use.** 
4aa0: 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  lookaside memory
4ab0: 2c 20 62 75 74 20 73 6f 6d 65 20 65 70 68 65 6d  , but some ephem
4ac0: 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63  eral Table objec
4ad0: 74 73 20 64 6f 2e 29 20 20 4f 72 20 74 68 65 0a  ts do.)  Or the.
4ae0: 2a 2a 20 64 62 20 70 61 72 61 6d 65 74 65 72 20  ** db parameter 
4af0: 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68  can be used with
4b00: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
4b10: 64 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65  d to measure the
4b20: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 75 73 65 64 20   memory.** used 
4b30: 62 79 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  by the Table obj
4b40: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
4b50: 6f 69 64 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  oid SQLITE_NOINL
4b60: 49 4e 45 20 64 65 6c 65 74 65 54 61 62 6c 65 28  INE deleteTable(
4b70: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62  sqlite3 *db, Tab
4b80: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49  le *pTable){.  I
4b90: 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70  ndex *pIndex, *p
4ba0: 4e 65 78 74 3b 0a 0a 23 69 66 64 65 66 20 53 51  Next;..#ifdef SQ
4bb0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
4bc0: 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65  Record the numbe
4bd0: 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  r of outstanding
4be0: 20 6c 6f 6f 6b 61 73 69 64 65 20 61 6c 6c 6f 63   lookaside alloc
4bf0: 61 74 69 6f 6e 73 20 69 6e 20 73 63 68 65 6d 61  ations in schema
4c00: 20 54 61 62 6c 65 73 0a 20 20 2a 2a 20 70 72 69   Tables.  ** pri
4c10: 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79 20  or to doing any 
4c20: 66 72 65 65 28 29 20 6f 70 65 72 61 74 69 6f 6e  free() operation
4c30: 73 2e 20 20 53 69 6e 63 65 20 73 63 68 65 6d 61  s.  Since schema
4c40: 20 54 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 75   Tables do not u
4c50: 73 65 0a 20 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64  se.  ** lookasid
4c60: 65 2c 20 74 68 69 73 20 6e 75 6d 62 65 72 20 73  e, this number s
4c70: 68 6f 75 6c 64 20 6e 6f 74 20 63 68 61 6e 67 65  hould not change
4c80: 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b  . */.  int nLook
4c90: 61 73 69 64 65 20 3d 20 30 3b 0a 20 20 69 66 28  aside = 0;.  if(
4ca0: 20 64 62 20 26 26 20 28 70 54 61 62 6c 65 2d 3e   db && (pTable->
4cb0: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
4cc0: 68 65 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a 20  hemeral)==0 ){. 
4cd0: 20 20 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20     nLookaside = 
4ce0: 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65  sqlite3Lookaside
4cf0: 55 73 65 64 28 64 62 2c 20 30 29 3b 0a 20 20 7d  Used(db, 0);.  }
4d00: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 65  .#endif..  /* De
4d10: 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  lete all indices
4d20: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
4d30: 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a   this table. */.
4d40: 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70    for(pIndex = p
4d50: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70  Table->pIndex; p
4d60: 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e  Index; pIndex=pN
4d70: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
4d80: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
4d90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
4da0: 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  dex->pSchema==pT
4db0: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 0a 20 20  able->pSchema.  
4dc0: 20 20 20 20 20 20 20 7c 7c 20 28 49 73 56 69 72         || (IsVir
4dd0: 74 75 61 6c 28 70 54 61 62 6c 65 29 20 26 26 20  tual(pTable) && 
4de0: 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 21  pIndex->idxType!
4df0: 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f  =SQLITE_IDXTYPE_
4e00: 41 50 50 44 45 46 29 20 29 3b 0a 20 20 20 20 69  APPDEF) );.    i
4e10: 66 28 20 28 64 62 3d 3d 30 20 7c 7c 20 64 62 2d  f( (db==0 || db-
4e20: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
4e30: 29 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28  ) && !IsVirtual(
4e40: 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20  pTable) ){.     
4e50: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
4e60: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20  Index->zName; . 
4e70: 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 20 28 20       TESTONLY ( 
4e80: 49 6e 64 65 78 20 2a 70 4f 6c 64 20 3d 20 29 20  Index *pOld = ) 
4e90: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
4ea0: 74 28 0a 20 20 20 20 20 20 20 20 20 26 70 49 6e  t(.         &pIn
4eb0: 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64  dex->pSchema->id
4ec0: 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a  xHash, zName, 0.
4ed0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
4ee0: 73 73 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20  ssert( db==0 || 
4ef0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
4f00: 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49  exHeld(db, 0, pI
4f10: 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29  ndex->pSchema) )
4f20: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4f30: 70 4f 6c 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20  pOld==pIndex || 
4f40: 70 4f 6c 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  pOld==0 );.    }
4f50: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 64  .    freeIndex(d
4f60: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
4f70: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79  .  /* Delete any
4f80: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 74   foreign keys at
4f90: 74 61 63 68 65 64 20 74 6f 20 74 68 69 73 20 74  tached to this t
4fa0: 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  able. */.  sqlit
4fb0: 65 33 46 6b 44 65 6c 65 74 65 28 64 62 2c 20 70  e3FkDelete(db, p
4fc0: 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65  Table);..  /* De
4fd0: 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73  lete the Table s
4fe0: 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e  tructure itself.
4ff0: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  .  */.  sqlite3D
5000: 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
5010: 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  (db, pTable);.  
5020: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5030: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
5040: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
5050: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43  e(db, pTable->zC
5060: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
5070: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
5080: 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  , pTable->pSelec
5090: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
50a0: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
50b0: 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b  pTable->pCheck);
50c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
50d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
50e0: 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 43  E.  sqlite3VtabC
50f0: 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29  lear(db, pTable)
5100: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
5110: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
5120: 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69  ble);..  /* Veri
5130: 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61  fy that no looka
5140: 73 69 64 65 20 6d 65 6d 6f 72 79 20 77 61 73 20  side memory was 
5150: 75 73 65 64 20 62 79 20 73 63 68 65 6d 61 20 74  used by schema t
5160: 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  ables */.  asser
5170: 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30  t( nLookaside==0
5180: 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d   || nLookaside==
5190: 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65  sqlite3Lookaside
51a0: 55 73 65 64 28 64 62 2c 30 29 20 29 3b 0a 7d 0a  Used(db,0) );.}.
51b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65  void sqlite3Dele
51c0: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
51d0: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  *db, Table *pTab
51e0: 6c 65 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74  le){.  /* Do not
51f0: 20 64 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c   delete the tabl
5200: 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65  e until the refe
5210: 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63  rence count reac
5220: 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69  hes zero. */.  i
5230: 66 28 20 21 70 54 61 62 6c 65 20 29 20 72 65 74  f( !pTable ) ret
5240: 75 72 6e 3b 0a 20 20 69 66 28 20 28 28 21 64 62  urn;.  if( ((!db
5250: 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46   || db->pnBytesF
5260: 72 65 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d 70  reed==0) && (--p
5270: 54 61 62 6c 65 2d 3e 6e 54 61 62 52 65 66 29 3e  Table->nTabRef)>
5280: 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64  0) ) return;.  d
5290: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
52a0: 54 61 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  Table);.}.../*.*
52b0: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
52c0: 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  en table from th
52d0: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  e hash tables an
52e0: 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65  d the delete the
52f0: 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74  .** table struct
5300: 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73  ure with all its
5310: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
5320: 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f  eign keys..*/.vo
5330: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
5340: 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73  AndDeleteTable(s
5350: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
5360: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
5370: 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61  *zTabName){.  Ta
5380: 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44  ble *p;.  Db *pD
5390: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  b;..  assert( db
53a0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
53b0: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
53c0: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
53d0: 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a  rt( zTabName );.
53e0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
53f0: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
5400: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
5410: 20 20 74 65 73 74 63 61 73 65 28 20 7a 54 61 62    testcase( zTab
5420: 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f  Name[0]==0 );  /
5430: 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61  * Zero-length ta
5440: 62 6c 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c  ble names are al
5450: 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d  lowed */.  pDb =
5460: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
5470: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
5480: 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53  hInsert(&pDb->pS
5490: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
54a0: 7a 54 61 62 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  zTabName, 0);.  
54b0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
54c0: 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d  le(db, p);.  db-
54d0: 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46  >mDbFlags |= DBF
54e0: 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65  LAG_SchemaChange
54f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
5500: 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e   a token, return
5510: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63   a string that c
5520: 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74  onsists of the t
5530: 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74  ext of that.** t
5540: 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20  oken.  Space to 
5550: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
5560: 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f  d string.** is o
5570: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
5580: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
5590: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
55a0: 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
55b0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
55c0: 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61  Any quotation ma
55d0: 72 6b 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22  rks (ex:  "name"
55e0: 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d  , 'name', [name]
55f0: 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61  , or `name`) tha
5600: 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68  t.** surround th
5610: 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f  e body of the to
5620: 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e  ken are removed.
5630: 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72  .**.** Tokens ar
5640: 65 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69  e often just poi
5650: 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f  nters into the o
5660: 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74  riginal SQL text
5670: 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e   and so.** are n
5680: 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  ot \000 terminat
5690: 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70  ed and are not p
56a0: 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20  ersistent.  The 
56b0: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
56c0: 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69  ** is \000 termi
56d0: 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72  nated and is per
56e0: 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72  sistent..*/.char
56f0: 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f   *sqlite3NameFro
5700: 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a  mToken(sqlite3 *
5710: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
5720: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  ){.  char *zName
5730: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b  ;.  if( pName ){
5740: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
5750: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
5760: 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e  , (char*)pName->
5770: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
5780: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
5790: 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  (zName);.  }else
57a0: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  {.    zName = 0;
57b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
57c0: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  ame;.}../*.** Op
57d0: 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  en the sqlite_ma
57e0: 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65  ster table store
57f0: 64 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75  d in database nu
5800: 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20  mber iDb for.** 
5810: 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62  writing. The tab
5820: 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  le is opened usi
5830: 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a  ng cursor 0..*/.
5840: 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e  void sqlite3Open
5850: 4d 61 73 74 65 72 54 61 62 6c 65 28 50 61 72 73  MasterTable(Pars
5860: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a  e *p, int iDb){.
5870: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
5880: 74 65 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20  te3GetVdbe(p);. 
5890: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
58a0: 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52  k(p, iDb, MASTER
58b0: 5f 52 4f 4f 54 2c 20 31 2c 20 4d 41 53 54 45 52  _ROOT, 1, MASTER
58c0: 5f 4e 41 4d 45 29 3b 0a 20 20 73 71 6c 69 74 65  _NAME);.  sqlite
58d0: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
58e0: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
58f0: 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  0, MASTER_ROOT, 
5900: 69 44 62 2c 20 35 29 3b 0a 20 20 69 66 28 20 70  iDb, 5);.  if( p
5910: 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ->nTab==0 ){.   
5920: 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20   p->nTab = 1;.  
5930: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  }.}../*.** Param
5940: 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74  eter zName point
5950: 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69  s to a nul-termi
5960: 6e 61 74 65 64 20 62 75 66 66 65 72 20 63 6f 6e  nated buffer con
5970: 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65  taining the name
5980: 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61 62 61 73  .** of a databas
5990: 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70  e ("main", "temp
59a0: 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  " or the name of
59b0: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29   an attached db)
59c0: 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
59d0: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 69  on returns the i
59e0: 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65  ndex of the name
59f0: 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62  d database in db
5a00: 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d  ->aDb[], or.** -
5a10: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
5a20: 62 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  b cannot be foun
5a30: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
5a40: 33 46 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69  3FindDbName(sqli
5a50: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
5a60: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
5a70: 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 20 20  nt i = -1;      
5a80: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
5a90: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a  umber */.  if( z
5aa0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44 62 20 2a  Name ){.    Db *
5ab0: 70 44 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28  pDb;.    for(i=(
5ac0: 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d  db->nDb-1), pDb=
5ad0: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d  &db->aDb[i]; i>=
5ae0: 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a  0; i--, pDb--){.
5af0: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
5b00: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 44 62  ite3_stricmp(pDb
5b10: 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a 4e 61 6d  ->zDbSName, zNam
5b20: 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  e) ) break;.    
5b30: 20 20 2f 2a 20 22 6d 61 69 6e 22 20 69 73 20 61    /* "main" is a
5b40: 6c 77 61 79 73 20 61 6e 20 61 63 63 65 70 74 61  lways an accepta
5b50: 62 6c 65 20 61 6c 69 61 73 20 66 6f 72 20 74 68  ble alias for th
5b60: 65 20 70 72 69 6d 61 72 79 20 64 61 74 61 62 61  e primary databa
5b70: 73 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e  se.      ** even
5b80: 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20   if it has been 
5b90: 72 65 6e 61 6d 65 64 20 75 73 69 6e 67 20 53 51  renamed using SQ
5ba0: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4d 41  LITE_DBCONFIG_MA
5bb0: 49 4e 44 42 4e 41 4d 45 2e 20 2a 2f 0a 20 20 20  INDBNAME. */.   
5bc0: 20 20 20 69 66 28 20 69 3d 3d 30 20 26 26 20 30     if( i==0 && 0
5bd0: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ==sqlite3_stricm
5be0: 70 28 22 6d 61 69 6e 22 2c 20 7a 4e 61 6d 65 29  p("main", zName)
5bf0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
5c00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
5c10: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b  }../*.** The tok
5c20: 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69  en *pName contai
5c30: 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ns the name of a
5c40: 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65   database (eithe
5c50: 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22  r "main" or.** "
5c60: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
5c70: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
5c80: 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69   db). This routi
5c90: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
5ca0: 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  * index of the n
5cb0: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
5cc0: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d   db->aDb[], or -
5cd0: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
5ce0: 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  b .** does not e
5cf0: 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  xist..*/.int sql
5d00: 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74  ite3FindDb(sqlit
5d10: 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70  e3 *db, Token *p
5d20: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Name){.  int i; 
5d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5d50: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
5d60: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
5d70: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
5d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
5d90: 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63 68  me we are search
5da0: 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61  ing for */.  zNa
5db0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
5dc0: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
5dd0: 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69  ame);.  i = sqli
5de0: 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
5df0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  , zName);.  sqli
5e00: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
5e10: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  ame);.  return i
5e20: 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c  ;.}../* The tabl
5e30: 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69  e or view or tri
5e40: 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73  gger name is pas
5e50: 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74  sed to this rout
5e60: 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a  ine via tokens.*
5e70: 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61  * pName1 and pNa
5e80: 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c  me2. If the tabl
5e90: 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79  e name was fully
5ea0: 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20   qualified, for 
5eb0: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43  example:.**.** C
5ec0: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e  REATE TABLE xxx.
5ed0: 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a  yyy (...);.** .*
5ee0: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
5ef0: 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e   set to "xxx" an
5f00: 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20  d pName2 "yyy". 
5f10: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
5f20: 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  d if.** the tabl
5f30: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75  e name is not fu
5f40: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69  lly qualified, i
5f50: 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  .e.:.**.** CREAT
5f60: 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29  E TABLE yyy(...)
5f70: 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61  ;.**.** Then pNa
5f80: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79  me1 is set to "y
5f90: 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69  yy" and pName2 i
5fa0: 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  s ""..**.** This
5fb0: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
5fc0: 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e  e *ppUnqual poin
5fd0: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
5fe0: 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65  the token (pName
5ff0: 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20  1 or.** pName2) 
6000: 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20  that stores the 
6010: 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c  unqualified tabl
6020: 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64  e name.  The ind
6030: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ex of the.** dat
6040: 61 62 61 73 65 20 22 78 78 78 22 20 69 73 20 72  abase "xxx" is r
6050: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
6060: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
6070: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
6080: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
6090: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
60a0: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
60b0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
60c0: 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  me1,      /* The
60d0: 20 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61   "xxx" in the na
60e0: 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20  me "xxx.yyy" or 
60f0: 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e  "xxx" */.  Token
6100: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f   *pName2,      /
6110: 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e 20 74  * The "yyy" in t
6120: 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79  he name "xxx.yyy
6130: 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70  " */.  Token **p
6140: 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72  Unqual     /* Wr
6150: 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66  ite the unqualif
6160: 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ied object name 
6170: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
6180: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
6190: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
61a0: 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  base holding the
61b0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c   object */.  sql
61c0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
61d0: 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74  e->db;..  assert
61e0: 28 20 70 4e 61 6d 65 32 21 3d 30 20 29 3b 0a 20  ( pName2!=0 );. 
61f0: 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30   if( pName2->n>0
6200: 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
6210: 69 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a 20 20  init.busy ) {.  
6220: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6230: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72  Msg(pParse, "cor
6240: 72 75 70 74 20 64 61 74 61 62 61 73 65 22 29 3b  rupt database");
6250: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
6260: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 55 6e  ;.    }.    *pUn
6270: 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20  qual = pName2;. 
6280: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
6290: 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65  FindDb(db, pName
62a0: 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  1);.    if( iDb<
62b0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
62c0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
62d0: 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61  e, "unknown data
62e0: 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31  base %T", pName1
62f0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
6300: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  -1;.    }.  }els
6310: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
6320: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c  b->init.iDb==0 |
6330: 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 0a  | db->init.busy.
6340: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
6350: 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 20  (db->mDbFlags & 
6360: 44 42 46 4c 41 47 5f 56 61 63 75 75 6d 29 21 3d  DBFLAG_Vacuum)!=
6370: 30 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62  0);.    iDb = db
6380: 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20  ->init.iDb;.    
6390: 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65  *pUnqual = pName
63a0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
63b0: 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  iDb;.}../*.** Th
63c0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
63d0: 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74  ed to check if t
63e0: 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20  he UTF-8 string 
63f0: 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c  zName is a legal
6400: 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20  .** unqualified 
6410: 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73  name for a new s
6420: 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61  chema object (ta
6430: 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77  ble, index, view
6440: 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e   or.** trigger).
6450: 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c   All names are l
6460: 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73  egal except thos
6470: 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  e that begin wit
6480: 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20  h the string.** 
6490: 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70  "sqlite_" (in up
64a0: 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69  per, lower or mi
64b0: 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20  xed case). This 
64c0: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  portion of the n
64d0: 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72  amespace.** is r
64e0: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
64f0: 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74  rnal use..*/.int
6500: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a   sqlite3CheckObj
6510: 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70  ectName(Parse *p
6520: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
6530: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28  r *zName){.  if(
6540: 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e   !pParse->db->in
6550: 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73  it.busy && pPars
6560: 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20  e->nested==0 .  
6570: 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61 72          && (pPar
6580: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
6590: 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65  SQLITE_WriteSche
65a0: 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ma)==0.         
65b0: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
65c0: 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  rNICmp(zName, "s
65d0: 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20  qlite_", 7) ){. 
65e0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
65f0: 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a 65  sg(pParse, "obje
6600: 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65 64  ct name reserved
6610: 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73   for internal us
6620: 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  e: %s", zName);.
6630: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6640: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
6650: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6660: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
6670: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
6680: 20 69 6e 64 65 78 20 6f 66 20 61 20 74 61 62 6c   index of a tabl
6690: 65 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69  e.*/.Index *sqli
66a0: 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
66b0: 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  ex(Table *pTab){
66c0: 0a 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 66  .  Index *p;.  f
66d0: 6f 72 28 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65  or(p=pTab->pInde
66e0: 78 3b 20 70 20 26 26 20 21 49 73 50 72 69 6d 61  x; p && !IsPrima
66f0: 72 79 4b 65 79 49 6e 64 65 78 28 70 29 3b 20 70  ryKeyIndex(p); p
6700: 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 72  =p->pNext){}.  r
6710: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
6720: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f 6c  * Return the col
6730: 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64  umn of index pId
6740: 78 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  x that correspon
6750: 64 73 20 74 6f 20 74 61 62 6c 65 0a 2a 2a 20 63  ds to table.** c
6760: 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 20 20 52 65 74  olumn iCol.  Ret
6770: 75 72 6e 20 2d 31 20 69 66 20 6e 6f 74 20 66 6f  urn -1 if not fo
6780: 75 6e 64 2e 0a 2a 2f 0a 69 31 36 20 73 71 6c 69  und..*/.i16 sqli
6790: 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
67a0: 28 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 31  (Index *pIdx, i1
67b0: 36 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69  6 iCol){.  int i
67c0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
67d0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Idx->nColumn; i+
67e0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  +){.    if( iCol
67f0: 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ==pIdx->aiColumn
6800: 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  [i] ) return i;.
6810: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
6820: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
6830: 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e  constructing a n
6840: 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73 65  ew table represe
6850: 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72  ntation in memor
6860: 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74  y.  This is.** t
6870: 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76 65  he first of seve
6880: 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69  ral action routi
6890: 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61 6c  nes that get cal
68a0: 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a  led in response.
68b0: 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20 54  ** to a CREATE T
68c0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
68d0: 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20   In particular, 
68e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
68f0: 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20  called.** after 
6900: 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43  seeing tokens "C
6910: 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c  REATE" and "TABL
6920: 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  E" and the table
6930: 20 6e 61 6d 65 2e 20 54 68 65 20 69 73 54 65 6d   name. The isTem
6940: 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75  p.** flag is tru
6950: 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73  e if the table s
6960: 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20  hould be stored 
6970: 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  in the auxiliary
6980: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
6990: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20  e instead of in 
69a0: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
69b0: 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  e file.  This is
69c0: 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61   normally the ca
69d0: 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22  se.** when the "
69e0: 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52  TEMP" or "TEMPOR
69f0: 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63  ARY" keyword occ
6a00: 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a  urs in between.*
6a10: 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41 42  * CREATE and TAB
6a20: 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  LE..**.** The ne
6a30: 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  w table record i
6a40: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e  s initialized an
6a50: 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d  d put in pParse-
6a60: 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41  >pNewTable..** A
6a70: 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52  s more of the CR
6a80: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
6a90: 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20  ment is parsed, 
6aa0: 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f  additional actio
6ab0: 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69  n.** routines wi
6ac0: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20  ll be called to 
6ad0: 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  add more informa
6ae0: 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63  tion to this rec
6af0: 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ord..** At the e
6b00: 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
6b10: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
6b20: 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64  , the sqlite3End
6b30: 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a  Table() routine.
6b40: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ** is called to 
6b50: 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e  complete the con
6b60: 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65  struction of the
6b70: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
6b80: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
6b90: 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20  e3StartTable(.  
6ba0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
6bb0: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
6bc0: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
6bd0: 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73  Name1,   /* Firs
6be0: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61  t part of the na
6bf0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
6c00: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b  or view */.  Tok
6c10: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a  en *pName2,   /*
6c20: 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20   Second part of 
6c30: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
6c40: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f  table or view */
6c50: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20  .  int isTemp,  
6c60: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
6c70: 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74 61  his is a TEMP ta
6c80: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  ble */.  int isV
6c90: 69 65 77 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  iew,      /* Tru
6ca0: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
6cb0: 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  IEW */.  int isV
6cc0: 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72 75  irtual,   /* Tru
6cd0: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
6ce0: 49 52 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f 0a  IRTUAL table */.
6cf0: 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20    int noErr     
6d00: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
6d10: 20 69 66 20 74 61 62 6c 65 20 61 6c 72 65 61 64   if table alread
6d20: 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20  y exists */.){. 
6d30: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a   Table *pTable;.
6d40: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
6d50: 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f  0; /* The name o
6d60: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
6d70: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
6d80: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
6d90: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
6da0: 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  iDb;         /* 
6db0: 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  Database number 
6dc0: 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61  to create the ta
6dd0: 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ble in */.  Toke
6de0: 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  n *pName;    /* 
6df0: 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  Unqualified name
6e00: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
6e10: 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 69 66   create */..  if
6e20: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
6e30: 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  && db->init.newT
6e40: 6e 75 6d 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  num==1 ){.    /*
6e50: 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20   Special case:  
6e60: 50 61 72 73 69 6e 67 20 74 68 65 20 73 71 6c 69  Parsing the sqli
6e70: 74 65 5f 6d 61 73 74 65 72 20 6f 72 20 73 71 6c  te_master or sql
6e80: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20  ite_temp_master 
6e90: 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 69 44  schema */.    iD
6ea0: 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  b = db->init.iDb
6eb0: 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  ;.    zName = sq
6ec0: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
6ed0: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
6ee0: 44 62 29 29 3b 0a 20 20 20 20 70 4e 61 6d 65 20  Db));.    pName 
6ef0: 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 65 6c 73  = pName1;.  }els
6f00: 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  e{.    /* The co
6f10: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20  mmon case */.   
6f20: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
6f30: 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
6f40: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
6f50: 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  , &pName);.    i
6f60: 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72  f( iDb<0 ) retur
6f70: 6e 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54  n;.    if( !OMIT
6f80: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
6f90: 70 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30  p && pName2->n>0
6fa0: 20 26 26 20 69 44 62 21 3d 31 20 29 7b 0a 20 20   && iDb!=1 ){.  
6fb0: 20 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69      /* If creati
6fc0: 6e 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c  ng a temp table,
6fd0: 20 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f   the name may no
6fe0: 74 20 62 65 20 71 75 61 6c 69 66 69 65 64 2e 20  t be qualified. 
6ff0: 55 6e 6c 65 73 73 20 0a 20 20 20 20 20 20 2a 2a  Unless .      **
7000: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
7010: 6d 65 20 69 73 20 22 74 65 6d 70 22 20 61 6e 79  me is "temp" any
7020: 77 61 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 73  way.  */.      s
7030: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
7040: 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72  Parse, "temporar
7050: 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73  y table name mus
7060: 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64  t be unqualified
7070: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
7080: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7090: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
70a0: 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31  isTemp ) iDb = 1
70b0: 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  ;.    zName = sq
70c0: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
70d0: 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  en(db, pName);. 
70e0: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61   }.  pParse->sNa
70f0: 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65  meToken = *pName
7100: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
7110: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
7120: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
7130: 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
7140: 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  me(pParse, zName
7150: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65  ) ){.    goto be
7160: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
7170: 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69  .  }.  if( db->i
7180: 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54  nit.iDb==1 ) isT
7190: 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  emp = 1;.#ifndef
71a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
71b0: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73  HORIZATION.  ass
71c0: 65 72 74 28 20 69 73 54 65 6d 70 3d 3d 30 20 7c  ert( isTemp==0 |
71d0: 7c 20 69 73 54 65 6d 70 3d 3d 31 20 29 3b 0a 20  | isTemp==1 );. 
71e0: 20 61 73 73 65 72 74 28 20 69 73 56 69 65 77 3d   assert( isView=
71f0: 3d 30 20 7c 7c 20 69 73 56 69 65 77 3d 3d 31 20  =0 || isView==1 
7200: 29 3b 0a 20 20 7b 0a 20 20 20 20 73 74 61 74 69  );.  {.    stati
7210: 63 20 63 6f 6e 73 74 20 75 38 20 61 43 6f 64 65  c const u8 aCode
7220: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 53 51  [] = {.       SQ
7230: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c  LITE_CREATE_TABL
7240: 45 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45  E,.       SQLITE
7250: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42  _CREATE_TEMP_TAB
7260: 4c 45 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54  LE,.       SQLIT
7270: 45 5f 43 52 45 41 54 45 5f 56 49 45 57 2c 0a 20  E_CREATE_VIEW,. 
7280: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45        SQLITE_CRE
7290: 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 0a 20 20  ATE_TEMP_VIEW.  
72a0: 20 20 7d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a    };.    char *z
72b0: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
72c0: 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20  ].zDbSName;.    
72d0: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
72e0: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
72f0: 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45  ITE_INSERT, SCHE
7300: 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29  MA_TABLE(isTemp)
7310: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
7320: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
7330: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
7340: 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 72 74  .    if( !isVirt
7350: 75 61 6c 20 26 26 20 73 71 6c 69 74 65 33 41 75  ual && sqlite3Au
7360: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
7370: 28 69 6e 74 29 61 43 6f 64 65 5b 69 73 54 65 6d  (int)aCode[isTem
7380: 70 2b 32 2a 69 73 56 69 65 77 5d 2c 0a 20 20 20  p+2*isView],.   
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73b0: 20 20 20 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44      zName, 0, zD
73c0: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
73d0: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
73e0: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  or;.    }.  }.#e
73f0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ndif..  /* Make 
7400: 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61 62  sure the new tab
7410: 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74  le name does not
7420: 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e   collide with an
7430: 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69   existing.  ** i
7440: 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61  ndex or table na
7450: 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  me in the same d
7460: 61 74 61 62 61 73 65 2e 20 20 49 73 73 75 65 20  atabase.  Issue 
7470: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
7480: 20 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73   if.  ** it does
7490: 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20  . The exception 
74a0: 69 73 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  is if the statem
74b0: 65 6e 74 20 62 65 69 6e 67 20 70 61 72 73 65 64  ent being parsed
74c0: 20 77 61 73 20 70 61 73 73 65 64 0a 20 20 2a 2a   was passed.  **
74d0: 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 64   to an sqlite3_d
74e0: 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20 63 61  eclare_vtab() ca
74f0: 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ll. In that case
7500: 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e   only the column
7510: 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64 20   names.  ** and 
7520: 74 79 70 65 73 20 77 69 6c 6c 20 62 65 20 75 73  types will be us
7530: 65 64 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20  ed, so there is 
7540: 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65 73 74 20  no need to test 
7550: 66 6f 72 20 6e 61 6d 65 73 70 61 63 65 0a 20 20  for namespace.  
7560: 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20  ** collisions.. 
7570: 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e 5f 44 45   */.  if( !IN_DE
7580: 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20  CLARE_VTAB ){.  
7590: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62    char *zDb = db
75a0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
75b0: 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  ame;.    if( SQL
75c0: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
75d0: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
75e0: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
75f0: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
7600: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  r;.    }.    pTa
7610: 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ble = sqlite3Fin
7620: 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
7630: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , zDb);.    if( 
7640: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  pTable ){.      
7650: 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20  if( !noErr ){.  
7660: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
7670: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
7680: 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20  able %T already 
7690: 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b  exists", pName);
76a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
76b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64        assert( !d
76c0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20  b->init.busy || 
76d0: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
76e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
76f0: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
7700: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
7710: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 62    }.      goto b
7720: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
7730: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7740: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
7750: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29  (db, zName, zDb)
7760: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
7770: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7780: 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61  rse, "there is a
7790: 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20  lready an index 
77a0: 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65  named %s", zName
77b0: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  );.      goto be
77c0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
77d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54  .    }.  }..  pT
77e0: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62  able = sqlite3Db
77f0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
7800: 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
7810: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
7820: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
7830: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7840: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  ;.    pParse->rc
7850: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
7860: 42 4b 50 54 3b 0a 20 20 20 20 70 50 61 72 73 65  BKPT;.    pParse
7870: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
7880: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7890: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rror;.  }.  pTab
78a0: 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  le->zName = zNam
78b0: 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b  e;.  pTable->iPK
78c0: 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c  ey = -1;.  pTabl
78d0: 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  e->pSchema = db-
78e0: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
78f0: 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 54 61  a;.  pTable->nTa
7900: 62 52 65 66 20 3d 20 31 3b 0a 23 69 66 64 65 66  bRef = 1;.#ifdef
7910: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
7920: 52 4f 57 45 53 54 0a 20 20 70 54 61 62 6c 65 2d  ROWEST.  pTable-
7930: 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73 71  >nRowLogEst = sq
7940: 6c 69 74 65 33 4c 6f 67 45 73 74 28 53 51 4c 49  lite3LogEst(SQLI
7950: 54 45 5f 44 45 46 41 55 4c 54 5f 52 4f 57 45 53  TE_DEFAULT_ROWES
7960: 54 29 3b 0a 23 65 6c 73 65 0a 20 20 70 54 61 62  T);.#else.  pTab
7970: 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  le->nRowLogEst =
7980: 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30   200; assert( 20
7990: 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
79a0: 28 31 30 34 38 35 37 36 29 20 29 3b 0a 23 65 6e  (1048576) );.#en
79b0: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 50  dif.  assert( pP
79c0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d  arse->pNewTable=
79d0: 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  =0 );.  pParse->
79e0: 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62  pNewTable = pTab
79f0: 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  le;..  /* If thi
7a00: 73 20 69 73 20 74 68 65 20 6d 61 67 69 63 20 73  s is the magic s
7a10: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
7a20: 61 62 6c 65 20 75 73 65 64 20 62 79 20 61 75 74  able used by aut
7a30: 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a  oincrement,.  **
7a40: 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70   then record a p
7a50: 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74  ointer to this t
7a60: 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e  able in the main
7a70: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
7a80: 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  ure.  ** so that
7a90: 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64   INSERT can find
7aa0: 20 74 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c   the table easil
7ab0: 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  y..  */.#ifndef 
7ac0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
7ad0: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20  INCREMENT.  if( 
7ae0: 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20  !pParse->nested 
7af0: 26 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  && strcmp(zName,
7b00: 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63   "sqlite_sequenc
7b10: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  e")==0 ){.    as
7b20: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
7b30: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
7b40: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
7b50: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d  pTable->pSchema-
7b60: 3e 70 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c  >pSeqTab = pTabl
7b70: 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  e;.  }.#endif.. 
7b80: 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61   /* Begin genera
7b90: 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68  ting the code th
7ba0: 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74  at will insert t
7bb0: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
7bc0: 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51  into.  ** the SQ
7bd0: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
7be0: 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74  e.  Note in part
7bf0: 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d  icular that we m
7c00: 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a  ust go ahead.  *
7c10: 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74  * and allocate t
7c20: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
7c30: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65   for the table e
7c40: 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72  ntry now.  Befor
7c50: 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41  e any.  ** PRIMA
7c60: 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
7c70: 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61   keywords are pa
7c80: 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79  rsed.  Those key
7c90: 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65  words will cause
7ca0: 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f  .  ** indices to
7cb0: 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20   be created and 
7cc0: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
7cd0: 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72   must come befor
7ce0: 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69  e the .  ** indi
7cf0: 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ces.  Hence, the
7d00: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
7d10: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73  or the table mus
7d20: 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20  t be allocated. 
7d30: 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   ** now..  */.  
7d40: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
7d50: 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74  sy && (v = sqlit
7d60: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
7d70: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ))!=0 ){.    int
7d80: 20 61 64 64 72 31 3b 0a 20 20 20 20 69 6e 74 20   addr1;.    int 
7d90: 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20  fileFormat;.    
7da0: 69 6e 74 20 72 65 67 31 2c 20 72 65 67 32 2c 20  int reg1, reg2, 
7db0: 72 65 67 33 3b 0a 20 20 20 20 2f 2a 20 6e 75 6c  reg3;.    /* nul
7dc0: 6c 52 6f 77 5b 5d 20 69 73 20 61 6e 20 4f 50 5f  lRow[] is an OP_
7dd0: 52 65 63 6f 72 64 20 65 6e 63 6f 64 69 6e 67 20  Record encoding 
7de0: 6f 66 20 61 20 72 6f 77 20 63 6f 6e 74 61 69 6e  of a row contain
7df0: 69 6e 67 20 35 20 4e 55 4c 4c 73 20 2a 2f 0a 20  ing 5 NULLs */. 
7e00: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
7e10: 63 68 61 72 20 6e 75 6c 6c 52 6f 77 5b 5d 20 3d  char nullRow[] =
7e20: 20 7b 20 36 2c 20 30 2c 20 30 2c 20 30 2c 20 30   { 6, 0, 0, 0, 0
7e30: 2c 20 30 20 7d 3b 0a 20 20 20 20 73 71 6c 69 74  , 0 };.    sqlit
7e40: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
7e50: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
7e60: 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
7e70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
7e80: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
7e90: 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20   isVirtual ){.  
7ea0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7eb0: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67  ddOp0(v, OP_VBeg
7ec0: 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  in);.    }.#endi
7ed0: 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  f..    /* If the
7ee0: 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64   file format and
7ef0: 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68 65   encoding in the
7f00: 20 64 61 74 61 62 61 73 65 20 68 61 76 65 20 6e   database have n
7f10: 6f 74 20 62 65 65 6e 20 73 65 74 2c 20 0a 20 20  ot been set, .  
7f20: 20 20 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f    ** set them no
7f30: 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  w..    */.    re
7f40: 67 31 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67  g1 = pParse->reg
7f50: 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65  Rowid = ++pParse
7f60: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 32  ->nMem;.    reg2
7f70: 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f   = pParse->regRo
7f80: 6f 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ot = ++pParse->n
7f90: 4d 65 6d 3b 0a 20 20 20 20 72 65 67 33 20 3d 20  Mem;.    reg3 = 
7fa0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
7fb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7fc0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 64  ddOp3(v, OP_Read
7fd0: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 72 65 67  Cookie, iDb, reg
7fe0: 33 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f  3, BTREE_FILE_FO
7ff0: 52 4d 41 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  RMAT);.    sqlit
8000: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
8010: 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 61 64 64  v, iDb);.    add
8020: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
8030: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c  AddOp1(v, OP_If,
8040: 20 72 65 67 33 29 3b 20 56 64 62 65 43 6f 76 65   reg3); VdbeCove
8050: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 66 69 6c  rage(v);.    fil
8060: 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66  eFormat = (db->f
8070: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 65  lags & SQLITE_Le
8080: 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30 20  gacyFileFmt)!=0 
8090: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
80a0: 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d      1 : SQLITE_M
80b0: 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a  AX_FILE_FORMAT;.
80c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
80d0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43  ddOp3(v, OP_SetC
80e0: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45  ookie, iDb, BTRE
80f0: 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 2c 20 66  E_FILE_FORMAT, f
8100: 69 6c 65 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  ileFormat);.    
8110: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8120: 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  3(v, OP_SetCooki
8130: 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 54 45  e, iDb, BTREE_TE
8140: 58 54 5f 45 4e 43 4f 44 49 4e 47 2c 20 45 4e 43  XT_ENCODING, ENC
8150: 28 64 62 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  (db));.    sqlit
8160: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
8170: 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 20 20 2f  , addr1);..    /
8180: 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72 65 61  * This just crea
8190: 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64  tes a place-hold
81a0: 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  er record in the
81b0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
81c0: 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65  able..    ** The
81d0: 20 72 65 63 6f 72 64 20 63 72 65 61 74 65 64 20   record created 
81e0: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
81f0: 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20 20   anything yet.  
8200: 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61  It will be repla
8210: 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ced.    ** by th
8220: 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e 20  e real entry in 
8230: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 61  code generated a
8240: 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  t sqlite3EndTabl
8250: 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
8260: 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72  ** The rowid for
8270: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69   the new entry i
8280: 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74  s left in regist
8290: 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f  er pParse->regRo
82a0: 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  wid..    ** The 
82b0: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
82c0: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
82d0: 65 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  e is left in reg
82e0: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
82f0: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77  ..    ** The row
8300: 69 64 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65  id and root page
8310: 20 6e 75 6d 62 65 72 20 76 61 6c 75 65 73 20 61   number values a
8320: 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65  re needed by the
8330: 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20 2a   code that.    *
8340: 2a 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  * sqlite3EndTabl
8350: 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e  e will generate.
8360: 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  .    */.#if !def
8370: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
8380: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
8390: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
83a0: 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20  IRTUALTABLE).   
83b0: 20 69 66 28 20 69 73 56 69 65 77 20 7c 7c 20 69   if( isView || i
83c0: 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20  sVirtual ){.    
83d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
83e0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
83f0: 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20 20 20  r, 0, reg2);.   
8400: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
8410: 20 20 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65    {.      pParse
8420: 2d 3e 61 64 64 72 43 72 54 61 62 20 3d 0a 20 20  ->addrCrTab =.  
8430: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8440: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
8450: 72 65 61 74 65 42 74 72 65 65 2c 20 69 44 62 2c  reateBtree, iDb,
8460: 20 72 65 67 32 2c 20 42 54 52 45 45 5f 49 4e 54   reg2, BTREE_INT
8470: 4b 45 59 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  KEY);.    }.    
8480: 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65  sqlite3OpenMaste
8490: 72 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  rTable(pParse, i
84a0: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
84b0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
84c0: 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20 72 65  _NewRowid, 0, re
84d0: 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g1);.    sqlite3
84e0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
84f0: 5f 42 6c 6f 62 2c 20 36 2c 20 72 65 67 33 2c 20  _Blob, 6, reg3, 
8500: 30 2c 20 6e 75 6c 6c 52 6f 77 2c 20 50 34 5f 53  0, nullRow, P4_S
8510: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
8520: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
8530: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20 72   OP_Insert, 0, r
8540: 65 67 33 2c 20 72 65 67 31 29 3b 0a 20 20 20 20  eg3, reg1);.    
8550: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
8560: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
8570: 50 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69 74  PEND);.    sqlit
8580: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
8590: 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a  OP_Close);.  }..
85a0: 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e    /* Normal (non
85b0: 2d 65 72 72 6f 72 29 20 72 65 74 75 72 6e 2e 20  -error) return. 
85c0: 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  */.  return;..  
85d0: 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
85e0: 63 63 75 72 73 2c 20 77 65 20 6a 75 6d 70 20 68  ccurs, we jump h
85f0: 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62  ere */.begin_tab
8600: 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69  le_error:.  sqli
8610: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
8620: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ame);.  return;.
8630: 7d 0a 0a 2f 2a 20 53 65 74 20 70 72 6f 70 65 72  }../* Set proper
8640: 74 69 65 73 20 6f 66 20 61 20 74 61 62 6c 65 20  ties of a table 
8650: 63 6f 6c 75 6d 6e 20 62 61 73 65 64 20 6f 6e 20  column based on 
8660: 74 68 65 20 28 6d 61 67 69 63 61 6c 29 0a 2a 2a  the (magical).**
8670: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   name of the col
8680: 75 6d 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  umn..*/.#if SQLI
8690: 54 45 5f 45 4e 41 42 4c 45 5f 48 49 44 44 45 4e  TE_ENABLE_HIDDEN
86a0: 5f 43 4f 4c 55 4d 4e 53 0a 76 6f 69 64 20 73 71  _COLUMNS.void sq
86b0: 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65  lite3ColumnPrope
86c0: 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28 54 61  rtiesFromName(Ta
86d0: 62 6c 65 20 2a 70 54 61 62 2c 20 43 6f 6c 75 6d  ble *pTab, Colum
86e0: 6e 20 2a 70 43 6f 6c 29 7b 0a 20 20 69 66 28 20  n *pCol){.  if( 
86f0: 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
8700: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 22 5f  (pCol->zName, "_
8710: 5f 68 69 64 64 65 6e 5f 5f 22 2c 20 31 30 29 3d  _hidden__", 10)=
8720: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e  =0 ){.    pCol->
8730: 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46  colFlags |= COLF
8740: 4c 41 47 5f 48 49 44 44 45 4e 3b 0a 20 20 7d 65  LAG_HIDDEN;.  }e
8750: 6c 73 65 20 69 66 28 20 70 54 61 62 20 26 26 20  lse if( pTab && 
8760: 70 43 6f 6c 21 3d 70 54 61 62 2d 3e 61 43 6f 6c  pCol!=pTab->aCol
8770: 20 26 26 20 28 70 43 6f 6c 5b 2d 31 5d 2e 63 6f   && (pCol[-1].co
8780: 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47  lFlags & COLFLAG
8790: 5f 48 49 44 44 45 4e 29 20 29 7b 0a 20 20 20 20  _HIDDEN) ){.    
87a0: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
87b0: 3d 20 54 46 5f 4f 4f 4f 48 69 64 64 65 6e 3b 0a  = TF_OOOHidden;.
87c0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
87d0: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63  *.** Add a new c
87e0: 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62  olumn to the tab
87f0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  le currently bei
8800: 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a  ng constructed..
8810: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  **.** The parser
8820: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
8830: 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ine once for eac
8840: 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61  h column declara
8850: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45  tion.** in a CRE
8860: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
8870: 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61  ent.  sqlite3Sta
8880: 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20 63  rtTable() gets c
8890: 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74  alled.** first t
88a0: 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69  o get things goi
88b0: 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72  ng.  Then this r
88c0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
88d0: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c   for each.** col
88e0: 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  umn..*/.void sql
88f0: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61  ite3AddColumn(Pa
8900: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
8910: 65 6e 20 2a 70 4e 61 6d 65 2c 20 54 6f 6b 65 6e  en *pName, Token
8920: 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c   *pType){.  Tabl
8930: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
8940: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72   char *z;.  char
8950: 20 2a 7a 54 79 70 65 3b 0a 20 20 43 6f 6c 75 6d   *zType;.  Colum
8960: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74  n *pCol;.  sqlit
8970: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
8980: 3e 64 62 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  >db;.  if( (p = 
8990: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
89a0: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
89b0: 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e    if( p->nCol+1>
89c0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
89d0: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
89e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
89f0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8a00: 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
8a10: 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d   on %s", p->zNam
8a20: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
8a30: 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65    }.  z = sqlite
8a40: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
8a50: 20 70 4e 61 6d 65 2d 3e 6e 20 2b 20 70 54 79 70   pName->n + pTyp
8a60: 65 2d 3e 6e 20 2b 20 32 29 3b 0a 20 20 69 66 28  e->n + 2);.  if(
8a70: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
8a80: 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 4e 61 6d    memcpy(z, pNam
8a90: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
8aa0: 0a 20 20 7a 5b 70 4e 61 6d 65 2d 3e 6e 5d 20 3d  .  z[pName->n] =
8ab0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71   0;.  sqlite3Deq
8ac0: 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f 72 28 69  uote(z);.  for(i
8ad0: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
8ae0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
8af0: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 2c 20  ite3_stricmp(z, 
8b00: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  p->aCol[i].zName
8b10: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
8b20: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8b30: 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65  arse, "duplicate
8b40: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73   column name: %s
8b50: 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", z);.      sql
8b60: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
8b70: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
8b80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
8b90: 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29   (p->nCol & 0x7)
8ba0: 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d  ==0 ){.    Colum
8bb0: 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65  n *aNew;.    aNe
8bc0: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
8bd0: 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c  lloc(db,p->aCol,
8be0: 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65  (p->nCol+8)*size
8bf0: 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b  of(p->aCol[0]));
8c00: 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30  .    if( aNew==0
8c10: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8c20: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a  3DbFree(db, z);.
8c30: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
8c40: 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20    }.    p->aCol 
8c50: 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43  = aNew;.  }.  pC
8c60: 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d  ol = &p->aCol[p-
8c70: 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74  >nCol];.  memset
8c80: 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (pCol, 0, sizeof
8c90: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
8ca0: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
8cb0: 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  ;.  sqlite3Colum
8cc0: 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e  nPropertiesFromN
8cd0: 61 6d 65 28 70 2c 20 70 43 6f 6c 29 3b 0a 20 0a  ame(p, pCol);. .
8ce0: 20 20 69 66 28 20 70 54 79 70 65 2d 3e 6e 3d 3d    if( pType->n==
8cf0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  0 ){.    /* If t
8d00: 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20  here is no type 
8d10: 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d  specified, colum
8d20: 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66 61  ns have the defa
8d30: 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20 20  ult affinity.   
8d40: 20 2a 2a 20 27 42 4c 4f 42 27 20 77 69 74 68 20   ** 'BLOB' with 
8d50: 61 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20 6f  a default size o
8d60: 66 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20  f 4 bytes. */.  
8d70: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
8d80: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
8d90: 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a  OB;.    pCol->sz
8da0: 45 73 74 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  Est = 1;.#ifdef 
8db0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
8dc0: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
8dd0: 20 20 20 20 69 66 28 20 34 3e 3d 73 71 6c 69 74      if( 4>=sqlit
8de0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
8df0: 7a 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20 20  zSorterRef ){.  
8e00: 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
8e10: 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 53 4f  gs |= COLFLAG_SO
8e20: 52 54 45 52 52 45 46 3b 0a 20 20 20 20 7d 0a 23  RTERREF;.    }.#
8e30: 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
8e40: 20 20 20 7a 54 79 70 65 20 3d 20 7a 20 2b 20 73     zType = z + s
8e50: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
8e60: 29 20 2b 20 31 3b 0a 20 20 20 20 6d 65 6d 63 70  ) + 1;.    memcp
8e70: 79 28 7a 54 79 70 65 2c 20 70 54 79 70 65 2d 3e  y(zType, pType->
8e80: 7a 2c 20 70 54 79 70 65 2d 3e 6e 29 3b 0a 20 20  z, pType->n);.  
8e90: 20 20 7a 54 79 70 65 5b 70 54 79 70 65 2d 3e 6e    zType[pType->n
8ea0: 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
8eb0: 65 33 44 65 71 75 6f 74 65 28 7a 54 79 70 65 29  e3Dequote(zType)
8ec0: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69  ;.    pCol->affi
8ed0: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66  nity = sqlite3Af
8ee0: 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65  finityType(zType
8ef0: 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 70 43 6f  , pCol);.    pCo
8f00: 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l->colFlags |= C
8f10: 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a  OLFLAG_HASTYPE;.
8f20: 20 20 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b    }.  p->nCol++;
8f30: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74  .  pParse->const
8f40: 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 3d 20 30 3b  raintName.n = 0;
8f50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
8f60: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8f70: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
8f80: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
8f90: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
8fa0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
8fb0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e  statement.  A "N
8fc0: 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61  OT NULL" constra
8fd0: 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20  int has.** been 
8fe0: 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  seen on a column
8ff0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
9000: 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c  sets the notNull
9010: 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20   flag on.** the 
9020: 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79  column currently
9030: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
9040: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
9050: 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50  ite3AddNotNull(P
9060: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
9070: 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61  t onError){.  Ta
9080: 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e  ble *p;.  Column
9090: 20 2a 70 43 6f 6c 3b 0a 20 20 70 20 3d 20 70 50   *pCol;.  p = pP
90a0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
90b0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e  .  if( p==0 || N
90c0: 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20  EVER(p->nCol<1) 
90d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c  ) return;.  pCol
90e0: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e   = &p->aCol[p->n
90f0: 43 6f 6c 2d 31 5d 3b 0a 20 20 70 43 6f 6c 2d 3e  Col-1];.  pCol->
9100: 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e  notNull = (u8)on
9110: 45 72 72 6f 72 3b 0a 20 20 70 2d 3e 74 61 62 46  Error;.  p->tabF
9120: 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 4e 6f  lags |= TF_HasNo
9130: 74 4e 75 6c 6c 3b 0a 0a 20 20 2f 2a 20 53 65 74  tNull;..  /* Set
9140: 20 74 68 65 20 75 6e 69 71 4e 6f 74 4e 75 6c 6c   the uniqNotNull
9150: 20 66 6c 61 67 20 6f 6e 20 61 6e 79 20 55 4e 49   flag on any UNI
9160: 51 55 45 20 6f 72 20 50 4b 20 69 6e 64 65 78 65  QUE or PK indexe
9170: 73 20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65  s already create
9180: 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 63  d.  ** on this c
9190: 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a 20 20 69 66 28  olumn.  */.  if(
91a0: 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
91b0: 26 20 43 4f 4c 46 4c 41 47 5f 55 4e 49 51 55 45  & COLFLAG_UNIQUE
91c0: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
91d0: 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
91e0: 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  x=p->pIndex; pId
91f0: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
9200: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
9210: 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  rt( pIdx->nKeyCo
9220: 6c 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e  l==1 && pIdx->on
9230: 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
9240: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
9250: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 70  ->aiColumn[0]==p
9260: 2d 3e 6e 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20  ->nCol-1 ){.    
9270: 20 20 20 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f      pIdx->uniqNo
9280: 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 20  tNull = 1;.     
9290: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
92a0: 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63  /*.** Scan the c
92b0: 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20  olumn type name 
92c0: 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54  zType (length nT
92d0: 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20  ype) and return 
92e0: 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  the.** associate
92f0: 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e  d affinity type.
9300: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9310: 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d  ine does a case-
9320: 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72  independent sear
9330: 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20  ch of zType for 
9340: 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e  the .** substrin
9350: 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  gs in the follow
9360: 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e  ing table. If on
9370: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
9380: 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c  ngs is.** found,
9390: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
93a0: 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73 20 72  ng affinity is r
93b0: 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70  eturned. If zTyp
93c0: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f  e contains.** mo
93d0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74  re than one of t
93e0: 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65  he substrings, e
93f0: 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20 74 68  ntries toward th
9400: 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65  e top of .** the
9410: 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f   table take prio
9420: 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c  rity. For exampl
9430: 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20 27  e, if zType is '
9440: 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51  BLOBINT', .** SQ
9450: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
9460: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
9470: 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20  .** Substring   
9480: 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20    | Affinity.** 
9490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
94a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
94b0: 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20  .** 'INT'       
94c0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49    | SQLITE_AFF_I
94d0: 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27  NTEGER.** 'CHAR'
94e0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
94f0: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c  _AFF_TEXT.** 'CL
9500: 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OB'        | SQL
9510: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
9520: 27 54 45 58 54 27 20 20 20 20 20 20 20 20 7c 20  'TEXT'        | 
9530: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
9540: 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20  ** 'BLOB'       
9550: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   | SQLITE_AFF_BL
9560: 4f 42 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20  OB.** 'REAL'    
9570: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
9580: 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20  _REAL.** 'FLOA' 
9590: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
95a0: 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55  AFF_REAL.** 'DOU
95b0: 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  B'        | SQLI
95c0: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a  TE_AFF_REAL.**.*
95d0: 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65  * If none of the
95e0: 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74   substrings in t
95f0: 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61  he above table a
9600: 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c  re found,.** SQL
9610: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
9620: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
9630: 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69  char sqlite3Affi
9640: 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63  nityType(const c
9650: 68 61 72 20 2a 7a 49 6e 2c 20 43 6f 6c 75 6d 6e  har *zIn, Column
9660: 20 2a 70 43 6f 6c 29 7b 0a 20 20 75 33 32 20 68   *pCol){.  u32 h
9670: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66   = 0;.  char aff
9680: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55   = SQLITE_AFF_NU
9690: 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 63  MERIC;.  const c
96a0: 68 61 72 20 2a 7a 43 68 61 72 20 3d 20 30 3b 0a  har *zChar = 0;.
96b0: 0a 20 20 61 73 73 65 72 74 28 20 7a 49 6e 21 3d  .  assert( zIn!=
96c0: 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 7a 49  0 );.  while( zI
96d0: 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20  n[0] ){.    h = 
96e0: 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33  (h<<8) + sqlite3
96f0: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a  UpperToLower[(*z
9700: 49 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a  In)&0xff];.    z
9710: 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d  In++;.    if( h=
9720: 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27  =(('c'<<24)+('h'
9730: 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27  <<16)+('a'<<8)+'
9740: 72 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20  r') ){          
9750: 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20     /* CHAR */.  
9760: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
9770: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 20  _AFF_TEXT;.     
9780: 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 20 20   zChar = zIn;.  
9790: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
97a0: 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c  ('c'<<24)+('l'<<
97b0: 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27  16)+('o'<<8)+'b'
97c0: 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c  ) ){       /* CL
97d0: 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  OB */.      aff 
97e0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
97f0: 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
9800: 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28   h==(('t'<<24)+(
9810: 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38  'e'<<16)+('x'<<8
9820: 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20 20  )+'t') ){       
9830: 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20  /* TEXT */.     
9840: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9850: 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73  F_TEXT;.    }els
9860: 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c  e if( h==(('b'<<
9870: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
9880: 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20  o'<<8)+'b')     
9890: 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a       /* BLOB */.
98a0: 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d          && (aff=
98b0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
98c0: 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  RIC || aff==SQLI
98d0: 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a  TE_AFF_REAL) ){.
98e0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
98f0: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20  TE_AFF_BLOB;.   
9900: 20 20 20 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27     if( zIn[0]=='
9910: 28 27 20 29 20 7a 43 68 61 72 20 3d 20 7a 49 6e  (' ) zChar = zIn
9920: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
9930: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
9940: 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20 69  OINT.    }else i
9950: 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29  f( h==(('r'<<24)
9960: 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c  +('e'<<16)+('a'<
9970: 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20 20  <8)+'l')        
9980: 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20    /* REAL */.   
9990: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
99a0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
99b0: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
99c0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
99d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
99e0: 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('f'<<24)+('l'
99f0: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
9a00: 61 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a')          /* 
9a10: 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20 20  FLOA */.        
9a20: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
9a30: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
9a40: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
9a50: 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d  _AFF_REAL;.    }
9a60: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 64  else if( h==(('d
9a70: 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29  '<<24)+('o'<<16)
9a80: 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20 20  +('u'<<8)+'b')  
9a90: 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42 20          /* DOUB 
9aa0: 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66  */.        && af
9ab0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
9ac0: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61  MERIC ){.      a
9ad0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
9ae0: 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  REAL;.#endif.   
9af0: 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30 78   }else if( (h&0x
9b00: 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69 27  00FFFFFF)==(('i'
9b10: 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27  <<16)+('n'<<8)+'
9b20: 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54  t') ){    /* INT
9b30: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
9b40: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
9b50: 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ER;.      break;
9b60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9b70: 20 49 66 20 70 43 6f 6c 20 69 73 20 6e 6f 74 20   If pCol is not 
9b80: 4e 55 4c 4c 2c 20 73 74 6f 72 65 20 61 6e 20 65  NULL, store an e
9b90: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 66  stimate of the f
9ba0: 69 65 6c 64 20 73 69 7a 65 2e 20 20 54 68 65 0a  ield size.  The.
9bb0: 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 20 69 73    ** estimate is
9bc0: 20 73 63 61 6c 65 64 20 73 6f 20 74 68 61 74 20   scaled so that 
9bd0: 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 69  the size of an i
9be0: 6e 74 65 67 65 72 20 69 73 20 31 2e 20 20 2a 2f  nteger is 1.  */
9bf0: 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20  .  if( pCol ){. 
9c00: 20 20 20 69 6e 74 20 76 20 3d 20 30 3b 20 20 20     int v = 0;   
9c10: 2f 2a 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20  /* default size 
9c20: 69 73 20 61 70 70 72 6f 78 20 34 20 62 79 74 65  is approx 4 byte
9c30: 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66 66  s */.    if( aff
9c40: 3c 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  <SQLITE_AFF_NUME
9c50: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 69 66 28  RIC ){.      if(
9c60: 20 7a 43 68 61 72 20 29 7b 0a 20 20 20 20 20 20   zChar ){.      
9c70: 20 20 77 68 69 6c 65 28 20 7a 43 68 61 72 5b 30    while( zChar[0
9c80: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ] ){.          i
9c90: 66 28 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  f( sqlite3Isdigi
9ca0: 74 28 7a 43 68 61 72 5b 30 5d 29 20 29 7b 0a 20  t(zChar[0]) ){. 
9cb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c             /* BL
9cc0: 4f 42 28 6b 29 2c 20 56 41 52 43 48 41 52 28 6b  OB(k), VARCHAR(k
9cd0: 29 2c 20 43 48 41 52 28 6b 29 20 2d 3e 20 72 3d  ), CHAR(k) -> r=
9ce0: 28 6b 2f 34 2b 31 29 20 2a 2f 0a 20 20 20 20 20  (k/4+1) */.     
9cf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65         sqlite3Ge
9d00: 74 49 6e 74 33 32 28 7a 43 68 61 72 2c 20 26 76  tInt32(zChar, &v
9d10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
9d20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
9d30: 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 43 68 61  }.          zCha
9d40: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  r++;.        }. 
9d50: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9d60: 20 20 20 20 76 20 3d 20 31 36 3b 20 20 20 2f 2a      v = 16;   /*
9d70: 20 42 4c 4f 42 2c 20 54 45 58 54 2c 20 43 4c 4f   BLOB, TEXT, CLO
9d80: 42 20 2d 3e 20 72 3d 35 20 20 28 61 70 70 72 6f  B -> r=5  (appro
9d90: 78 20 32 30 20 62 79 74 65 73 29 2a 2f 0a 20 20  x 20 bytes)*/.  
9da0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64      }.    }.#ifd
9db0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
9dc0: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
9dd0: 45 53 0a 20 20 20 20 69 66 28 20 76 3e 3d 73 71  ES.    if( v>=sq
9de0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
9df0: 67 2e 73 7a 53 6f 72 74 65 72 52 65 66 20 29 7b  g.szSorterRef ){
9e00: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c  .      pCol->col
9e10: 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
9e20: 5f 53 4f 52 54 45 52 52 45 46 3b 0a 20 20 20 20  _SORTERREF;.    
9e30: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 76 20 3d  }.#endif.    v =
9e40: 20 76 2f 34 20 2b 20 31 3b 0a 20 20 20 20 69 66   v/4 + 1;.    if
9e50: 28 20 76 3e 32 35 35 20 29 20 76 20 3d 20 32 35  ( v>255 ) v = 25
9e60: 35 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a 45  5;.    pCol->szE
9e70: 73 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65  st = v;.  }.  re
9e80: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
9e90: 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
9ea0: 6e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  n is the default
9eb0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d   value for the m
9ec0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
9ed0: 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20  ed column.** of 
9ee0: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
9ef0: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
9f00: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65  uction..**.** De
9f10: 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72  fault value expr
9f20: 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20  essions must be 
9f30: 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65  constant.  Raise
9f40: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66   an exception if
9f50: 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20   this.** is not 
9f60: 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  the case..**.** 
9f70: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
9f80: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
9f90: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
9fa0: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
9fb0: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
9fc0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
9fd0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9fe0: 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28  AddDefaultValue(
9ff0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
a000: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
a010: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
a020: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
a030: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a040: 54 68 65 20 70 61 72 73 65 64 20 65 78 70 72 65  The parsed expre
a050: 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 64 65 66  ssion of the def
a060: 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20  ault value */.  
a070: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61  const char *zSta
a080: 72 74 2c 20 20 20 20 20 20 2f 2a 20 53 74 61 72  rt,      /* Star
a090: 74 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74  t of the default
a0a0: 20 76 61 6c 75 65 20 74 65 78 74 20 2a 2f 0a 20   value text */. 
a0b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e   const char *zEn
a0c0: 64 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  d         /* Fir
a0d0: 73 74 20 63 68 61 72 61 63 74 65 72 20 70 61 73  st character pas
a0e0: 74 20 65 6e 64 20 6f 66 20 64 65 66 61 75 74 20  t end of defaut 
a0f0: 76 61 6c 75 65 20 74 65 78 74 20 2a 2f 0a 29 7b  value text */.){
a100: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43  .  Table *p;.  C
a110: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73  olumn *pCol;.  s
a120: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
a130: 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 70  rse->db;.  p = p
a140: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
a150: 3b 0a 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a  ;.  if( p!=0 ){.
a160: 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e      pCol = &(p->
a170: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29  aCol[p->nCol-1])
a180: 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  ;.    if( !sqlit
a190: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
a1a0: 4f 72 46 75 6e 63 74 69 6f 6e 28 70 45 78 70 72  OrFunction(pExpr
a1b0: 2c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29  , db->init.busy)
a1c0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a1d0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
a1e0: 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65  , "default value
a1f0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20   of column [%s] 
a200: 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22  is not constant"
a210: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  ,.          pCol
a220: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  ->zName);.    }e
a230: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
a240: 63 6f 70 79 20 6f 66 20 70 45 78 70 72 20 69 73  copy of pExpr is
a250: 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66   used instead of
a260: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61   the original, a
a270: 73 20 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73  s pExpr contains
a280: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73  .      ** tokens
a290: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76   that point to v
a2a0: 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 0a  olatile memory..
a2b0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45        */.      E
a2c0: 78 70 72 20 78 3b 0a 20 20 20 20 20 20 73 71 6c  xpr x;.      sql
a2d0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
a2e0: 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b  b, pCol->pDflt);
a2f0: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 78  .      memset(&x
a300: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b  , 0, sizeof(x));
a310: 0a 20 20 20 20 20 20 78 2e 6f 70 20 3d 20 54 4b  .      x.op = TK
a320: 5f 53 50 41 4e 3b 0a 20 20 20 20 20 20 78 2e 75  _SPAN;.      x.u
a330: 2e 7a 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65  .zToken = sqlite
a340: 33 44 62 53 70 61 6e 44 75 70 28 64 62 2c 20 7a  3DbSpanDup(db, z
a350: 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20  Start, zEnd);.  
a360: 20 20 20 20 78 2e 70 4c 65 66 74 20 3d 20 70 45      x.pLeft = pE
a370: 78 70 72 3b 0a 20 20 20 20 20 20 78 2e 66 6c 61  xpr;.      x.fla
a380: 67 73 20 3d 20 45 50 5f 53 6b 69 70 3b 0a 20 20  gs = EP_Skip;.  
a390: 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20      pCol->pDflt 
a3a0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
a3b0: 28 64 62 2c 20 26 78 2c 20 45 58 50 52 44 55 50  (db, &x, EXPRDUP
a3c0: 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20 20  _REDUCE);.      
a3d0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
a3e0: 2c 20 78 2e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  , x.u.zToken);. 
a3f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
a400: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
a410: 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pExpr);.}../*.*
a420: 2a 20 42 61 63 6b 77 61 72 64 73 20 43 6f 6d 70  * Backwards Comp
a430: 61 74 69 62 69 6c 69 74 79 20 48 61 63 6b 3a 0a  atibility Hack:.
a440: 2a 2a 20 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61  ** .** Historica
a450: 6c 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  l versions of SQ
a460: 4c 69 74 65 20 61 63 63 65 70 74 65 64 20 73 74  Lite accepted st
a470: 72 69 6e 67 73 20 61 73 20 63 6f 6c 75 6d 6e 20  rings as column 
a480: 6e 61 6d 65 73 20 69 6e 0a 2a 2a 20 69 6e 64 65  names in.** inde
a490: 78 65 73 20 61 6e 64 20 50 52 49 4d 41 52 59 20  xes and PRIMARY 
a4a0: 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  KEY constraints 
a4b0: 61 6e 64 20 69 6e 20 55 4e 49 51 55 45 20 63 6f  and in UNIQUE co
a4c0: 6e 73 74 72 61 69 6e 74 73 2e 20 20 45 78 61 6d  nstraints.  Exam
a4d0: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43  ple:.**.**     C
a4e0: 52 45 41 54 45 20 54 41 42 4c 45 20 78 79 7a 28  REATE TABLE xyz(
a4f0: 61 2c 62 2c 63 2c 64 2c 65 2c 50 52 49 4d 41 52  a,b,c,d,e,PRIMAR
a500: 59 20 4b 45 59 28 27 61 27 29 2c 55 4e 49 51 55  Y KEY('a'),UNIQU
a510: 45 28 27 62 27 2c 27 63 27 20 43 4f 4c 4c 41 54  E('b','c' COLLAT
a520: 45 20 74 72 69 6d 29 0a 2a 2a 20 20 20 20 20 43  E trim).**     C
a530: 52 45 41 54 45 20 49 4e 44 45 58 20 61 62 63 20  REATE INDEX abc 
a540: 4f 4e 20 78 79 7a 28 27 63 27 2c 27 64 27 20 44  ON xyz('c','d' D
a550: 45 53 43 2c 27 65 27 20 43 4f 4c 4c 41 54 45 20  ESC,'e' COLLATE 
a560: 6e 6f 63 61 73 65 20 44 45 53 43 29 3b 0a 2a 2a  nocase DESC);.**
a570: 0a 2a 2a 20 54 68 69 73 20 69 73 20 67 6f 6f 66  .** This is goof
a580: 79 2e 20 20 42 75 74 20 74 6f 20 70 72 65 73 65  y.  But to prese
a590: 72 76 65 20 62 61 63 6b 77 61 72 64 73 20 63 6f  rve backwards co
a5a0: 6d 70 61 74 69 62 69 6c 69 74 79 20 77 65 20 63  mpatibility we c
a5b0: 6f 6e 74 69 6e 75 65 20 74 6f 0a 2a 2a 20 61 63  ontinue to.** ac
a5c0: 63 65 70 74 20 69 74 2e 20 20 54 68 69 73 20 72  cept it.  This r
a5d0: 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
a5e0: 6e 65 63 65 73 73 61 72 79 20 63 6f 6e 76 65 72  necessary conver
a5f0: 73 69 6f 6e 2e 20 20 49 74 20 63 6f 6e 76 65 72  sion.  It conver
a600: 74 73 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73  ts.** the expres
a610: 73 69 6f 6e 20 67 69 76 65 6e 20 69 6e 20 69 74  sion given in it
a620: 73 20 61 72 67 75 6d 65 6e 74 20 66 72 6f 6d 20  s argument from 
a630: 61 20 54 4b 5f 53 54 52 49 4e 47 20 69 6e 74 6f  a TK_STRING into
a640: 20 61 20 54 4b 5f 49 44 0a 2a 2a 20 69 66 20 74   a TK_ID.** if t
a650: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
a660: 20 6a 75 73 74 20 61 20 54 4b 5f 53 54 52 49 4e   just a TK_STRIN
a670: 47 20 77 69 74 68 20 61 6e 20 6f 70 74 69 6f 6e  G with an option
a680: 61 6c 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73  al COLLATE claus
a690: 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65 70 78  e..** If the epx
a6a0: 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 79 74 68  ression is anyth
a6b0: 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 54  ing other than T
a6c0: 4b 5f 53 54 52 49 4e 47 2c 20 74 68 65 20 65 78  K_STRING, the ex
a6d0: 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 75  pression is.** u
a6e0: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61  nchanged..*/.sta
a6f0: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
a700: 53 74 72 69 6e 67 54 6f 49 64 28 45 78 70 72 20  StringToId(Expr 
a710: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 70  *p){.  if( p->op
a720: 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20  ==TK_STRING ){. 
a730: 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44     p->op = TK_ID
a740: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
a750: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
a760: 26 26 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  && p->pLeft->op=
a770: 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20  =TK_STRING ){.  
a780: 20 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 20 3d    p->pLeft->op =
a790: 20 54 4b 5f 49 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f   TK_ID;.  }.}../
a7a0: 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74  *.** Designate t
a7b0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66  he PRIMARY KEY f
a7c0: 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70  or the table.  p
a7d0: 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  List is a list o
a7e0: 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63  f names .** of c
a7f0: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d  olumns that form
a800: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
a810: 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e  .  If pList is N
a820: 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ULL, then the.**
a830: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
a840: 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  dded column of t
a850: 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  he table is the 
a860: 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a  primary key..**.
a870: 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68  ** A table can h
a880: 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  ave at most one 
a890: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66  primary key.  If
a8a0: 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61   the table alrea
a8b0: 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d  dy has.** a prim
a8c0: 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69  ary key (and thi
a8d0: 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20  s is the second 
a8e0: 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65  primary key) the
a8f0: 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65  n create an.** e
a900: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rror..**.** If t
a910: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
a920: 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f  s on a single co
a930: 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74  lumn whose datat
a940: 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a  ype is INTEGER,.
a950: 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  ** then we will 
a960: 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20  try to use that 
a970: 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f  column as the ro
a980: 77 69 64 2e 20 20 53 65 74 20 74 68 65 20 54 61  wid.  Set the Ta
a990: 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65  ble.iPKey.** fie
a9a0: 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ld of the table 
a9b0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
a9c0: 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64  on to be the ind
a9d0: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54  ex of the.** INT
a9e0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
a9f0: 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e   column.  Table.
aa00: 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20  iPKey is set to 
aa10: 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a  -1 if there is.*
aa20: 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49  * no INTEGER PRI
aa30: 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20  MARY KEY..**.** 
aa40: 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f  If the key is no
aa50: 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  t an INTEGER PRI
aa60: 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63  MARY KEY, then c
aa70: 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a  reate a unique.*
aa80: 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20  * index for the 
aa90: 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69  key.  No index i
aaa0: 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e  s created for IN
aab0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
aac0: 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  Ys..*/.void sqli
aad0: 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79  te3AddPrimaryKey
aae0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
aaf0: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
ab00: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
ab10: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
ab20: 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64  /* List of field
ab30: 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64   names to be ind
ab40: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  exed */.  int on
ab50: 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57  Error,      /* W
ab60: 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61  hat to do with a
ab70: 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66   uniqueness conf
ab80: 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75  lict */.  int au
ab90: 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54  toInc,      /* T
aba0: 72 75 65 20 69 66 20 74 68 65 20 41 55 54 4f 49  rue if the AUTOI
abb0: 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64  NCREMENT keyword
abc0: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
abd0: 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 20   int sortOrder  
abe0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f     /* SQLITE_SO_
abf0: 41 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f  ASC or SQLITE_SO
ac00: 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61  _DESC */.){.  Ta
ac10: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72  ble *pTab = pPar
ac20: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
ac30: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20   Column *pCol = 
ac40: 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  0;.  int iCol = 
ac50: 2d 31 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 54 65  -1, i;.  int nTe
ac60: 72 6d 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  rm;.  if( pTab==
ac70: 30 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79  0 ) goto primary
ac80: 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28  _key_exit;.  if(
ac90: 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
aca0: 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b  & TF_HasPrimaryK
acb0: 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
acc0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
acd0: 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20  , .      "table 
ace0: 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20  \"%s\" has more 
acf0: 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79  than one primary
ad00: 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61   key", pTab->zNa
ad10: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72  me);.    goto pr
ad20: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a  imary_key_exit;.
ad30: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 74 61 62 46    }.  pTab->tabF
ad40: 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 50 72  lags |= TF_HasPr
ad50: 69 6d 61 72 79 4b 65 79 3b 0a 20 20 69 66 28 20  imaryKey;.  if( 
ad60: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
ad70: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f  iCol = pTab->nCo
ad80: 6c 20 2d 20 31 3b 0a 20 20 20 20 70 43 6f 6c 20  l - 1;.    pCol 
ad90: 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  = &pTab->aCol[iC
ada0: 6f 6c 5d 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63  ol];.    pCol->c
adb0: 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c  olFlags |= COLFL
adc0: 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20  AG_PRIMKEY;.    
add0: 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c  nTerm = 1;.  }el
ade0: 73 65 7b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20  se{.    nTerm = 
adf0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
ae00: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65    for(i=0; i<nTe
ae10: 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rm; i++){.      
ae20: 45 78 70 72 20 2a 70 43 45 78 70 72 20 3d 20 73  Expr *pCExpr = s
ae30: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
ae40: 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  llate(pList->a[i
ae50: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
ae60: 61 73 73 65 72 74 28 20 70 43 45 78 70 72 21 3d  assert( pCExpr!=
ae70: 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
ae80: 65 33 53 74 72 69 6e 67 54 6f 49 64 28 70 43 45  e3StringToId(pCE
ae90: 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
aea0: 70 43 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  pCExpr->op==TK_I
aeb0: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  D ){.        con
aec0: 73 74 20 63 68 61 72 20 2a 7a 43 4e 61 6d 65 20  st char *zCName 
aed0: 3d 20 70 43 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  = pCExpr->u.zTok
aee0: 65 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  en;.        for(
aef0: 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61  iCol=0; iCol<pTa
af00: 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  b->nCol; iCol++)
af10: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
af20: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
af30: 43 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f  CName, pTab->aCo
af40: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d  l[iCol].zName)==
af50: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
af60: 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61   pCol = &pTab->a
af70: 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20  Col[iCol];.     
af80: 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c         pCol->col
af90: 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
afa0: 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 20 20  _PRIMKEY;.      
afb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
afc0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
afd0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
afe0: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 54 65 72 6d  .  }.  if( nTerm
aff0: 3d 3d 31 0a 20 20 20 26 26 20 70 43 6f 6c 0a 20  ==1.   && pCol. 
b000: 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49    && sqlite3StrI
b010: 43 6d 70 28 73 71 6c 69 74 65 33 43 6f 6c 75 6d  Cmp(sqlite3Colum
b020: 6e 54 79 70 65 28 70 43 6f 6c 2c 22 22 29 2c 20  nType(pCol,""), 
b030: 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20  "INTEGER")==0.  
b040: 20 26 26 20 73 6f 72 74 4f 72 64 65 72 21 3d 53   && sortOrder!=S
b050: 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 0a 20 20  QLITE_SO_DESC.  
b060: 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b  ){.    pTab->iPK
b070: 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70  ey = iCol;.    p
b080: 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28  Tab->keyConf = (
b090: 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20  u8)onError;.    
b0a0: 61 73 73 65 72 74 28 20 61 75 74 6f 49 6e 63 3d  assert( autoInc=
b0b0: 3d 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31  =0 || autoInc==1
b0c0: 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61   );.    pTab->ta
b0d0: 62 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e  bFlags |= autoIn
b0e0: 63 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  c*TF_Autoincreme
b0f0: 6e 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  nt;.    if( pLis
b100: 74 20 29 20 70 50 61 72 73 65 2d 3e 69 50 6b 53  t ) pParse->iPkS
b110: 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74  ortOrder = pList
b120: 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
b130: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75  ;.  }else if( au
b140: 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66  toInc ){.#ifndef
b150: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
b160: 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73  OINCREMENT.    s
b170: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
b180: 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52  Parse, "AUTOINCR
b190: 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c  EMENT is only al
b1a0: 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20  lowed on an ".  
b1b0: 20 20 20 20 20 22 49 4e 54 45 47 45 52 20 50 52       "INTEGER PR
b1c0: 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e  IMARY KEY");.#en
b1d0: 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
b1e0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
b1f0: 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30  dex(pParse, 0, 0
b200: 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72  , 0, pList, onEr
b210: 72 6f 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  ror, 0,.        
b220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b230: 20 20 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c     0, sortOrder,
b240: 20 30 2c 20 53 51 4c 49 54 45 5f 49 44 58 54 59   0, SQLITE_IDXTY
b250: 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 29 3b 0a  PE_PRIMARYKEY);.
b260: 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20      pList = 0;. 
b270: 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f   }..primary_key_
b280: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45  exit:.  sqlite3E
b290: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
b2a0: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29  arse->db, pList)
b2b0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
b2c0: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 43  *.** Add a new C
b2d0: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
b2e0: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
b2f0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
b300: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
b310: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 68 65  id sqlite3AddChe
b320: 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  ckConstraint(.  
b330: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
b340: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
b350: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
b360: 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20 54  pCheckExpr  /* T
b370: 68 65 20 63 68 65 63 6b 20 65 78 70 72 65 73 73  he check express
b380: 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  ion */.){.#ifnde
b390: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
b3a0: 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  ECK.  Table *pTa
b3b0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
b3c0: 54 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33  Table;.  sqlite3
b3d0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
b3e0: 62 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26 26  b;.  if( pTab &&
b3f0: 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41   !IN_DECLARE_VTA
b400: 42 0a 20 20 20 26 26 20 21 73 71 6c 69 74 65 33  B.   && !sqlite3
b410: 42 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79 28  BtreeIsReadonly(
b420: 64 62 2d 3e 61 44 62 5b 64 62 2d 3e 69 6e 69 74  db->aDb[db->init
b430: 2e 69 44 62 5d 2e 70 42 74 29 0a 20 20 29 7b 0a  .iDb].pBt).  ){.
b440: 20 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63 6b      pTab->pCheck
b450: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
b460: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
b470: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 70   pTab->pCheck, p
b480: 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 20 20  CheckExpr);.    
b490: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73  if( pParse->cons
b4a0: 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a  traintName.n ){.
b4b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
b4c0: 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
b4d0: 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65 63  rse, pTab->pChec
b4e0: 6b 2c 20 26 70 50 61 72 73 65 2d 3e 63 6f 6e 73  k, &pParse->cons
b4f0: 74 72 61 69 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a  traintName, 1);.
b500: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65      }.  }else.#e
b510: 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ndif.  {.    sql
b520: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
b530: 50 61 72 73 65 2d 3e 64 62 2c 20 70 43 68 65 63  Parse->db, pChec
b540: 6b 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  kExpr);.  }.}../
b550: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c  *.** Set the col
b560: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
b570: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
b580: 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c  ntly parsed tabl
b590: 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74  e column.** to t
b5a0: 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e  he CollSeq given
b5b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b5c0: 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28  3AddCollateType(
b5d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
b5e0: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
b5f0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
b600: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c   i;.  char *zCol
b610: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
b620: 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61 6d 65  /* Dequoted name
b630: 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65   of collation se
b640: 71 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69  quence */.  sqli
b650: 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
b660: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
b670: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
b680: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
b690: 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50 61  ol-1;.  db = pPa
b6a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c  rse->db;.  zColl
b6b0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
b6c0: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b  omToken(db, pTok
b6d0: 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c  en);.  if( !zCol
b6e0: 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69  l ) return;..  i
b6f0: 66 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  f( sqlite3Locate
b700: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
b710: 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 49 6e  zColl) ){.    In
b720: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 73  dex *pIdx;.    s
b730: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
b740: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c   p->aCol[i].zCol
b750: 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b  l);.    p->aCol[
b760: 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c  i].zColl = zColl
b770: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  ;.  .    /* If t
b780: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63  he column is dec
b790: 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e  lared as "<name>
b7a0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c   PRIMARY KEY COL
b7b0: 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20  LATE <type>",.  
b7c0: 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64    ** then an ind
b7d0: 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ex may have been
b7e0: 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73   created on this
b7f0: 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74   column before t
b800: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74  he.    ** collat
b810: 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64  ion type was add
b820: 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73  ed. Correct this
b830: 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61   if it is the ca
b840: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  se..    */.    f
b850: 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65  or(pIdx=p->pInde
b860: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
b870: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
b880: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
b890: 6e 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20  nKeyCol==1 );.  
b8a0: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
b8b0: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a  Column[0]==i ){.
b8c0: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
b8d0: 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f  Coll[0] = p->aCo
b8e0: 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  l[i].zColl;.    
b8f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
b900: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  e{.    sqlite3Db
b910: 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
b920: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
b930: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
b940: 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  rns the collatio
b950: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64  n sequence for d
b960: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74  atabase native t
b970: 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20  ext.** encoding 
b980: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
b990: 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20  e string zName, 
b9a0: 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a  length nName..**
b9b0: 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65  .** If the reque
b9c0: 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  sted collation s
b9d0: 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61  equence is not a
b9e0: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74  vailable, or not
b9f0: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e   available.** in
ba00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
ba10: 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74  tive encoding, t
ba20: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
ba30: 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20  tory is invoked 
ba40: 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74  to.** request it
ba50: 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  . If the collati
ba60: 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20  on factory does 
ba70: 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20  not supply such 
ba80: 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61  a sequence,.** a
ba90: 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  nd the sequence 
baa0: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  is available in 
bab0: 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63  another text enc
bac0: 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74  oding, then that
bad0: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
bae0: 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
baf0: 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66  f no versions of
bb00: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
bb10: 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e  ollations sequen
bb20: 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ce are available
bb30: 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20  , or.** another 
bb40: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
bb50: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
bb60: 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nd an error mess
bb70: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
bb80: 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a  .** pParse..**.*
bb90: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
bba0: 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
bbb0: 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f  nd sqlite3FindCo
bbc0: 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20 72  llSeq().  This r
bbd0: 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65  outine.** invoke
bbe0: 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
bbf0: 66 61 63 74 6f 72 79 20 69 66 20 74 68 65 20 6e  factory if the n
bc00: 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63  amed collation c
bc10: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a  annot be found.*
bc20: 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 20  * and generates 
bc30: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
bc40: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
bc50: 3a 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  : sqlite3FindCol
bc60: 6c 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33 47  lSeq(), sqlite3G
bc70: 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43  etCollSeq().*/.C
bc80: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c  ollSeq *sqlite3L
bc90: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72  ocateCollSeq(Par
bca0: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
bcb0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
bcc0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
bcd0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38  pParse->db;.  u8
bce0: 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a   enc = ENC(db);.
bcf0: 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20    u8 initbusy = 
bd00: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20  db->init.busy;. 
bd10: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
bd20: 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
bd30: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
bd40: 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69  b, enc, zName, i
bd50: 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20  nitbusy);.  if( 
bd60: 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70  !initbusy && (!p
bd70: 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e  Coll || !pColl->
bd80: 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43 6f  xCmp) ){.    pCo
bd90: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43  ll = sqlite3GetC
bda0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 65  ollSeq(pParse, e
bdb0: 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65  nc, pColl, zName
bdc0: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
bdd0: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   pColl;.}.../*.*
bde0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
bdf0: 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d  that will increm
be00: 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63  ent the schema c
be10: 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ookie..**.** The
be20: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69   schema cookie i
be30: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
be40: 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68  ine when the sch
be50: 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64  ema for the.** d
be60: 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e  atabase changes.
be70: 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68    After each sch
be80: 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20  ema change, the 
be90: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20  cookie value.** 
bea0: 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61  changes.  When a
beb0: 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72   process first r
bec0: 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20  eads the schema 
bed0: 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a  it records the.*
bee0: 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65  * cookie.  There
bef0: 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20  after, whenever 
bf00: 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73  it goes to acces
bf10: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a  s the database,.
bf20: 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65  ** it checks the
bf30: 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20   cookie to make 
bf40: 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20  sure the schema 
bf50: 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a  has not changed.
bf60: 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20  ** since it was 
bf70: 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  last read..**.**
bf80: 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f   This plan is no
bf90: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c  t completely bul
bfa0: 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69  let-proof.  It i
bfb0: 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a  s possible for.*
bfc0: 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20  * the schema to 
bfd0: 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20  change multiple 
bfe0: 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68  times and for th
bff0: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a  e cookie to be.*
c000: 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72  * set back to pr
c010: 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20  ior value.  But 
c020: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61  schema changes a
c030: 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a  re infrequent.**
c040: 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69   and the probabi
c050: 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20  lity of hitting 
c060: 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20  the same cookie 
c070: 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a  value is only.**
c080: 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33   1 chance in 2^3
c090: 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66  2.  So we're saf
c0a0: 65 20 65 6e 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20  e enough..**.** 
c0b0: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
c0c0: 46 3a 20 52 2d 33 34 32 33 30 2d 35 36 30 34 39  F: R-34230-56049
c0d0: 20 53 51 4c 69 74 65 20 61 75 74 6f 6d 61 74 69   SQLite automati
c0e0: 63 61 6c 6c 79 20 69 6e 63 72 65 6d 65 6e 74 73  cally increments
c0f0: 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 2d 76  .** the schema-v
c100: 65 72 73 69 6f 6e 20 77 68 65 6e 65 76 65 72 20  ersion whenever 
c110: 74 68 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67  the schema chang
c120: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
c130: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
c140: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
c150: 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74  nt iDb){.  sqlit
c160: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
c170: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  >db;.  Vdbe *v =
c180: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
c190: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c1a0: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
c1b0: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
c1c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c1d0: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  Op3(v, OP_SetCoo
c1e0: 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f  kie, iDb, BTREE_
c1f0: 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20  SCHEMA_VERSION, 
c200: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c210: 20 20 20 20 28 69 6e 74 29 28 31 2b 28 75 6e 73      (int)(1+(uns
c220: 69 67 6e 65 64 29 64 62 2d 3e 61 44 62 5b 69 44  igned)db->aDb[iD
c230: 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  b].pSchema->sche
c240: 6d 61 5f 63 6f 6f 6b 69 65 29 29 3b 0a 7d 0a 0a  ma_cookie));.}..
c250: 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68  /*.** Measure th
c260: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
c270: 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f  acters needed to
c280: 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   output the give
c290: 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e  n.** identifier.
c2a0: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74    The number ret
c2b0: 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61  urned includes a
c2c0: 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a  ny quotes used.*
c2d0: 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69  * but does not i
c2e0: 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20  nclude the null 
c2f0: 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a  terminator..**.*
c300: 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 20 69  * The estimate i
c310: 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20  s conservative. 
c320: 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72   It might be lar
c330: 67 65 72 20 74 68 61 74 20 77 68 61 74 20 69 73  ger that what is
c340: 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65  .** really neede
c350: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
c360: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e   identLength(con
c370: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
c380: 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b  nt n;.  for(n=0;
c390: 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a   *z; n++, z++){.
c3a0: 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20      if( *z=='"' 
c3b0: 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20  ){ n++; }.  }.  
c3c0: 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a  return n + 2;.}.
c3d0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ./*.** The first
c3e0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
c3f0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75  pointer to an ou
c400: 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 65  tput buffer. The
c410: 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61   second .** para
c420: 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
c430: 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  er to an integer
c440: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
c450: 68 65 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20  he offset at.** 
c460: 77 68 69 63 68 20 74 6f 20 77 72 69 74 65 20 69  which to write i
c470: 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62  nto the output b
c480: 75 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63  uffer. This func
c490: 74 69 6f 6e 20 63 6f 70 69 65 73 20 74 68 65 0a  tion copies the.
c4a0: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  ** nul-terminate
c4b0: 64 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64  d string pointed
c4c0: 20 74 6f 20 62 79 20 74 68 65 20 74 68 69 72 64   to by the third
c4d0: 20 70 61 72 61 6d 65 74 65 72 2c 20 7a 53 69 67   parameter, zSig
c4e0: 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20  nedIdent,.** to 
c4f0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 66  the specified of
c500: 66 73 65 74 20 69 6e 20 74 68 65 20 62 75 66 66  fset in the buff
c510: 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 20 2a  er and updates *
c520: 70 49 64 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a  pIdx to refer.**
c530: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
c540: 74 65 20 61 66 74 65 72 20 74 68 65 20 6c 61 73  te after the las
c550: 74 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 62  t byte written b
c560: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
c570: 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 73  .** .** If the s
c580: 74 72 69 6e 67 20 7a 53 69 67 6e 65 64 49 64 65  tring zSignedIde
c590: 6e 74 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69  nt consists enti
c5a0: 72 65 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75  rely of alpha-nu
c5b0: 6d 65 72 69 63 0a 2a 2a 20 63 68 61 72 61 63 74  meric.** charact
c5c0: 65 72 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65  ers, does not be
c5d0: 67 69 6e 20 77 69 74 68 20 61 20 64 69 67 69 74  gin with a digit
c5e0: 20 61 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20 53   and is not an S
c5f0: 51 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74  QL keyword,.** t
c600: 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64  hen it is copied
c610: 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62   to the output b
c620: 75 66 66 65 72 20 65 78 61 63 74 6c 79 20 61 73  uffer exactly as
c630: 20 69 74 20 69 73 2e 20 4f 74 68 65 72 77 69 73   it is. Otherwis
c640: 65 2c 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f 74  e,.** it is quot
c650: 65 64 20 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d  ed using double-
c660: 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  quotes..*/.stati
c670: 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28  c void identPut(
c680: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49  char *z, int *pI
c690: 64 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65  dx, char *zSigne
c6a0: 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67  dIdent){.  unsig
c6b0: 6e 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74  ned char *zIdent
c6c0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
c6d0: 72 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b  r*)zSignedIdent;
c6e0: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65  .  int i, j, nee
c6f0: 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70  dQuote;.  i = *p
c700: 49 64 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b  Idx;..  for(j=0;
c710: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
c720: 7b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  {.    if( !sqlit
c730: 65 33 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74  e3Isalnum(zIdent
c740: 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a  [j]) && zIdent[j
c750: 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a  ]!='_' ) break;.
c760: 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20    }.  needQuote 
c770: 3d 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74  = sqlite3Isdigit
c780: 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20  (zIdent[0]).    
c790: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
c7a0: 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49  e3KeywordCode(zI
c7b0: 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a  dent, j)!=TK_ID.
c7c0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 7a              || z
c7d0: 49 64 65 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20 20  Ident[j]!=0.    
c7e0: 20 20 20 20 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b          || j==0;
c7f0: 0a 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  ..  if( needQuot
c800: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  e ) z[i++] = '"'
c810: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
c820: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
c830: 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e    z[i++] = zIden
c840: 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49  t[j];.    if( zI
c850: 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a  dent[j]=='"' ) z
c860: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d  [i++] = '"';.  }
c870: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
c880: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
c890: 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a  .  z[i] = 0;.  *
c8a0: 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a  pIdx = i;.}../*.
c8b0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52  ** Generate a CR
c8c0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
c8d0: 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65  ment appropriate
c8e0: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a   for the given.*
c8f0: 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79  * table.  Memory
c900: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78   to hold the tex
c910: 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  t of the stateme
c920: 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a  nt is obtained.*
c930: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  * from sqliteMal
c940: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
c950: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
c960: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
c970: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
c980: 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74  *createTableStmt
c990: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
c9a0: 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ble *p){.  int i
c9b0: 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a  , k, n;.  char *
c9c0: 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a  zStmt;.  char *z
c9d0: 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45  Sep, *zSep2, *zE
c9e0: 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  nd;.  Column *pC
c9f0: 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66  ol;.  n = 0;.  f
ca00: 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f  or(pCol = p->aCo
ca10: 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  l, i=0; i<p->nCo
ca20: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
ca30: 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c  .    n += identL
ca40: 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  ength(pCol->zNam
ca50: 65 29 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20  e) + 5;.  }.  n 
ca60: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
ca70: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
ca80: 6e 3c 35 30 20 29 7b 20 0a 20 20 20 20 7a 53 65  n<50 ){ .    zSe
ca90: 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70  p = "";.    zSep
caa0: 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e  2 = ",";.    zEn
cab0: 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65  d = ")";.  }else
cac0: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e  {.    zSep = "\n
cad0: 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d    ";.    zSep2 =
cae0: 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45   ",\n  ";.    zE
caf0: 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a  nd = "\n)";.  }.
cb00: 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d    n += 35 + 6*p-
cb10: 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d  >nCol;.  zStmt =
cb20: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
cb30: 52 61 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28  Raw(0, n);.  if(
cb40: 20 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20   zStmt==0 ){.   
cb50: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
cb60: 28 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  (db);.    return
cb70: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
cb80: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53  3_snprintf(n, zS
cb90: 74 6d 74 2c 20 22 43 52 45 41 54 45 20 54 41 42  tmt, "CREATE TAB
cba0: 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c  LE ");.  k = sql
cbb0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74  ite3Strlen30(zSt
cbc0: 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28  mt);.  identPut(
cbd0: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e  zStmt, &k, p->zN
cbe0: 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b  ame);.  zStmt[k+
cbf0: 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28  +] = '(';.  for(
cc00: 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d  pCol=p->aCol, i=
cc10: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
cc20: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
cc30: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
cc40: 72 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65  r * const azType
cc50: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f  [] = {.        /
cc60: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  * SQLITE_AFF_BLO
cc70: 42 20 20 20 20 2a 2f 20 22 22 2c 0a 20 20 20 20  B    */ "",.    
cc80: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
cc90: 46 5f 54 45 58 54 20 20 20 20 2a 2f 20 22 20 54  F_TEXT    */ " T
cca0: 45 58 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a  EXT",.        /*
ccb0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
ccc0: 52 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20  RIC */ " NUM",. 
ccd0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
cce0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20  _AFF_INTEGER */ 
ccf0: 22 20 49 4e 54 22 2c 0a 20 20 20 20 20 20 20 20  " INT",.        
cd00: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  /* SQLITE_AFF_RE
cd10: 41 4c 20 20 20 20 2a 2f 20 22 20 52 45 41 4c 22  AL    */ " REAL"
cd20: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
cd30: 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  len;.    const c
cd40: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20  har *zType;..   
cd50: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
cd60: 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d  f(n-k, &zStmt[k]
cd70: 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b  , zSep);.    k +
cd80: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
cd90: 30 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20  0(&zStmt[k]);.  
cda0: 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a    zSep = zSep2;.
cdb0: 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74      identPut(zSt
cdc0: 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e  mt, &k, pCol->zN
cdd0: 61 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ame);.    assert
cde0: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
cdf0: 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  -SQLITE_AFF_BLOB
ce00: 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73   >= 0 );.    ass
ce10: 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ert( pCol->affin
ce20: 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ity-SQLITE_AFF_B
ce30: 4c 4f 42 20 3c 20 41 72 72 61 79 53 69 7a 65 28  LOB < ArraySize(
ce40: 61 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20 74  azType) );.    t
ce50: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
ce60: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
ce70: 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20  AFF_BLOB );.    
ce80: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e  testcase( pCol->
ce90: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
cea0: 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20  _AFF_TEXT );.   
ceb0: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
cec0: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
ced0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b  E_AFF_NUMERIC );
cee0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
cef0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
cf00: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
cf10: 52 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  R );.    testcas
cf20: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
cf30: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  y==SQLITE_AFF_RE
cf40: 41 4c 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a  AL );.    .    z
cf50: 54 79 70 65 20 3d 20 61 7a 54 79 70 65 5b 70 43  Type = azType[pC
cf60: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20 53  ol->affinity - S
cf70: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 3b  QLITE_AFF_BLOB];
cf80: 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74  .    len = sqlit
cf90: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65  e3Strlen30(zType
cfa0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
cfb0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
cfc0: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 0a  QLITE_AFF_BLOB .
cfd0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
cfe0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73  Col->affinity==s
cff0: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
d000: 70 65 28 7a 54 79 70 65 2c 20 30 29 20 29 3b 0a  pe(zType, 0) );.
d010: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 53 74 6d      memcpy(&zStm
d020: 74 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c 65 6e  t[k], zType, len
d030: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b  );.    k += len;
d040: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 3d  .    assert( k<=
d050: 6e 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n );.  }.  sqlit
d060: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c  e3_snprintf(n-k,
d070: 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22   &zStmt[k], "%s"
d080: 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72  , zEnd);.  retur
d090: 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zStmt;.}../*.*
d0a0: 2a 20 52 65 73 69 7a 65 20 61 6e 20 49 6e 64 65  * Resize an Inde
d0b0: 78 20 6f 62 6a 65 63 74 20 74 6f 20 68 6f 6c 64  x object to hold
d0c0: 20 4e 20 63 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c   N columns total
d0d0: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
d0e0: 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
d0f0: 73 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d  s and SQLITE_NOM
d100: 45 4d 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72  EM on an OOM err
d110: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
d120: 74 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a  t resizeIndexObj
d130: 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ect(sqlite3 *db,
d140: 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e   Index *pIdx, in
d150: 74 20 4e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45  t N){.  char *zE
d160: 78 74 72 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74  xtra;.  int nByt
d170: 65 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6e  e;.  if( pIdx->n
d180: 43 6f 6c 75 6d 6e 3e 3d 4e 20 29 20 72 65 74 75  Column>=N ) retu
d190: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
d1a0: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 73  assert( pIdx->is
d1b0: 52 65 73 69 7a 65 64 3d 3d 30 20 29 3b 0a 20 20  Resized==0 );.  
d1c0: 6e 42 79 74 65 20 3d 20 28 73 69 7a 65 6f 66 28  nByte = (sizeof(
d1d0: 63 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28  char*) + sizeof(
d1e0: 69 31 36 29 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a  i16) + 1)*N;.  z
d1f0: 45 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33 44  Extra = sqlite3D
d200: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
d210: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 7a 45  nByte);.  if( zE
d220: 78 74 72 61 3d 3d 30 20 29 20 72 65 74 75 72 6e  xtra==0 ) return
d230: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
d240: 50 54 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78  PT;.  memcpy(zEx
d250: 74 72 61 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  tra, pIdx->azCol
d260: 6c 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  l, sizeof(char*)
d270: 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b  *pIdx->nColumn);
d280: 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20  .  pIdx->azColl 
d290: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29  = (const char**)
d2a0: 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61  zExtra;.  zExtra
d2b0: 20 2b 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 2a   += sizeof(char*
d2c0: 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45  )*N;.  memcpy(zE
d2d0: 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 69 43 6f  xtra, pIdx->aiCo
d2e0: 6c 75 6d 6e 2c 20 73 69 7a 65 6f 66 28 69 31 36  lumn, sizeof(i16
d2f0: 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  )*pIdx->nColumn)
d300: 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  ;.  pIdx->aiColu
d310: 6d 6e 20 3d 20 28 69 31 36 2a 29 7a 45 78 74 72  mn = (i16*)zExtr
d320: 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73  a;.  zExtra += s
d330: 69 7a 65 6f 66 28 69 31 36 29 2a 4e 3b 0a 20 20  izeof(i16)*N;.  
d340: 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70  memcpy(zExtra, p
d350: 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  Idx->aSortOrder,
d360: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b   pIdx->nColumn);
d370: 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  .  pIdx->aSortOr
d380: 64 65 72 20 3d 20 28 75 38 2a 29 7a 45 78 74 72  der = (u8*)zExtr
d390: 61 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  a;.  pIdx->nColu
d3a0: 6d 6e 20 3d 20 4e 3b 0a 20 20 70 49 64 78 2d 3e  mn = N;.  pIdx->
d3b0: 69 73 52 65 73 69 7a 65 64 20 3d 20 31 3b 0a 20  isResized = 1;. 
d3c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d3d0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69  K;.}../*.** Esti
d3e0: 6d 61 74 65 20 74 68 65 20 74 6f 74 61 6c 20 72  mate the total r
d3f0: 6f 77 20 77 69 64 74 68 20 66 6f 72 20 61 20 74  ow width for a t
d400: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
d410: 76 6f 69 64 20 65 73 74 69 6d 61 74 65 54 61 62  void estimateTab
d420: 6c 65 57 69 64 74 68 28 54 61 62 6c 65 20 2a 70  leWidth(Table *p
d430: 54 61 62 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Tab){.  unsigned
d440: 20 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 63   wTable = 0;.  c
d450: 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 70 54 61  onst Column *pTa
d460: 62 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  bCol;.  int i;. 
d470: 20 66 6f 72 28 69 3d 70 54 61 62 2d 3e 6e 43 6f   for(i=pTab->nCo
d480: 6c 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d  l, pTabCol=pTab-
d490: 3e 61 43 6f 6c 3b 20 69 3e 30 3b 20 69 2d 2d 2c  >aCol; i>0; i--,
d4a0: 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20   pTabCol++){.   
d4b0: 20 77 54 61 62 6c 65 20 2b 3d 20 70 54 61 62 43   wTable += pTabC
d4c0: 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20  ol->szEst;.  }. 
d4d0: 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79   if( pTab->iPKey
d4e0: 3c 30 20 29 20 77 54 61 62 6c 65 2b 2b 3b 0a 20  <0 ) wTable++;. 
d4f0: 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20   pTab->szTabRow 
d500: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
d510: 77 54 61 62 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a  wTable*4);.}../*
d520: 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
d530: 20 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66   average size of
d540: 20 61 20 72 6f 77 20 66 6f 72 20 61 6e 20 69 6e   a row for an in
d550: 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
d560: 6f 69 64 20 65 73 74 69 6d 61 74 65 49 6e 64 65  oid estimateInde
d570: 78 57 69 64 74 68 28 49 6e 64 65 78 20 2a 70 49  xWidth(Index *pI
d580: 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  dx){.  unsigned 
d590: 77 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 69 6e  wIndex = 0;.  in
d5a0: 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c  t i;.  const Col
d5b0: 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 49 64 78  umn *aCol = pIdx
d5c0: 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a  ->pTable->aCol;.
d5d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
d5e0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
d5f0: 7b 0a 20 20 20 20 69 31 36 20 78 20 3d 20 70 49  {.    i16 x = pI
d600: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  dx->aiColumn[i];
d610: 0a 20 20 20 20 61 73 73 65 72 74 28 20 78 3c 70  .    assert( x<p
d620: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43 6f  Idx->pTable->nCo
d630: 6c 20 29 3b 0a 20 20 20 20 77 49 6e 64 65 78 20  l );.    wIndex 
d640: 2b 3d 20 78 3c 30 20 3f 20 31 20 3a 20 61 43 6f  += x<0 ? 1 : aCo
d650: 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  l[pIdx->aiColumn
d660: 5b 69 5d 5d 2e 73 7a 45 73 74 3b 0a 20 20 7d 0a  [i]].szEst;.  }.
d670: 20 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77    pIdx->szIdxRow
d680: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
d690: 28 77 49 6e 64 65 78 2a 34 29 3b 0a 7d 0a 0a 2f  (wIndex*4);.}../
d6a0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
d6b0: 20 76 61 6c 75 65 20 78 20 69 73 20 66 6f 75 6e   value x is foun
d6c0: 64 20 61 6e 79 20 6f 66 20 74 68 65 20 66 69 72  d any of the fir
d6d0: 73 74 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20  st nCol entries 
d6e0: 6f 66 20 61 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74  of aiCol[].*/.st
d6f0: 61 74 69 63 20 69 6e 74 20 68 61 73 43 6f 6c 75  atic int hasColu
d700: 6d 6e 28 63 6f 6e 73 74 20 69 31 36 20 2a 61 69  mn(const i16 *ai
d710: 43 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20 69  Col, int nCol, i
d720: 6e 74 20 78 29 7b 0a 20 20 77 68 69 6c 65 28 20  nt x){.  while( 
d730: 6e 43 6f 6c 2d 2d 20 3e 20 30 20 29 20 69 66 28  nCol-- > 0 ) if(
d740: 20 78 3d 3d 2a 28 61 69 43 6f 6c 2b 2b 29 20 29   x==*(aiCol++) )
d750: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
d760: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 63  urn 0;.}../* Rec
d770: 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 4e 6f  ompute the colNo
d780: 74 49 64 78 65 64 20 66 69 65 6c 64 20 6f 66 20  tIdxed field of 
d790: 74 68 65 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  the Index..**.**
d7a0: 20 63 6f 6c 4e 6f 74 49 64 78 65 64 20 69 73 20   colNotIdxed is 
d7b0: 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20 68  a bitmask that h
d7c0: 61 73 20 61 20 30 20 62 69 74 20 72 65 70 72 65  as a 0 bit repre
d7d0: 73 65 6e 74 69 6e 67 20 65 61 63 68 20 69 6e 64  senting each ind
d7e0: 65 78 65 64 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20  exed.** columns 
d7f0: 74 68 61 74 20 61 72 65 20 77 69 74 68 69 6e 20  that are within 
d800: 74 68 65 20 66 69 72 73 74 20 36 33 20 63 6f 6c  the first 63 col
d810: 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c  umns of the tabl
d820: 65 2e 20 20 54 68 65 0a 2a 2a 20 68 69 67 68 2d  e.  The.** high-
d830: 6f 72 64 65 72 20 62 69 74 20 6f 66 20 63 6f 6c  order bit of col
d840: 4e 6f 74 49 64 78 65 64 20 69 73 20 61 6c 77 61  NotIdxed is alwa
d850: 79 73 20 31 2e 20 20 41 6c 6c 20 75 6e 69 6e 64  ys 1.  All unind
d860: 65 78 65 64 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  exed columns.** 
d870: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 76  of the table hav
d880: 65 20 61 20 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e a 1..**.** The
d890: 20 63 6f 6c 4e 6f 74 49 64 78 65 64 20 6d 61 73   colNotIdxed mas
d8a0: 6b 20 69 73 20 41 4e 44 2d 65 64 20 77 69 74 68  k is AND-ed with
d8b0: 20 74 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d   the SrcList.a[]
d8c0: 2e 63 6f 6c 55 73 65 64 20 6d 61 73 6b 0a 2a 2a  .colUsed mask.**
d8d0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
d8e0: 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 63 6f   the index is co
d8f0: 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2f  vering index..*/
d900: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 63  .static void rec
d910: 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74  omputeColumnsNot
d920: 49 6e 64 65 78 65 64 28 49 6e 64 65 78 20 2a 70  Indexed(Index *p
d930: 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20  Idx){.  Bitmask 
d940: 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a  m = 0;.  int j;.
d950: 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43    for(j=pIdx->nC
d960: 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a  olumn-1; j>=0; j
d970: 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d  --){.    int x =
d980: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
d990: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 30  j];.    if( x>=0
d9a0: 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
d9b0: 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a  se( x==BMS-1 );.
d9c0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
d9d0: 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20  x==BMS-2 );.    
d9e0: 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 20    if( x<BMS-1 ) 
d9f0: 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b  m |= MASKBIT(x);
da00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 64  .    }.  }.  pId
da10: 78 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65 64 20 3d  x->colNotIdxed =
da20: 20 7e 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 28   ~m;.  assert( (
da30: 70 49 64 78 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65  pIdx->colNotIdxe
da40: 64 3e 3e 36 33 29 3d 3d 31 20 29 3b 0a 7d 0a 0a  d>>63)==1 );.}..
da50: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
da60: 6e 65 20 72 75 6e 73 20 61 74 20 74 68 65 20 65  ne runs at the e
da70: 6e 64 20 6f 66 20 70 61 72 73 69 6e 67 20 61 20  nd of parsing a 
da80: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
da90: 74 65 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20 68  tement that.** h
daa0: 61 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  as a WITHOUT ROW
dab0: 49 44 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20  ID clause.  The 
dac0: 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74  job of this rout
dad0: 69 6e 65 20 69 73 20 74 6f 20 63 6f 6e 76 65 72  ine is to conver
dae0: 74 20 62 6f 74 68 0a 2a 2a 20 69 6e 74 65 72 6e  t both.** intern
daf0: 61 6c 20 73 63 68 65 6d 61 20 64 61 74 61 20 73  al schema data s
db00: 74 72 75 63 74 75 72 65 73 20 61 6e 64 20 74 68  tructures and th
db10: 65 20 67 65 6e 65 72 61 74 65 64 20 56 44 42 45  e generated VDBE
db20: 20 63 6f 64 65 20 73 6f 20 74 68 61 74 20 74 68   code so that th
db30: 65 79 0a 2a 2a 20 61 72 65 20 61 70 70 72 6f 70  ey.** are approp
db40: 72 69 61 74 65 20 66 6f 72 20 61 20 57 49 54 48  riate for a WITH
db50: 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 20  OUT ROWID table 
db60: 69 6e 73 74 65 61 64 20 6f 66 20 61 20 72 6f 77  instead of a row
db70: 69 64 20 74 61 62 6c 65 2e 0a 2a 2a 20 43 68 61  id table..** Cha
db80: 6e 67 65 73 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a  nges include:.**
db90: 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 53 65 74  .**     (1)  Set
dba0: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   all columns of 
dbb0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
dbc0: 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 74 6f  schema object to
dbd0: 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a   be NOT NULL..**
dbe0: 20 20 20 20 20 28 32 29 20 20 43 6f 6e 76 65 72       (2)  Conver
dbf0: 74 20 50 33 20 70 61 72 61 6d 65 74 65 72 20 6f  t P3 parameter o
dc00: 66 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65 42  f the OP_CreateB
dc10: 74 72 65 65 20 66 72 6f 6d 20 42 54 52 45 45 5f  tree from BTREE_
dc20: 49 4e 54 4b 45 59 20 0a 2a 2a 20 20 20 20 20 20  INTKEY .**      
dc30: 20 20 20 20 69 6e 74 6f 20 42 54 52 45 45 5f 42      into BTREE_B
dc40: 4c 4f 42 4b 45 59 2e 0a 2a 2a 20 20 20 20 20 28  LOBKEY..**     (
dc50: 33 29 20 20 42 79 70 61 73 73 20 74 68 65 20 63  3)  Bypass the c
dc60: 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  reation of the s
dc70: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
dc80: 6c 65 20 65 6e 74 72 79 0a 2a 2a 20 20 20 20 20  le entry.**     
dc90: 20 20 20 20 20 66 6f 72 20 74 68 65 20 50 52 49       for the PRI
dca0: 4d 41 52 59 20 4b 45 59 20 61 73 20 74 68 65 20  MARY KEY as the 
dcb0: 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65  primary key inde
dcc0: 78 20 69 73 20 6e 6f 77 0a 2a 2a 20 20 20 20 20  x is now.**     
dcd0: 20 20 20 20 20 69 64 65 6e 74 69 66 69 65 64 20       identified 
dce0: 62 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  by the sqlite_ma
dcf0: 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74 72 79  ster table entry
dd00: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 74   of the table it
dd10: 73 65 6c 66 2e 0a 2a 2a 20 20 20 20 20 28 34 29  self..**     (4)
dd20: 20 20 53 65 74 20 74 68 65 20 49 6e 64 65 78 2e    Set the Index.
dd30: 74 6e 75 6d 20 6f 66 20 74 68 65 20 50 52 49 4d  tnum of the PRIM
dd40: 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f 62  ARY KEY Index ob
dd50: 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20  ject in the.**  
dd60: 20 20 20 20 20 20 20 20 73 63 68 65 6d 61 20 74          schema t
dd70: 6f 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66  o the rootpage f
dd80: 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74 61 62  rom the main tab
dd90: 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 35 29 20 20  le..**     (5)  
dda0: 41 64 64 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f  Add all table co
ddb0: 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 50 52 49  lumns to the PRI
ddc0: 4d 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f  MARY KEY Index o
ddd0: 62 6a 65 63 74 0a 2a 2a 20 20 20 20 20 20 20 20  bject.**        
dde0: 20 20 73 6f 20 74 68 61 74 20 74 68 65 20 50 52    so that the PR
ddf0: 49 4d 41 52 59 20 4b 45 59 20 69 73 20 61 20 63  IMARY KEY is a c
de00: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20  overing index.  
de10: 54 68 65 20 73 75 72 70 6c 75 73 0a 2a 2a 20 20  The surplus.**  
de20: 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20          columns 
de30: 61 72 65 20 70 61 72 74 20 6f 66 20 4b 65 79 49  are part of KeyI
de40: 6e 66 6f 2e 6e 41 6c 6c 46 69 65 6c 64 20 61 6e  nfo.nAllField an
de50: 64 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 66  d are not used f
de60: 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73  or.**          s
de70: 6f 72 74 69 6e 67 20 6f 72 20 6c 6f 6f 6b 75 70  orting or lookup
de80: 20 6f 72 20 75 6e 69 71 75 65 6e 65 73 73 20 63   or uniqueness c
de90: 68 65 63 6b 73 2e 0a 2a 2a 20 20 20 20 20 28 36  hecks..**     (6
dea0: 29 20 20 52 65 70 6c 61 63 65 20 74 68 65 20 72  )  Replace the r
deb0: 6f 77 69 64 20 74 61 69 6c 20 6f 6e 20 61 6c 6c  owid tail on all
dec0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67   automatically g
ded0: 65 6e 65 72 61 74 65 64 20 55 4e 49 51 55 45 0a  enerated UNIQUE.
dee0: 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e 64 69  **          indi
def0: 63 65 73 20 77 69 74 68 20 74 68 65 20 50 52 49  ces with the PRI
df00: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73  MARY KEY columns
df10: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 76 69 72 74  ..**.** For virt
df20: 75 61 6c 20 74 61 62 6c 65 73 2c 20 6f 6e 6c 79  ual tables, only
df30: 20 28 31 29 20 69 73 20 70 65 72 66 6f 72 6d 65   (1) is performe
df40: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
df50: 64 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f  d convertToWitho
df60: 75 74 52 6f 77 69 64 54 61 62 6c 65 28 50 61 72  utRowidTable(Par
df70: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
df80: 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65  e *pTab){.  Inde
df90: 78 20 2a 70 49 64 78 3b 0a 20 20 49 6e 64 65 78  x *pIdx;.  Index
dfa0: 20 2a 70 50 6b 3b 0a 20 20 69 6e 74 20 6e 50 6b   *pPk;.  int nPk
dfb0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
dfc0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
dfd0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
dfe0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
dff0: 64 62 65 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  dbe;..  /* Mark 
e000: 65 76 65 72 79 20 50 52 49 4d 41 52 59 20 4b 45  every PRIMARY KE
e010: 59 20 63 6f 6c 75 6d 6e 20 61 73 20 4e 4f 54 20  Y column as NOT 
e020: 4e 55 4c 4c 20 28 65 78 63 65 70 74 20 66 6f 72  NULL (except for
e030: 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73   imposter tables
e040: 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ).  */.  if( !db
e050: 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54  ->init.imposterT
e060: 61 62 6c 65 20 29 7b 0a 20 20 20 20 66 6f 72 28  able ){.    for(
e070: 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  i=0; i<pTab->nCo
e080: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
e090: 66 28 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  f( (pTab->aCol[i
e0a0: 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c  ].colFlags & COL
e0b0: 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21 3d 30  FLAG_PRIMKEY)!=0
e0c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62   ){.        pTab
e0d0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c  ->aCol[i].notNul
e0e0: 6c 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  l = OE_Abort;.  
e0f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
e100: 0a 20 20 2f 2a 20 54 68 65 20 72 65 6d 61 69 6e  .  /* The remain
e110: 69 6e 67 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  ing transformati
e120: 6f 6e 73 20 6f 6e 6c 79 20 61 70 70 6c 79 20 74  ons only apply t
e130: 6f 20 62 2d 74 72 65 65 20 74 61 62 6c 65 73 2c  o b-tree tables,
e140: 20 6e 6f 74 20 74 6f 0a 20 20 2a 2a 20 76 69 72   not to.  ** vir
e150: 74 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20  tual tables */. 
e160: 20 69 66 28 20 49 4e 5f 44 45 43 4c 41 52 45 5f   if( IN_DECLARE_
e170: 56 54 41 42 20 29 20 72 65 74 75 72 6e 3b 0a 0a  VTAB ) return;..
e180: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
e190: 20 50 33 20 6f 70 65 72 61 6e 64 20 6f 66 20 74   P3 operand of t
e1a0: 68 65 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65  he OP_CreateBtre
e1b0: 65 20 6f 70 63 6f 64 65 20 66 72 6f 6d 20 42 54  e opcode from BT
e1c0: 52 45 45 5f 49 4e 54 4b 45 59 0a 20 20 2a 2a 20  REE_INTKEY.  ** 
e1d0: 69 6e 74 6f 20 42 54 52 45 45 5f 42 4c 4f 42 4b  into BTREE_BLOBK
e1e0: 45 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  EY..  */.  if( p
e1f0: 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62  Parse->addrCrTab
e200: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
e210: 76 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  v );.    sqlite3
e220: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
e230: 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61  pParse->addrCrTa
e240: 62 2c 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59  b, BTREE_BLOBKEY
e250: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  );.  }..  /* Loc
e260: 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20  ate the PRIMARY 
e270: 4b 45 59 20 69 6e 64 65 78 2e 20 20 4f 72 2c 20  KEY index.  Or, 
e280: 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 77 61  if this table wa
e290: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  s originally.  *
e2a0: 2a 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  * an INTEGER PRI
e2b0: 4d 41 52 59 20 4b 45 59 20 74 61 62 6c 65 2c 20  MARY KEY table, 
e2c0: 63 72 65 61 74 65 20 61 20 6e 65 77 20 50 52 49  create a new PRI
e2d0: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20  MARY KEY index. 
e2e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
e2f0: 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20  ->iPKey>=0 ){.  
e300: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
e310: 74 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 69 70 6b  t;.    Token ipk
e320: 54 6f 6b 65 6e 3b 0a 20 20 20 20 73 71 6c 69 74  Token;.    sqlit
e330: 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 69 70 6b  e3TokenInit(&ipk
e340: 54 6f 6b 65 6e 2c 20 70 54 61 62 2d 3e 61 43 6f  Token, pTab->aCo
e350: 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a  l[pTab->iPKey].z
e360: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73 74  Name);.    pList
e370: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
e380: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
e390: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
e3a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
e3b0: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49  prAlloc(db, TK_I
e3c0: 44 2c 20 26 69 70 6b 54 6f 6b 65 6e 2c 20 30 29  D, &ipkToken, 0)
e3d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
e3e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
e3f0: 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f    pList->a[0].so
e400: 72 74 4f 72 64 65 72 20 3d 20 70 50 61 72 73 65  rtOrder = pParse
e410: 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72 3b 0a  ->iPkSortOrder;.
e420: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
e430: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 70  se->pNewTable==p
e440: 54 61 62 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  Tab );.    sqlit
e450: 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50  e3CreateIndex(pP
e460: 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70  arse, 0, 0, 0, p
e470: 4c 69 73 74 2c 20 70 54 61 62 2d 3e 6b 65 79 43  List, pTab->keyC
e480: 6f 6e 66 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  onf, 0, 0, 0, 0,
e490: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e4a0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
e4b0: 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45  DXTYPE_PRIMARYKE
e4c0: 59 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  Y);.    if( db->
e4d0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
e4e0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
e4f0: 65 74 75 72 6e 3b 0a 20 20 20 20 70 50 6b 20 3d  eturn;.    pPk =
e500: 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
e510: 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
e520: 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
e530: 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   -1;.  }else{.  
e540: 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50    pPk = sqlite3P
e550: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
e560: 54 61 62 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  Tab);..    /*.  
e570: 20 20 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20    ** Remove all 
e580: 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e  redundant column
e590: 73 20 66 72 6f 6d 20 74 68 65 20 50 52 49 4d 41  s from the PRIMA
e5a0: 52 59 20 4b 45 59 2e 20 20 46 6f 72 20 65 78 61  RY KEY.  For exa
e5b0: 6d 70 6c 65 2c 20 63 68 61 6e 67 65 0a 20 20 20  mple, change.   
e5c0: 20 2a 2a 20 22 50 52 49 4d 41 52 59 20 4b 45 59   ** "PRIMARY KEY
e5d0: 28 61 2c 62 2c 61 2c 62 2c 63 2c 62 2c 63 2c 64  (a,b,a,b,c,b,c,d
e5e0: 29 22 20 69 6e 74 6f 20 6a 75 73 74 20 22 50 52  )" into just "PR
e5f0: 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c 63 2c  IMARY KEY(a,b,c,
e600: 64 29 22 2e 20 20 4c 61 74 65 72 0a 20 20 20 20  d)".  Later.    
e610: 2a 2a 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20  ** code assumes 
e620: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
e630: 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 65 70 65  contains no repe
e640: 61 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20  ated columns..  
e650: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 6a    */.    for(i=j
e660: 3d 31 3b 20 69 3c 70 50 6b 2d 3e 6e 4b 65 79 43  =1; i<pPk->nKeyC
e670: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
e680: 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70 50  if( hasColumn(pP
e690: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20  k->aiColumn, j, 
e6a0: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  pPk->aiColumn[i]
e6b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 6b  ) ){.        pPk
e6c0: 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 0a 20 20 20  ->nColumn--;.   
e6d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e6e0: 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b    pPk->aiColumn[
e6f0: 6a 2b 2b 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f  j++] = pPk->aiCo
e700: 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 7d  lumn[i];.      }
e710: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 6b 2d 3e  .    }.    pPk->
e720: 6e 4b 65 79 43 6f 6c 20 3d 20 6a 3b 0a 20 20 7d  nKeyCol = j;.  }
e730: 0a 20 20 61 73 73 65 72 74 28 20 70 50 6b 21 3d  .  assert( pPk!=
e740: 30 20 29 3b 0a 20 20 70 50 6b 2d 3e 69 73 43 6f  0 );.  pPk->isCo
e750: 76 65 72 69 6e 67 20 3d 20 31 3b 0a 20 20 69 66  vering = 1;.  if
e760: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f  ( !db->init.impo
e770: 73 74 65 72 54 61 62 6c 65 20 29 20 70 50 6b 2d  sterTable ) pPk-
e780: 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31  >uniqNotNull = 1
e790: 3b 0a 20 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e  ;.  nPk = pPk->n
e7a0: 4b 65 79 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 42 79  KeyCol;..  /* By
e7b0: 70 61 73 73 20 74 68 65 20 63 72 65 61 74 69 6f  pass the creatio
e7c0: 6e 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59  n of the PRIMARY
e7d0: 20 4b 45 59 20 62 74 72 65 65 20 61 6e 64 20 74   KEY btree and t
e7e0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
e7f0: 0a 20 20 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72  .  ** table entr
e800: 79 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20  y. This is only 
e810: 72 65 71 75 69 72 65 64 20 69 66 20 63 75 72 72  required if curr
e820: 65 6e 74 6c 79 20 67 65 6e 65 72 61 74 69 6e 67  ently generating
e830: 20 56 44 42 45 0a 20 20 2a 2a 20 63 6f 64 65 20   VDBE.  ** code 
e840: 66 6f 72 20 61 20 43 52 45 41 54 45 20 54 41 42  for a CREATE TAB
e850: 4c 45 20 28 6e 6f 74 20 77 68 65 6e 20 70 61 72  LE (not when par
e860: 73 69 6e 67 20 6f 6e 65 20 61 73 20 70 61 72 74  sing one as part
e870: 20 6f 66 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a   of reading.  **
e880: 20 61 20 64 61 74 61 62 61 73 65 20 73 63 68 65   a database sche
e890: 6d 61 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 76  ma).  */.  if( v
e8a0: 20 26 26 20 70 50 6b 2d 3e 74 6e 75 6d 3e 30 20   && pPk->tnum>0 
e8b0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
e8c0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
e8d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
e8e0: 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 76  beChangeOpcode(v
e8f0: 2c 20 70 50 6b 2d 3e 74 6e 75 6d 2c 20 4f 50 5f  , pPk->tnum, OP_
e900: 47 6f 74 6f 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Goto);.  }..  /*
e910: 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   The root page o
e920: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
e930: 59 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 72  Y is the table r
e940: 6f 6f 74 20 70 61 67 65 20 2a 2f 0a 20 20 70 50  oot page */.  pP
e950: 6b 2d 3e 74 6e 75 6d 20 3d 20 70 54 61 62 2d 3e  k->tnum = pTab->
e960: 74 6e 75 6d 3b 0a 0a 20 20 2f 2a 20 55 70 64 61  tnum;..  /* Upda
e970: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
e980: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
e990: 6f 66 20 61 6c 6c 20 55 4e 49 51 55 45 20 69 6e  of all UNIQUE in
e9a0: 64 69 63 65 73 20 62 79 20 63 6f 6e 76 65 72 74  dices by convert
e9b0: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e  ing.  ** the fin
e9c0: 61 6c 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20  al rowid column 
e9d0: 69 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  into one or more
e9e0: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
e9f0: 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 20 20 2a  PRIMARY KEY..  *
ea00: 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61  /.  for(pIdx=pTa
ea10: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
ea20: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
ea30: 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  t){.    int n;. 
ea40: 20 20 20 69 66 28 20 49 73 50 72 69 6d 61 72 79     if( IsPrimary
ea50: 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20 29  KeyIndex(pIdx) )
ea60: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66   continue;.    f
ea70: 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c 6e 50 6b 3b  or(i=n=0; i<nPk;
ea80: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
ea90: 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78   !hasColumn(pIdx
eaa0: 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78  ->aiColumn, pIdx
eab0: 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e  ->nKeyCol, pPk->
eac0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 20 6e  aiColumn[i]) ) n
ead0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
eae0: 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
eaf0: 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 73  /* This index is
eb00: 20 61 20 73 75 70 65 72 73 65 74 20 6f 66 20 74   a superset of t
eb10: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a  he primary key *
eb20: 2f 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 6e 43  /.      pIdx->nC
eb30: 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 6e 4b  olumn = pIdx->nK
eb40: 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 63 6f 6e  eyCol;.      con
eb50: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
eb60: 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64 65 78   if( resizeIndex
eb70: 4f 62 6a 65 63 74 28 64 62 2c 20 70 49 64 78 2c  Object(db, pIdx,
eb80: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e   pIdx->nKeyCol+n
eb90: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ) ) return;.    
eba0: 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 49 64 78 2d  for(i=0, j=pIdx-
ebb0: 3e 6e 4b 65 79 43 6f 6c 3b 20 69 3c 6e 50 6b 3b  >nKeyCol; i<nPk;
ebc0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
ebd0: 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78   !hasColumn(pIdx
ebe0: 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78  ->aiColumn, pIdx
ebf0: 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e  ->nKeyCol, pPk->
ec00: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a  aiColumn[i]) ){.
ec10: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69          pIdx->ai
ec20: 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 50 6b 2d  Column[j] = pPk-
ec30: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
ec40: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
ec50: 6c 6c 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43  ll[j] = pPk->azC
ec60: 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  oll[i];.        
ec70: 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  j++;.      }.   
ec80: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
ec90: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 49  Idx->nColumn>=pI
eca0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 20 29 3b  dx->nKeyCol+n );
ecb0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64  .    assert( pId
ecc0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 3b  x->nColumn>=j );
ecd0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 61  .  }..  /* Add a
ece0: 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  ll table columns
ecf0: 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59 20   to the PRIMARY 
ed00: 4b 45 59 20 69 6e 64 65 78 0a 20 20 2a 2f 0a 20  KEY index.  */. 
ed10: 20 69 66 28 20 6e 50 6b 3c 70 54 61 62 2d 3e 6e   if( nPk<pTab->n
ed20: 43 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 72  Col ){.    if( r
ed30: 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74  esizeIndexObject
ed40: 28 64 62 2c 20 70 50 6b 2c 20 70 54 61 62 2d 3e  (db, pPk, pTab->
ed50: 6e 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 3b 0a  nCol) ) return;.
ed60: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 6e      for(i=0, j=n
ed70: 50 6b 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  Pk; i<pTab->nCol
ed80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
ed90: 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b  ( !hasColumn(pPk
eda0: 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 69  ->aiColumn, j, i
edb0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
edc0: 65 72 74 28 20 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c  ert( j<pPk->nCol
edd0: 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70  umn );.        p
ede0: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20  Pk->aiColumn[j] 
edf0: 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 50 6b  = i;.        pPk
ee00: 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 73 71  ->azColl[j] = sq
ee10: 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a  lite3StrBINARY;.
ee20: 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
ee30: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
ee40: 73 73 65 72 74 28 20 70 50 6b 2d 3e 6e 43 6f 6c  ssert( pPk->nCol
ee50: 75 6d 6e 3d 3d 6a 20 29 3b 0a 20 20 20 20 61 73  umn==j );.    as
ee60: 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  sert( pTab->nCol
ee70: 3d 3d 6a 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ==j );.  }else{.
ee80: 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e      pPk->nColumn
ee90: 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20   = pTab->nCol;. 
eea0: 20 7d 0a 20 20 72 65 63 6f 6d 70 75 74 65 43 6f   }.  recomputeCo
eeb0: 6c 75 6d 6e 73 4e 6f 74 49 6e 64 65 78 65 64 28  lumnsNotIndexed(
eec0: 70 50 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pPk);.}../*.** T
eed0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
eee0: 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20  alled to report 
eef0: 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68  the final ")" th
ef00: 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a  at terminates.**
ef10: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
ef20: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
ef30: 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63   The table struc
ef40: 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20  ture that other 
ef50: 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  action routines 
ef60: 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69  have been buildi
ef70: 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74  ng.** is added t
ef80: 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68  o the internal h
ef90: 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75  ash tables, assu
efa0: 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68  ming no errors h
efb0: 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e  ave.** occurred.
efc0: 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20  .**.** An entry 
efd0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73  for the table is
efe0: 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73   made in the mas
eff0: 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73  ter table on dis
f000: 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69  k, unless.** thi
f010: 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
f020: 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e   table or db->in
f030: 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65  it.busy==1.  Whe
f040: 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  n db->init.busy=
f050: 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77  =1.** it means w
f060: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
f070: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
f080: 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65  table because we
f090: 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74   just.** connect
f0a0: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
f0b0: 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74 68  se or because th
f0c0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
f0d0: 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63  table has.** rec
f0e0: 65 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73  ently changed, s
f0f0: 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  o the entry for 
f100: 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61  this table alrea
f110: 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20  dy exists in.** 
f120: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
f130: 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20  r table.  We do 
f140: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61  not want to crea
f150: 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a  te it again..**.
f160: 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65 63  ** If the pSelec
f170: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  t argument is no
f180: 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73  t NULL, it means
f190: 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69   that this routi
f1a0: 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64  ne.** was called
f1b0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62   to create a tab
f1c0: 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  le generated fro
f1d0: 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20  m a .** "CREATE 
f1e0: 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c  TABLE ... AS SEL
f1f0: 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65  ECT ..." stateme
f200: 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20  nt.  The column 
f210: 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
f220: 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d  new table will m
f230: 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74 20  atch the result 
f240: 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
f250: 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  T..*/.void sqlit
f260: 65 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61  e3EndTable(.  Pa
f270: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
f280: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
f290: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
f2a0: 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20  n *pCons,       
f2b0: 20 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74      /* The ',' t
f2c0: 6f 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c  oken after the l
f2d0: 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e  ast column defn.
f2e0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e   */.  Token *pEn
f2f0: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d,            /*
f300: 20 54 68 65 20 27 29 27 20 62 65 66 6f 72 65 20   The ')' before 
f310: 6f 70 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 43  options in the C
f320: 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20  REATE TABLE */. 
f330: 20 75 38 20 74 61 62 4f 70 74 73 2c 20 20 20 20   u8 tabOpts,    
f340: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
f350: 61 20 74 61 62 6c 65 20 6f 70 74 69 6f 6e 73 2e  a table options.
f360: 20 55 73 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a 20   Usually 0. */. 
f370: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
f380: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
f390: 63 74 20 66 72 6f 6d 20 61 20 22 43 52 45 41 54  ct from a "CREAT
f3a0: 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 22  E ... AS SELECT"
f3b0: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
f3c0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
f3d0: 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 74 61     /* The new ta
f3e0: 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
f3f0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
f400: 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61  b; /* The databa
f410: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
f420: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
f430: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f440: 44 61 74 61 62 61 73 65 20 69 6e 20 77 68 69 63  Database in whic
f450: 68 20 74 68 65 20 74 61 62 6c 65 20 6c 69 76 65  h the table live
f460: 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  s */.  Index *pI
f470: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
f480: 20 2f 2a 20 41 6e 20 69 6d 70 6c 69 65 64 20 69   /* An implied i
f490: 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c  ndex of the tabl
f4a0: 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 6e 64  e */..  if( pEnd
f4b0: 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d  ==0 && pSelect==
f4c0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
f4d0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
f4e0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f4f0: 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65   );.  p = pParse
f500: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
f510: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
f520: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  ;..  /* If the d
f530: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
f540: 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  1 it means we ar
f550: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51  e reading the SQ
f560: 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22  L off the.  ** "
f570: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f  sqlite_master" o
f580: 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  r "sqlite_temp_m
f590: 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20  aster" table on 
f5a0: 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53  the disk..  ** S
f5b0: 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74  o do not write t
f5c0: 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e  o the disk again
f5d0: 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20 72  .  Extract the r
f5e0: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  oot page number.
f5f0: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62    ** for the tab
f600: 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e  le from the db->
f610: 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65  init.newTnum fie
f620: 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e  ld.  (The page n
f630: 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c  umber.  ** shoul
f640: 64 20 68 61 76 65 20 62 65 65 6e 20 70 75 74 20  d have been put 
f650: 74 68 65 72 65 20 62 79 20 74 68 65 20 73 71 6c  there by the sql
f660: 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e  iteOpenCb routin
f670: 65 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  e.).  **.  ** If
f680: 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
f690: 75 6d 62 65 72 20 69 73 20 31 2c 20 74 68 61 74  umber is 1, that
f6a0: 20 6d 65 61 6e 73 20 74 68 69 73 20 69 73 20 74   means this is t
f6b0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
f6c0: 0a 20 20 2a 2a 20 74 61 62 6c 65 20 69 74 73 65  .  ** table itse
f6d0: 6c 66 2e 20 20 53 6f 20 6d 61 72 6b 20 69 74 20  lf.  So mark it 
f6e0: 72 65 61 64 2d 6f 6e 6c 79 2e 0a 20 20 2a 2f 0a  read-only..  */.
f6f0: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
f700: 75 73 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70  usy ){.    if( p
f710: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
f720: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
f730: 70 50 61 72 73 65 2c 20 22 22 29 3b 0a 20 20 20  pParse, "");.   
f740: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
f750: 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64  .    p->tnum = d
f760: 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
f770: 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 6e 75 6d  .    if( p->tnum
f780: 3d 3d 31 20 29 20 70 2d 3e 74 61 62 46 6c 61 67  ==1 ) p->tabFlag
f790: 73 20 7c 3d 20 54 46 5f 52 65 61 64 6f 6e 6c 79  s |= TF_Readonly
f7a0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63  ;.  }..  /* Spec
f7b0: 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 66  ial processing f
f7c0: 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  or WITHOUT ROWID
f7d0: 20 54 61 62 6c 65 73 20 2a 2f 0a 20 20 69 66 28   Tables */.  if(
f7e0: 20 74 61 62 4f 70 74 73 20 26 20 54 46 5f 57 69   tabOpts & TF_Wi
f7f0: 74 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20 20  thoutRowid ){.  
f800: 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61    if( (p->tabFla
f810: 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72  gs & TF_Autoincr
f820: 65 6d 65 6e 74 29 20 29 7b 0a 20 20 20 20 20 20  ement) ){.      
f830: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
f840: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
f850: 20 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54    "AUTOINCREMENT
f860: 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20   not allowed on 
f870: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
f880: 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 72 65  bles");.      re
f890: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
f8a0: 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73  if( (p->tabFlags
f8b0: 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79   & TF_HasPrimary
f8c0: 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Key)==0 ){.     
f8d0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
f8e0: 28 70 50 61 72 73 65 2c 20 22 50 52 49 4d 41 52  (pParse, "PRIMAR
f8f0: 59 20 4b 45 59 20 6d 69 73 73 69 6e 67 20 6f 6e  Y KEY missing on
f900: 20 74 61 62 6c 65 20 25 73 22 2c 20 70 2d 3e 7a   table %s", p->z
f910: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
f920: 7b 0a 20 20 20 20 20 20 70 2d 3e 74 61 62 46 6c  {.      p->tabFl
f930: 61 67 73 20 7c 3d 20 54 46 5f 57 69 74 68 6f 75  ags |= TF_Withou
f940: 74 52 6f 77 69 64 20 7c 20 54 46 5f 4e 6f 56 69  tRowid | TF_NoVi
f950: 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20  sibleRowid;.    
f960: 20 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f    convertToWitho
f970: 75 74 52 6f 77 69 64 54 61 62 6c 65 28 70 50 61  utRowidTable(pPa
f980: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20  rse, p);.    }. 
f990: 20 7d 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69   }..  iDb = sqli
f9a0: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
f9b0: 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  (db, p->pSchema)
f9c0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
f9d0: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f  E_OMIT_CHECK.  /
f9e0: 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20  * Resolve names 
f9f0: 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e  in all CHECK con
fa00: 73 74 72 61 69 6e 74 20 65 78 70 72 65 73 73 69  straint expressi
fa10: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
fa20: 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20  p->pCheck ){.   
fa30: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53   sqlite3ResolveS
fa40: 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61  elfReference(pPa
fa50: 72 73 65 2c 20 70 2c 20 4e 43 5f 49 73 43 68 65  rse, p, NC_IsChe
fa60: 63 6b 2c 20 30 2c 20 70 2d 3e 70 43 68 65 63 6b  ck, 0, p->pCheck
fa70: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
fa80: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
fa90: 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a  _OMIT_CHECK) */.
faa0: 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74  .  /* Estimate t
fab0: 68 65 20 61 76 65 72 61 67 65 20 72 6f 77 20 73  he average row s
fac0: 69 7a 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ize for the tabl
fad0: 65 20 61 6e 64 20 66 6f 72 20 61 6c 6c 20 69 6d  e and for all im
fae0: 70 6c 69 65 64 20 69 6e 64 69 63 65 73 20 2a 2f  plied indices */
faf0: 0a 20 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65  .  estimateTable
fb00: 57 69 64 74 68 28 70 29 3b 0a 20 20 66 6f 72 28  Width(p);.  for(
fb10: 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20  pIdx=p->pIndex; 
fb20: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
fb30: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 65 73 74  >pNext){.    est
fb40: 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68 28  imateIndexWidth(
fb50: 70 49 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pIdx);.  }..  /*
fb60: 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69   If not initiali
fb70: 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74  zing, then creat
fb80: 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74  e a record for t
fb90: 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a  he new table.  *
fba0: 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  * in the SQLITE_
fbb0: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20  MASTER table of 
fbc0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
fbd0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  **.  ** If this 
fbe0: 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74  is a TEMPORARY t
fbf0: 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20  able, write the 
fc00: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61  entry into the a
fc10: 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69  uxiliary.  ** fi
fc20: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e  le instead of in
fc30: 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
fc40: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
fc50: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
fc60: 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  busy ){.    int 
fc70: 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  n;.    Vdbe *v;.
fc80: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b      char *zType;
fc90: 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72      /* "view" or
fca0: 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20   "table" */.    
fcb0: 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20  char *zType2;   
fcc0: 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22 54 41  /* "VIEW" or "TA
fcd0: 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72  BLE" */.    char
fce0: 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54   *zStmt;    /* T
fcf0: 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
fd00: 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54  E TABLE or CREAT
fd10: 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74  E VIEW statement
fd20: 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c   */..    v = sql
fd30: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
fd40: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  se);.    if( NEV
fd50: 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
fd60: 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56  n;..    sqlite3V
fd70: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
fd80: 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20 20 20 20  Close, 0);..    
fd90: 2f 2a 20 0a 20 20 20 20 2a 2a 20 49 6e 69 74 69  /* .    ** Initi
fda0: 61 6c 69 7a 65 20 7a 54 79 70 65 20 66 6f 72 20  alize zType for 
fdb0: 74 68 65 20 6e 65 77 20 76 69 65 77 20 6f 72 20  the new view or 
fdc0: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
fdd0: 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74    if( p->pSelect
fde0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
fdf0: 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20  A regular table 
fe00: 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  */.      zType =
fe10: 20 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20   "table";.      
fe20: 7a 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22  zType2 = "TABLE"
fe30: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
fe40: 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d  _OMIT_VIEW.    }
fe50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
fe60: 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a   view */.      z
fe70: 54 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20  Type = "view";. 
fe80: 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56       zType2 = "V
fe90: 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20  IEW";.#endif.   
fea0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
feb0: 69 73 20 69 73 20 61 20 43 52 45 41 54 45 20 54  is is a CREATE T
fec0: 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43  ABLE xx AS SELEC
fed0: 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74  T ..., execute t
fee0: 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a  he SELECT.    **
fef0: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f   statement to po
ff00: 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74  pulate the new t
ff10: 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70  able. The root-p
ff20: 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
ff30: 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61  he.    ** new ta
ff40: 62 6c 65 20 69 73 20 69 6e 20 72 65 67 69 73 74  ble is in regist
ff50: 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f  er pParse->regRo
ff60: 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ot..    **.    *
ff70: 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43  * Once the SELEC
ff80: 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64  T has been coded
ff90: 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63   by sqlite3Selec
ffa0: 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a  t(), it is in a.
ffb0: 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20      ** suitable 
ffc0: 73 74 61 74 65 20 74 6f 20 71 75 65 72 79 20 66  state to query f
ffd0: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  or the column na
ffe0: 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f  mes and types to
fff0: 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20   be used.    ** 
10000 62 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  by the new table
10010 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
10020 41 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 77  A shared-cache w
10030 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74  rite-lock is not
10040 20 72 65 71 75 69 72 65 64 20 74 6f 20 77 72 69   required to wri
10050 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61  te to the new ta
10060 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61  ble,.    ** as a
10070 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73   schema-lock mus
10080 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
10090 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20  een obtained to 
100a0 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65  create it. Since
100b0 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61  .    ** a schema
100c0 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61  -lock excludes a
100d0 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  ll other databas
100e0 65 20 75 73 65 72 73 2c 20 74 68 65 20 77 72 69  e users, the wri
100f0 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20  te-lock would.  
10100 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e    ** be redundan
10110 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
10120 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
10130 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
10140 73 74 3b 20 20 20 20 2f 2a 20 57 68 65 72 65 20  st;    /* Where 
10150 74 68 65 20 53 45 4c 45 43 54 20 73 68 6f 75 6c  the SELECT shoul
10160 64 20 73 74 6f 72 65 20 72 65 73 75 6c 74 73 20  d store results 
10170 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  */.      int reg
10180 59 69 65 6c 64 3b 20 20 20 20 20 20 20 2f 2a 20  Yield;       /* 
10190 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
101a0 20 63 6f 2d 72 6f 75 74 69 6e 65 20 65 6e 74 72   co-routine entr
101b0 79 2d 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20  y-point */.     
101c0 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20   int addrTop;   
101d0 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
101e0 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f  he co-routine */
101f0 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65  .      int regRe
10200 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  c;         /* A 
10210 72 65 63 6f 72 64 20 74 6f 20 62 65 20 69 6e 73  record to be ins
10220 65 72 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77  ert into the new
10230 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
10240 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 20 20 20  int regRowid;   
10250 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 6f 66 20      /* Rowid of 
10260 74 68 65 20 6e 65 78 74 20 72 6f 77 20 74 6f 20  the next row to 
10270 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20 20 20  insert */.      
10280 69 6e 74 20 61 64 64 72 49 6e 73 4c 6f 6f 70 3b  int addrInsLoop;
10290 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
102a0 65 20 6c 6f 6f 70 20 66 6f 72 20 69 6e 73 65 72  e loop for inser
102b0 74 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 20  ting rows */.   
102c0 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61     Table *pSelTa
102d0 62 3b 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c  b;     /* A tabl
102e0 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
102f0 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 73 75   the SELECT resu
10300 6c 74 73 20 2a 2f 0a 0a 20 20 20 20 20 20 72 65  lts */..      re
10310 67 59 69 65 6c 64 20 3d 20 2b 2b 70 50 61 72 73  gYield = ++pPars
10320 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72  e->nMem;.      r
10330 65 67 52 65 63 20 3d 20 2b 2b 70 50 61 72 73 65  egRec = ++pParse
10340 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65  ->nMem;.      re
10350 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73  gRowid = ++pPars
10360 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61  e->nMem;.      a
10370 73 73 65 72 74 28 70 50 61 72 73 65 2d 3e 6e 54  ssert(pParse->nT
10380 61 62 3d 3d 31 29 3b 0a 20 20 20 20 20 20 73 71  ab==1);.      sq
10390 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50  lite3MayAbort(pP
103a0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
103b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
103c0 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
103d0 31 2c 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f  1, pParse->regRo
103e0 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  ot, iDb);.      
103f0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
10400 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 32  eP5(v, OPFLAG_P2
10410 49 53 52 45 47 29 3b 0a 20 20 20 20 20 20 70 50  ISREG);.      pP
10420 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a  arse->nTab = 2;.
10430 20 20 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20        addrTop = 
10440 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
10450 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20  ntAddr(v) + 1;. 
10460 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10470 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69  AddOp3(v, OP_Ini
10480 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59  tCoroutine, regY
10490 69 65 6c 64 2c 20 30 2c 20 61 64 64 72 54 6f 70  ield, 0, addrTop
104a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
104b0 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
104c0 72 6e 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61  rn;.      pSelTa
104d0 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c  b = sqlite3Resul
104e0 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
104f0 72 73 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  rse, pSelect);. 
10500 20 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62       if( pSelTab
10510 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
10520 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
10530 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Col==0 );.      
10540 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->nCol = pSelTa
10550 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70  b->nCol;.      p
10560 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->aCol = pSelTab
10570 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53  ->aCol;.      pS
10580 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  elTab->nCol = 0;
10590 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  .      pSelTab->
105a0 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  aCol = 0;.      
105b0 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
105c0 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b  le(db, pSelTab);
105d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
105e0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
105f0 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st, SRT_Coroutin
10600 65 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20  e, regYield);.  
10610 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
10620 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
10630 74 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  t, &dest);.     
10640 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
10650 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  r ) return;.    
10660 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64    sqlite3VdbeEnd
10670 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67  Coroutine(v, reg
10680 59 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 73 71  Yield);.      sq
10690 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
106a0 65 28 76 2c 20 61 64 64 72 54 6f 70 20 2d 20 31  e(v, addrTop - 1
106b0 29 3b 0a 20 20 20 20 20 20 61 64 64 72 49 6e 73  );.      addrIns
106c0 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Loop = sqlite3Vd
106d0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
106e0 69 65 6c 64 2c 20 64 65 73 74 2e 69 53 44 50 61  ield, dest.iSDPa
106f0 72 6d 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  rm);.      VdbeC
10700 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
10710 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10720 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
10730 63 6f 72 64 2c 20 64 65 73 74 2e 69 53 64 73 74  cord, dest.iSdst
10740 2c 20 64 65 73 74 2e 6e 53 64 73 74 2c 20 72 65  , dest.nSdst, re
10750 67 52 65 63 29 3b 0a 20 20 20 20 20 20 73 71 6c  gRec);.      sql
10760 69 74 65 33 54 61 62 6c 65 41 66 66 69 6e 69 74  ite3TableAffinit
10770 79 28 76 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20  y(v, p, 0);.    
10780 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10790 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
107a0 69 64 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 29  id, 1, regRowid)
107b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
107c0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
107d0 49 6e 73 65 72 74 2c 20 31 2c 20 72 65 67 52 65  Insert, 1, regRe
107e0 63 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  c, regRowid);.  
107f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
10800 6f 74 6f 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f  oto(v, addrInsLo
10810 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  op);.      sqlit
10820 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
10830 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a  , addrInsLoop);.
10840 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10850 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
10860 6f 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 0a  ose, 1);.    }..
10870 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
10880 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
10890 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 73   of the CREATE s
108a0 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
108b0 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
108c0 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65       zStmt = cre
108d0 61 74 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c  ateTableStmt(db,
108e0 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   p);.    }else{.
108f0 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 45 6e        Token *pEn
10900 64 32 20 3d 20 74 61 62 4f 70 74 73 20 3f 20 26  d2 = tabOpts ? &
10910 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b  pParse->sLastTok
10920 65 6e 20 3a 20 70 45 6e 64 3b 0a 20 20 20 20 20  en : pEnd;.     
10930 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 32   n = (int)(pEnd2
10940 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e  ->z - pParse->sN
10950 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20  ameToken.z);.   
10960 20 20 20 69 66 28 20 70 45 6e 64 32 2d 3e 7a 5b     if( pEnd2->z[
10970 30 5d 21 3d 27 3b 27 20 29 20 6e 20 2b 3d 20 70  0]!=';' ) n += p
10980 45 6e 64 32 2d 3e 6e 3b 0a 20 20 20 20 20 20 7a  End2->n;.      z
10990 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
109a0 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20  rintf(db, .     
109b0 20 20 20 20 20 22 43 52 45 41 54 45 20 25 73 20       "CREATE %s 
109c0 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e  %.*s", zType2, n
109d0 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  , pParse->sNameT
109e0 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a  oken.z.      );.
109f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20      }..    /* A 
10a00 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63  slot for the rec
10a10 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64 79 20  ord has already 
10a20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69  been allocated i
10a30 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51  n the .    ** SQ
10a40 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
10a50 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64  e.  We just need
10a60 20 74 6f 20 75 70 64 61 74 65 20 74 68 61 74 20   to update that 
10a70 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20  slot with all.  
10a80 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61    ** the informa
10a90 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65  tion we've colle
10aa0 63 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  cted..    */.   
10ab0 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
10ac0 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
10ad0 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20    "UPDATE %Q.%s 
10ae0 22 0a 20 20 20 20 20 20 20 20 20 22 53 45 54 20  ".         "SET 
10af0 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d  type='%s', name=
10b00 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c  %Q, tbl_name=%Q,
10b10 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20 73   rootpage=#%d, s
10b20 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22  ql=%Q ".       "
10b30 57 48 45 52 45 20 72 6f 77 69 64 3d 23 25 64 22  WHERE rowid=#%d"
10b40 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  ,.      db->aDb[
10b50 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d  iDb].zDbSName, M
10b60 41 53 54 45 52 5f 4e 41 4d 45 2c 0a 20 20 20 20  ASTER_NAME,.    
10b70 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70    zType,.      p
10b80 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70  ->zName,.      p
10b90 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70  ->zName,.      p
10ba0 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a  Parse->regRoot,.
10bb0 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a 20 20 20        zStmt,.   
10bc0 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f     pParse->regRo
10bd0 77 69 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  wid.    );.    s
10be0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
10bf0 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c   zStmt);.    sql
10c00 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
10c10 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 0a  (pParse, iDb);..
10c20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10c30 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
10c40 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  T.    /* Check t
10c50 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65 65 64  o see if we need
10c60 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71   to create an sq
10c70 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
10c80 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b  ble for.    ** k
10c90 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20  eeping track of 
10ca0 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65  autoincrement ke
10cb0 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ys..    */.    i
10cc0 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20  f( (p->tabFlags 
10cd0 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  & TF_Autoincreme
10ce0 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  nt)!=0 ){.      
10cf0 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
10d00 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20 61  Db[iDb];.      a
10d10 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
10d20 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
10d30 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20  , iDb, 0) );.   
10d40 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68     if( pDb->pSch
10d50 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20  ema->pSeqTab==0 
10d60 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
10d70 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
10d80 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
10d90 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 51  "CREATE TABLE %Q
10da0 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  .sqlite_sequence
10db0 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20  (name,seq)",.   
10dc0 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53         pDb->zDbS
10dd0 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a  Name.        );.
10de0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
10df0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70  ndif..    /* Rep
10e00 61 72 73 65 20 65 76 65 72 79 74 68 69 6e 67 20  arse everything 
10e10 74 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e  to update our in
10e20 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75  ternal data stru
10e30 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71  ctures */.    sq
10e40 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73  lite3VdbeAddPars
10e50 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62  eSchemaOp(v, iDb
10e60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
10e70 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
10e80 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 20 41  "tbl_name='%q' A
10e90 4e 44 20 74 79 70 65 21 3d 27 74 72 69 67 67 65  ND type!='trigge
10ea0 72 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 29 3b  r'", p->zName));
10eb0 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20  .  }...  /* Add 
10ec0 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65  the table to the
10ed0 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
10ee0 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
10ef0 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
10f00 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
10f10 75 73 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  usy ){.    Table
10f20 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65   *pOld;.    Sche
10f30 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d  ma *pSchema = p-
10f40 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 61 73  >pSchema;.    as
10f50 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
10f60 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
10f70 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
10f80 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61  pOld = sqlite3Ha
10f90 73 68 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d  shInsert(&pSchem
10fa0 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a  a->tblHash, p->z
10fb0 4e 61 6d 65 2c 20 70 29 3b 0a 20 20 20 20 69 66  Name, p);.    if
10fc0 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  ( pOld ){.      
10fd0 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20  assert( p==pOld 
10fe0 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75  );  /* Malloc mu
10ff0 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 69  st have failed i
11000 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65 72 74  nside HashInsert
11010 28 29 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  () */.      sqli
11020 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
11030 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
11040 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
11050 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a  >pNewTable = 0;.
11060 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73      db->mDbFlags
11070 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d   |= DBFLAG_Schem
11080 61 43 68 61 6e 67 65 3b 0a 0a 23 69 66 6e 64 65  aChange;..#ifnde
11090 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c  f SQLITE_OMIT_AL
110a0 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28  TERTABLE.    if(
110b0 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a   !p->pSelect ){.
110c0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
110d0 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74   *zName = (const
110e0 20 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e   char *)pParse->
110f0 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20  sNameToken.z;.  
11100 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20      int nName;. 
11110 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53       assert( !pS
11120 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26  elect && pCons &
11130 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  & pEnd );.      
11140 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20  if( pCons->z==0 
11150 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 73  ){.        pCons
11160 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d   = pEnd;.      }
11170 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28  .      nName = (
11180 69 6e 74 29 28 28 63 6f 6e 73 74 20 63 68 61 72  int)((const char
11190 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e   *)pCons->z - zN
111a0 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  ame);.      p->a
111b0 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33  ddColOffset = 13
111c0 20 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43 68   + sqlite3Utf8Ch
111d0 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61  arLen(zName, nNa
111e0 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  me);.    }.#endi
111f0 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  f.  }.}..#ifndef
11200 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
11210 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  W./*.** The pars
11220 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
11230 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74  utine in order t
11240 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56  o create a new V
11250 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  IEW.*/.void sqli
11260 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20  te3CreateView(. 
11270 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
11280 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
11290 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
112a0 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20  Token *pBegin,  
112b0 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
112c0 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
112d0 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ns the statement
112e0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
112f0 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me1,     /* The 
11300 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
11310 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
11320 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e   view */.  Token
11330 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a   *pName2,     /*
11340 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20   The token that 
11350 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f  holds the name o
11360 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  f the view */.  
11370 45 78 70 72 4c 69 73 74 20 2a 70 43 4e 61 6d 65  ExprList *pCName
11380 73 2c 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 6c  s, /* Optional l
11390 69 73 74 20 6f 66 20 76 69 65 77 20 63 6f 6c 75  ist of view colu
113a0 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 53 65  mn names */.  Se
113b0 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
113c0 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61   /* A SELECT sta
113d0 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c  tement that will
113e0 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
113f0 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73  view */.  int is
11400 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
11410 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f  TRUE for a TEMPO
11420 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69  RARY view */.  i
11430 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20  nt noErr        
11440 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72    /* Suppress er
11450 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 66 20  ror messages if 
11460 56 49 45 57 20 61 6c 72 65 61 64 79 20 65 78 69  VIEW already exi
11470 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  sts */.){.  Tabl
11480 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  e *p;.  int n;. 
11490 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
114a0 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20    Token sEnd;.  
114b0 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20  DbFixer sFix;.  
114c0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30  Token *pName = 0
114d0 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73  ;.  int iDb;.  s
114e0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
114f0 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
11500 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29  pParse->nVar>0 )
11510 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
11520 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70  orMsg(pParse, "p
11530 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f  arameters are no
11540 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65  t allowed in vie
11550 77 73 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 63  ws");.    goto c
11560 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b  reate_view_fail;
11570 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74  .  }.  sqlite3St
11580 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c  artTable(pParse,
11590 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
115a0 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e   isTemp, 1, 0, n
115b0 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20 70 50 61  oErr);.  p = pPa
115c0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
115d0 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50    if( p==0 || pP
115e0 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74  arse->nErr ) got
115f0 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61  o create_view_fa
11600 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33 54 77 6f  il;.  sqlite3Two
11610 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
11620 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
11630 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62 20   &pName);.  iDb 
11640 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
11650 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53  oIndex(db, p->pS
11660 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65  chema);.  sqlite
11670 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20  3FixInit(&sFix, 
11680 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 76 69  pParse, iDb, "vi
11690 65 77 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  ew", pName);.  i
116a0 66 28 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c  f( sqlite3FixSel
116b0 65 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65  ect(&sFix, pSele
116c0 63 74 29 20 29 20 67 6f 74 6f 20 63 72 65 61 74  ct) ) goto creat
116d0 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20 20  e_view_fail;..  
116e0 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f  /* Make a copy o
116f0 66 20 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c  f the entire SEL
11700 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
11710 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76  at defines the v
11720 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77  iew..  ** This w
11730 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68  ill force all th
11740 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76  e Expr.token.z v
11750 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61  alues to be dyna
11760 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c  mically.  ** all
11770 6f 63 61 74 65 64 20 72 61 74 68 65 72 20 74 68  ocated rather th
11780 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  an point to the 
11790 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77  input string - w
117a0 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a  hich means that.
117b0 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70    ** they will p
117c0 65 72 73 69 73 74 20 61 66 74 65 72 20 74 68 65  ersist after the
117d0 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33   current sqlite3
117e0 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74  _exec() call ret
117f0 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  urns..  */.  p->
11800 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
11810 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
11820 53 65 6c 65 63 74 2c 20 45 58 50 52 44 55 50 5f  Select, EXPRDUP_
11830 52 45 44 55 43 45 29 3b 0a 20 20 70 2d 3e 70 43  REDUCE);.  p->pC
11840 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78  heck = sqlite3Ex
11850 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 43  prListDup(db, pC
11860 4e 61 6d 65 73 2c 20 45 58 50 52 44 55 50 5f 52  Names, EXPRDUP_R
11870 45 44 55 43 45 29 3b 0a 20 20 69 66 28 20 64 62  EDUCE);.  if( db
11880 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
11890 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65   goto create_vie
118a0 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4c 6f  w_fail;..  /* Lo
118b0 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20  cate the end of 
118c0 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20  the CREATE VIEW 
118d0 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65  statement.  Make
118e0 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20   sEnd point to. 
118f0 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a   ** the end..  *
11900 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73  /.  sEnd = pPars
11910 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20  e->sLastToken;. 
11920 20 61 73 73 65 72 74 28 20 73 45 6e 64 2e 7a 5b   assert( sEnd.z[
11930 30 5d 21 3d 30 20 7c 7c 20 73 45 6e 64 2e 6e 3d  0]!=0 || sEnd.n=
11940 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 45 6e 64  =0 );.  if( sEnd
11950 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20  .z[0]!=';' ){.  
11960 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64    sEnd.z += sEnd
11970 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e  .n;.  }.  sEnd.n
11980 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74   = 0;.  n = (int
11990 29 28 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69  )(sEnd.z - pBegi
119a0 6e 2d 3e 7a 29 3b 0a 20 20 61 73 73 65 72 74 28  n->z);.  assert(
119b0 20 6e 3e 30 20 29 3b 0a 20 20 7a 20 3d 20 70 42   n>0 );.  z = pB
119c0 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65  egin->z;.  while
119d0 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ( sqlite3Isspace
119e0 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b  (z[n-1]) ){ n--;
119f0 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a   }.  sEnd.z = &z
11a00 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20  [n-1];.  sEnd.n 
11a10 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73  = 1;..  /* Use s
11a20 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29  qlite3EndTable()
11a30 20 74 6f 20 61 64 64 20 74 68 65 20 76 69 65 77   to add the view
11a40 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   to the SQLITE_M
11a50 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20  ASTER table */. 
11a60 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
11a70 28 70 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e  (pParse, 0, &sEn
11a80 64 2c 20 30 2c 20 30 29 3b 0a 0a 63 72 65 61 74  d, 0, 0);..creat
11a90 65 5f 76 69 65 77 5f 66 61 69 6c 3a 0a 20 20 73  e_view_fail:.  s
11aa0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
11ab0 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b  te(db, pSelect);
11ac0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
11ad0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 4e  stDelete(db, pCN
11ae0 61 6d 65 73 29 3b 0a 20 20 72 65 74 75 72 6e 3b  ames);.  return;
11af0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
11b00 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f  ITE_OMIT_VIEW */
11b10 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
11b20 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
11b30 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
11b40 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
11b50 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65  TABLE)./*.** The
11b60 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
11b70 20 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c   pTable is reall
11b80 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20  y a VIEW.  Fill 
11b90 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a  in the names of.
11ba0 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  ** the columns o
11bb0 66 20 74 68 65 20 76 69 65 77 20 69 6e 20 74 68  f the view in th
11bc0 65 20 70 54 61 62 6c 65 20 73 74 72 75 63 74 75  e pTable structu
11bd0 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  re.  Return the 
11be0 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72  number.** of err
11bf0 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f  ors.  If an erro
11c00 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20  r is seen leave 
11c10 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
11c20 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72   in pParse->zErr
11c30 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Msg..*/.int sqli
11c40 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
11c50 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61  Names(Parse *pPa
11c60 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
11c70 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53  le){.  Table *pS
11c80 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20 66 61  elTab;   /* A fa
11c90 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68  ke table from wh
11ca0 69 63 68 20 77 65 20 67 65 74 20 74 68 65 20 72  ich we get the r
11cb0 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53  esult set */.  S
11cc0 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20  elect *pSel;    
11cd0 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68 65 20   /* Copy of the 
11ce0 53 45 4c 45 43 54 20 74 68 61 74 20 69 6d 70 6c  SELECT that impl
11cf0 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 20  ements the view 
11d00 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20  */.  int nErr = 
11d10 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  0;     /* Number
11d20 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75   of errors encou
11d30 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ntered */.  int 
11d40 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n;            /*
11d50 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c   Temporarily hol
11d60 64 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ds the number of
11d70 20 63 75 72 73 6f 72 73 20 61 73 73 69 67 6e 65   cursors assigne
11d80 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  d */.  sqlite3 *
11d90 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
11da0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
11db0 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c  nnection for mal
11dc0 6c 6f 63 20 65 72 72 6f 72 73 20 2a 2f 0a 23 69  loc errors */.#i
11dd0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11de0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
11df0 20 69 6e 74 20 72 63 3b 0a 23 65 6e 64 69 66 0a   int rc;.#endif.
11e00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11e10 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
11e20 4e 0a 20 20 73 71 6c 69 74 65 33 5f 78 61 75 74  N.  sqlite3_xaut
11e30 68 20 78 41 75 74 68 3b 20 20 20 20 20 20 20 2f  h xAuth;       /
11e40 2a 20 53 61 76 65 64 20 78 41 75 74 68 20 70 6f  * Saved xAuth po
11e50 69 6e 74 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a  inter */.#endif.
11e60 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
11e70 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  e );..#ifndef SQ
11e80 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
11e90 4c 54 41 42 4c 45 0a 20 20 64 62 2d 3e 6e 53 63  LTABLE.  db->nSc
11ea0 68 65 6d 61 4c 6f 63 6b 2b 2b 3b 0a 20 20 72 63  hemaLock++;.  rc
11eb0 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 43 61   = sqlite3VtabCa
11ec0 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65  llConnect(pParse
11ed0 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 64 62 2d  , pTable);.  db-
11ee0 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 2d 2d 3b 0a  >nSchemaLock--;.
11ef0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
11f00 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
11f10 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
11f20 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30  able) ) return 0
11f30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ;.#endif..#ifnde
11f40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
11f50 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69  EW.  /* A positi
11f60 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68  ve nCol means th
11f70 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20  e columns names 
11f80 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61 72  for this view ar
11f90 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b  e.  ** already k
11fa0 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nown..  */.  if(
11fb0 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20   pTable->nCol>0 
11fc0 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
11fd0 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * A negative nCo
11fe0 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d  l is a special m
11ff0 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68  arker meaning th
12000 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e  at we are curren
12010 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20  tly.  ** trying 
12020 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63  to compute the c
12030 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66  olumn names.  If
12040 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20 72   we enter this r
12050 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a  outine with.  **
12060 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c   a negative nCol
12070 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f  , it means two o
12080 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72  r more views for
12090 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74  m a loop, like t
120a0 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  his:.  **.  **  
120b0 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 6f     CREATE VIEW o
120c0 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  ne AS SELECT * F
120d0 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20  ROM two;.  **   
120e0 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74 77    CREATE VIEW tw
120f0 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  o AS SELECT * FR
12100 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a  OM one;.  **.  *
12110 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20  * Actually, the 
12120 65 72 72 6f 72 20 61 62 6f 76 65 20 69 73 20 6e  error above is n
12130 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f 72 20  ow caught prior 
12140 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68 69 73  to reaching this
12150 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74   point..  ** But
12160 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
12170 65 73 74 20 69 73 20 73 74 69 6c 6c 20 69 6d 70  est is still imp
12180 6f 72 74 61 6e 74 20 61 73 20 69 74 20 64 6f 65  ortant as it doe
12190 73 20 63 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69  s come up.  ** i
121a0 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  n the following:
121b0 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20  .  ** .  **     
121c0 43 52 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69  CREATE TABLE mai
121d0 6e 2e 65 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20  n.ex1(a);.  **  
121e0 20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20 56     CREATE TEMP V
121f0 49 45 57 20 65 78 31 20 41 53 20 53 45 4c 45 43  IEW ex1 AS SELEC
12200 54 20 61 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20  T a FROM ex1;.  
12210 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  **     SELECT * 
12220 46 52 4f 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20  FROM temp.ex1;. 
12230 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
12240 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ->nCol<0 ){.    
12250 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
12260 70 50 61 72 73 65 2c 20 22 76 69 65 77 20 25 73  pParse, "view %s
12270 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64   is circularly d
12280 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d  efined", pTable-
12290 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
122a0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 1;.  }.  ass
122b0 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  ert( pTable->nCo
122c0 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  l>=0 );..  /* If
122d0 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
122e0 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65  , it means we ne
122f0 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
12300 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20  e table names.. 
12310 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
12320 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
12330 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
12340 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64  ct() will expand
12350 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c   any.  ** "*" el
12360 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65  ements in the re
12370 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65  sults set of the
12380 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61   view and will a
12390 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20  ssign cursors.  
123a0 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e  ** to the elemen
123b0 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ts of the FROM c
123c0 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65 20 64  lause.  But we d
123d0 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65  o not want these
123e0 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f   changes.  ** to
123f0 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20   be permanent.  
12400 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  So the computati
12410 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20  on is done on a 
12420 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  copy of the SELE
12430 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  CT.  ** statemen
12440 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
12450 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20  he view..  */.  
12460 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
12470 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65  pSelect );.  pSe
12480 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  l = sqlite3Selec
12490 74 44 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d  tDup(db, pTable-
124a0 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  >pSelect, 0);.  
124b0 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20  if( pSel ){.    
124c0 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  n = pParse->nTab
124d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63  ;.    sqlite3Src
124e0 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
124f0 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e  s(pParse, pSel->
12500 70 53 72 63 29 3b 0a 20 20 20 20 70 54 61 62 6c  pSrc);.    pTabl
12510 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20  e->nCol = -1;.  
12520 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
12530 62 44 69 73 61 62 6c 65 2b 2b 3b 0a 23 69 66 6e  bDisable++;.#ifn
12540 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12550 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
12560 20 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78 41    xAuth = db->xA
12570 75 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75  uth;.    db->xAu
12580 74 68 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c  th = 0;.    pSel
12590 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
125a0 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
125b0 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 20 20  Parse, pSel);.  
125c0 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 78 41    db->xAuth = xA
125d0 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70  uth;.#else.    p
125e0 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
125f0 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
12600 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b  t(pParse, pSel);
12610 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 72  .#endif.    pPar
12620 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20  se->nTab = n;.  
12630 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 70 43    if( pTable->pC
12640 68 65 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  heck ){.      /*
12650 20 43 52 45 41 54 45 20 56 49 45 57 20 6e 61 6d   CREATE VIEW nam
12660 65 28 61 72 67 6c 69 73 74 29 20 41 53 20 2e 2e  e(arglist) AS ..
12670 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6e  ..      ** The n
12680 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75  ames of the colu
12690 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  mns in the table
126a0 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 0a   are taken from.
126b0 20 20 20 20 20 20 2a 2a 20 61 72 67 6c 69 73 74        ** arglist
126c0 20 77 68 69 63 68 20 69 73 20 73 74 6f 72 65 64   which is stored
126d0 20 69 6e 20 70 54 61 62 6c 65 2d 3e 70 43 68 65   in pTable->pChe
126e0 63 6b 2e 20 20 54 68 65 20 70 43 68 65 63 6b 20  ck.  The pCheck 
126f0 66 69 65 6c 64 0a 20 20 20 20 20 20 2a 2a 20 6e  field.      ** n
12700 6f 72 6d 61 6c 6c 79 20 68 6f 6c 64 73 20 43 48  ormally holds CH
12710 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ECK constraints 
12720 6f 6e 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 74  on an ordinary t
12730 61 62 6c 65 2c 20 62 75 74 20 66 6f 72 0a 20 20  able, but for.  
12740 20 20 20 20 2a 2a 20 61 20 56 49 45 57 20 69 74      ** a VIEW it
12750 20 68 6f 6c 64 73 20 74 68 65 20 6c 69 73 74 20   holds the list 
12760 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e  of column names.
12770 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
12780 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72  sqlite3ColumnsFr
12790 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
127a0 65 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63  e, pTable->pChec
127b0 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  k, .            
127c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127d0 20 20 20 20 20 26 70 54 61 62 6c 65 2d 3e 6e 43       &pTable->nC
127e0 6f 6c 2c 20 26 70 54 61 62 6c 65 2d 3e 61 43 6f  ol, &pTable->aCo
127f0 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  l);.      if( db
12800 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
12810 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 50 61  0 .       && pPa
12820 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 0a 20 20 20  rse->nErr==0.   
12830 20 20 20 20 26 26 20 70 54 61 62 6c 65 2d 3e 6e      && pTable->n
12840 43 6f 6c 3d 3d 70 53 65 6c 2d 3e 70 45 4c 69 73  Col==pSel->pELis
12850 74 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 29  t->nExpr.      )
12860 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
12870 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e  3SelectAddColumn
12880 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
12890 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 2c  (pParse, pTable,
128a0 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a   pSel);.      }.
128b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53      }else if( pS
128c0 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20 2f  elTab ){.      /
128d0 2a 20 43 52 45 41 54 45 20 56 49 45 57 20 6e 61  * CREATE VIEW na
128e0 6d 65 20 41 53 2e 2e 2e 20 20 77 69 74 68 6f 75  me AS...  withou
128f0 74 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 6c 69  t an argument li
12900 73 74 2e 20 20 43 6f 6e 73 74 72 75 63 74 0a 20  st.  Construct. 
12910 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6c 75       ** the colu
12920 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74 68  mn names from th
12930 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
12940 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  nt that defines 
12950 74 68 65 20 76 69 65 77 2e 0a 20 20 20 20 20 20  the view..      
12960 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
12970 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30   pTable->aCol==0
12980 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65   );.      pTable
12990 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->nCol = pSelTab
129a0 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54  ->nCol;.      pT
129b0 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65  able->aCol = pSe
129c0 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  lTab->aCol;.    
129d0 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20    pSelTab->nCol 
129e0 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54  = 0;.      pSelT
129f0 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
12a00 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
12a10 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
12a20 6c 64 28 64 62 2c 20 30 2c 20 70 54 61 62 6c 65  ld(db, 0, pTable
12a30 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
12a40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
12a50 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
12a60 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20  .      nErr++;. 
12a70 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
12a80 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
12a90 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 73 71  pSelTab);.    sq
12aa0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
12ab0 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20  e(db, pSel);.   
12ac0 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
12ad0 44 69 73 61 62 6c 65 2d 2d 3b 0a 20 20 7d 20 65  Disable--;.  } e
12ae0 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b  lse {.    nErr++
12af0 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e  ;.  }.  pTable->
12b00 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 46  pSchema->schemaF
12b10 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73  lags |= DB_Unres
12b20 65 74 56 69 65 77 73 3b 0a 20 20 69 66 28 20 64  etViews;.  if( d
12b30 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
12b40 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
12b50 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  leteColumnNames(
12b60 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 20  db, pTable);.   
12b70 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
12b80 30 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  0;.    pTable->n
12b90 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  Col = 0;.  }.#en
12ba0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
12bb0 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65 74  IT_VIEW */.  ret
12bc0 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65  urn nErr;  .}.#e
12bd0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
12be0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
12bf0 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
12c00 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
12c10 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66  ALTABLE) */..#if
12c20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12c30 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  _VIEW./*.** Clea
12c40 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r the column nam
12c50 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49  es from every VI
12c60 45 57 20 69 6e 20 64 61 74 61 62 61 73 65 20 69  EW in database i
12c70 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  dx..*/.static vo
12c80 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  id sqliteViewRes
12c90 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64  etAll(sqlite3 *d
12ca0 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48  b, int idx){.  H
12cb0 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 61 73  ashElem *i;.  as
12cc0 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
12cd0 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
12ce0 20 69 64 78 2c 20 30 29 20 29 3b 0a 20 20 69 66   idx, 0) );.  if
12cf0 28 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79  ( !DbHasProperty
12d00 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72  (db, idx, DB_Unr
12d10 65 73 65 74 56 69 65 77 73 29 20 29 20 72 65 74  esetViews) ) ret
12d20 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c  urn;.  for(i=sql
12d30 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
12d40 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63 68 65  ->aDb[idx].pSche
12d50 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b  ma->tblHash); i;
12d60 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
12d70 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  (i)){.    Table 
12d80 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
12d90 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69  shData(i);.    i
12da0 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
12db0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12dc0 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d  3DeleteColumnNam
12dd0 65 73 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  es(db, pTab);.  
12de0 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d      pTab->aCol =
12df0 20 30 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   0;.      pTab->
12e00 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  nCol = 0;.    }.
12e10 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f    }.  DbClearPro
12e20 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44  perty(db, idx, D
12e30 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b  B_UnresetViews);
12e40 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
12e50 65 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  e sqliteViewRese
12e60 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66  tAll(A,B).#endif
12e70 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
12e80 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  VIEW */../*.** T
12e90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
12ea0 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44  called by the VD
12eb0 42 45 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  BE to adjust the
12ec0 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
12ed0 0a 2a 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69  .** used by SQLi
12ee0 74 65 20 77 68 65 6e 20 74 68 65 20 62 74 72 65  te when the btre
12ef0 65 20 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20  e layer moves a 
12f00 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e  table root page.
12f10 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67   The.** root-pag
12f20 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  e of a table or 
12f30 69 6e 64 65 78 20 69 6e 20 64 61 74 61 62 61 73  index in databas
12f40 65 20 69 44 62 20 68 61 73 20 63 68 61 6e 67 65  e iDb has change
12f50 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20  d from iFrom.** 
12f60 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69  to iTo..**.** Ti
12f70 63 6b 65 74 20 23 31 37 32 38 3a 20 20 54 68 65  cket #1728:  The
12f80 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69   symbol table mi
12f90 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69  ght still contai
12fa0 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  n information.**
12fb0 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f   on tables and/o
12fc0 72 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 61  r indices that a
12fd0 72 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f  re the process o
12fe0 66 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e  f being deleted.
12ff0 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75  .** If you are u
13000 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74  nlucky, one of t
13010 68 6f 73 65 20 64 65 6c 65 74 65 64 20 69 6e 64  hose deleted ind
13020 69 63 65 73 20 6f 72 20 74 61 62 6c 65 73 20 6d  ices or tables m
13030 69 67 68 74 0a 2a 2a 20 68 61 76 65 20 74 68 65  ight.** have the
13040 20 73 61 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e   same rootpage n
13050 75 6d 62 65 72 20 61 73 20 74 68 65 20 72 65 61  umber as the rea
13060 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  l table or index
13070 20 74 68 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e   that is.** bein
13080 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65 20  g moved.  So we 
13090 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61 72  cannot stop sear
130a0 63 68 69 6e 67 20 61 66 74 65 72 20 74 68 65 20  ching after the 
130b0 66 69 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20  first match .** 
130c0 62 65 63 61 75 73 65 20 74 68 65 20 66 69 72 73  because the firs
130d0 74 20 6d 61 74 63 68 20 6d 69 67 68 74 20 62 65  t match might be
130e0 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20   for one of the 
130f0 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 0a  deleted indices.
13100 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20 61 6e 64  ** or tables and
13110 20 6e 6f 74 20 74 68 65 20 74 61 62 6c 65 2f 69   not the table/i
13120 6e 64 65 78 20 74 68 61 74 20 69 73 20 61 63 74  ndex that is act
13130 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65  ually being move
13140 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f  d..** We must co
13150 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75  ntinue looping u
13160 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20  ntil all tables 
13170 61 6e 64 20 69 6e 64 69 63 65 73 20 77 69 74 68  and indices with
13180 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46  .** rootpage==iF
13190 72 6f 6d 20 68 61 76 65 20 62 65 65 6e 20 63 6f  rom have been co
131a0 6e 76 65 72 74 65 64 20 74 6f 20 68 61 76 65 20  nverted to have 
131b0 61 20 72 6f 6f 74 70 61 67 65 20 6f 66 20 69 54  a rootpage of iT
131c0 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  o.** in order to
131d0 20 62 65 20 63 65 72 74 61 69 6e 20 74 68 61 74   be certain that
131e0 20 77 65 20 67 6f 74 20 74 68 65 20 72 69 67 68   we got the righ
131f0 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  t one..*/.#ifnde
13200 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
13210 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71  TOVACUUM.void sq
13220 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76  lite3RootPageMov
13230 65 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ed(sqlite3 *db, 
13240 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 69 46 72  int iDb, int iFr
13250 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20  om, int iTo){.  
13260 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b  HashElem *pElem;
13270 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a  .  Hash *pHash;.
13280 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73    Db *pDb;..  as
13290 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
132a0 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
132b0 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 44   iDb, 0) );.  pD
132c0 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
132d0 5d 3b 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44  ];.  pHash = &pD
132e0 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  b->pSchema->tblH
132f0 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d  ash;.  for(pElem
13300 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
13310 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20  (pHash); pElem; 
13320 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
13330 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20  Next(pElem)){.  
13340 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
13350 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
13360 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Elem);.    if( p
13370 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d  Tab->tnum==iFrom
13380 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   ){.      pTab->
13390 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20  tnum = iTo;.    
133a0 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68 20 3d 20  }.  }.  pHash = 
133b0 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69  &pDb->pSchema->i
133c0 64 78 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45  dxHash;.  for(pE
133d0 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
133e0 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65  rst(pHash); pEle
133f0 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
13400 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
13410 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
13420 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
13430 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66  a(pElem);.    if
13440 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46  ( pIdx->tnum==iF
13450 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64  rom ){.      pId
13460 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20  x->tnum = iTo;. 
13470 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
13480 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63  f../*.** Write c
13490 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 68 65  ode to erase the
134a0 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74   table with root
134b0 2d 70 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f  -page iTable fro
134c0 6d 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a  m database iDb..
134d0 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f  ** Also write co
134e0 64 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  de to modify the
134f0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
13500 61 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61  able and interna
13510 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61  l schema.** if a
13520 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e   root-page of an
13530 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d  other table is m
13540 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65  oved by the btre
13550 65 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a  e-layer whilst.*
13560 2a 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65  * erasing iTable
13570 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65   (this can happe
13580 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76  n with an auto-v
13590 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e  acuum database).
135a0 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
135b0 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
135c0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
135d0 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20  int iTable, int 
135e0 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  iDb){.  Vdbe *v 
135f0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
13600 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
13610 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
13620 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
13630 20 20 61 73 73 65 72 74 28 20 69 54 61 62 6c 65    assert( iTable
13640 3e 31 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  >1 );.  sqlite3V
13650 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
13660 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c  Destroy, iTable,
13670 20 72 31 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c   r1, iDb);.  sql
13680 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
13690 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  rse);.#ifndef SQ
136a0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
136b0 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73  CUUM.  /* OP_Des
136c0 74 72 6f 79 20 73 74 6f 72 65 73 20 61 6e 20 69  troy stores an i
136d0 6e 20 69 6e 74 65 67 65 72 20 72 31 2e 20 49 66  n integer r1. If
136e0 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20   this integer.  
136f0 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ** is non-zero, 
13700 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72  then it is the r
13710 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
13720 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64  of a table moved
13730 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f   to.  ** locatio
13740 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f  n iTable. The fo
13750 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64  llowing code mod
13760 69 66 69 65 73 20 74 68 65 20 73 71 6c 69 74 65  ifies the sqlite
13770 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f  _master table to
13780 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68  .  ** reflect th
13790 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  is..  **.  ** Th
137a0 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20  e "#NNN" in the 
137b0 53 51 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c  SQL is a special
137c0 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d   constant that m
137d0 65 61 6e 73 20 77 68 61 74 65 76 65 72 20 76 61  eans whatever va
137e0 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72  lue.  ** is in r
137f0 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65  egister NNN.  Se
13800 65 20 67 72 61 6d 6d 61 72 20 72 75 6c 65 73 20  e grammar rules 
13810 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
13820 74 68 65 20 54 4b 5f 52 45 47 49 53 54 45 52 0a  the TK_REGISTER.
13830 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61    ** token for a
13840 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
13850 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71  ation..  */.  sq
13860 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
13870 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22  (pParse, .     "
13880 55 50 44 41 54 45 20 25 51 2e 25 73 20 53 45 54  UPDATE %Q.%s SET
13890 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45   rootpage=%d WHE
138a0 52 45 20 23 25 64 20 41 4e 44 20 72 6f 6f 74 70  RE #%d AND rootp
138b0 61 67 65 3d 23 25 64 22 2c 0a 20 20 20 20 20 70  age=#%d",.     p
138c0 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
138d0 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41  Db].zDbSName, MA
138e0 53 54 45 52 5f 4e 41 4d 45 2c 20 69 54 61 62 6c  STER_NAME, iTabl
138f0 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23 65 6e 64  e, r1, r1);.#end
13900 69 66 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  if.  sqlite3Rele
13910 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
13920 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e, r1);.}../*.**
13930 20 57 72 69 74 65 20 56 44 42 45 20 63 6f 64 65   Write VDBE code
13940 20 74 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20   to erase table 
13950 70 54 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73  pTab and all ass
13960 6f 63 69 61 74 65 64 20 69 6e 64 69 63 65 73 20  ociated indices 
13970 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65  on disk..** Code
13980 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 73   to update the s
13990 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
139a0 6c 65 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c  les and internal
139b0 20 73 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69   schema definiti
139c0 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61  ons.** in case a
139d0 20 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e   root-page belon
139e0 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20  ging to another 
139f0 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62  table is moved b
13a00 79 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  y the btree laye
13a10 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64  r.** is also add
13a20 65 64 20 28 74 68 69 73 20 63 61 6e 20 68 61 70  ed (this can hap
13a30 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f  pen with an auto
13a40 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
13a50 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
13a60 64 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50  d destroyTable(P
13a70 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
13a80 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 2f 2a  ble *pTab){.  /*
13a90 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
13aa0 20 6d 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63   may be auto-vac
13ab0 75 75 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20  uum capable (if 
13ac0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
13ad0 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e  VACUUM.  ** is n
13ae0 6f 74 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65  ot defined), the
13af0 6e 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  n it is importan
13b00 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73  t to call OP_Des
13b10 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  troy on the.  **
13b20 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
13b30 20 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f   root-pages in o
13b40 72 64 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77  rder, starting w
13b50 69 74 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61  ith the numerica
13b60 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73  lly .  ** larges
13b70 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  t root-page numb
13b80 65 72 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74  er. This guarant
13b90 65 65 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66  ees that none of
13ba0 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a   the root-pages.
13bb0 20 20 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72    ** to be destr
13bc0 6f 79 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65  oyed is relocate
13bd0 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
13be0 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e  OP_Destroy. i.e.
13bf0 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c   if the.  ** fol
13c00 6c 6f 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65  lowing were code
13c10 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f  d:.  **.  ** OP_
13c20 44 65 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a  Destroy 4 0.  **
13c30 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73   ....  ** OP_Des
13c40 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20  troy 5 0.  **.  
13c50 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65  ** and root page
13c60 20 35 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62   5 happened to b
13c70 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f  e the largest ro
13c80 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69  ot-page number i
13c90 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
13ca0 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70  ase, then root p
13cb0 61 67 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d  age 5 would be m
13cc0 6f 76 65 64 20 74 6f 20 70 61 67 65 20 34 20 62  oved to page 4 b
13cd0 79 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f  y the .  ** "OP_
13ce0 44 65 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63  Destroy 4 0" opc
13cf0 6f 64 65 2e 20 54 68 65 20 73 75 62 73 65 71 75  ode. The subsequ
13d00 65 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20  ent "OP_Destroy 
13d10 35 20 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20  5 0" would hit. 
13d20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20   ** a free-list 
13d30 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  page..  */.  int
13d40 20 69 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e   iTab = pTab->tn
13d50 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72  um;.  int iDestr
13d60 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69  oyed = 0;..  whi
13d70 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64  le( 1 ){.    Ind
13d80 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e  ex *pIdx;.    in
13d90 74 20 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a  t iLargest = 0;.
13da0 0a 20 20 20 20 69 66 28 20 69 44 65 73 74 72 6f  .    if( iDestro
13db0 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69  yed==0 || iTab<i
13dc0 44 65 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20  Destroyed ){.   
13dd0 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54     iLargest = iT
13de0 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ab;.    }.    fo
13df0 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
13e00 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
13e10 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
13e20 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70      int iIdx = p
13e30 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20  Idx->tnum;.     
13e40 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70   assert( pIdx->p
13e50 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
13e60 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 69  chema );.      i
13e70 66 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d  f( (iDestroyed==
13e80 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74  0 || (iIdx<iDest
13e90 72 6f 79 65 64 29 29 20 26 26 20 69 49 64 78 3e  royed)) && iIdx>
13ea0 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20  iLargest ){.    
13eb0 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69      iLargest = i
13ec0 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Idx;.      }.   
13ed0 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67   }.    if( iLarg
13ee0 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  est==0 ){.      
13ef0 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73  return;.    }els
13f00 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62  e{.      int iDb
13f10 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
13f20 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
13f30 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
13f40 61 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  a);.      assert
13f50 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
13f60 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20  pParse->db->nDb 
13f70 29 3b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79  );.      destroy
13f80 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
13f90 20 69 4c 61 72 67 65 73 74 2c 20 69 44 62 29 3b   iLargest, iDb);
13fa0 0a 20 20 20 20 20 20 69 44 65 73 74 72 6f 79 65  .      iDestroye
13fb0 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20 20  d = iLargest;.  
13fc0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
13fd0 20 52 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20   Remove entries 
13fe0 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f  from the sqlite_
13ff0 73 74 61 74 4e 20 74 61 62 6c 65 73 20 28 66 6f  statN tables (fo
14000 72 20 4e 20 69 6e 20 28 31 2c 32 2c 33 29 29 0a  r N in (1,2,3)).
14010 2a 2a 20 61 66 74 65 72 20 61 20 44 52 4f 50 20  ** after a DROP 
14020 49 4e 44 45 58 20 6f 72 20 44 52 4f 50 20 54 41  INDEX or DROP TA
14030 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  BLE command..*/.
14040 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
14050 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c  te3ClearStatTabl
14060 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
14070 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
14080 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
14090 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ext */.  int iDb
140a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
140b0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
140c0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 6f 6e 73  number */.  cons
140d0 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 20  t char *zType,  
140e0 20 20 20 2f 2a 20 22 69 64 78 22 20 6f 72 20 22     /* "idx" or "
140f0 74 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tbl" */.  const 
14100 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20  char *zName     
14110 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 69 6e 64 65   /* Name of inde
14120 78 20 6f 72 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  x or table */.){
14130 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
14140 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20  t char *zDbName 
14150 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44  = pParse->db->aD
14160 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b  b[iDb].zDbSName;
14170 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 34  .  for(i=1; i<=4
14180 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
14190 20 7a 54 61 62 5b 32 34 5d 3b 0a 20 20 20 20 73   zTab[24];.    s
141a0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
141b0 73 69 7a 65 6f 66 28 7a 54 61 62 29 2c 7a 54 61  sizeof(zTab),zTa
141c0 62 2c 22 73 71 6c 69 74 65 5f 73 74 61 74 25 64  b,"sqlite_stat%d
141d0 22 2c 69 29 3b 0a 20 20 20 20 69 66 28 20 73 71  ",i);.    if( sq
141e0 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70  lite3FindTable(p
141f0 50 61 72 73 65 2d 3e 64 62 2c 20 7a 54 61 62 2c  Parse->db, zTab,
14200 20 7a 44 62 4e 61 6d 65 29 20 29 7b 0a 20 20 20   zDbName) ){.   
14210 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
14220 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
14230 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
14240 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 25  OM %Q.%s WHERE %
14250 73 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 7a  s=%Q",.        z
14260 44 62 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 7a 54  DbName, zTab, zT
14270 79 70 65 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 20  ype, zName.     
14280 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   );.    }.  }.}.
14290 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
142a0 63 6f 64 65 20 74 6f 20 64 72 6f 70 20 61 20 74  code to drop a t
142b0 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  able..*/.void sq
142c0 6c 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62  lite3CodeDropTab
142d0 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
142e0 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 69  , Table *pTab, i
142f0 6e 74 20 69 44 62 2c 20 69 6e 74 20 69 73 56 69  nt iDb, int isVi
14300 65 77 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  ew){.  Vdbe *v;.
14310 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
14320 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 54 72  pParse->db;.  Tr
14330 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b  igger *pTrigger;
14340 0a 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  .  Db *pDb = &db
14350 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 76  ->aDb[iDb];..  v
14360 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
14370 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  e(pParse);.  ass
14380 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73  ert( v!=0 );.  s
14390 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
143a0 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
143b0 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e  , 1, iDb);..#ifn
143c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
143d0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
143e0 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
143f0 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
14400 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
14410 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 7d 0a 23  P_VBegin);.  }.#
14420 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70  endif..  /* Drop
14430 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73   all triggers as
14440 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
14450 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
14460 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 2a 2a  opped. Code.  **
14470 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f   is generated to
14480 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20   remove entries 
14490 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74  from sqlite_mast
144a0 65 72 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 73  er and/or.  ** s
144b0 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
144c0 72 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20  r if required.. 
144d0 20 2a 2f 0a 20 20 70 54 72 69 67 67 65 72 20 3d   */.  pTrigger =
144e0 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 4c   sqlite3TriggerL
144f0 69 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ist(pParse, pTab
14500 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 54 72 69  );.  while( pTri
14510 67 67 65 72 20 29 7b 0a 20 20 20 20 61 73 73 65  gger ){.    asse
14520 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 70 53  rt( pTrigger->pS
14530 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
14540 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20 20  hema || .       
14550 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65   pTrigger->pSche
14560 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ma==db->aDb[1].p
14570 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71  Schema );.    sq
14580 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72  lite3DropTrigger
14590 50 74 72 28 70 50 61 72 73 65 2c 20 70 54 72 69  Ptr(pParse, pTri
145a0 67 67 65 72 29 3b 0a 20 20 20 20 70 54 72 69 67  gger);.    pTrig
145b0 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e  ger = pTrigger->
145c0 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e  pNext;.  }..#ifn
145d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
145e0 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
145f0 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e  /* Remove any en
14600 74 72 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c  tries of the sql
14610 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
14620 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
14630 74 68 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c  th.  ** the tabl
14640 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e  e being dropped.
14650 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
14660 66 6f 72 65 20 74 68 65 20 74 61 62 6c 65 20 69  fore the table i
14670 73 20 64 72 6f 70 70 65 64 0a 20 20 2a 2a 20 61  s dropped.  ** a
14680 74 20 74 68 65 20 62 74 72 65 65 20 6c 65 76 65  t the btree leve
14690 6c 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  l, in case the s
146a0 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
146b0 61 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20 20  able needs to.  
146c0 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73  ** move as a res
146d0 75 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20  ult of the drop 
146e0 28 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61  (can happen in a
146f0 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29  uto-vacuum mode)
14700 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ..  */.  if( pTa
14710 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
14720 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29  _Autoincrement )
14730 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  {.    sqlite3Nes
14740 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
14750 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46  .      "DELETE F
14760 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 65  ROM %Q.sqlite_se
14770 71 75 65 6e 63 65 20 57 48 45 52 45 20 6e 61 6d  quence WHERE nam
14780 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 70 44 62  e=%Q",.      pDb
14790 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 70 54 61 62  ->zDbSName, pTab
147a0 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20  ->zName.    );. 
147b0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
147c0 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f  Drop all SQLITE_
147d0 4d 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64  MASTER table and
147e0 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74   index entries t
147f0 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
14800 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65  .  ** table. The
14810 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f   program name lo
14820 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  ops through the 
14830 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
14840 20 64 65 6c 65 74 65 73 0a 20 20 2a 2a 20 65 76   deletes.  ** ev
14850 65 72 79 20 72 6f 77 20 74 68 61 74 20 72 65 66  ery row that ref
14860 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f  ers to a table o
14870 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  f the same name 
14880 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67  as the one being
14890 0a 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54  .  ** dropped. T
148a0 72 69 67 67 65 72 73 20 61 72 65 20 68 61 6e 64  riggers are hand
148b0 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 20 62  led separately b
148c0 65 63 61 75 73 65 20 61 20 74 72 69 67 67 65 72  ecause a trigger
148d0 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 63 72 65   can be.  ** cre
148e0 61 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70  ated in the temp
148f0 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 72   database that r
14900 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
14910 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a   in another.  **
14920 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
14930 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
14940 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
14950 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
14960 20 25 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c   %Q.%s WHERE tbl
14970 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70  _name=%Q and typ
14980 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20  e!='trigger'",. 
14990 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61       pDb->zDbSNa
149a0 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c  me, MASTER_NAME,
149b0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
149c0 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20   if( !isView && 
149d0 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  !IsVirtual(pTab)
149e0 20 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 54   ){.    destroyT
149f0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
14a00 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  b);.  }..  /* Re
14a10 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 65  move the table e
14a20 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74 65  ntry from SQLite
14a30 27 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  's internal sche
14a40 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20  ma and modify.  
14a50 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  ** the schema co
14a60 6f 6b 69 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  okie..  */.  if(
14a70 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
14a80 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
14a90 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
14aa0 56 44 65 73 74 72 6f 79 2c 20 69 44 62 2c 20 30  VDestroy, iDb, 0
14ab0 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
14ac0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
14ad0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
14ae0 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69   OP_DropTable, i
14af0 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e  Db, 0, 0, pTab->
14b00 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c  zName, 0);.  sql
14b10 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
14b20 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
14b30 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
14b40 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 7d 0a  All(db, iDb);.}.
14b50 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
14b60 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
14b70 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20   do the work of 
14b80 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61  a DROP TABLE sta
14b90 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65  tement..** pName
14ba0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
14bb0 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
14bc0 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64  dropped..*/.void
14bd0 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c   sqlite3DropTabl
14be0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
14bf0 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c   SrcList *pName,
14c00 20 69 6e 74 20 69 73 56 69 65 77 2c 20 69 6e 74   int isView, int
14c10 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62 6c 65   noErr){.  Table
14c20 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20 2a   *pTab;.  Vdbe *
14c30 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
14c40 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
14c50 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28   int iDb;..  if(
14c60 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
14c70 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d ){.    goto ex
14c80 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
14c90 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
14ca0 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a  rse->nErr==0 );.
14cb0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
14cc0 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66  >nSrc==1 );.  if
14cd0 28 20 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  ( sqlite3ReadSch
14ce0 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f  ema(pParse) ) go
14cf0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
14d00 6c 65 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20  le;.  if( noErr 
14d10 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72  ) db->suppressEr
14d20 72 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 69  r++;.  assert( i
14d30 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69  sView==0 || isVi
14d40 65 77 3d 3d 4c 4f 43 41 54 45 5f 56 49 45 57 20  ew==LOCATE_VIEW 
14d50 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  );.  pTab = sqli
14d60 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74  te3LocateTableIt
14d70 65 6d 28 70 50 61 72 73 65 2c 20 69 73 56 69 65  em(pParse, isVie
14d80 77 2c 20 26 70 4e 61 6d 65 2d 3e 61 5b 30 5d 29  w, &pName->a[0])
14d90 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20  ;.  if( noErr ) 
14da0 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72 2d  db->suppressErr-
14db0 2d 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  -;..  if( pTab==
14dc0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f 45  0 ){.    if( noE
14dd0 72 72 20 29 20 73 71 6c 69 74 65 33 43 6f 64 65  rr ) sqlite3Code
14de0 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d  VerifyNamedSchem
14df0 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d  a(pParse, pName-
14e00 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
14e10 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
14e20 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
14e30 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
14e40 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
14e50 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
14e60 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
14e70 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
14e80 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61   );..  /* If pTa
14e90 62 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74  b is a virtual t
14ea0 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69 65 77 47  able, call ViewG
14eb0 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20  etColumnNames() 
14ec0 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a 2a 20 69  to ensure.  ** i
14ed0 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  t is initialized
14ee0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  ..  */.  if( IsV
14ef0 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26 20  irtual(pTab) && 
14f00 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
14f10 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
14f20 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 67  , pTab) ){.    g
14f30 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
14f40 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  ble;.  }.#ifndef
14f50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
14f60 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
14f70 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20     int code;.   
14f80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
14f90 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
14fa0 28 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74  (iDb);.    const
14fb0 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
14fc0 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
14fd0 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  me;.    const ch
14fe0 61 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b 0a 20  ar *zArg2 = 0;. 
14ff0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
15000 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
15010 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
15020 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20  Tab, 0, zDb)){. 
15030 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
15040 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
15050 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20  .    if( isView 
15060 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  ){.      if( !OM
15070 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
15080 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
15090 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
150a0 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20  P_TEMP_VIEW;.   
150b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
150c0 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
150d0 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  DROP_VIEW;.     
150e0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
150f0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
15100 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  BLE.    }else if
15110 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
15120 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 20  ) ){.      code 
15130 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54  = SQLITE_DROP_VT
15140 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41 72 67  ABLE;.      zArg
15150 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54  2 = sqlite3GetVT
15160 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 2d 3e  able(db, pTab)->
15170 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e  pMod->zName;.#en
15180 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
15190 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
151a0 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
151b0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
151c0 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
151d0 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  MP_TABLE;.      
151e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
151f0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
15200 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
15210 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
15220 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
15230 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54  pParse, code, pT
15240 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67 32  ab->zName, zArg2
15250 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
15260 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
15270 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  able;.    }.    
15280 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
15290 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
152a0 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62  ITE_DELETE, pTab
152b0 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  ->zName, 0, zDb)
152c0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
152d0 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
152e0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
152f0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
15300 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rNICmp(pTab->zNa
15310 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
15320 29 3d 3d 30 20 0a 20 20 20 20 26 26 20 73 71 6c  )==0 .    && sql
15330 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61  ite3StrNICmp(pTa
15340 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  b->zName, "sqlit
15350 65 5f 73 74 61 74 22 2c 20 31 31 29 21 3d 30 20  e_stat", 11)!=0 
15360 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
15370 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
15380 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
15390 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70 54   be dropped", pT
153a0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
153b0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
153c0 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  able;.  }..#ifnd
153d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
153e0 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20  IEW.  /* Ensure 
153f0 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20 6e 6f  DROP TABLE is no
15400 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69 65 77  t used on a view
15410 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45 57 20  , and DROP VIEW 
15420 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a  is not used.  **
15430 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a   on a table..  *
15440 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 26  /.  if( isView &
15450 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  & pTab->pSelect=
15460 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
15470 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15480 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c  , "use DROP TABL
15490 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c  E to delete tabl
154a0 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  e %s", pTab->zNa
154b0 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
154c0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
154d0 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65 77   }.  if( !isView
154e0 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
154f0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
15500 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
15510 20 22 75 73 65 20 44 52 4f 50 20 56 49 45 57 20   "use DROP VIEW 
15520 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20 25  to delete view %
15530 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s", pTab->zName)
15540 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
15550 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
15560 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
15570 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
15580 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 66  move the table f
15590 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
155a0 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73  able.  ** on dis
155b0 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  k..  */.  v = sq
155c0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
155d0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
155e0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
155f0 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
15600 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
15610 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61  .    sqlite3Clea
15620 72 53 74 61 74 54 61 62 6c 65 73 28 70 50 61 72  rStatTables(pPar
15630 73 65 2c 20 69 44 62 2c 20 22 74 62 6c 22 2c 20  se, iDb, "tbl", 
15640 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
15650 20 20 73 71 6c 69 74 65 33 46 6b 44 72 6f 70 54    sqlite3FkDropT
15660 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61  able(pParse, pNa
15670 6d 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 73  me, pTab);.    s
15680 71 6c 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61  qlite3CodeDropTa
15690 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
156a0 2c 20 69 44 62 2c 20 69 73 56 69 65 77 29 3b 0a  , iDb, isView);.
156b0 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74    }..exit_drop_t
156c0 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53  able:.  sqlite3S
156d0 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
156e0 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pName);.}../*.*
156f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
15700 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
15710 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e  te a new foreign
15720 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c   key on the tabl
15730 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75  e.** currently u
15740 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
15750 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74  n.  pFromCol det
15760 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f  ermines which co
15770 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
15780 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f  current table po
15790 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69  int to the forei
157a0 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f  gn key.  If pFro
157b0 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  mCol==0 then.** 
157c0 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20  connect the key 
157d0 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  to the last colu
157e0 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54  mn inserted.  pT
157f0 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  o is the name of
15800 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65  .** the table re
15810 66 65 72 72 65 64 20 74 6f 20 28 61 2e 6b 2e 61  ferred to (a.k.a
15820 20 74 68 65 20 22 70 61 72 65 6e 74 22 20 74 61   the "parent" ta
15830 62 6c 65 29 2e 20 20 70 54 6f 43 6f 6c 20 69 73  ble).  pToCol is
15840 20 61 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 74 61   a list.** of ta
15850 62 6c 65 73 20 69 6e 20 74 68 65 20 70 61 72 65  bles in the pare
15860 6e 74 20 70 54 6f 20 74 61 62 6c 65 2e 20 20 66  nt pTo table.  f
15870 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c  lags contains al
15880 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  l.** information
15890 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c   about the confl
158a0 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
158b0 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66  lgorithms specif
158c0 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e  ied.** in the ON
158d0 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41   DELETE, ON UPDA
158e0 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54  TE and ON INSERT
158f0 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
15900 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75 72  An FKey structur
15910 65 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  e is created and
15920 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
15930 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  ble currently.**
15940 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
15950 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73  ion in the pPars
15960 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65  e->pNewTable fie
15970 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ld..**.** The fo
15980 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74  reign key is set
15990 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70   for IMMEDIATE p
159a0 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75  rocessing.  A su
159b0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a  bsequent call.**
159c0 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72   to sqlite3Defer
159d0 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67  ForeignKey() mig
159e0 68 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 74  ht change this t
159f0 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76  o DEFERRED..*/.v
15a00 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74  oid sqlite3Creat
15a10 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50  eForeignKey(.  P
15a20 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
15a30 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
15a40 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
15a50 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20  List *pFromCol, 
15a60 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74   /* Columns in t
15a70 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 70  his table that p
15a80 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61  oint to other ta
15a90 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ble */.  Token *
15aa0 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  pTo,          /*
15ab0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68   Name of the oth
15ac0 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  er table */.  Ex
15ad0 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20  prList *pToCol, 
15ae0 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e     /* Columns in
15af0 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65   the other table
15b00 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
15b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
15b20 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
15b30 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f  n algorithms. */
15b40 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
15b50 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
15b60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15b70 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
15b80 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20    FKey *pFKey = 
15b90 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e 65 78 74  0;.  FKey *pNext
15ba0 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d  To;.  Table *p =
15bb0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
15bc0 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  le;.  int nByte;
15bd0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
15be0 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nCol;.  char *z;
15bf0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 21  ..  assert( pTo!
15c00 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
15c10 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56   || IN_DECLARE_V
15c20 54 41 42 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  TAB ) goto fk_en
15c30 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f  d;.  if( pFromCo
15c40 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  l==0 ){.    int 
15c50 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  iCol = p->nCol-1
15c60 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
15c70 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74 6f 20 66  iCol<0) ) goto f
15c80 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70  k_end;.    if( p
15c90 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
15ca0 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20  >nExpr!=1 ){.   
15cb0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15cc0 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65  sg(pParse, "fore
15cd0 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20  ign key on %s". 
15ce0 20 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64          " should
15cf0 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20   reference only 
15d00 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61  one column of ta
15d10 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20  ble %T",.       
15d20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e    p->aCol[iCol].
15d30 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20  zName, pTo);.   
15d40 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
15d50 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d      }.    nCol =
15d60 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
15d70 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c  pToCol && pToCol
15d80 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f  ->nExpr!=pFromCo
15d90 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  l->nExpr ){.    
15da0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15db0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
15dc0 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d  "number of colum
15dd0 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  ns in foreign ke
15de0 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  y does not match
15df0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22   the number of "
15e00 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e  .        "column
15e10 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e  s in the referen
15e20 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20  ced table");.   
15e30 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
15e40 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20  }else{.    nCol 
15e50 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70  = pFromCol->nExp
15e60 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  r;.  }.  nByte =
15e70 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20   sizeof(*pFKey) 
15e80 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f  + (nCol-1)*sizeo
15e90 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d  f(pFKey->aCol[0]
15ea0 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a  ) + pTo->n + 1;.
15eb0 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a    if( pToCol ){.
15ec0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
15ed0 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b  ToCol->nExpr; i+
15ee0 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20  +){.      nByte 
15ef0 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
15f00 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  30(pToCol->a[i].
15f10 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20  zName) + 1;.    
15f20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20  }.  }.  pFKey = 
15f30 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
15f40 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 29 3b  ero(db, nByte );
15f50 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20  .  if( pFKey==0 
15f60 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  ){.    goto fk_e
15f70 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d  nd;.  }.  pFKey-
15f80 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46  >pFrom = p;.  pF
15f90 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d  Key->pNextFrom =
15fa0 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d   p->pFKey;.  z =
15fb0 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79 2d 3e   (char*)&pFKey->
15fc0 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 46  aCol[nCol];.  pF
15fd0 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20  Key->zTo = z;.  
15fe0 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a  memcpy(z, pTo->z
15ff0 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70  , pTo->n);.  z[p
16000 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71  To->n] = 0;.  sq
16010 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b  lite3Dequote(z);
16020 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31  .  z += pTo->n+1
16030 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20  ;.  pFKey->nCol 
16040 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46  = nCol;.  if( pF
16050 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  romCol==0 ){.   
16060 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e   pFKey->aCol[0].
16070 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  iFrom = p->nCol-
16080 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
16090 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
160a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
160b0 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
160c0 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b  0; j<p->nCol; j+
160d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
160e0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
160f0 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  ->aCol[j].zName,
16100 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e   pFromCol->a[i].
16110 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
16120 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43         pFKey->aC
16130 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b  ol[i].iFrom = j;
16140 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
16150 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16160 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e    }.      if( j>
16170 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  =p->nCol ){.    
16180 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
16190 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
161a0 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20         "unknown 
161b0 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e  column \"%s\" in
161c0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66   foreign key def
161d0 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20  inition", .     
161e0 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61       pFromCol->a
161f0 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
16200 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
16210 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16220 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20   }.  if( pToCol 
16230 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
16240 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
16250 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69      int n = sqli
16260 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43  te3Strlen30(pToC
16270 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ol->a[i].zName);
16280 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43  .      pFKey->aC
16290 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a  ol[i].zCol = z;.
162a0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20        memcpy(z, 
162b0 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
162c0 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b  me, n);.      z[
162d0 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20  n] = 0;.      z 
162e0 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  += n+1;.    }.  
162f0 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  }.  pFKey->isDef
16300 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b  erred = 0;.  pFK
16310 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 20 3d  ey->aAction[0] =
16320 20 28 75 38 29 28 66 6c 61 67 73 20 26 20 30 78   (u8)(flags & 0x
16330 66 66 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ff);            
16340 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20 61 63 74  /* ON DELETE act
16350 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e  ion */.  pFKey->
16360 61 41 63 74 69 6f 6e 5b 31 5d 20 3d 20 28 75 38  aAction[1] = (u8
16370 29 28 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20  )((flags >> 8 ) 
16380 26 20 30 78 66 66 29 3b 20 20 20 20 2f 2a 20 4f  & 0xff);    /* O
16390 4e 20 55 50 44 41 54 45 20 61 63 74 69 6f 6e 20  N UPDATE action 
163a0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
163b0 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
163c0 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 2d 3e 70  Held(db, 0, p->p
163d0 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 70 4e 65  Schema) );.  pNe
163e0 78 74 54 6f 20 3d 20 28 46 4b 65 79 20 2a 29 73  xtTo = (FKey *)s
163f0 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
16400 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6b  (&p->pSchema->fk
16410 65 79 48 61 73 68 2c 20 0a 20 20 20 20 20 20 70  eyHash, .      p
16420 46 4b 65 79 2d 3e 7a 54 6f 2c 20 28 76 6f 69 64  FKey->zTo, (void
16430 20 2a 29 70 46 4b 65 79 0a 20 20 29 3b 0a 20 20   *)pFKey.  );.  
16440 69 66 28 20 70 4e 65 78 74 54 6f 3d 3d 70 46 4b  if( pNextTo==pFK
16450 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
16460 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
16470 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
16480 20 20 7d 0a 20 20 69 66 28 20 70 4e 65 78 74 54    }.  if( pNextT
16490 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  o ){.    assert(
164a0 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54   pNextTo->pPrevT
164b0 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 4b 65  o==0 );.    pFKe
164c0 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 4e 65  y->pNextTo = pNe
164d0 78 74 54 6f 3b 0a 20 20 20 20 70 4e 65 78 74 54  xtTo;.    pNextT
164e0 6f 2d 3e 70 50 72 65 76 54 6f 20 3d 20 70 46 4b  o->pPrevTo = pFK
164f0 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69  ey;.  }..  /* Li
16500 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  nk the foreign k
16510 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ey to the table 
16520 61 73 20 74 68 65 20 6c 61 73 74 20 73 74 65 70  as the last step
16530 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65  ..  */.  p->pFKe
16540 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b  y = pFKey;.  pFK
16550 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a  ey = 0;..fk_end:
16560 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
16570 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a 23 65 6e  (db, pFKey);.#en
16580 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
16590 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
165a0 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71  IGN_KEY) */.  sq
165b0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
165c0 65 74 65 28 64 62 2c 20 70 46 72 6f 6d 43 6f 6c  ete(db, pFromCol
165d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
165e0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
165f0 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ToCol);.}../*.**
16600 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
16610 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
16620 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49  INITIALLY IMMEDI
16630 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59  ATE or INITIALLY
16640 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61   DEFERRED.** cla
16650 75 73 65 20 69 73 20 73 65 65 6e 20 61 73 20 70  use is seen as p
16660 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e  art of a foreign
16670 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e   key definition.
16680 20 20 54 68 65 20 69 73 44 65 66 65 72 72 65 64    The isDeferred
16690 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
166a0 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   1 for INITIALLY
166b0 20 44 45 46 45 52 52 45 44 20 61 6e 64 20 30 20   DEFERRED and 0 
166c0 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d  for INITIALLY IM
166d0 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20  MEDIATE..** The 
166e0 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20  behavior of the 
166f0 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72  most recently cr
16700 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65  eated foreign ke
16710 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a  y is adjusted.**
16720 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f   accordingly..*/
16730 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66  .void sqlite3Def
16740 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72  erForeignKey(Par
16750 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
16760 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69 66  isDeferred){.#if
16770 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16780 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54  _FOREIGN_KEY.  T
16790 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b  able *pTab;.  FK
167a0 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28  ey *pFKey;.  if(
167b0 20 28 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   (pTab = pParse-
167c0 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c  >pNewTable)==0 |
167d0 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d  | (pFKey = pTab-
167e0 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74  >pFKey)==0 ) ret
167f0 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 69  urn;.  assert( i
16800 73 44 65 66 65 72 72 65 64 3d 3d 30 20 7c 7c 20  sDeferred==0 || 
16810 69 73 44 65 66 65 72 72 65 64 3d 3d 31 20 29 3b  isDeferred==1 );
16820 20 2f 2a 20 45 56 3a 20 52 2d 33 30 33 32 33 2d   /* EV: R-30323-
16830 32 31 39 31 37 20 2a 2f 0a 20 20 70 46 4b 65 79  21917 */.  pFKey
16840 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 28  ->isDeferred = (
16850 75 38 29 69 73 44 65 66 65 72 72 65 64 3b 0a 23  u8)isDeferred;.#
16860 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  endif.}../*.** G
16870 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
16880 74 20 77 69 6c 6c 20 65 72 61 73 65 20 61 6e 64  t will erase and
16890 20 72 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70   refill index *p
168a0 49 64 78 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a  Idx.  This is.**
168b0 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c   used to initial
168c0 69 7a 65 20 61 20 6e 65 77 6c 79 20 63 72 65 61  ize a newly crea
168d0 74 65 64 20 69 6e 64 65 78 20 6f 72 20 74 6f 20  ted index or to 
168e0 72 65 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  recompute the.**
168f0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69   content of an i
16900 6e 64 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65  ndex in response
16910 20 74 6f 20 61 20 52 45 49 4e 44 45 58 20 63 6f   to a REINDEX co
16920 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20  mmand..**.** if 
16930 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e  memRootPage is n
16940 6f 74 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20  ot negative, it 
16950 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 69  means that the i
16960 6e 64 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a  ndex is newly.**
16970 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 72   created.  The r
16980 65 67 69 73 74 65 72 20 73 70 65 63 69 66 69 65  egister specifie
16990 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65  d by memRootPage
169a0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a   contains the.**
169b0 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
169c0 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  r of the index. 
169d0 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20   If memRootPage 
169e0 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
169f0 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 61  n.** the index a
16a00 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61 6e  lready exists an
16a10 64 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72 65  d must be cleare
16a20 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72  d before being r
16a30 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74  efilled and.** t
16a40 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
16a50 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ber of the index
16a60 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70   is taken from p
16a70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a  Index->tnum..*/.
16a80 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
16a90 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 50  te3RefillIndex(P
16aa0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e  arse *pParse, In
16ab0 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74  dex *pIndex, int
16ac0 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20   memRootPage){. 
16ad0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
16ae0 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20  Index->pTable;  
16af0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68 61  /* The table tha
16b00 74 20 69 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a  t is indexed */.
16b10 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61    int iTab = pPa
16b20 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20  rse->nTab++;    
16b30 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72   /* Btree cursor
16b40 20 75 73 65 64 20 66 6f 72 20 70 54 61 62 20 2a   used for pTab *
16b50 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70  /.  int iIdx = p
16b60 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
16b70 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73     /* Btree curs
16b80 6f 72 20 75 73 65 64 20 66 6f 72 20 70 49 6e 64  or used for pInd
16b90 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72  ex */.  int iSor
16ba0 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
16bb0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
16bc0 20 6f 70 65 6e 65 64 20 62 79 20 4f 70 65 6e 53   opened by OpenS
16bd0 6f 72 74 65 72 20 28 69 66 20 69 6e 20 75 73 65  orter (if in use
16be0 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31  ) */.  int addr1
16bf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16c00 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
16c10 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20   of top of loop 
16c20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 32 3b 20  */.  int addr2; 
16c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c40 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 74      /* Address t
16c50 6f 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20 6e 65  o jump to for ne
16c60 78 74 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a  xt iteration */.
16c70 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20    int tnum;     
16c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c90 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
16ca0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
16cb0 69 50 61 72 74 49 64 78 4c 61 62 65 6c 3b 20 20  iPartIdxLabel;  
16cc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
16cd0 6d 70 20 74 6f 20 74 68 69 73 20 6c 61 62 65 6c  mp to this label
16ce0 20 74 6f 20 73 6b 69 70 20 61 20 72 6f 77 20 2a   to skip a row *
16cf0 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
16d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d10 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
16d20 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69  ode into this vi
16d30 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f  rtual machine */
16d40 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
16d50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16d60 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72    /* KeyInfo for
16d70 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
16d80 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20  regRecord;      
16d90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
16da0 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61  gister holding a
16db0 73 73 65 6d 62 6c 65 64 20 69 6e 64 65 78 20 72  ssembled index r
16dc0 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74  ecord */.  sqlit
16dd0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
16de0 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  >db;      /* The
16df0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
16e00 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44  tion */.  int iD
16e10 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
16e20 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  aToIndex(db, pIn
16e30 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a  dex->pSchema);..
16e40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16e50 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
16e60 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  N.  if( sqlite3A
16e70 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
16e80 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c   SQLITE_REINDEX,
16e90 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
16ea0 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  0,.      db->aDb
16eb0 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 29  [iDb].zDbSName )
16ec0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
16ed0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
16ee0 20 52 65 71 75 69 72 65 20 61 20 77 72 69 74 65   Require a write
16ef0 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62  -lock on the tab
16f00 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68  le to perform th
16f10 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  is operation */.
16f20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
16f30 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
16f40 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70  pTab->tnum, 1, p
16f50 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
16f60 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
16f70 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
16f80 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
16f90 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61  .  if( memRootPa
16fa0 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75  ge>=0 ){.    tnu
16fb0 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b  m = memRootPage;
16fc0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e  .  }else{.    tn
16fd0 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75  um = pIndex->tnu
16fe0 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20  m;.  }.  pKey = 
16ff0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66  sqlite3KeyInfoOf
17000 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
17010 6e 64 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  ndex);.  assert(
17020 20 70 4b 65 79 21 3d 30 20 7c 7c 20 64 62 2d 3e   pKey!=0 || db->
17030 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
17040 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a  pParse->nErr );.
17050 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73  .  /* Open the s
17060 6f 72 74 65 72 20 63 75 72 73 6f 72 20 69 66 20  orter cursor if 
17070 77 65 20 61 72 65 20 74 6f 20 75 73 65 20 6f 6e  we are to use on
17080 65 2e 20 2a 2f 0a 20 20 69 53 6f 72 74 65 72 20  e. */.  iSorter 
17090 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
170a0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
170b0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp4(v, OP_Sort
170c0 65 72 4f 70 65 6e 2c 20 69 53 6f 72 74 65 72 2c  erOpen, iSorter,
170d0 20 30 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79   0, pIndex->nKey
170e0 43 6f 6c 2c 20 28 63 68 61 72 2a 29 0a 20 20 20  Col, (char*).   
170f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17100 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52   sqlite3KeyInfoR
17110 65 66 28 70 4b 65 79 29 2c 20 50 34 5f 4b 45 59  ef(pKey), P4_KEY
17120 49 4e 46 4f 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65  INFO);..  /* Ope
17130 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 4c 6f 6f  n the table. Loo
17140 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 72 6f  p through all ro
17150 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2c  ws of the table,
17160 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 64 65 78   inserting index
17170 0a 20 20 2a 2a 20 72 65 63 6f 72 64 73 20 69 6e  .  ** records in
17180 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a  to the sorter. *
17190 2f 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54  /.  sqlite3OpenT
171a0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61  able(pParse, iTa
171b0 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  b, iDb, pTab, OP
171c0 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 61 64  _OpenRead);.  ad
171d0 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
171e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
171f0 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 20  wind, iTab, 0); 
17200 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
17210 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73  .  regRecord = s
17220 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
17230 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
17240 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28 70 50  te3MultiWrite(pP
17250 61 72 73 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65  arse);..  sqlite
17260 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65  3GenerateIndexKe
17270 79 28 70 50 61 72 73 65 2c 70 49 6e 64 65 78 2c  y(pParse,pIndex,
17280 69 54 61 62 2c 72 65 67 52 65 63 6f 72 64 2c 30  iTab,regRecord,0
17290 2c 26 69 50 61 72 74 49 64 78 4c 61 62 65 6c 2c  ,&iPartIdxLabel,
172a0 30 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  0,0);.  sqlite3V
172b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
172c0 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 69 53  SorterInsert, iS
172d0 6f 72 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64  orter, regRecord
172e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f  );.  sqlite3Reso
172f0 6c 76 65 50 61 72 74 49 64 78 4c 61 62 65 6c 28  lvePartIdxLabel(
17300 70 50 61 72 73 65 2c 20 69 50 61 72 74 49 64 78  pParse, iPartIdx
17310 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65  Label);.  sqlite
17320 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17330 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  P_Next, iTab, ad
17340 64 72 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65  dr1+1); VdbeCove
17350 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
17360 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
17370 2c 20 61 64 64 72 31 29 3b 0a 20 20 69 66 28 20  , addr1);.  if( 
17380 6d 65 6d 52 6f 6f 74 50 61 67 65 3c 30 20 29 20  memRootPage<0 ) 
17390 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
173a0 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74  2(v, OP_Clear, t
173b0 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c  num, iDb);.  sql
173c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
173d0 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
173e0 69 49 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c  iIdx, tnum, iDb,
173f0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
17400 20 20 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b        (char *)pK
17410 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  ey, P4_KEYINFO);
17420 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
17430 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
17440 5f 42 55 4c 4b 43 53 52 7c 28 28 6d 65 6d 52 6f  _BULKCSR|((memRo
17450 6f 74 50 61 67 65 3e 3d 30 29 3f 4f 50 46 4c 41  otPage>=0)?OPFLA
17460 47 5f 50 32 49 53 52 45 47 3a 30 29 29 3b 0a 0a  G_P2ISREG:0));..
17470 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
17480 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17490 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 53  P_SorterSort, iS
174a0 6f 72 74 65 72 2c 20 30 29 3b 20 56 64 62 65 43  orter, 0); VdbeC
174b0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66  overage(v);.  if
174c0 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28  ( IsUniqueIndex(
174d0 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69  pIndex) ){.    i
174e0 6e 74 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56  nt j2 = sqlite3V
174f0 64 62 65 47 6f 74 6f 28 76 2c 20 31 29 3b 0a 20  dbeGoto(v, 1);. 
17500 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74     addr2 = sqlit
17510 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
17520 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(v);.    sqlite
17530 33 56 64 62 65 56 65 72 69 66 79 41 62 6f 72 74  3VdbeVerifyAbort
17540 61 62 6c 65 28 76 2c 20 4f 45 5f 41 62 6f 72 74  able(v, OE_Abort
17550 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
17560 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
17570 50 5f 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 2c  P_SorterCompare,
17580 20 69 53 6f 72 74 65 72 2c 20 6a 32 2c 20 72 65   iSorter, j2, re
17590 67 52 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 20  gRecord,.       
175a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175b0 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f    pIndex->nKeyCo
175c0 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  l); VdbeCoverage
175d0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
175e0 55 6e 69 71 75 65 43 6f 6e 73 74 72 61 69 6e 74  UniqueConstraint
175f0 28 70 50 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72  (pParse, OE_Abor
17600 74 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  t, pIndex);.    
17610 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
17620 65 72 65 28 76 2c 20 6a 32 29 3b 0a 20 20 7d 65  ere(v, j2);.  }e
17630 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 32 20 3d  lse{.    addr2 =
17640 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
17650 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 7d 0a  entAddr(v);.  }.
17660 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17670 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op3(v, OP_Sorter
17680 44 61 74 61 2c 20 69 53 6f 72 74 65 72 2c 20 72  Data, iSorter, r
17690 65 67 52 65 63 6f 72 64 2c 20 69 49 64 78 29 3b  egRecord, iIdx);
176a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
176b0 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65 65 6b 45  dOp1(v, OP_SeekE
176c0 6e 64 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c  nd, iIdx);.  sql
176d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
176e0 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
176f0 69 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29  iIdx, regRecord)
17700 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
17710 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
17720 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
17730 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
17740 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
17750 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
17760 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17770 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65  2(v, OP_SorterNe
17780 78 74 2c 20 69 53 6f 72 74 65 72 2c 20 61 64 64  xt, iSorter, add
17790 72 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  r2); VdbeCoverag
177a0 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
177b0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
177c0 64 64 72 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65  ddr1);..  sqlite
177d0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
177e0 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a  P_Close, iTab);.
177f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17800 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
17810 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65   iIdx);.  sqlite
17820 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
17830 50 5f 43 6c 6f 73 65 2c 20 69 53 6f 72 74 65 72  P_Close, iSorter
17840 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  );.}../*.** Allo
17850 63 61 74 65 20 68 65 61 70 20 73 70 61 63 65 20  cate heap space 
17860 74 6f 20 68 6f 6c 64 20 61 6e 20 49 6e 64 65 78  to hold an Index
17870 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 43 6f   object with nCo
17880 6c 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a  l columns..**.**
17890 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c   Increase the al
178a0 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 74 6f  location size to
178b0 20 70 72 6f 76 69 64 65 20 61 6e 20 65 78 74 72   provide an extr
178c0 61 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a  a nExtra bytes.*
178d0 2a 20 6f 66 20 38 2d 62 79 74 65 20 61 6c 69 67  * of 8-byte alig
178e0 6e 65 64 20 73 70 61 63 65 20 61 66 74 65 72 20  ned space after 
178f0 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
17900 20 61 6e 64 20 72 65 74 75 72 6e 20 61 0a 2a 2a   and return a.**
17910 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
17920 20 65 78 74 72 61 20 73 70 61 63 65 20 69 6e 20   extra space in 
17930 2a 70 70 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e 64  *ppExtra..*/.Ind
17940 65 78 20 2a 73 71 6c 69 74 65 33 41 6c 6c 6f 63  ex *sqlite3Alloc
17950 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 0a  ateIndexObject(.
17960 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
17970 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
17980 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
17990 0a 20 20 69 31 36 20 6e 43 6f 6c 2c 20 20 20 20  .  i16 nCol,    
179a0 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
179b0 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
179c0 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  ns in the index 
179d0 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
179e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
179f0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
17a00 65 78 74 72 61 20 73 70 61 63 65 20 74 6f 20 61  extra space to a
17a10 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lloc */.  char *
17a20 2a 70 70 45 78 74 72 61 20 20 20 20 20 20 20 2f  *ppExtra       /
17a30 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
17a40 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20 2a   "extra" space *
17a50 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b  /.){.  Index *p;
17a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
17a70 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78 20 6f  llocated index o
17a80 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  bject */.  int n
17a90 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
17aa0 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63  /* Bytes of spac
17ab0 65 20 66 6f 72 20 49 6e 64 65 78 20 6f 62 6a 65  e for Index obje
17ac0 63 74 20 2b 20 61 72 72 61 79 73 20 2a 2f 0a 0a  ct + arrays */..
17ad0 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
17ae0 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 20  (sizeof(Index)) 
17af0 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  +              /
17b00 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  * Index structur
17b10 65 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e  */.          
17b20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68  ROUND8(sizeof(ch
17b30 61 72 2a 29 2a 6e 43 6f 6c 29 20 2b 20 20 20 20  ar*)*nCol) +    
17b40 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a       /* Index.az
17b50 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20  Coll     */.    
17b60 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a        ROUND8(siz
17b70 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f  eof(LogEst)*(nCo
17b80 6c 2b 31 29 20 2b 20 20 20 20 20 2f 2a 20 49 6e  l+1) +     /* In
17b90 64 65 78 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20  dex.aiRowLogEst 
17ba0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
17bb0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 31 36        sizeof(i16
17bc0 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20  )*nCol +        
17bd0 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43      /* Index.aiC
17be0 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20  olumn   */.     
17bf0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
17c00 6f 66 28 75 38 29 2a 6e 43 6f 6c 29 3b 20 20 20  of(u8)*nCol);   
17c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
17c20 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f  ex.aSortOrder */
17c30 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62  .  p = sqlite3Db
17c40 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
17c50 42 79 74 65 20 2b 20 6e 45 78 74 72 61 29 3b 0a  Byte + nExtra);.
17c60 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63    if( p ){.    c
17c70 68 61 72 20 2a 70 45 78 74 72 61 20 3d 20 28 28  har *pExtra = ((
17c80 63 68 61 72 2a 29 70 29 2b 52 4f 55 4e 44 38 28  char*)p)+ROUND8(
17c90 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a  sizeof(Index));.
17ca0 20 20 20 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d 20      p->azColl = 
17cb0 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 70 45  (const char**)pE
17cc0 78 74 72 61 3b 20 70 45 78 74 72 61 20 2b 3d 20  xtra; pExtra += 
17cd0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68  ROUND8(sizeof(ch
17ce0 61 72 2a 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20  ar*)*nCol);.    
17cf0 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d  p->aiRowLogEst =
17d00 20 28 4c 6f 67 45 73 74 2a 29 70 45 78 74 72 61   (LogEst*)pExtra
17d10 3b 20 70 45 78 74 72 61 20 2b 3d 20 73 69 7a 65  ; pExtra += size
17d20 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c  of(LogEst)*(nCol
17d30 2b 31 29 3b 0a 20 20 20 20 70 2d 3e 61 69 43 6f  +1);.    p->aiCo
17d40 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29 70 45 78  lumn = (i16*)pEx
17d50 74 72 61 3b 20 20 20 20 20 20 20 70 45 78 74 72  tra;       pExtr
17d60 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36 29  a += sizeof(i16)
17d70 2a 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61 53  *nCol;.    p->aS
17d80 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
17d90 70 45 78 74 72 61 3b 0a 20 20 20 20 70 2d 3e 6e  pExtra;.    p->n
17da0 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a 20  Column = nCol;. 
17db0 20 20 20 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20     p->nKeyCol = 
17dc0 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 2a 70  nCol - 1;.    *p
17dd0 70 45 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a  pExtra = ((char*
17de0 29 70 29 20 2b 20 6e 42 79 74 65 3b 0a 20 20 7d  )p) + nByte;.  }
17df0 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
17e00 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
17e10 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20  ew index for an 
17e20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d  SQL table.  pNam
17e30 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68 65  e1.pName2 is the
17e40 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
17e50 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c  ex .** and pTblL
17e60 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ist is the name 
17e70 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  of the table tha
17e80 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
17e90 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a  ed.  Both will .
17ea0 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61  ** be NULL for a
17eb0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
17ec0 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  an index that is
17ed0 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69   created to sati
17ee0 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20  sfy a.** UNIQUE 
17ef0 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20  constraint.  If 
17f00 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65  pTable and pInde
17f10 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20  x are NULL, use 
17f20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
17f30 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c  e.** as the tabl
17f40 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  e to be indexed.
17f50 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
17f60 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74  ble is a table t
17f70 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e  hat is.** curren
17f80 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
17f90 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54  ucted by a CREAT
17fa0 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
17fb0 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69  t..**.** pList i
17fc0 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  s a list of colu
17fd0 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
17fe0 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62  d.  pList will b
17ff0 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a  e NULL if this.*
18000 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b  * is a primary k
18010 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e  ey or unique-con
18020 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d  straint on the m
18030 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d  ost recent colum
18040 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68  n added.** to th
18050 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
18060 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
18070 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20  tion.  .*/.void 
18080 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
18090 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
180a0 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20  rse,     /* All 
180b0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
180c0 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a  t this parse */.
180d0 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
180e0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
180f0 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65  rt of index name
18100 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
18110 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
18120 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  ,     /* Second 
18130 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61  part of index na
18140 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  me. May be NULL 
18150 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
18160 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65  blName, /* Table
18170 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70   to index. Use p
18180 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
18190 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c   if 0 */.  ExprL
181a0 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
181b0 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   A list of colum
181c0 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
181d0 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
181e0 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41  r,       /* OE_A
181f0 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  bort, OE_Ignore,
18200 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20   OE_Replace, or 
18210 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b  OE_None */.  Tok
18220 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20  en *pStart,     
18230 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
18240 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
18250 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a  this statement *
18260 2f 0a 20 20 45 78 70 72 20 2a 70 50 49 57 68 65  /.  Expr *pPIWhe
18270 72 65 2c 20 20 20 20 2f 2a 20 57 48 45 52 45 20  re,    /* WHERE 
18280 63 6c 61 75 73 65 20 66 6f 72 20 70 61 72 74 69  clause for parti
18290 61 6c 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  al indices */.  
182a0 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20 20  int sortOrder,  
182b0 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72     /* Sort order
182c0 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20   of primary key 
182d0 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c  when pList==NULL
182e0 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45   */.  int ifNotE
182f0 78 69 73 74 2c 20 20 20 20 2f 2a 20 4f 6d 69 74  xist,    /* Omit
18300 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78 20   error if index 
18310 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
18320 2f 0a 20 20 75 38 20 69 64 78 54 79 70 65 20 20  /.  u8 idxType  
18330 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
18340 64 65 78 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  dex type */.){. 
18350 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30   Table *pTab = 0
18360 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74  ;     /* Table t
18370 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
18380 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20    Index *pIndex 
18390 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e  = 0;   /* The in
183a0 64 65 78 20 74 6f 20 62 65 20 63 72 65 61 74 65  dex to be create
183b0 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  d */.  char *zNa
183c0 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e  me = 0;     /* N
183d0 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
183e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
183f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
18400 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
18410 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20  rs in zName */. 
18420 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 44 62 46   int i, j;.  DbF
18430 69 78 65 72 20 73 46 69 78 3b 20 20 20 20 20 20  ixer sFix;      
18440 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69    /* For assigni
18450 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ng database name
18460 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20  s to pTable */. 
18470 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d 61   int sortOrderMa
18480 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f  sk;   /* 1 to ho
18490 6e 6f 72 20 44 45 53 43 20 69 6e 20 69 6e 64 65  nor DESC in inde
184a0 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e  x.  0 to ignore.
184b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
184c0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
184d0 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20    Db *pDb;      
184e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70         /* The sp
184f0 65 63 69 66 69 63 20 74 61 62 6c 65 20 63 6f 6e  ecific table con
18500 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65  taining the inde
18510 78 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  xed database */.
18520 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
18530 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
18540 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
18550 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 77 72  that is being wr
18560 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  itten */.  Token
18570 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20   *pName = 0;    
18580 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e  /* Unqualified n
18590 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
185a0 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20 20   to create */.  
185b0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
185c0 69 74 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b  item *pListItem;
185d0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
185e0 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20  over pList */.  
185f0 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 20  int nExtra = 0; 
18600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18610 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61   /* Space alloca
18620 74 65 64 20 66 6f 72 20 7a 45 78 74 72 61 5b 5d  ted for zExtra[]
18630 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
18640 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
18650 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
18660 20 6f 66 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e   of extra column
18670 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 63 68  s needed */.  ch
18680 61 72 20 2a 7a 45 78 74 72 61 20 3d 20 30 3b 20  ar *zExtra = 0; 
18690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
186a0 2a 20 45 78 74 72 61 20 73 70 61 63 65 20 61 66  * Extra space af
186b0 74 65 72 20 74 68 65 20 49 6e 64 65 78 20 6f 62  ter the Index ob
186c0 6a 65 63 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ject */.  Index 
186d0 2a 70 50 6b 20 3d 20 30 3b 20 20 20 20 20 20 2f  *pPk = 0;      /
186e0 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  * PRIMARY KEY in
186f0 64 65 78 20 66 6f 72 20 57 49 54 48 4f 55 54 20  dex for WITHOUT 
18700 52 4f 57 49 44 20 74 61 62 6c 65 73 20 2a 2f 0a  ROWID tables */.
18710 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
18720 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
18730 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20  e->nErr>0 ){.   
18740 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
18750 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  e_index;.  }.  i
18760 66 28 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  f( IN_DECLARE_VT
18770 41 42 20 26 26 20 69 64 78 54 79 70 65 21 3d 53  AB && idxType!=S
18780 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52  QLITE_IDXTYPE_PR
18790 49 4d 41 52 59 4b 45 59 20 29 7b 0a 20 20 20 20  IMARYKEY ){.    
187a0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
187b0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66  _index;.  }.  if
187c0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
187d0 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
187e0 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f  Parse) ){.    go
187f0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18800 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  ndex;.  }..  /*.
18810 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61    ** Find the ta
18820 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62  ble that is to b
18830 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75  e indexed.  Retu
18840 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20  rn early if not 
18850 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  found..  */.  if
18860 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  ( pTblName!=0 ){
18870 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65  ..    /* Use the
18880 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20   two-part index 
18890 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  name to determin
188a0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  e the database .
188b0 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68      ** to search
188c0 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20   for the table. 
188d0 27 46 69 78 27 20 74 68 65 20 74 61 62 6c 65 20  'Fix' the table 
188e0 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a  name to this db.
188f0 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f      ** before lo
18900 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61 62  oking up the tab
18910 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  le..    */.    a
18920 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26  ssert( pName1 &&
18930 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69   pName2 );.    i
18940 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
18950 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
18960 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
18970 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  &pName);.    if(
18980 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78   iDb<0 ) goto ex
18990 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
189a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
189b0 6d 65 20 26 26 20 70 4e 61 6d 65 2d 3e 7a 20 29  me && pName->z )
189c0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
189d0 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20  E_OMIT_TEMPDB.  
189e0 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65    /* If the inde
189f0 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61  x name was unqua
18a00 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66  lified, check if
18a10 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a   the table.    *
18a20 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c  * is a temp tabl
18a30 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68  e. If so, set th
18a40 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e  e database to 1.
18a50 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a   Do not do this.
18a60 20 20 20 20 2a 2a 20 69 66 20 69 6e 69 74 69 61      ** if initia
18a70 6c 69 73 69 6e 67 20 61 20 64 61 74 61 62 61 73  lising a databas
18a80 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f  e schema..    */
18a90 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
18aa0 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20  it.busy ){.     
18ab0 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53   pTab = sqlite3S
18ac0 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61  rcListLookup(pPa
18ad0 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a  rse, pTblName);.
18ae0 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32        if( pName2
18af0 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26  ->n==0 && pTab &
18b00 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d  & pTab->pSchema=
18b10 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68  =db->aDb[1].pSch
18b20 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ema ){.        i
18b30 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  Db = 1;.      }.
18b40 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
18b50 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74    sqlite3FixInit
18b60 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20  (&sFix, pParse, 
18b70 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e  iDb, "index", pN
18b80 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 73 71  ame);.    if( sq
18b90 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28  lite3FixSrcList(
18ba0 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29  &sFix, pTblName)
18bb0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63   ){.      /* Bec
18bc0 61 75 73 65 20 74 68 65 20 70 61 72 73 65 72 20  ause the parser 
18bd0 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e  constructs pTblN
18be0 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c  ame from a singl
18bf0 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20  e identifier,.  
18c00 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69      ** sqlite3Fi
18c10 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76  xSrcList can nev
18c20 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20  er fail. */.    
18c30 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20    assert(0);.   
18c40 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71   }.    pTab = sq
18c50 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
18c60 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20  Item(pParse, 0, 
18c70 26 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 29  &pTblName->a[0])
18c80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
18c90 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
18ca0 30 20 7c 7c 20 70 54 61 62 3d 3d 30 20 29 3b 0a  0 || pTab==0 );.
18cb0 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
18cc0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
18cd0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66  te_index;.    if
18ce0 28 20 69 44 62 3d 3d 31 20 26 26 20 64 62 2d 3e  ( iDb==1 && db->
18cf0 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
18d00 21 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  !=pTab->pSchema 
18d10 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
18d20 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
18d30 20 0a 20 20 20 20 20 20 20 20 20 20 20 22 63 61   .           "ca
18d40 6e 6e 6f 74 20 63 72 65 61 74 65 20 61 20 54 45  nnot create a TE
18d50 4d 50 20 69 6e 64 65 78 20 6f 6e 20 6e 6f 6e 2d  MP index on non-
18d60 54 45 4d 50 20 74 61 62 6c 65 20 5c 22 25 73 5c  TEMP table \"%s\
18d70 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  "",.           p
18d80 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
18d90 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
18da0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
18db0 0a 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77  .    if( !HasRow
18dc0 69 64 28 70 54 61 62 29 20 29 20 70 50 6b 20 3d  id(pTab) ) pPk =
18dd0 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
18de0 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
18df0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
18e00 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a  rt( pName==0 );.
18e10 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61      assert( pSta
18e20 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61  rt==0 );.    pTa
18e30 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
18e40 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 21  Table;.    if( !
18e50 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74  pTab ) goto exit
18e60 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
18e70 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
18e80 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
18e90 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
18ea0 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26 64  ;.  }.  pDb = &d
18eb0 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20  b->aDb[iDb];..  
18ec0 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
18ed0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
18ee0 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a  rse->nErr==0 );.
18ef0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
18f00 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d  NICmp(pTab->zNam
18f10 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29  e, "sqlite_", 7)
18f20 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 64  ==0 .       && d
18f30 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 0a  b->init.busy==0.
18f40 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  #if SQLITE_USER_
18f50 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20  AUTHENTICATION. 
18f60 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
18f70 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 70 54  UserAuthTable(pT
18f80 61 62 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 0a 23 65  ab->zName)==0.#e
18f90 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
18fa0 54 45 5f 41 4c 4c 4f 57 5f 53 51 4c 49 54 45 5f  TE_ALLOW_SQLITE_
18fb0 4d 41 53 54 45 52 5f 49 4e 44 45 58 0a 20 20 20  MASTER_INDEX.   
18fc0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
18fd0 72 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61  rICmp(&pTab->zNa
18fe0 6d 65 5b 37 5d 2c 22 6d 61 73 74 65 72 22 29 21  me[7],"master")!
18ff0 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  =0.#endif.      
19000 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
19010 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65  Cmp(&pTab->zName
19020 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c  [7],"altertab_",
19030 39 29 21 3d 30 0a 20 29 7b 0a 20 20 20 20 73 71  9)!=0. ){.    sq
19040 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
19050 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
19060 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
19070 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ed", pTab->zName
19080 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
19090 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
190a0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
190b0 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66  E_OMIT_VIEW.  if
190c0 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
190d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
190e0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
190f0 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65  views may not be
19100 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20   indexed");.    
19110 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
19120 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64  _index;.  }.#end
19130 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
19140 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
19150 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74  BLE.  if( IsVirt
19160 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
19170 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
19180 28 70 50 61 72 73 65 2c 20 22 76 69 72 74 75 61  (pParse, "virtua
19190 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  l tables may not
191a0 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20   be indexed");. 
191b0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
191c0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
191d0 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  endif..  /*.  **
191e0 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f   Find the name o
191f0 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61  f the index.  Ma
19200 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
19210 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f   not already ano
19220 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ther.  ** index 
19230 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  or table with th
19240 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20  e same name.  . 
19250 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69   **.  ** Excepti
19260 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72  on:  If we are r
19270 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73  eading the names
19280 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e   of permanent in
19290 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20  dices from the. 
192a0 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   ** sqlite_maste
192b0 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65  r table (because
192c0 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
192d0 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20  ess changed the 
192e0 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a  schema) and.  **
192f0 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65   one of the inde
19300 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73  x names collides
19310 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f   with the name o
19320 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  f a temporary ta
19330 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65  ble or.  ** inde
19340 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  x, then we will 
19350 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63  continue to proc
19360 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a  ess this index..
19370 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61    **.  ** If pNa
19380 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  me==0 it means t
19390 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20  hat we are.  ** 
193a0 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70  dealing with a p
193b0 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e  rimary key or UN
193c0 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
193d0 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76    We have to inv
193e0 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e  ent our.  ** own
193f0 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   name..  */.  if
19400 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a  ( pName ){.    z
19410 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
19420 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
19430 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
19440 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20  zName==0 ) goto 
19450 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
19460 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  x;.    assert( p
19470 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  Name->z!=0 );.  
19480 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
19490 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
194a0 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
194b0 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
194c0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
194d0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
194e0 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
194f0 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66  busy ){.      if
19500 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  ( sqlite3FindTab
19510 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  le(db, zName, 0)
19520 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=0 ){.        s
19530 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
19540 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73  Parse, "there is
19550 20 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65   already a table
19560 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d   named %s", zNam
19570 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  e);.        goto
19580 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
19590 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ex;.      }.    
195a0 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
195b0 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
195c0 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 44 62 53 4e  Name, pDb->zDbSN
195d0 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
195e0 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74   if( !ifNotExist
195f0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
19600 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
19610 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c  se, "index %s al
19620 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a  ready exists", z
19630 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Name);.      }el
19640 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
19650 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  rt( !db->init.bu
19660 73 79 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  sy );.        sq
19670 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
19680 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
19690 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
196a0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
196b0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
196c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
196d0 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   n;.    Index *p
196e0 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c  Loop;.    for(pL
196f0 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  oop=pTab->pIndex
19700 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c  , n=1; pLoop; pL
19710 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74  oop=pLoop->pNext
19720 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61  , n++){}.    zNa
19730 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
19740 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f  ntf(db, "sqlite_
19750 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22  autoindex_%s_%d"
19760 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e  , pTab->zName, n
19770 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
19780 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
19790 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
197a0 64 65 78 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  dex;.    }..    
197b0 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64  /* Automatic ind
197c0 65 78 20 6e 61 6d 65 73 20 67 65 6e 65 72 61 74  ex names generat
197d0 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 73  ed from within s
197e0 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76  qlite3_declare_v
197f0 74 61 62 28 29 0a 20 20 20 20 2a 2a 20 6d 75 73  tab().    ** mus
19800 74 20 68 61 76 65 20 6e 61 6d 65 73 20 74 68 61  t have names tha
19810 74 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 66  t are distinct f
19820 72 6f 6d 20 6e 6f 72 6d 61 6c 20 61 75 74 6f 6d  rom normal autom
19830 61 74 69 63 20 69 6e 64 65 78 20 6e 61 6d 65 73  atic index names
19840 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c  ..    ** The fol
19850 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74  lowing statement
19860 20 63 6f 6e 76 65 72 74 73 20 22 73 71 6c 69 74   converts "sqlit
19870 65 33 5f 61 75 74 6f 69 6e 64 65 78 2e 2e 2e 22  e3_autoindex..."
19880 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 22 73 71   into.    ** "sq
19890 6c 69 74 65 33 5f 62 75 74 6f 69 6e 64 65 78 2e  lite3_butoindex.
198a0 2e 2e 22 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .." in order to 
198b0 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 73 20 64  make the names d
198c0 69 73 74 69 6e 63 74 2e 0a 20 20 20 20 2a 2a 20  istinct..    ** 
198d0 54 68 65 20 22 76 74 61 62 5f 65 72 72 2e 74 65  The "vtab_err.te
198e0 73 74 22 20 74 65 73 74 20 64 65 6d 6f 6e 73 74  st" test demonst
198f0 72 61 74 65 73 20 74 68 65 20 6e 65 65 64 20 6f  rates the need o
19900 66 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  f this statement
19910 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 4e 5f  . */.    if( IN_
19920 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 7a  DECLARE_VTAB ) z
19930 4e 61 6d 65 5b 37 5d 2b 2b 3b 0a 20 20 7d 0a 0a  Name[7]++;.  }..
19940 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61    /* Check for a
19950 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20  uthorization to 
19960 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e  create an index.
19970 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
19980 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
19990 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
199a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
199b0 3d 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 3b  = pDb->zDbSName;
199c0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
199d0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
199e0 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
199f0 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
19a00 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  b), 0, zDb) ){. 
19a10 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
19a20 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
19a30 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54   }.    i = SQLIT
19a40 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a  E_CREATE_INDEX;.
19a50 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
19a60 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
19a70 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
19a80 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  TE_TEMP_INDEX;. 
19a90 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
19aa0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
19ab0 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i, zName, pTab->
19ac0 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
19ad0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
19ae0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
19af0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
19b00 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c   /* If pList==0,
19b10 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72   it means this r
19b20 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
19b30 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d  d to make a prim
19b40 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74  ary.  ** key out
19b50 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   of the last col
19b60 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65  umn added to the
19b70 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
19b80 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  struction..  ** 
19b90 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65  So create a fake
19ba0 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74   list to simulat
19bb0 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69  e this..  */.  i
19bc0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
19bd0 20 20 20 54 6f 6b 65 6e 20 70 72 65 76 43 6f 6c     Token prevCol
19be0 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  ;.    Column *pC
19bf0 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c  ol = &pTab->aCol
19c00 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a  [pTab->nCol-1];.
19c10 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
19c20 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 55 4e  gs |= COLFLAG_UN
19c30 49 51 55 45 3b 0a 20 20 20 20 73 71 6c 69 74 65  IQUE;.    sqlite
19c40 33 54 6f 6b 65 6e 49 6e 69 74 28 26 70 72 65 76  3TokenInit(&prev
19c50 43 6f 6c 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  Col, pCol->zName
19c60 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  );.    pList = s
19c70 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
19c80 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 0a  pend(pParse, 0,.
19c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
19ca0 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
19cb0 62 2c 20 54 4b 5f 49 44 2c 20 26 70 72 65 76 43  b, TK_ID, &prevC
19cc0 6f 6c 2c 20 30 29 29 3b 0a 20 20 20 20 69 66 28  ol, 0));.    if(
19cd0 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f   pList==0 ) goto
19ce0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
19cf0 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
19d00 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20  pList->nExpr==1 
19d10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
19d20 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f 72 64  prListSetSortOrd
19d30 65 72 28 70 4c 69 73 74 2c 20 73 6f 72 74 4f 72  er(pList, sortOr
19d40 64 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  der);.  }else{. 
19d50 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
19d60 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 70 50  stCheckLength(pP
19d70 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 22 69 6e  arse, pList, "in
19d80 64 65 78 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  dex");.  }..  /*
19d90 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
19da0 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 73 70  many bytes of sp
19db0 61 63 65 20 61 72 65 20 72 65 71 75 69 72 65 64  ace are required
19dc0 20 74 6f 20 73 74 6f 72 65 20 65 78 70 6c 69 63   to store explic
19dd0 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69 66  itly.  ** specif
19de0 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ied collation se
19df0 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20  quence names..  
19e00 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
19e10 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
19e20 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
19e30 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  xpr = pList->a[i
19e40 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ].pExpr;.    ass
19e50 65 72 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b  ert( pExpr!=0 );
19e60 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
19e70 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29  op==TK_COLLATE )
19e80 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b  {.      nExtra +
19e90 3d 20 28 31 20 2b 20 73 71 6c 69 74 65 33 53 74  = (1 + sqlite3St
19ea0 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e  rlen30(pExpr->u.
19eb0 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 7d 0a  zToken));.    }.
19ec0 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20    }..  /* .  ** 
19ed0 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64  Allocate the ind
19ee0 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20  ex structure. . 
19ef0 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71   */.  nName = sq
19f00 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
19f10 61 6d 65 29 3b 0a 20 20 6e 45 78 74 72 61 43 6f  ame);.  nExtraCo
19f20 6c 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 6e  l = pPk ? pPk->n
19f30 4b 65 79 43 6f 6c 20 3a 20 31 3b 0a 20 20 70 49  KeyCol : 1;.  pI
19f40 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 41 6c  ndex = sqlite3Al
19f50 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63  locateIndexObjec
19f60 74 28 64 62 2c 20 70 4c 69 73 74 2d 3e 6e 45 78  t(db, pList->nEx
19f70 70 72 20 2b 20 6e 45 78 74 72 61 43 6f 6c 2c 0a  pr + nExtraCol,.
19f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fa0 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20 6e 45        nName + nE
19fb0 78 74 72 61 20 2b 20 31 2c 20 26 7a 45 78 74 72  xtra + 1, &zExtr
19fc0 61 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  a);.  if( db->ma
19fd0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
19fe0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
19ff0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  te_index;.  }.  
1a000 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
1a010 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e  TE_ALIGNMENT(pIn
1a020 64 65 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  dex->aiRowLogEst
1a030 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45  ) );.  assert( E
1a040 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
1a050 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  ENT(pIndex->azCo
1a060 6c 6c 29 20 29 3b 0a 20 20 70 49 6e 64 65 78 2d  ll) );.  pIndex-
1a070 3e 7a 4e 61 6d 65 20 3d 20 7a 45 78 74 72 61 3b  >zName = zExtra;
1a080 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 4e 61  .  zExtra += nNa
1a090 6d 65 20 2b 20 31 3b 0a 20 20 6d 65 6d 63 70 79  me + 1;.  memcpy
1a0a0 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20  (pIndex->zName, 
1a0b0 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b  zName, nName+1);
1a0c0 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  .  pIndex->pTabl
1a0d0 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64  e = pTab;.  pInd
1a0e0 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 28 75  ex->onError = (u
1a0f0 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e  8)onError;.  pIn
1a100 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  dex->uniqNotNull
1a110 20 3d 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e   = onError!=OE_N
1a120 6f 6e 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69  one;.  pIndex->i
1a130 64 78 54 79 70 65 20 3d 20 69 64 78 54 79 70 65  dxType = idxType
1a140 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  ;.  pIndex->pSch
1a150 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  ema = db->aDb[iD
1a160 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 49  b].pSchema;.  pI
1a170 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20  ndex->nKeyCol = 
1a180 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
1a190 69 66 28 20 70 50 49 57 68 65 72 65 20 29 7b 0a  if( pPIWhere ){.
1a1a0 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c      sqlite3Resol
1a1b0 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28  veSelfReference(
1a1c0 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43  pParse, pTab, NC
1a1d0 5f 50 61 72 74 49 64 78 2c 20 70 50 49 57 68 65  _PartIdx, pPIWhe
1a1e0 72 65 2c 20 30 29 3b 0a 20 20 20 20 70 49 6e 64  re, 0);.    pInd
1a1f0 65 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  ex->pPartIdxWher
1a200 65 20 3d 20 70 50 49 57 68 65 72 65 3b 0a 20 20  e = pPIWhere;.  
1a210 20 20 70 50 49 57 68 65 72 65 20 3d 20 30 3b 0a    pPIWhere = 0;.
1a220 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71    }.  assert( sq
1a230 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
1a240 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
1a250 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
1a260 74 6f 20 73 65 65 20 69 66 20 77 65 20 73 68 6f  to see if we sho
1a270 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72  uld honor DESC r
1a280 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78  equests on index
1a290 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20   columns.  */.  
1a2a0 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
1a2b0 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34  ->file_format>=4
1a2c0 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65   ){.    sortOrde
1a2d0 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a  rMask = -1;   /*
1a2e0 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20   Honor DESC */. 
1a2f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74   }else{.    sort
1a300 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20  OrderMask = 0;  
1a310 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43    /* Ignore DESC
1a320 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e   */.  }..  /* An
1a330 61 6c 79 7a 65 20 74 68 65 20 6c 69 73 74 20 6f  alyze the list o
1a340 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  f expressions th
1a350 61 74 20 66 6f 72 6d 20 74 68 65 20 74 65 72 6d  at form the term
1a360 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61  s of the index a
1a370 6e 64 0a 20 20 2a 2a 20 72 65 70 6f 72 74 20 61  nd.  ** report a
1a380 6e 79 20 65 72 72 6f 72 73 2e 20 20 49 6e 20 74  ny errors.  In t
1a390 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
1a3a0 68 65 72 65 20 74 68 65 20 65 78 70 72 65 73 73  here the express
1a3b0 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 0a 20  ion is exactly. 
1a3c0 20 2a 2a 20 61 20 74 61 62 6c 65 20 63 6f 6c 75   ** a table colu
1a3d0 6d 6e 2c 20 73 74 6f 72 65 20 74 68 61 74 20 63  mn, store that c
1a3e0 6f 6c 75 6d 6e 20 69 6e 20 61 69 43 6f 6c 75 6d  olumn in aiColum
1a3f0 6e 5b 5d 2e 20 20 46 6f 72 20 67 65 6e 65 72 61  n[].  For genera
1a400 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 20  l expressions,. 
1a410 20 2a 2a 20 70 6f 70 75 6c 61 74 65 20 70 49 6e   ** populate pIn
1a420 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20 61 6e  dex->aColExpr an
1a430 64 20 73 74 6f 72 65 20 58 4e 5f 45 58 50 52 20  d store XN_EXPR 
1a440 28 2d 32 29 20 69 6e 20 61 69 43 6f 6c 75 6d 6e  (-2) in aiColumn
1a450 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f  []..  **.  ** TO
1a460 44 4f 3a 20 49 73 73 75 65 20 61 20 77 61 72 6e  DO: Issue a warn
1a470 69 6e 67 20 69 66 20 74 77 6f 20 6f 72 20 6d 6f  ing if two or mo
1a480 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  re columns of th
1a490 65 20 69 6e 64 65 78 20 61 72 65 20 69 64 65 6e  e index are iden
1a4a0 74 69 63 61 6c 2e 0a 20 20 2a 2a 20 54 4f 44 4f  tical..  ** TODO
1a4b0 3a 20 49 73 73 75 65 20 61 20 77 61 72 6e 69 6e  : Issue a warnin
1a4c0 67 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 70  g if the table p
1a4d0 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75 73  rimary key is us
1a4e0 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
1a4f0 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6b 65 79  e.  ** index key
1a500 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
1a510 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c 69 73  , pListItem=pLis
1a520 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  t->a; i<pList->n
1a530 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73 74  Expr; i++, pList
1a540 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
1a550 72 20 2a 70 43 45 78 70 72 3b 20 20 20 20 20 20  r *pCExpr;      
1a560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1a570 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20 65 78  he i-th index ex
1a580 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
1a590 69 6e 74 20 72 65 71 75 65 73 74 65 64 53 6f 72  int requestedSor
1a5a0 74 4f 72 64 65 72 3b 20 20 20 20 20 20 20 20 2f  tOrder;        /
1a5b0 2a 20 41 53 43 20 6f 72 20 44 45 53 43 20 6f 6e  * ASC or DESC on
1a5c0 20 74 68 65 20 69 2d 74 68 20 65 78 70 72 65 73   the i-th expres
1a5d0 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  sion */.    cons
1a5e0 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20  t char *zColl;  
1a5f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1a600 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1a610 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 73 71   name */..    sq
1a620 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49 64 28  lite3StringToId(
1a630 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
1a640 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
1a650 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e  solveSelfReferen
1a660 63 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  ce(pParse, pTab,
1a670 20 4e 43 5f 49 64 78 45 78 70 72 2c 20 70 4c 69   NC_IdxExpr, pLi
1a680 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 30  stItem->pExpr, 0
1a690 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  );.    if( pPars
1a6a0 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65  e->nErr ) goto e
1a6b0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1a6c0 3b 0a 20 20 20 20 70 43 45 78 70 72 20 3d 20 73  ;.    pCExpr = s
1a6d0 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
1a6e0 6c 6c 61 74 65 28 70 4c 69 73 74 49 74 65 6d 2d  llate(pListItem-
1a6f0 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  >pExpr);.    if(
1a700 20 70 43 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f   pCExpr->op!=TK_
1a710 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
1a720 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65  if( pTab==pParse
1a730 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20  ->pNewTable ){. 
1a740 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1a750 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1a760 65 78 70 72 65 73 73 69 6f 6e 73 20 70 72 6f 68  expressions proh
1a770 69 62 69 74 65 64 20 69 6e 20 50 52 49 4d 41 52  ibited in PRIMAR
1a780 59 20 4b 45 59 20 61 6e 64 20 22 0a 20 20 20 20  Y KEY and ".    
1a790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7a0 20 20 20 20 20 20 20 20 20 20 20 20 22 55 4e 49              "UNI
1a7b0 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 22  QUE constraints"
1a7c0 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
1a7d0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1a7e0 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  x;.      }.     
1a7f0 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 43 6f   if( pIndex->aCo
1a800 6c 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20  lExpr==0 ){.    
1a810 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43      ExprList *pC
1a820 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  opy = sqlite3Exp
1a830 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4c 69  rListDup(db, pLi
1a840 73 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  st, 0);.        
1a850 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72  pIndex->aColExpr
1a860 20 3d 20 70 43 6f 70 79 3b 0a 20 20 20 20 20 20   = pCopy;.      
1a870 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
1a880 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
1a890 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f       assert( pCo
1a8a0 70 79 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  py!=0 );.       
1a8b0 20 20 20 70 4c 69 73 74 49 74 65 6d 20 3d 20 26     pListItem = &
1a8c0 70 43 6f 70 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20  pCopy->a[i];.   
1a8d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1a8e0 20 20 20 20 20 6a 20 3d 20 58 4e 5f 45 58 50 52       j = XN_EXPR
1a8f0 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  ;.      pIndex->
1a900 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e  aiColumn[i] = XN
1a910 5f 45 58 50 52 3b 0a 20 20 20 20 20 20 70 49 6e  _EXPR;.      pIn
1a920 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  dex->uniqNotNull
1a930 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1a940 0a 20 20 20 20 20 20 6a 20 3d 20 70 43 45 78 70  .      j = pCExp
1a950 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
1a960 20 20 61 73 73 65 72 74 28 20 6a 3c 3d 30 78 37    assert( j<=0x7
1a970 66 66 66 20 29 3b 0a 20 20 20 20 20 20 69 66 28  fff );.      if(
1a980 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   j<0 ){.        
1a990 6a 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  j = pTab->iPKey;
1a9a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1a9b0 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e   pTab->aCol[j].n
1a9c0 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  otNull==0 ){.   
1a9d0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69       pIndex->uni
1a9e0 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  qNotNull = 0;.  
1a9f0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64      }.      pInd
1aa00 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
1aa10 3d 20 28 69 31 36 29 6a 3b 0a 20 20 20 20 7d 0a  = (i16)j;.    }.
1aa20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 20      zColl = 0;. 
1aa30 20 20 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d     if( pListItem
1aa40 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ->pExpr->op==TK_
1aa50 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20  COLLATE ){.     
1aa60 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20   int nColl;.    
1aa70 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49    zColl = pListI
1aa80 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 75 2e 7a 54  tem->pExpr->u.zT
1aa90 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 43 6f 6c  oken;.      nCol
1aaa0 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  l = sqlite3Strle
1aab0 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a  n30(zColl) + 1;.
1aac0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 45        assert( nE
1aad0 78 74 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20  xtra>=nColl );. 
1aae0 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 45 78 74       memcpy(zExt
1aaf0 72 61 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c  ra, zColl, nColl
1ab00 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  );.      zColl =
1ab10 20 7a 45 78 74 72 61 3b 0a 20 20 20 20 20 20 7a   zExtra;.      z
1ab20 45 78 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a  Extra += nColl;.
1ab30 20 20 20 20 20 20 6e 45 78 74 72 61 20 2d 3d 20        nExtra -= 
1ab40 6e 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  nColl;.    }else
1ab50 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20   if( j>=0 ){.   
1ab60 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d     zColl = pTab-
1ab70 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a  >aCol[j].zColl;.
1ab80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 7a      }.    if( !z
1ab90 43 6f 6c 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20 73  Coll ) zColl = s
1aba0 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b  qlite3StrBINARY;
1abb0 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
1abc0 69 74 2e 62 75 73 79 20 26 26 20 21 73 71 6c 69  it.busy && !sqli
1abd0 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
1abe0 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20  (pParse, zColl) 
1abf0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
1ac00 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1ac10 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65  .    }.    pInde
1ac20 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a  x->azColl[i] = z
1ac30 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65 73  Coll;.    reques
1ac40 74 65 64 53 6f 72 74 4f 72 64 65 72 20 3d 20 70  tedSortOrder = p
1ac50 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72  ListItem->sortOr
1ac60 64 65 72 20 26 20 73 6f 72 74 4f 72 64 65 72 4d  der & sortOrderM
1ac70 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d  ask;.    pIndex-
1ac80 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
1ac90 20 28 75 38 29 72 65 71 75 65 73 74 65 64 53 6f   (u8)requestedSo
1aca0 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  rtOrder;.  }..  
1acb0 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 74 61  /* Append the ta
1acc0 62 6c 65 20 6b 65 79 20 74 6f 20 74 68 65 20 65  ble key to the e
1acd0 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  nd of the index.
1ace0 20 20 46 6f 72 20 57 49 54 48 4f 55 54 20 52 4f    For WITHOUT RO
1acf0 57 49 44 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20  WID.  ** tables 
1ad00 28 77 68 65 6e 20 70 50 6b 21 3d 30 29 20 74 68  (when pPk!=0) th
1ad10 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 64  is will be the d
1ad20 65 63 6c 61 72 65 64 20 50 52 49 4d 41 52 59 20  eclared PRIMARY 
1ad30 4b 45 59 2e 20 20 46 6f 72 0a 20 20 2a 2a 20 6e  KEY.  For.  ** n
1ad40 6f 72 6d 61 6c 20 74 61 62 6c 65 73 20 28 77 68  ormal tables (wh
1ad50 65 6e 20 70 50 6b 3d 3d 30 29 20 74 68 69 73 20  en pPk==0) this 
1ad60 77 69 6c 6c 20 62 65 20 74 68 65 20 72 6f 77 69  will be the rowi
1ad70 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
1ad80 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  k ){.    for(j=0
1ad90 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  ; j<pPk->nKeyCol
1ada0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; j++){.      in
1adb0 74 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c  t x = pPk->aiCol
1adc0 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73  umn[j];.      as
1add0 73 65 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20  sert( x>=0 );.  
1ade0 20 20 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d      if( hasColum
1adf0 6e 28 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  n(pIndex->aiColu
1ae00 6d 6e 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79  mn, pIndex->nKey
1ae10 43 6f 6c 2c 20 78 29 20 29 7b 0a 20 20 20 20 20  Col, x) ){.     
1ae20 20 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75     pIndex->nColu
1ae30 6d 6e 2d 2d 3b 20 0a 20 20 20 20 20 20 7d 65 6c  mn--; .      }el
1ae40 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64  se{.        pInd
1ae50 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
1ae60 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  = x;.        pIn
1ae70 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d  dex->azColl[i] =
1ae80 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b   pPk->azColl[j];
1ae90 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
1aea0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
1aeb0 20 70 50 6b 2d 3e 61 53 6f 72 74 4f 72 64 65 72   pPk->aSortOrder
1aec0 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b  [j];.        i++
1aed0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1aee0 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70      assert( i==p
1aef0 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Index->nColumn )
1af00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1af10 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
1af20 69 5d 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20  i] = XN_ROWID;. 
1af30 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c     pIndex->azCol
1af40 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 53 74  l[i] = sqlite3St
1af50 72 42 49 4e 41 52 59 3b 0a 20 20 7d 0a 20 20 73  rBINARY;.  }.  s
1af60 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77  qlite3DefaultRow
1af70 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 20 20 69  Est(pIndex);.  i
1af80 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  f( pParse->pNewT
1af90 61 62 6c 65 3d 3d 30 20 29 20 65 73 74 69 6d 61  able==0 ) estima
1afa0 74 65 49 6e 64 65 78 57 69 64 74 68 28 70 49 6e  teIndexWidth(pIn
1afb0 64 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  dex);..  /* If t
1afc0 68 69 73 20 69 6e 64 65 78 20 63 6f 6e 74 61 69  his index contai
1afd0 6e 73 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  ns every column 
1afe0 6f 66 20 69 74 73 20 74 61 62 6c 65 2c 20 74 68  of its table, th
1aff0 65 6e 20 6d 61 72 6b 0a 20 20 2a 2a 20 69 74 20  en mark.  ** it 
1b000 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  as a covering in
1b010 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  dex */.  assert(
1b020 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
1b030 0a 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e  .      || pTab->
1b040 69 50 4b 65 79 3c 30 20 7c 7c 20 73 71 6c 69 74  iPKey<0 || sqlit
1b050 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28  e3ColumnOfIndex(
1b060 70 49 6e 64 65 78 2c 20 70 54 61 62 2d 3e 69 50  pIndex, pTab->iP
1b070 4b 65 79 29 3e 3d 30 20 29 3b 0a 20 20 72 65 63  Key)>=0 );.  rec
1b080 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74  omputeColumnsNot
1b090 49 6e 64 65 78 65 64 28 70 49 6e 64 65 78 29 3b  Indexed(pIndex);
1b0a0 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21  .  if( pTblName!
1b0b0 3d 30 20 26 26 20 70 49 6e 64 65 78 2d 3e 6e 43  =0 && pIndex->nC
1b0c0 6f 6c 75 6d 6e 3e 3d 70 54 61 62 2d 3e 6e 43 6f  olumn>=pTab->nCo
1b0d0 6c 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d  l ){.    pIndex-
1b0e0 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b  >isCovering = 1;
1b0f0 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
1b100 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
1b110 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70  {.      if( j==p
1b120 54 61 62 2d 3e 69 50 4b 65 79 20 29 20 63 6f 6e  Tab->iPKey ) con
1b130 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
1b140 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
1b150 49 6e 64 65 78 28 70 49 6e 64 65 78 2c 6a 29 3e  Index(pIndex,j)>
1b160 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1b170 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 69 73 43       pIndex->isC
1b180 6f 76 65 72 69 6e 67 20 3d 20 30 3b 0a 20 20 20  overing = 0;.   
1b190 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1b1a0 20 20 7d 0a 0a 20 20 69 66 28 20 70 54 61 62 3d    }..  if( pTab=
1b1b0 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62  =pParse->pNewTab
1b1c0 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  le ){.    /* Thi
1b1d0 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65  s routine has be
1b1e0 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  en called to cre
1b1f0 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ate an automatic
1b200 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20   index as a.    
1b210 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50  ** result of a P
1b220 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
1b230 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61  IQUE clause on a
1b240 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69   column definiti
1b250 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20  on, or.    ** a 
1b260 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
1b270 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c  NIQUE clause fol
1b280 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d  lowing the colum
1b290 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20  n definitions.. 
1b2a0 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f     ** i.e. one o
1b2b0 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
1b2c0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28   CREATE TABLE t(
1b2d0 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79  x PRIMARY KEY, y
1b2e0 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45  );.    ** CREATE
1b2f0 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55   TABLE t(x, y, U
1b300 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20  NIQUE(x, y));.  
1b310 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68    **.    ** Eith
1b320 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f  er way, check to
1b330 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62 6c   see if the tabl
1b340 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73 75  e already has su
1b350 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a  ch an index. If.
1b360 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74      ** so, don't
1b370 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67   bother creating
1b380 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20   this one. This 
1b390 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a  only applies to.
1b3a0 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63      ** automatic
1b3b0 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ally created ind
1b3c0 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20  ices. Users can 
1b3d0 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68 20  do as they wish 
1b3e0 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c  with.    ** expl
1b3f0 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20  icit indices..  
1b400 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 77 6f 20    **.    ** Two 
1b410 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52  UNIQUE or PRIMAR
1b420 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
1b430 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
1b440 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20   equivalent.    
1b450 2a 2a 20 28 61 6e 64 20 74 68 75 73 20 73 75 70  ** (and thus sup
1b460 70 72 65 73 73 69 6e 67 20 74 68 65 20 73 65 63  pressing the sec
1b470 6f 6e 64 20 6f 6e 65 29 20 65 76 65 6e 20 69 66  ond one) even if
1b480 20 74 68 65 79 20 68 61 76 65 20 64 69 66 66 65   they have diffe
1b490 72 65 6e 74 0a 20 20 20 20 2a 2a 20 73 6f 72 74  rent.    ** sort
1b4a0 20 6f 72 64 65 72 73 2e 0a 20 20 20 20 2a 2a 0a   orders..    **.
1b4b0 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20      ** If there 
1b4c0 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 63 6f  are different co
1b4d0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1b4e0 73 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6c 75  s or if the colu
1b4f0 6d 6e 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  mns of.    ** th
1b500 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 63 63  e constraint occ
1b510 75 72 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20  ur in different 
1b520 6f 72 64 65 72 73 2c 20 74 68 65 6e 20 74 68 65  orders, then the
1b530 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
1b540 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72  .    ** consider
1b550 65 64 20 64 69 73 74 69 6e 63 74 20 61 6e 64 20  ed distinct and 
1b560 62 6f 74 68 20 72 65 73 75 6c 74 20 69 6e 20 73  both result in s
1b570 65 70 61 72 61 74 65 20 69 6e 64 69 63 65 73 2e  eparate indices.
1b580 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65  .    */.    Inde
1b590 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72  x *pIdx;.    for
1b5a0 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
1b5b0 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
1b5c0 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
1b5d0 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
1b5e0 61 73 73 65 72 74 28 20 49 73 55 6e 69 71 75 65  assert( IsUnique
1b5f0 49 6e 64 65 78 28 70 49 64 78 29 20 29 3b 0a 20  Index(pIdx) );. 
1b600 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
1b610 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49  x->idxType!=SQLI
1b620 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45  TE_IDXTYPE_APPDE
1b630 46 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  F );.      asser
1b640 74 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78  t( IsUniqueIndex
1b650 28 70 49 6e 64 65 78 29 20 29 3b 0a 0a 20 20 20  (pIndex) );..   
1b660 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65     if( pIdx->nKe
1b670 79 43 6f 6c 21 3d 70 49 6e 64 65 78 2d 3e 6e 4b  yCol!=pIndex->nK
1b680 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65  eyCol ) continue
1b690 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b  ;.      for(k=0;
1b6a0 20 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   k<pIdx->nKeyCol
1b6b0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
1b6c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 3b 0a  const char *z1;.
1b6d0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
1b6e0 61 72 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20  ar *z2;.        
1b6f0 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69  assert( pIdx->ai
1b700 43 6f 6c 75 6d 6e 5b 6b 5d 3e 3d 30 20 29 3b 0a  Column[k]>=0 );.
1b710 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
1b720 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70  ->aiColumn[k]!=p
1b730 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
1b740 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  k] ) break;.    
1b750 20 20 20 20 7a 31 20 3d 20 70 49 64 78 2d 3e 61      z1 = pIdx->a
1b760 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  zColl[k];.      
1b770 20 20 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e 61    z2 = pIndex->a
1b780 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  zColl[k];.      
1b790 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1b7a0 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20 62  ICmp(z1, z2) ) b
1b7b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1b7c0 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d      if( k==pIdx-
1b7d0 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20  >nKeyCol ){.    
1b7e0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e      if( pIdx->on
1b7f0 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f  Error!=pIndex->o
1b800 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  nError ){.      
1b810 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73      /* This cons
1b820 74 72 61 69 6e 74 20 63 72 65 61 74 65 73 20 74  traint creates t
1b830 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73  he same index as
1b840 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20   a previous.    
1b850 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61        ** constra
1b860 69 6e 74 20 73 70 65 63 69 66 69 65 64 20 73 6f  int specified so
1b870 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65 20 43  mewhere in the C
1b880 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
1b890 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20  ement..         
1b8a0 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68 65 20   ** However the 
1b8b0 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
1b8c0 73 65 73 20 61 72 65 20 64 69 66 66 65 72 65 6e  ses are differen
1b8d0 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69 73 20  t. If both this 
1b8e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
1b8f0 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65  nstraint and the
1b900 20 70 72 65 76 69 6f 75 73 20 65 71 75 69 76 61   previous equiva
1b910 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20  lent constraint 
1b920 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a 20 20  have explicit.  
1b930 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f          ** ON CO
1b940 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 74  NFLICT clauses t
1b950 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e  his is an error.
1b960 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20   Otherwise, use 
1b970 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
1b980 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63   explicitly spec
1b990 69 66 69 65 64 20 62 65 68 61 76 69 6f 72 20 66  ified behavior f
1b9a0 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  or the index..  
1b9b0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1b9c0 20 20 20 20 20 69 66 28 20 21 28 70 49 64 78 2d       if( !(pIdx-
1b9d0 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
1b9e0 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e  ault || pIndex->
1b9f0 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
1ba00 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ult) ){.        
1ba10 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1ba20 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
1ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f               "co
1ba40 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e  nflicting ON CON
1ba50 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 73 70  FLICT clauses sp
1ba60 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20  ecified", 0);.  
1ba70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ba80 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e      if( pIdx->on
1ba90 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
1baa0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
1bab0 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d   pIdx->onError =
1bac0 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
1bad0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1bae0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1baf0 69 66 28 20 69 64 78 54 79 70 65 3d 3d 53 51 4c  if( idxType==SQL
1bb00 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d  ITE_IDXTYPE_PRIM
1bb10 41 52 59 4b 45 59 20 29 20 70 49 64 78 2d 3e 69  ARYKEY ) pIdx->i
1bb20 64 78 54 79 70 65 20 3d 20 69 64 78 54 79 70 65  dxType = idxType
1bb30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
1bb40 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1bb50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1bb60 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74    }..  /* Link t
1bb70 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72  he new Index str
1bb80 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61  ucture to its ta
1bb90 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f  ble and to the o
1bba0 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d  ther.  ** in-mem
1bbb0 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72  ory database str
1bbc0 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20  uctures. .  */. 
1bbd0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1bbe0 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66  >nErr==0 );.  if
1bbf0 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
1bc00 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  ){.    Index *p;
1bc10 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 49 4e  .    assert( !IN
1bc20 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 3b  _DECLARE_VTAB );
1bc30 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
1bc40 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
1bc50 65 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65  eld(db, 0, pInde
1bc60 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20  x->pSchema) );. 
1bc70 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
1bc80 73 68 49 6e 73 65 72 74 28 26 70 49 6e 64 65 78  shInsert(&pIndex
1bc90 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
1bca0 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  sh, .           
1bcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1bcc0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 49  Index->zName, pI
1bcd0 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70  ndex);.    if( p
1bce0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1bcf0 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20  ( p==pIndex );  
1bd00 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
1bd10 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  ave failed */.  
1bd20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
1bd30 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 67  ult(db);.      g
1bd40 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1bd50 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
1bd60 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d   db->mDbFlags |=
1bd70 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68   DBFLAG_SchemaCh
1bd80 61 6e 67 65 3b 0a 20 20 20 20 69 66 28 20 70 54  ange;.    if( pT
1bd90 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20  blName!=0 ){.   
1bda0 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20     pIndex->tnum 
1bdb0 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  = db->init.newTn
1bdc0 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  um;.    }.  }.. 
1bdd0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
1bde0 68 65 20 69 6e 69 74 69 61 6c 20 43 52 45 41 54  he initial CREAT
1bdf0 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
1be00 74 20 28 6f 72 20 43 52 45 41 54 45 20 54 41 42  t (or CREATE TAB
1be10 4c 45 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 69  LE if the.  ** i
1be20 6e 64 65 78 20 69 73 20 61 6e 20 69 6d 70 6c 69  ndex is an impli
1be30 65 64 20 69 6e 64 65 78 20 66 6f 72 20 61 20 55  ed index for a U
1be40 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59  NIQUE or PRIMARY
1be50 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 29   KEY constraint)
1be60 20 74 68 65 6e 0a 20 20 2a 2a 20 65 6d 69 74 20   then.  ** emit 
1be70 63 6f 64 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  code to allocate
1be80 20 74 68 65 20 69 6e 64 65 78 20 72 6f 6f 74 70   the index rootp
1be90 61 67 65 20 6f 6e 20 64 69 73 6b 20 61 6e 64 20  age on disk and 
1bea0 6d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f  make an entry fo
1beb0 72 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78  r.  ** the index
1bec0 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   in the sqlite_m
1bed0 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
1bee0 70 6f 70 75 6c 61 74 65 20 74 68 65 20 69 6e 64  populate the ind
1bef0 65 78 20 77 69 74 68 0a 20 20 2a 2a 20 63 6f 6e  ex with.  ** con
1bf00 74 65 6e 74 2e 20 20 42 75 74 2c 20 64 6f 20 6e  tent.  But, do n
1bf10 6f 74 20 64 6f 20 74 68 69 73 20 69 66 20 77 65  ot do this if we
1bf20 20 61 72 65 20 73 69 6d 70 6c 79 20 72 65 61 64   are simply read
1bf30 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ing the sqlite_m
1bf40 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65  aster.  ** table
1bf50 20 74 6f 20 70 61 72 73 65 20 74 68 65 20 73 63   to parse the sc
1bf60 68 65 6d 61 2c 20 6f 72 20 69 66 20 74 68 69 73  hema, or if this
1bf70 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 50 52   index is the PR
1bf80 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 0a  IMARY KEY index.
1bf90 20 20 2a 2a 20 6f 66 20 61 20 57 49 54 48 4f 55    ** of a WITHOU
1bfa0 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a 20  T ROWID table.. 
1bfb0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c   **.  ** If pTbl
1bfc0 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
1bfd0 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67   this index is g
1bfe0 65 6e 65 72 61 74 65 64 20 61 73 20 61 6e 20 69  enerated as an i
1bff0 6d 70 6c 69 65 64 20 50 52 49 4d 41 52 59 20 4b  mplied PRIMARY K
1c000 45 59 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55  EY.  ** or UNIQU
1c010 45 20 69 6e 64 65 78 20 69 6e 20 61 20 43 52 45  E index in a CRE
1c020 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
1c030 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20  ent.  Since the 
1c040 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a  table.  ** has j
1c050 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65 64  ust been created
1c060 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  , it contains no
1c070 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e   data and the in
1c080 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  dex initializati
1c090 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e  on.  ** step can
1c0a0 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a   be skipped..  *
1c0b0 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 48 61 73  /.  else if( Has
1c0c0 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20 70  Rowid(pTab) || p
1c0d0 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20  TblName!=0 ){.  
1c0e0 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63    Vdbe *v;.    c
1c0f0 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20  har *zStmt;.    
1c100 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  int iMem = ++pPa
1c110 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20  rse->nMem;..    
1c120 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1c130 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
1c140 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20  if( v==0 ) goto 
1c150 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1c160 78 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42  x;..    sqlite3B
1c170 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
1c180 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
1c190 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  b);..    /* Crea
1c1a0 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20  te the rootpage 
1c1b0 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 75 73  for the index us
1c1c0 69 6e 67 20 43 72 65 61 74 65 49 6e 64 65 78 2e  ing CreateIndex.
1c1d0 20 42 75 74 20 62 65 66 6f 72 65 0a 20 20 20 20   But before.    
1c1e0 2a 2a 20 64 6f 69 6e 67 20 73 6f 2c 20 63 6f 64  ** doing so, cod
1c1f0 65 20 61 20 4e 6f 6f 70 20 69 6e 73 74 72 75 63  e a Noop instruc
1c200 74 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 69  tion and store i
1c210 74 73 20 61 64 64 72 65 73 73 20 69 6e 20 0a 20  ts address in . 
1c220 20 20 20 2a 2a 20 49 6e 64 65 78 2e 74 6e 75 6d     ** Index.tnum
1c230 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
1c240 65 64 20 69 6e 20 63 61 73 65 20 74 68 69 73 20  ed in case this 
1c250 69 6e 64 65 78 20 69 73 20 61 63 74 75 61 6c 6c  index is actuall
1c260 79 20 61 20 0a 20 20 20 20 2a 2a 20 50 52 49 4d  y a .    ** PRIM
1c270 41 52 59 20 4b 45 59 20 61 6e 64 20 74 68 65 20  ARY KEY and the 
1c280 74 61 62 6c 65 20 69 73 20 61 63 74 75 61 6c 6c  table is actuall
1c290 79 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  y a WITHOUT ROWI
1c2a0 44 20 74 61 62 6c 65 2e 20 49 6e 20 0a 20 20 20  D table. In .   
1c2b0 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 74 68   ** that case th
1c2c0 65 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f  e convertToWitho
1c2d0 75 74 52 6f 77 69 64 54 61 62 6c 65 28 29 20 72  utRowidTable() r
1c2e0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 70 6c  outine will repl
1c2f0 61 63 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 4e  ace.    ** the N
1c300 6f 6f 70 20 77 69 74 68 20 61 20 47 6f 74 6f 20  oop with a Goto 
1c310 74 6f 20 6a 75 6d 70 20 6f 76 65 72 20 74 68 65  to jump over the
1c320 20 56 44 42 45 20 63 6f 64 65 20 67 65 6e 65 72   VDBE code gener
1c330 61 74 65 64 20 62 65 6c 6f 77 2e 20 2a 2f 0a 20  ated below. */. 
1c340 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20     pIndex->tnum 
1c350 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1c360 4f 70 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b  Op0(v, OP_Noop);
1c370 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1c380 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 72 65  AddOp3(v, OP_Cre
1c390 61 74 65 42 74 72 65 65 2c 20 69 44 62 2c 20 69  ateBtree, iDb, i
1c3a0 4d 65 6d 2c 20 42 54 52 45 45 5f 42 4c 4f 42 4b  Mem, BTREE_BLOBK
1c3b0 45 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74  EY);..    /* Gat
1c3c0 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  her the complete
1c3d0 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
1c3e0 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
1c3f0 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20  ent into.    ** 
1c400 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62  the zStmt variab
1c410 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  le.    */.    if
1c420 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ( pStart ){.    
1c430 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 28    int n = (int)(
1c440 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b  pParse->sLastTok
1c450 65 6e 2e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 29  en.z - pName->z)
1c460 20 2b 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74   + pParse->sLast
1c470 54 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 69  Token.n;.      i
1c480 66 28 20 70 4e 61 6d 65 2d 3e 7a 5b 6e 2d 31 5d  f( pName->z[n-1]
1c490 3d 3d 27 3b 27 20 29 20 6e 2d 2d 3b 0a 20 20 20  ==';' ) n--;.   
1c4a0 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e     /* A named in
1c4b0 64 65 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c  dex with an expl
1c4c0 69 63 69 74 20 43 52 45 41 54 45 20 49 4e 44 45  icit CREATE INDE
1c4d0 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  X statement */. 
1c4e0 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c       zStmt = sql
1c4f0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
1c500 22 43 52 45 41 54 45 25 73 20 49 4e 44 45 58 20  "CREATE%s INDEX 
1c510 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 6f  %.*s",.        o
1c520 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20  nError==OE_None 
1c530 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22  ? "" : " UNIQUE"
1c540 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a  , n, pName->z);.
1c550 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c560 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63   /* An automatic
1c570 20 69 6e 64 65 78 20 63 72 65 61 74 65 64 20 62   index created b
1c580 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  y a PRIMARY KEY 
1c590 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  or UNIQUE constr
1c5a0 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  aint */.      /*
1c5b0 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
1c5c0 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a  MPrintf(""); */.
1c5d0 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b        zStmt = 0;
1c5e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
1c5f0 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73  dd an entry in s
1c600 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72  qlite_master for
1c610 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20   this index.    
1c620 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  */.    sqlite3Ne
1c630 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
1c640 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45  , .        "INSE
1c650 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41  RT INTO %Q.%s VA
1c660 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c  LUES('index',%Q,
1c670 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20  %Q,#%d,%Q);",.  
1c680 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
1c690 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53  b].zDbSName, MAS
1c6a0 54 45 52 5f 4e 41 4d 45 2c 0a 20 20 20 20 20 20  TER_NAME,.      
1c6b0 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c    pIndex->zName,
1c6c0 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  .        pTab->z
1c6d0 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 69 4d  Name,.        iM
1c6e0 65 6d 2c 0a 20 20 20 20 20 20 20 20 7a 53 74 6d  em,.        zStm
1c6f0 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  t.    );.    sql
1c700 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
1c710 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46  Stmt);..    /* F
1c720 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20 77 69  ill the index wi
1c730 74 68 20 64 61 74 61 20 61 6e 64 20 72 65 70 61  th data and repa
1c740 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 2e 20  rse the schema. 
1c750 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70 69 72  Code an OP_Expir
1c760 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61  e.    ** to inva
1c770 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 2d 63  lidate all pre-c
1c780 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e  ompiled statemen
1c790 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ts..    */.    i
1c7a0 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20  f( pTblName ){. 
1c7b0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69       sqlite3Refi
1c7c0 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
1c7d0 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20  pIndex, iMem);. 
1c7e0 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e       sqlite3Chan
1c7f0 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
1c800 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
1c810 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65  ite3VdbeAddParse
1c820 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c  SchemaOp(v, iDb,
1c830 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
1c840 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 61  3MPrintf(db, "na
1c850 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65  me='%q' AND type
1c860 3d 27 69 6e 64 65 78 27 22 2c 20 70 49 6e 64 65  ='index'", pInde
1c870 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
1c880 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c890 4f 70 30 28 76 2c 20 4f 50 5f 45 78 70 69 72 65  Op0(v, OP_Expire
1c8a0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71  );.    }..    sq
1c8b0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
1c8c0 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75  e(v, pIndex->tnu
1c8d0 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68  m);.  }..  /* Wh
1c8e0 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64  en adding an ind
1c8f0 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  ex to the list o
1c900 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20  f indices for a 
1c910 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a  table, make.  **
1c920 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65   sure all indice
1c930 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70  s labeled OE_Rep
1c940 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20  lace come after 
1c950 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65  all those labele
1c960 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65  d.  ** OE_Ignore
1c970 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
1c980 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72  sary for the cor
1c990 72 65 63 74 20 63 6f 6e 73 74 72 61 69 6e 74 20  rect constraint 
1c9a0 63 68 65 63 6b 0a 20 20 2a 2a 20 70 72 6f 63 65  check.  ** proce
1c9b0 73 73 69 6e 67 20 28 69 6e 20 73 71 6c 69 74 65  ssing (in sqlite
1c9c0 33 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61  3GenerateConstra
1c9d0 69 6e 74 43 68 65 63 6b 73 28 29 29 20 61 73 20  intChecks()) as 
1c9e0 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 55 50 44  part of.  ** UPD
1c9f0 41 54 45 20 61 6e 64 20 49 4e 53 45 52 54 20 73  ATE and INSERT s
1ca00 74 61 74 65 6d 65 6e 74 73 2e 20 20 0a 20 20 2a  tatements.  .  *
1ca10 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
1ca20 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d  .busy || pTblNam
1ca30 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  e==0 ){.    if( 
1ca40 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
1ca50 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e  ace || pTab->pIn
1ca60 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  dex==0.         
1ca70 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d  || pTab->pIndex-
1ca80 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70  >onError==OE_Rep
1ca90 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e  lace){.      pIn
1caa0 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61  dex->pNext = pTa
1cab0 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
1cac0 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20   pTab->pIndex = 
1cad0 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73  pIndex;.    }els
1cae0 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
1caf0 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70  pOther = pTab->p
1cb00 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69  Index;.      whi
1cb10 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  le( pOther->pNex
1cb20 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65  t && pOther->pNe
1cb30 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  xt->onError!=OE_
1cb40 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20  Replace ){.     
1cb50 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68     pOther = pOth
1cb60 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  er->pNext;.     
1cb70 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d   }.      pIndex-
1cb80 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d  >pNext = pOther-
1cb90 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f  >pNext;.      pO
1cba0 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49  ther->pNext = pI
1cbb0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
1cbc0 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a  pIndex = 0;.  }.
1cbd0 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62  .  /* Clean up b
1cbe0 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f  efore exiting */
1cbf0 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64  .exit_create_ind
1cc00 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78  ex:.  if( pIndex
1cc10 20 29 20 66 72 65 65 49 6e 64 65 78 28 64 62 2c   ) freeIndex(db,
1cc20 20 70 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69   pIndex);.  sqli
1cc30 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1cc40 2c 20 70 50 49 57 68 65 72 65 29 3b 0a 20 20 73  , pPIWhere);.  s
1cc50 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
1cc60 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
1cc70 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
1cc80 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 62 6c  tDelete(db, pTbl
1cc90 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
1cca0 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
1ccb0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c  );.}../*.** Fill
1ccc0 20 74 68 65 20 49 6e 64 65 78 2e 61 69 52 6f 77   the Index.aiRow
1ccd0 45 73 74 5b 5d 20 61 72 72 61 79 20 77 69 74 68  Est[] array with
1cce0 20 64 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61   default informa
1ccf0 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69  tion - informati
1cd00 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65 64  on.** to be used
1cd10 20 77 68 65 6e 20 77 65 20 68 61 76 65 20 6e 6f   when we have no
1cd20 74 20 72 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a  t run the ANALYZ
1cd30 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  E command..**.**
1cd40 20 61 69 52 6f 77 45 73 74 5b 30 5d 20 69 73 20   aiRowEst[0] is 
1cd50 73 75 70 70 6f 73 65 64 20 74 6f 20 63 6f 6e 74  supposed to cont
1cd60 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ain the number o
1cd70 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  f elements in th
1cd80 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63  e index..** Sinc
1cd90 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  e we do not know
1cda0 2c 20 67 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f  , guess 1 millio
1cdb0 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b 31 5d 20  n.  aiRowEst[1] 
1cdc0 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  is an estimate o
1cdd0 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  f the.** number 
1cde0 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
1cdf0 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63 68 20  able that match 
1ce00 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 76  any particular v
1ce10 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66  alue of the.** f
1ce20 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  irst column of t
1ce30 68 65 20 69 6e 64 65 78 2e 20 20 61 69 52 6f 77  he index.  aiRow
1ce40 45 73 74 5b 32 5d 20 69 73 20 61 6e 20 65 73 74  Est[2] is an est
1ce50 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
1ce60 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74  ber.** of rows t
1ce70 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61  hat match any pa
1ce80 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 61  rticular combina
1ce90 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73  tion of the firs
1cea0 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f  t 2 columns.** o
1ceb0 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 41 6e  f the index.  An
1cec0 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 74 20  d so forth.  It 
1ced0 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20 74  must always be t
1cee0 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a  he case that.*.*
1cef0 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f  *           aiRo
1cf00 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73  wEst[N]<=aiRowEs
1cf10 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20  t[N-1].**       
1cf20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e      aiRowEst[N]>
1cf30 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66  =1.**.** Apart f
1cf40 72 6f 6d 20 74 68 61 74 2c 20 77 65 20 68 61 76  rom that, we hav
1cf50 65 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f  e little to go o
1cf60 6e 20 62 65 73 69 64 65 73 20 69 6e 74 75 69 74  n besides intuit
1cf70 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77  ion as to.** how
1cf80 20 61 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75   aiRowEst[] shou
1cf90 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ld be initialize
1cfa0 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 73 20  d.  The numbers 
1cfb0 67 65 6e 65 72 61 74 65 64 20 68 65 72 65 0a 2a  generated here.*
1cfc0 2a 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20 74  * are based on t
1cfd0 79 70 69 63 61 6c 20 76 61 6c 75 65 73 20 66 6f  ypical values fo
1cfe0 75 6e 64 20 69 6e 20 61 63 74 75 61 6c 20 69 6e  und in actual in
1cff0 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dices..*/.void s
1d000 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77  qlite3DefaultRow
1d010 45 73 74 28 49 6e 64 65 78 20 2a 70 49 64 78 29  Est(Index *pIdx)
1d020 7b 0a 20 20 2f 2a 20 20 20 20 20 20 20 20 20 20  {.  /*          
1d030 20 20 20 20 20 20 31 30 2c 20 20 39 2c 20 20 38        10,  9,  8
1d040 2c 20 20 37 2c 20 20 36 20 2a 2f 0a 20 20 4c 6f  ,  7,  6 */.  Lo
1d050 67 45 73 74 20 61 56 61 6c 5b 5d 20 3d 20 7b 20  gEst aVal[] = { 
1d060 33 33 2c 20 33 32 2c 20 33 30 2c 20 32 38 2c 20  33, 32, 30, 28, 
1d070 32 36 20 7d 3b 0a 20 20 4c 6f 67 45 73 74 20 2a  26 };.  LogEst *
1d080 61 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77 4c  a = pIdx->aiRowL
1d090 6f 67 45 73 74 3b 0a 20 20 69 6e 74 20 6e 43 6f  ogEst;.  int nCo
1d0a0 70 79 20 3d 20 4d 49 4e 28 41 72 72 61 79 53 69  py = MIN(ArraySi
1d0b0 7a 65 28 61 56 61 6c 29 2c 20 70 49 64 78 2d 3e  ze(aVal), pIdx->
1d0c0 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 69 6e 74 20  nKeyCol);.  int 
1d0d0 69 3b 0a 0a 20 20 2f 2a 20 49 6e 64 65 78 65 73  i;..  /* Indexes
1d0e0 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 72 6f   with default ro
1d0f0 77 20 65 73 74 69 6d 61 74 65 73 20 73 68 6f 75  w estimates shou
1d100 6c 64 20 6e 6f 74 20 68 61 76 65 20 73 74 61 74  ld not have stat
1d110 31 20 64 61 74 61 20 2a 2f 0a 20 20 61 73 73 65  1 data */.  asse
1d120 72 74 28 20 21 70 49 64 78 2d 3e 68 61 73 53 74  rt( !pIdx->hasSt
1d130 61 74 31 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  at1 );..  /* Set
1d140 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1d150 20 28 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73   (number of rows
1d160 20 69 6e 20 74 68 65 20 69 6e 64 65 78 29 20 74   in the index) t
1d170 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  o the estimated 
1d180 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  .  ** number of 
1d190 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
1d1a0 65 2c 20 6f 72 20 68 61 6c 66 20 74 68 65 20 6e  e, or half the n
1d1b0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
1d1c0 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20   the table.  ** 
1d1d0 66 6f 72 20 61 20 70 61 72 74 69 61 6c 20 69 6e  for a partial in
1d1e0 64 65 78 2e 20 20 20 42 75 74 20 64 6f 20 6e 6f  dex.   But do no
1d1f0 74 20 6c 65 74 20 74 68 65 20 65 73 74 69 6d 61  t let the estima
1d200 74 65 20 64 72 6f 70 20 62 65 6c 6f 77 20 31 30  te drop below 10
1d210 2e 20 2a 2f 0a 20 20 61 5b 30 5d 20 3d 20 70 49  . */.  a[0] = pI
1d220 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52 6f 77  dx->pTable->nRow
1d230 4c 6f 67 45 73 74 3b 0a 20 20 69 66 28 20 70 49  LogEst;.  if( pI
1d240 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  dx->pPartIdxWher
1d250 65 21 3d 30 20 29 20 61 5b 30 5d 20 2d 3d 20 31  e!=0 ) a[0] -= 1
1d260 30 3b 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d  0;  assert( 10==
1d270 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 29  sqlite3LogEst(2)
1d280 20 29 3b 0a 20 20 69 66 28 20 61 5b 30 5d 3c 33   );.  if( a[0]<3
1d290 33 20 29 20 61 5b 30 5d 20 3d 20 33 33 3b 20 20  3 ) a[0] = 33;  
1d2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2b0 61 73 73 65 72 74 28 20 33 33 3d 3d 73 71 6c 69  assert( 33==sqli
1d2c0 74 65 33 4c 6f 67 45 73 74 28 31 30 29 20 29 3b  te3LogEst(10) );
1d2d0 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 20  ..  /* Estimate 
1d2e0 74 68 61 74 20 61 5b 31 5d 20 69 73 20 31 30 2c  that a[1] is 10,
1d2f0 20 61 5b 32 5d 20 69 73 20 39 2c 20 61 5b 33 5d   a[2] is 9, a[3]
1d300 20 69 73 20 38 2c 20 61 5b 34 5d 20 69 73 20 37   is 8, a[4] is 7
1d310 2c 20 61 5b 35 5d 20 69 73 0a 20 20 2a 2a 20 36  , a[5] is.  ** 6
1d320 20 61 6e 64 20 65 61 63 68 20 73 75 62 73 65 71   and each subseq
1d330 75 65 6e 74 20 76 61 6c 75 65 20 28 69 66 20 61  uent value (if a
1d340 6e 79 29 20 69 73 20 35 2e 20 20 2a 2f 0a 20 20  ny) is 5.  */.  
1d350 6d 65 6d 63 70 79 28 26 61 5b 31 5d 2c 20 61 56  memcpy(&a[1], aV
1d360 61 6c 2c 20 6e 43 6f 70 79 2a 73 69 7a 65 6f 66  al, nCopy*sizeof
1d370 28 4c 6f 67 45 73 74 29 29 3b 0a 20 20 66 6f 72  (LogEst));.  for
1d380 28 69 3d 6e 43 6f 70 79 2b 31 3b 20 69 3c 3d 70  (i=nCopy+1; i<=p
1d390 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b  Idx->nKeyCol; i+
1d3a0 2b 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 32  +){.    a[i] = 2
1d3b0 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3;              
1d3c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 32 33        assert( 23
1d3d0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
1d3e0 35 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  5) );.  }..  ass
1d3f0 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c  ert( 0==sqlite3L
1d400 6f 67 45 73 74 28 31 29 20 29 3b 0a 20 20 69 66  ogEst(1) );.  if
1d410 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28  ( IsUniqueIndex(
1d420 70 49 64 78 29 20 29 20 61 5b 70 49 64 78 2d 3e  pIdx) ) a[pIdx->
1d430 6e 4b 65 79 43 6f 6c 5d 20 3d 20 30 3b 0a 7d 0a  nKeyCol] = 0;.}.
1d440 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1d450 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e  ine will drop an
1d460 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20   existing named 
1d470 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75  index.  This rou
1d480 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tine.** implemen
1d490 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45  ts the DROP INDE
1d4a0 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  X statement..*/.
1d4b0 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70  void sqlite3Drop
1d4c0 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
1d4d0 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e  rse, SrcList *pN
1d4e0 61 6d 65 2c 20 69 6e 74 20 69 66 45 78 69 73 74  ame, int ifExist
1d4f0 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  s){.  Index *pIn
1d500 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  dex;.  Vdbe *v;.
1d510 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1d520 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
1d530 74 20 69 44 62 3b 0a 0a 20 20 61 73 73 65 72 74  t iDb;..  assert
1d540 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
1d550 30 20 29 3b 20 20 20 2f 2a 20 4e 65 76 65 72 20  0 );   /* Never 
1d560 63 61 6c 6c 65 64 20 77 69 74 68 20 70 72 69 6f  called with prio
1d570 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 66  r errors */.  if
1d580 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1d590 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  ed ){.    goto e
1d5a0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
1d5b0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e    }.  assert( pN
1d5c0 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ame->nSrc==1 );.
1d5d0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
1d5e0 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
1d5f0 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
1d600 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
1d610 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49  _index;.  }.  pI
1d620 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69  ndex = sqlite3Fi
1d630 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d  ndIndex(db, pNam
1d640 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70  e->a[0].zName, p
1d650 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
1d660 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e  base);.  if( pIn
1d670 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  dex==0 ){.    if
1d680 28 20 21 69 66 45 78 69 73 74 73 20 29 7b 0a 20  ( !ifExists ){. 
1d690 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1d6a0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
1d6b0 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22   such index: %S"
1d6c0 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  , pName, 0);.   
1d6d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
1d6e0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e  lite3CodeVerifyN
1d6f0 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61 72 73  amedSchema(pPars
1d700 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
1d710 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 7d  Database);.    }
1d720 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65  .    pParse->che
1d730 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
1d740 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
1d750 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66  _index;.  }.  if
1d760 28 20 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70  ( pIndex->idxTyp
1d770 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50  e!=SQLITE_IDXTYP
1d780 45 5f 41 50 50 44 45 46 20 29 7b 0a 20 20 20 20  E_APPDEF ){.    
1d790 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1d7a0 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61  pParse, "index a
1d7b0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55  ssociated with U
1d7c0 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f  NIQUE ".      "o
1d7d0 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  r PRIMARY KEY co
1d7e0 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20  nstraint cannot 
1d7f0 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b  be dropped", 0);
1d800 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
1d810 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
1d820 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
1d830 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
1d840 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29  pIndex->pSchema)
1d850 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1d860 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
1d870 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ION.  {.    int 
1d880 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
1d890 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61  OP_INDEX;.    Ta
1d8a0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64  ble *pTab = pInd
1d8b0 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20  ex->pTable;.    
1d8c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
1d8d0 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
1d8e0 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e  DbSName;.    con
1d8f0 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  st char *zTab = 
1d900 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
1d910 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
1d920 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1d930 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
1d940 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29  E, zTab, 0, zDb)
1d950 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
1d960 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
1d970 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f      }.    if( !O
1d980 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
1d990 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54  b ) code = SQLIT
1d9a0 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45  E_DROP_TEMP_INDE
1d9b0 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  X;.    if( sqlit
1d9c0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1d9d0 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78  se, code, pIndex
1d9e0 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  ->zName, pTab->z
1d9f0 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Name, zDb) ){.  
1da00 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
1da10 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
1da20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1da30 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1da40 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64  o remove the ind
1da50 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20  ex and from the 
1da60 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  master table */.
1da70 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
1da80 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
1da90 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
1daa0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
1dab0 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
1dac0 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  1, iDb);.    sql
1dad0 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
1dae0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22  pParse,.       "
1daf0 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
1db00 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 20  s WHERE name=%Q 
1db10 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27  AND type='index'
1db20 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44  ",.       db->aD
1db30 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c  b[iDb].zDbSName,
1db40 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 70 49   MASTER_NAME, pI
1db50 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  ndex->zName.    
1db60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6c  );.    sqlite3Cl
1db70 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 70 50  earStatTables(pP
1db80 61 72 73 65 2c 20 69 44 62 2c 20 22 69 64 78 22  arse, iDb, "idx"
1db90 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29  , pIndex->zName)
1dba0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61  ;.    sqlite3Cha
1dbb0 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
1dbc0 2c 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73 74  , iDb);.    dest
1dbd0 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
1dbe0 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  se, pIndex->tnum
1dbf0 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
1dc00 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1dc10 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69   OP_DropIndex, i
1dc20 44 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65 78  Db, 0, 0, pIndex
1dc30 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d  ->zName, 0);.  }
1dc40 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  ..exit_drop_inde
1dc50 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  x:.  sqlite3SrcL
1dc60 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e  istDelete(db, pN
1dc70 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  ame);.}../*.** p
1dc80 41 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74  Array is a point
1dc90 65 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f  er to an array o
1dca0 66 20 6f 62 6a 65 63 74 73 2e 20 45 61 63 68 20  f objects. Each 
1dcb0 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a  object in the.**
1dcc0 20 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74 72   array is szEntr
1dcd0 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  y bytes in size.
1dce0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73   This routine us
1dcf0 65 73 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c  es sqlite3DbReal
1dd00 6c 6f 63 28 29 0a 2a 2a 20 74 6f 20 65 78 74 65  loc().** to exte
1dd10 6e 64 20 74 68 65 20 61 72 72 61 79 20 73 6f 20  nd the array so 
1dd20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73 70  that there is sp
1dd30 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20 6f 62  ace for a new ob
1dd40 6a 65 63 74 20 61 74 20 74 68 65 20 65 6e 64 2e  ject at the end.
1dd50 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
1dd60 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1dd70 6c 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 63 6f  led, *pnEntry co
1dd80 6e 74 61 69 6e 73 20 74 68 65 20 63 75 72 72 65  ntains the curre
1dd90 6e 74 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68  nt size of.** th
1dda0 65 20 61 72 72 61 79 20 28 69 6e 20 65 6e 74 72  e array (in entr
1ddb0 69 65 73 20 2d 20 73 6f 20 74 68 65 20 61 6c 6c  ies - so the all
1ddc0 6f 63 61 74 69 6f 6e 20 69 73 20 28 28 2a 70 6e  ocation is ((*pn
1ddd0 45 6e 74 72 79 29 20 2a 20 73 7a 45 6e 74 72 79  Entry) * szEntry
1dde0 29 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20 74 6f  ) bytes.** in to
1ddf0 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tal)..**.** If t
1de00 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 69 73 20  he realloc() is 
1de10 73 75 63 63 65 73 73 66 75 6c 20 28 69 2e 65 2e  successful (i.e.
1de20 20 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f 6e 64 69   if no OOM condi
1de30 74 69 6f 6e 20 6f 63 63 75 72 73 29 2c 20 74 68  tion occurs), th
1de40 65 0a 2a 2a 20 73 70 61 63 65 20 61 6c 6c 6f 63  e.** space alloc
1de50 61 74 65 64 20 66 6f 72 20 74 68 65 20 6e 65 77  ated for the new
1de60 20 6f 62 6a 65 63 74 20 69 73 20 7a 65 72 6f 65   object is zeroe
1de70 64 2c 20 2a 70 6e 45 6e 74 72 79 20 75 70 64 61  d, *pnEntry upda
1de80 74 65 64 20 74 6f 0a 2a 2a 20 72 65 66 6c 65 63  ted to.** reflec
1de90 74 20 74 68 65 20 6e 65 77 20 73 69 7a 65 20 6f  t the new size o
1dea0 66 20 74 68 65 20 61 72 72 61 79 20 61 6e 64 20  f the array and 
1deb0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1dec0 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a   new allocation.
1ded0 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 2a 70 49  ** returned. *pI
1dee0 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  dx is set to the
1def0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 65   index of the ne
1df00 77 20 61 72 72 61 79 20 65 6e 74 72 79 20 69 6e  w array entry in
1df10 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
1df20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
1df30 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 66 61  the realloc() fa
1df40 69 6c 73 2c 20 2a 70 49 64 78 20 69 73 20 73 65  ils, *pIdx is se
1df50 74 20 74 6f 20 2d 31 2c 20 2a 70 6e 45 6e 74 72  t to -1, *pnEntr
1df60 79 20 72 65 6d 61 69 6e 73 0a 2a 2a 20 75 6e 63  y remains.** unc
1df70 68 61 6e 67 65 64 20 61 6e 64 20 61 20 63 6f 70  hanged and a cop
1df80 79 20 6f 66 20 70 41 72 72 61 79 20 72 65 74 75  y of pArray retu
1df90 72 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  rned..*/.void *s
1dfa0 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
1dfb0 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ate(.  sqlite3 *
1dfc0 64 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  db,      /* Conn
1dfd0 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79  ection to notify
1dfe0 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75   of malloc failu
1dff0 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  res */.  void *p
1e000 41 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72  Array,     /* Ar
1e010 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20  ray of objects. 
1e020 20 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f   Might be reallo
1e030 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73  cated */.  int s
1e040 7a 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20  zEntry,      /* 
1e050 53 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a  Size of each obj
1e060 65 63 74 20 69 6e 20 74 68 65 20 61 72 72 61 79  ect in the array
1e070 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e 74   */.  int *pnEnt
1e080 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ry,     /* Numbe
1e090 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 63 75 72  r of objects cur
1e0a0 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a 2f  rently in use */
1e0b0 0a 20 20 69 6e 74 20 2a 70 49 64 78 20 20 20 20  .  int *pIdx    
1e0c0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
1e0d0 65 20 69 6e 64 65 78 20 6f 66 20 61 20 6e 65 77  e index of a new
1e0e0 20 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b   slot here */.){
1e0f0 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e  .  char *z;.  in
1e100 74 20 6e 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a  t n = *pnEntry;.
1e110 20 20 69 66 28 20 28 6e 20 26 20 28 6e 2d 31 29    if( (n & (n-1)
1e120 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )==0 ){.    int 
1e130 73 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f 20 31 20  sz = (n==0) ? 1 
1e140 3a 20 32 2a 6e 3b 0a 20 20 20 20 76 6f 69 64 20  : 2*n;.    void 
1e150 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44  *pNew = sqlite3D
1e160 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72  bRealloc(db, pAr
1e170 72 61 79 2c 20 73 7a 2a 73 7a 45 6e 74 72 79 29  ray, sz*szEntry)
1e180 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
1e190 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 49 64 78  0 ){.      *pIdx
1e1a0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74   = -1;.      ret
1e1b0 75 72 6e 20 70 41 72 72 61 79 3b 0a 20 20 20 20  urn pArray;.    
1e1c0 7d 0a 20 20 20 20 70 41 72 72 61 79 20 3d 20 70  }.    pArray = p
1e1d0 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28  New;.  }.  z = (
1e1e0 63 68 61 72 2a 29 70 41 72 72 61 79 3b 0a 20 20  char*)pArray;.  
1e1f0 6d 65 6d 73 65 74 28 26 7a 5b 6e 20 2a 20 73 7a  memset(&z[n * sz
1e200 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74  Entry], 0, szEnt
1e210 72 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 6e  ry);.  *pIdx = n
1e220 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a  ;.  ++*pnEntry;.
1e230 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b    return pArray;
1e240 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
1e250 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
1e260 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69  o the given IdLi
1e270 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
1e280 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e  w IdList if.** n
1e290 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  eed be..**.** A 
1e2a0 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65  new IdList is re
1e2b0 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  turned, or NULL 
1e2c0 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  if malloc() fail
1e2d0 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71  s..*/.IdList *sq
1e2e0 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e  lite3IdListAppen
1e2f0 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  d(sqlite3 *db, I
1e300 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  dList *pList, To
1e310 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
1e320 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
1e330 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
1e340 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
1e350 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
1e360 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20  eof(IdList) );. 
1e370 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
1e380 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
1e390 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c    pList->a = sql
1e3a0 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
1e3b0 65 28 0a 20 20 20 20 20 20 64 62 2c 0a 20 20 20  e(.      db,.   
1e3c0 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20     pList->a,.   
1e3d0 20 20 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d     sizeof(pList-
1e3e0 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20 26 70  >a[0]),.      &p
1e3f0 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20 20  List->nId,.     
1e400 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28 20 69   &i.  );.  if( i
1e410 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
1e420 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
1e430 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65  , pList);.    re
1e440 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c  turn 0;.  }.  pL
1e450 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
1e460 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1e470 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65  mToken(db, pToke
1e480 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69  n);.  return pLi
1e490 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  st;.}../*.** Del
1e4a0 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a  ete an IdList..*
1e4b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64  /.void sqlite3Id
1e4c0 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74  ListDelete(sqlit
1e4d0 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a  e3 *db, IdList *
1e4e0 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
1e4f0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1e500 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
1e510 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
1e520 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  d; i++){.    sql
1e530 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1e540 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
1e550 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1e560 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
1e570 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ->a);.  sqlite3D
1e580 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69 73  bFreeNN(db, pLis
1e590 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
1e5a0 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e  urn the index in
1e5b0 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64   pList of the id
1e5c0 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a  entifier named z
1e5d0 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a  Id.  Return -1.*
1e5e0 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  * if not found..
1e5f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64  */.int sqlite3Id
1e600 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74  ListIndex(IdList
1e610 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63   *pList, const c
1e620 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
1e630 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
1e640 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31  t==0 ) return -1
1e650 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1e660 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
1e670 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1e680 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61  StrICmp(pList->a
1e690 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  [i].zName, zName
1e6a0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b  )==0 ) return i;
1e6b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
1e6c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e  ;.}../*.** Expan
1e6d0 64 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f  d the space allo
1e6e0 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 67 69  cated for the gi
1e6f0 76 65 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a 65  ven SrcList obje
1e700 63 74 20 62 79 0a 2a 2a 20 63 72 65 61 74 69 6e  ct by.** creatin
1e710 67 20 6e 45 78 74 72 61 20 6e 65 77 20 73 6c 6f  g nExtra new slo
1e720 74 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  ts beginning at 
1e730 69 53 74 61 72 74 2e 20 20 69 53 74 61 72 74 20  iStart.  iStart 
1e740 69 73 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a 2a  is zero based..*
1e750 2a 20 4e 65 77 20 73 6c 6f 74 73 20 61 72 65 20  * New slots are 
1e760 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  zeroed..**.** Fo
1e770 72 20 65 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f  r example, suppo
1e780 73 65 20 61 20 53 72 63 4c 69 73 74 20 69 6e 69  se a SrcList ini
1e790 74 69 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20  tially contains 
1e7a0 74 77 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c 42  two entries: A,B
1e7b0 2e 0a 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20 33  ..** To append 3
1e7c0 20 6e 65 77 20 65 6e 74 72 69 65 73 20 6f 6e 74   new entries ont
1e7d0 6f 20 74 68 65 20 65 6e 64 2c 20 64 6f 20 74 68  o the end, do th
1e7e0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c  is:.**.**    sql
1e7f0 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72  ite3SrcListEnlar
1e800 67 65 28 64 62 2c 20 70 53 72 63 6c 69 73 74 2c  ge(db, pSrclist,
1e810 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66   3, 2);.**.** Af
1e820 74 65 72 20 74 68 65 20 63 61 6c 6c 20 61 62 6f  ter the call abo
1e830 76 65 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e 74  ve it would cont
1e840 61 69 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c 2c  ain:  A, B, nil,
1e850 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66   nil, nil..** If
1e860 20 74 68 65 20 69 53 74 61 72 74 20 61 72 67 75   the iStart argu
1e870 6d 65 6e 74 20 68 61 64 20 62 65 65 6e 20 31 20  ment had been 1 
1e880 69 6e 73 74 65 61 64 20 6f 66 20 32 2c 20 74 68  instead of 2, th
1e890 65 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  en the result.**
1e8a0 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   would have been
1e8b0 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20  :  A, nil, nil, 
1e8c0 6e 69 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65 70  nil, B.  To prep
1e8d0 65 6e 64 20 74 68 65 20 6e 65 77 20 73 6c 6f 74  end the new slot
1e8e0 73 2c 0a 2a 2a 20 74 68 65 20 69 53 74 61 72 74  s,.** the iStart
1e8f0 20 76 61 6c 75 65 20 77 6f 75 6c 64 20 62 65 20   value would be 
1e900 30 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 74  0.  The result t
1e910 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a  hen would.** be:
1e920 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20   nil, nil, nil, 
1e930 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  A, B..**.** If a
1e940 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
1e950 6f 6e 20 66 61 69 6c 73 20 74 68 65 20 53 72 63  on fails the Src
1e960 4c 69 73 74 20 69 73 20 75 6e 63 68 61 6e 67 65  List is unchange
1e970 64 2e 20 20 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d  d.  The.** db->m
1e980 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
1e990 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
1e9a0 74 72 75 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74  true..*/.SrcList
1e9b0 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
1e9c0 45 6e 6c 61 72 67 65 28 0a 20 20 73 71 6c 69 74  Enlarge(.  sqlit
1e9d0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 2f 2a  e3 *db,       /*
1e9e0 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
1e9f0 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f  tion to notify o
1ea00 66 20 4f 4f 4d 20 65 72 72 6f 72 73 20 2a 2f 0a  f OOM errors */.
1ea10 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
1ea20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 72 63 4c       /* The SrcL
1ea30 69 73 74 20 74 6f 20 62 65 20 65 6e 6c 61 72 67  ist to be enlarg
1ea40 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  ed */.  int nExt
1ea50 72 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ra,        /* Nu
1ea60 6d 62 65 72 20 6f 66 20 6e 65 77 20 73 6c 6f 74  mber of new slot
1ea70 73 20 74 6f 20 61 64 64 20 74 6f 20 70 53 72 63  s to add to pSrc
1ea80 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  ->a[] */.  int i
1ea90 53 74 61 72 74 20 20 20 20 20 20 20 20 20 2f 2a  Start         /*
1eaa0 20 49 6e 64 65 78 20 69 6e 20 70 53 72 63 2d 3e   Index in pSrc->
1eab0 61 5b 5d 20 6f 66 20 66 69 72 73 74 20 6e 65 77  a[] of first new
1eac0 20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e   slot */.){.  in
1ead0 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74  t i;..  /* Sanit
1eae0 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 63 61  y checking on ca
1eaf0 6c 6c 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73  lling parameters
1eb00 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53   */.  assert( iS
1eb10 74 61 72 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73  tart>=0 );.  ass
1eb20 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 31 20 29  ert( nExtra>=1 )
1eb30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
1eb40 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1eb50 20 69 53 74 61 72 74 3c 3d 70 53 72 63 2d 3e 6e   iStart<=pSrc->n
1eb60 53 72 63 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  Src );..  /* All
1eb70 6f 63 61 74 65 20 61 64 64 69 74 69 6f 6e 61 6c  ocate additional
1eb80 20 73 70 61 63 65 20 69 66 20 6e 65 65 64 65 64   space if needed
1eb90 20 2a 2f 0a 20 20 69 66 28 20 28 75 33 32 29 70   */.  if( (u32)p
1eba0 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61  Src->nSrc+nExtra
1ebb0 3e 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 29 7b  >pSrc->nAlloc ){
1ebc0 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  .    SrcList *pN
1ebd0 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c  ew;.    int nAll
1ebe0 6f 63 20 3d 20 70 53 72 63 2d 3e 6e 53 72 63 2a  oc = pSrc->nSrc*
1ebf0 32 2b 6e 45 78 74 72 61 3b 0a 20 20 20 20 69 6e  2+nExtra;.    in
1ec00 74 20 6e 47 6f 74 3b 0a 20 20 20 20 70 4e 65 77  t nGot;.    pNew
1ec10 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
1ec20 6c 6f 63 28 64 62 2c 20 70 53 72 63 2c 0a 20 20  loc(db, pSrc,.  
1ec30 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
1ec40 65 6f 66 28 2a 70 53 72 63 29 20 2b 20 28 6e 41  eof(*pSrc) + (nA
1ec50 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70  lloc-1)*sizeof(p
1ec60 53 72 63 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  Src->a[0]) );.  
1ec70 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
1ec80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64  .      assert( d
1ec90 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1eca0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1ecb0 70 53 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pSrc;.    }.    
1ecc0 70 53 72 63 20 3d 20 70 4e 65 77 3b 0a 20 20 20  pSrc = pNew;.   
1ecd0 20 6e 47 6f 74 20 3d 20 28 73 71 6c 69 74 65 33   nGot = (sqlite3
1ece0 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c  DbMallocSize(db,
1ecf0 20 70 4e 65 77 29 20 2d 20 73 69 7a 65 6f 66 28   pNew) - sizeof(
1ed00 2a 70 53 72 63 29 29 2f 73 69 7a 65 6f 66 28 70  *pSrc))/sizeof(p
1ed10 53 72 63 2d 3e 61 5b 30 5d 29 2b 31 3b 0a 20 20  Src->a[0])+1;.  
1ed20 20 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 3d    pSrc->nAlloc =
1ed30 20 6e 47 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   nGot;.  }..  /*
1ed40 20 4d 6f 76 65 20 65 78 69 73 74 69 6e 67 20 73   Move existing s
1ed50 6c 6f 74 73 20 74 68 61 74 20 63 6f 6d 65 20 61  lots that come a
1ed60 66 74 65 72 20 74 68 65 20 6e 65 77 6c 79 20 69  fter the newly i
1ed70 6e 73 65 72 74 65 64 20 73 6c 6f 74 73 0a 20 20  nserted slots.  
1ed80 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20 77 61  ** out of the wa
1ed90 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 53 72  y */.  for(i=pSr
1eda0 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 69 53  c->nSrc-1; i>=iS
1edb0 74 61 72 74 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  tart; i--){.    
1edc0 70 53 72 63 2d 3e 61 5b 69 2b 6e 45 78 74 72 61  pSrc->a[i+nExtra
1edd0 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a  ] = pSrc->a[i];.
1ede0 20 20 7d 0a 20 20 70 53 72 63 2d 3e 6e 53 72 63    }.  pSrc->nSrc
1edf0 20 2b 3d 20 6e 45 78 74 72 61 3b 0a 0a 20 20 2f   += nExtra;..  /
1ee00 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c 79  * Zero the newly
1ee10 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73   allocated slots
1ee20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 53   */.  memset(&pS
1ee30 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30  rc->a[iStart], 0
1ee40 2c 20 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61  , sizeof(pSrc->a
1ee50 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20  [0])*nExtra);.  
1ee60 66 6f 72 28 69 3d 69 53 74 61 72 74 3b 20 69 3c  for(i=iStart; i<
1ee70 69 53 74 61 72 74 2b 6e 45 78 74 72 61 3b 20 69  iStart+nExtra; i
1ee80 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61  ++){.    pSrc->a
1ee90 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31  [i].iCursor = -1
1eea0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75  ;.  }..  /* Retu
1eeb0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1eec0 74 68 65 20 65 6e 6c 61 72 67 65 64 20 53 72 63  the enlarged Src
1eed0 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e  List */.  return
1eee0 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   pSrc;.}.../*.**
1eef0 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61   Append a new ta
1ef00 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20  ble name to the 
1ef10 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20  given SrcList.  
1ef20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 72 63  Create a new Src
1ef30 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
1ef40 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79  be.  A new entry
1ef50 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 74   is created in t
1ef60 68 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20  he SrcList even 
1ef70 69 66 20 70 54 61 62 6c 65 20 69 73 20 4e 55 4c  if pTable is NUL
1ef80 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69  L..**.** A SrcLi
1ef90 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  st is returned, 
1efa0 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65  or NULL if there
1efb0 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   is an OOM error
1efc0 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 0a  .  The returned.
1efd0 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74  ** SrcList might
1efe0 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
1eff0 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74  the SrcList that
1f000 20 77 61 73 20 69 6e 70 75 74 20 6f 72 20 69 74   was input or it
1f010 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e   might be.** a n
1f020 65 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f  ew one.  If an O
1f030 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  OM error does oc
1f040 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 70  curs, then the p
1f050 72 69 6f 72 20 76 61 6c 75 65 20 6f 66 20 70 4c  rior value of pL
1f060 69 73 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 69  ist.** that is i
1f070 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75  nput to this rou
1f080 74 69 6e 65 20 69 73 20 61 75 74 6f 6d 61 74 69  tine is automati
1f090 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a  cally freed..**.
1f0a0 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20  ** If pDatabase 
1f0b0 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20  is not null, it 
1f0c0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74  means that the t
1f0d0 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69  able has an opti
1f0e0 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65  onal.** database
1f0f0 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c   name prefix.  L
1f100 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61  ike this:  "data
1f110 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68  base.table".  Th
1f120 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70  e pDatabase.** p
1f130 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62  oints to the tab
1f140 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
1f150 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f  pTable points to
1f160 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
1f170 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69  me..** The SrcLi
1f180 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65  st.a[].zName fie
1f190 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  ld is filled wit
1f1a0 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  h the table name
1f1b0 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20   which might.** 
1f1c0 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65  come from pTable
1f1d0 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69   (if pDatabase i
1f1e0 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20  s NULL) or from 
1f1f0 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20  pDatabase.  .** 
1f200 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74  SrcList.a[].zDat
1f210 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20  abase is filled 
1f220 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
1f230 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62  e name from pTab
1f240 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e  le,.** or with N
1f250 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61  ULL if no databa
1f260 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e  se is specified.
1f270 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  .**.** In other 
1f280 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c  words, if call l
1f290 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
1f2a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
1f2b0 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41  rcListAppend(D,A
1f2c0 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,0);.**.** The
1f2d0 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e  n B is a table n
1f2e0 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
1f2f0 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73  base name is uns
1f300 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61  pecified.  If ca
1f310 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69  lled.** like thi
1f320 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
1f330 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1f340 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a  ppend(D,A,B,C);.
1f350 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20  **.** Then C is 
1f360 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  the table name a
1f370 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61  nd B is the data
1f380 62 61 73 65 20 6e 61 6d 65 2e 20 20 49 66 20 43  base name.  If C
1f390 20 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74   is defined.** t
1f3a0 68 65 6e 20 73 6f 20 69 73 20 42 2e 20 20 49 6e  hen so is B.  In
1f3b0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 65   other words, we
1f3c0 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 63 61   never have a ca
1f3d0 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a 20  se where:.**.** 
1f3e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
1f3f0 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41  rcListAppend(D,A
1f400 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74  ,0,C);.**.** Bot
1f410 68 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61  h pTable and pDa
1f420 74 61 62 61 73 65 20 61 72 65 20 61 73 73 75 6d  tabase are assum
1f430 65 64 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e  ed to be quoted.
1f440 20 20 54 68 65 79 20 61 72 65 20 64 65 71 75 6f    They are dequo
1f450 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62 65  ted.** before be
1f460 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68 65  ing added to the
1f470 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72 63   SrcList..*/.Src
1f480 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
1f490 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 73 71  ListAppend(.  sq
1f4a0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1f4b0 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
1f4c0 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c  to notify of mal
1f4d0 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a  loc failures */.
1f4e0 20 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74    SrcList *pList
1f4f0 2c 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20  ,     /* Append 
1f500 74 6f 20 74 68 69 73 20 53 72 63 4c 69 73 74 2e  to this SrcList.
1f510 20 4e 55 4c 4c 20 63 72 65 61 74 65 73 20 61 20   NULL creates a 
1f520 6e 65 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20  new SrcList */. 
1f530 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20   Token *pTable, 
1f540 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
1f550 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b   append */.  Tok
1f560 65 6e 20 2a 70 44 61 74 61 62 61 73 65 20 20 20  en *pDatabase   
1f570 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 66 20   /* Database of 
1f580 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  the table */.){.
1f590 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1f5a0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1f5b0 61 73 73 65 72 74 28 20 70 44 61 74 61 62 61 73  assert( pDatabas
1f5c0 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65 21 3d  e==0 || pTable!=
1f5d0 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20  0 );  /* Cannot 
1f5e0 68 61 76 65 20 43 20 77 69 74 68 6f 75 74 20 42  have C without B
1f5f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62   */.  assert( db
1f600 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69  !=0 );.  if( pLi
1f610 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
1f620 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
1f630 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
1f640 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b  zeof(SrcList) );
1f650 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
1f660 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1f670 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20    pList->nAlloc 
1f680 3d 20 31 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  = 1;.    pList->
1f690 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 6d 65  nSrc = 1;.    me
1f6a0 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 30  mset(&pList->a[0
1f6b0 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69  ], 0, sizeof(pLi
1f6c0 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20  st->a[0]));.    
1f6d0 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72  pList->a[0].iCur
1f6e0 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73  sor = -1;.  }els
1f6f0 65 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  e{.    pList = s
1f700 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
1f710 61 72 67 65 28 64 62 2c 20 70 4c 69 73 74 2c 20  arge(db, pList, 
1f720 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b  1, pList->nSrc);
1f730 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d  .  }.  if( db->m
1f740 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
1f750 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
1f760 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
1f770 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  t);.    return 0
1f780 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20  ;.  }.  pItem = 
1f790 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
1f7a0 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20  >nSrc-1];.  if( 
1f7b0 70 44 61 74 61 62 61 73 65 20 26 26 20 70 44 61  pDatabase && pDa
1f7c0 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a  tabase->z==0 ){.
1f7d0 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20      pDatabase = 
1f7e0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61  0;.  }.  if( pDa
1f7f0 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20 70 49  tabase ){.    pI
1f800 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
1f810 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1f820 6e 28 64 62 2c 20 70 44 61 74 61 62 61 73 65 29  n(db, pDatabase)
1f830 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 44 61  ;.    pItem->zDa
1f840 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33  tabase = sqlite3
1f850 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
1f860 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 7d 65 6c  , pTable);.  }el
1f870 73 65 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  se{.    pItem->z
1f880 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
1f890 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
1f8a0 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 49 74  pTable);.    pIt
1f8b0 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
1f8c0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1f8d0 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
1f8e0 41 73 73 69 67 6e 20 56 64 62 65 43 75 72 73 6f  Assign VdbeCurso
1f8f0 72 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 73 20  r index numbers 
1f900 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  to all tables in
1f910 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f   a SrcList.*/.vo
1f920 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
1f930 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50  tAssignCursors(P
1f940 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
1f950 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  cList *pList){. 
1f960 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1f970 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1f980 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 70  Item;.  assert(p
1f990 4c 69 73 74 20 7c 7c 20 70 50 61 72 73 65 2d 3e  List || pParse->
1f9a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1f9b0 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   );.  if( pList 
1f9c0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  ){.    for(i=0, 
1f9d0 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  pItem=pList->a; 
1f9e0 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  i<pList->nSrc; i
1f9f0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1fa00 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69      if( pItem->i
1fa10 43 75 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61  Cursor>=0 ) brea
1fa20 6b 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  k;.      pItem->
1fa30 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65  iCursor = pParse
1fa40 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
1fa50 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  if( pItem->pSele
1fa60 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
1fa70 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
1fa80 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
1fa90 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
1faa0 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20 7d  ->pSrc);.      }
1fab0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1fac0 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
1fad0 74 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63  tire SrcList inc
1fae0 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73  luding all its s
1faf0 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  ubstructure..*/.
1fb00 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
1fb10 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  istDelete(sqlite
1fb20 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a  3 *db, SrcList *
1fb30 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
1fb40 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1fb50 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1fb60 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
1fb70 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49  return;.  for(pI
1fb80 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
1fb90 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63  0; i<pList->nSrc
1fba0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
1fbb0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1fbc0 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 44  ee(db, pItem->zD
1fbd0 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71  atabase);.    sq
1fbe0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1fbf0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
1fc00 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1fc10 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  (db, pItem->zAli
1fc20 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  as);.    if( pIt
1fc30 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64  em->fg.isIndexed
1fc40 42 79 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  By ) sqlite3DbFr
1fc50 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 75 31  ee(db, pItem->u1
1fc60 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20  .zIndexedBy);.  
1fc70 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
1fc80 69 73 54 61 62 46 75 6e 63 20 29 20 73 71 6c 69  isTabFunc ) sqli
1fc90 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
1fca0 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 75 31 2e  e(db, pItem->u1.
1fcb0 70 46 75 6e 63 41 72 67 29 3b 0a 20 20 20 20 73  pFuncArg);.    s
1fcc0 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
1fcd0 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 54 61  e(db, pItem->pTa
1fce0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  b);.    sqlite3S
1fcf0 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
1fd00 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pItem->pSelect);
1fd10 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1fd20 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
1fd30 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ->pOn);.    sqli
1fd40 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
1fd50 64 62 2c 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e  db, pItem->pUsin
1fd60 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  g);.  }.  sqlite
1fd70 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c  3DbFreeNN(db, pL
1fd80 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ist);.}../*.** T
1fd90 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1fda0 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
1fdb0 73 65 72 20 74 6f 20 61 64 64 20 61 20 6e 65 77  ser to add a new
1fdc0 20 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20   term to the.** 
1fdd0 65 6e 64 20 6f 66 20 61 20 67 72 6f 77 69 6e 67  end of a growing
1fde0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
1fdf0 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72  he "p" parameter
1fe00 20 69 73 20 74 68 65 20 70 61 72 74 20 6f 66 0a   is the part of.
1fe10 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
1fe20 73 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  se that has alre
1fe30 61 64 79 20 62 65 65 6e 20 63 6f 6e 73 74 72 75  ady been constru
1fe40 63 74 65 64 2e 20 20 22 70 22 20 69 73 20 4e 55  cted.  "p" is NU
1fe50 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73  LL.** if this is
1fe60 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   the first term 
1fe70 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
1fe80 73 65 2e 20 20 70 54 61 62 6c 65 20 61 6e 64 20  se.  pTable and 
1fe90 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 61 72 65  pDatabase.** are
1fea0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
1feb0 20 74 61 62 6c 65 20 61 6e 64 20 64 61 74 61 62   table and datab
1fec0 61 73 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65  ase named in the
1fed0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
1fee0 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20  m..** pDatabase 
1fef0 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 64  is NULL if the d
1ff00 61 74 61 62 61 73 65 20 6e 61 6d 65 20 71 75 61  atabase name qua
1ff10 6c 69 66 69 65 72 20 69 73 20 6d 69 73 73 69 6e  lifier is missin
1ff20 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61 6c  g - the.** usual
1ff30 20 63 61 73 65 2e 20 20 49 66 20 74 68 65 20 74   case.  If the t
1ff40 65 72 6d 20 68 61 73 20 61 6e 20 61 6c 69 61 73  erm has an alias
1ff50 2c 20 74 68 65 6e 20 70 41 6c 69 61 73 20 70 6f  , then pAlias po
1ff60 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 61  ints to the.** a
1ff70 6c 69 61 73 20 74 6f 6b 65 6e 2e 20 20 49 66 20  lias token.  If 
1ff80 74 68 65 20 74 65 72 6d 20 69 73 20 61 20 73 75  the term is a su
1ff90 62 71 75 65 72 79 2c 20 74 68 65 6e 20 70 53 75  bquery, then pSu
1ffa0 62 71 75 65 72 79 20 69 73 20 74 68 65 0a 2a 2a  bquery is the.**
1ffb0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1ffc0 74 20 74 68 61 74 20 74 68 65 20 73 75 62 71 75  t that the subqu
1ffd0 65 72 79 20 65 6e 63 6f 64 65 73 2e 20 20 54 68  ery encodes.  Th
1ffe0 65 20 70 54 61 62 6c 65 20 61 6e 64 0a 2a 2a 20  e pTable and.** 
1fff0 70 44 61 74 61 62 61 73 65 20 70 61 72 61 6d 65  pDatabase parame
20000 74 65 72 73 20 61 72 65 20 4e 55 4c 4c 20 66 6f  ters are NULL fo
20010 72 20 73 75 62 71 75 65 72 69 65 73 2e 20 20 54  r subqueries.  T
20020 68 65 20 70 4f 6e 20 61 6e 64 20 70 55 73 69 6e  he pOn and pUsin
20030 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20  g.** parameters 
20040 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  are the content 
20050 6f 66 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53  of the ON and US
20060 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ING clauses..**.
20070 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 65 77 20  ** Return a new 
20080 53 72 63 4c 69 73 74 20 77 68 69 63 68 20 65 6e  SrcList which en
20090 63 6f 64 65 73 20 69 73 20 74 68 65 20 46 52 4f  codes is the FRO
200a0 4d 20 77 69 74 68 20 74 68 65 20 6e 65 77 0a 2a  M with the new.*
200b0 2a 20 74 65 72 6d 20 61 64 64 65 64 2e 0a 2a 2f  * term added..*/
200c0 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
200d0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72  3SrcListAppendFr
200e0 6f 6d 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20  omTerm(.  Parse 
200f0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
20100 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
20110 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
20120 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
20130 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 70 61    /* The left pa
20140 72 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  rt of the FROM c
20150 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 73 65  lause already se
20160 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  en */.  Token *p
20170 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
20180 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
20190 61 62 6c 65 20 74 6f 20 61 64 64 20 74 6f 20 74  able to add to t
201a0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
201b0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61  /.  Token *pData
201c0 62 61 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 4e  base,       /* N
201d0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
201e0 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  ase containing p
201f0 54 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  Table */.  Token
20200 20 2a 70 41 6c 69 61 73 2c 20 20 20 20 20 20 20   *pAlias,       
20210 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
20220 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
20230 20 41 53 20 73 75 62 65 78 70 72 65 73 73 69 6f   AS subexpressio
20240 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  n */.  Select *p
20250 53 75 62 71 75 65 72 79 2c 20 20 20 20 20 20 2f  Subquery,      /
20260 2a 20 41 20 73 75 62 71 75 65 72 79 20 75 73 65  * A subquery use
20270 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20  d in place of a 
20280 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  table name */.  
20290 45 78 70 72 20 2a 70 4f 6e 2c 20 20 20 20 20 20  Expr *pOn,      
202a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f          /* The O
202b0 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f  N clause of a jo
202c0 69 6e 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a  in */.  IdList *
202d0 70 55 73 69 6e 67 20 20 20 20 20 20 20 20 20 20  pUsing          
202e0 2f 2a 20 54 68 65 20 55 53 49 4e 47 20 63 6c 61  /* The USING cla
202f0 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f  use of a join */
20300 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63  .){.  struct Src
20310 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
20320 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
20330 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
20340 69 66 28 20 21 70 20 26 26 20 28 70 4f 6e 20 7c  if( !p && (pOn |
20350 7c 20 70 55 73 69 6e 67 29 20 29 7b 0a 20 20 20  | pUsing) ){.   
20360 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
20370 28 70 50 61 72 73 65 2c 20 22 61 20 4a 4f 49 4e  (pParse, "a JOIN
20380 20 63 6c 61 75 73 65 20 69 73 20 72 65 71 75 69   clause is requi
20390 72 65 64 20 62 65 66 6f 72 65 20 25 73 22 2c 20  red before %s", 
203a0 0a 20 20 20 20 20 20 28 70 4f 6e 20 3f 20 22 4f  .      (pOn ? "O
203b0 4e 22 20 3a 20 22 55 53 49 4e 47 22 29 0a 20 20  N" : "USING").  
203c0 20 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61 70    );.    goto ap
203d0 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b  pend_from_error;
203e0 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74  .  }.  p = sqlit
203f0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
20400 64 62 2c 20 70 2c 20 70 54 61 62 6c 65 2c 20 70  db, p, pTable, p
20410 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28  Database);.  if(
20420 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74   p==0 ){.    got
20430 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72  o append_from_er
20440 72 6f 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ror;.  }.  asser
20450 74 28 20 70 2d 3e 6e 53 72 63 3e 30 20 29 3b 0a  t( p->nSrc>0 );.
20460 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b    pItem = &p->a[
20470 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 61 73  p->nSrc-1];.  as
20480 73 65 72 74 28 20 70 41 6c 69 61 73 21 3d 30 20  sert( pAlias!=0 
20490 29 3b 0a 20 20 69 66 28 20 70 41 6c 69 61 73 2d  );.  if( pAlias-
204a0 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d  >n ){.    pItem-
204b0 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65  >zAlias = sqlite
204c0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
204d0 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20 7d 0a  b, pAlias);.  }.
204e0 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74    pItem->pSelect
204f0 20 3d 20 70 53 75 62 71 75 65 72 79 3b 0a 20 20   = pSubquery;.  
20500 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e  pItem->pOn = pOn
20510 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e  ;.  pItem->pUsin
20520 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72 65  g = pUsing;.  re
20530 74 75 72 6e 20 70 3b 0a 0a 20 61 70 70 65 6e 64  turn p;.. append
20540 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 61  _from_error:.  a
20550 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20  ssert( p==0 );. 
20560 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
20570 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a 20 20 73  te(db, pOn);.  s
20580 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
20590 74 65 28 64 62 2c 20 70 55 73 69 6e 67 29 3b 0a  te(db, pUsing);.
205a0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
205b0 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 71 75  elete(db, pSubqu
205c0 65 72 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ery);.  return 0
205d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
205e0 6e 20 49 4e 44 45 58 45 44 20 42 59 20 6f 72 20  n INDEXED BY or 
205f0 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75  NOT INDEXED clau
20600 73 65 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72  se to the most r
20610 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 0a 2a  ecently added .*
20620 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  * element of the
20630 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 70 61 73   source-list pas
20640 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
20650 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76  d argument..*/.v
20660 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
20670 73 74 49 6e 64 65 78 65 64 42 79 28 50 61 72 73  stIndexedBy(Pars
20680 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
20690 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a 70 49  st *p, Token *pI
206a0 6e 64 65 78 65 64 42 79 29 7b 0a 20 20 61 73 73  ndexedBy){.  ass
206b0 65 72 74 28 20 70 49 6e 64 65 78 65 64 42 79 21  ert( pIndexedBy!
206c0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26  =0 );.  if( p &&
206d0 20 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3e 30   pIndexedBy->n>0
206e0 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53   ){.    struct S
206f0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
20700 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  em;.    assert( 
20710 70 2d 3e 6e 53 72 63 3e 30 20 29 3b 0a 20 20 20  p->nSrc>0 );.   
20720 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70   pItem = &p->a[p
20730 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61  ->nSrc-1];.    a
20740 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
20750 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29  .notIndexed==0 )
20760 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
20770 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65  tem->fg.isIndexe
20780 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  dBy==0 );.    as
20790 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e  sert( pItem->fg.
207a0 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a  isTabFunc==0 );.
207b0 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 65 64      if( pIndexed
207c0 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21 70 49 6e  By->n==1 && !pIn
207d0 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b 0a 20 20  dexedBy->z ){.  
207e0 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54 20 49 4e      /* A "NOT IN
207f0 44 45 58 45 44 22 20 63 6c 61 75 73 65 20 77 61  DEXED" clause wa
20800 73 20 73 75 70 70 6c 69 65 64 2e 20 53 65 65 20  s supplied. See 
20810 70 61 72 73 65 2e 79 20 0a 20 20 20 20 20 20 2a  parse.y .      *
20820 2a 20 63 6f 6e 73 74 72 75 63 74 20 22 69 6e 64  * construct "ind
20830 65 78 65 64 5f 6f 70 74 22 20 66 6f 72 20 64 65  exed_opt" for de
20840 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20  tails. */.      
20850 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64  pItem->fg.notInd
20860 65 78 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65  exed = 1;.    }e
20870 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65 6d  lse{.      pItem
20880 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 20  ->u1.zIndexedBy 
20890 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
208a0 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
208b0 62 2c 20 70 49 6e 64 65 78 65 64 42 79 29 3b 0a  b, pIndexedBy);.
208c0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e        pItem->fg.
208d0 69 73 49 6e 64 65 78 65 64 42 79 20 3d 20 31 3b  isIndexedBy = 1;
208e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
208f0 0a 2a 2a 20 41 64 64 20 74 68 65 20 6c 69 73 74  .** Add the list
20900 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67   of function arg
20910 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 53 72  uments to the Sr
20920 63 4c 69 73 74 20 65 6e 74 72 79 20 66 6f 72 20  cList entry for 
20930 61 0a 2a 2a 20 74 61 62 6c 65 2d 76 61 6c 75 65  a.** table-value
20940 64 2d 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  d-function..*/.v
20950 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
20960 73 74 46 75 6e 63 41 72 67 73 28 50 61 72 73 65  stFuncArgs(Parse
20970 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
20980 74 20 2a 70 2c 20 45 78 70 72 4c 69 73 74 20 2a  t *p, ExprList *
20990 70 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70 20  pList){.  if( p 
209a0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
209b0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
209c0 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72  m = &p->a[p->nSr
209d0 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  c-1];.    assert
209e0 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49  ( pItem->fg.notI
209f0 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20  ndexed==0 );.   
20a00 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
20a10 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 3d 3d  fg.isIndexedBy==
20a20 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
20a30 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62   pItem->fg.isTab
20a40 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Func==0 );.    p
20a50 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
20a60 67 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 70  g = pList;.    p
20a70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
20a80 6e 63 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  nc = 1;.  }else{
20a90 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
20aa0 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73  ListDelete(pPars
20ab0 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  e->db, pList);. 
20ac0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e   }.}../*.** When
20ad0 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61 20 46   building up a F
20ae0 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68  ROM clause in th
20af0 65 20 70 61 72 73 65 72 2c 20 74 68 65 20 6a 6f  e parser, the jo
20b00 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69  in operator.** i
20b10 73 20 69 6e 69 74 69 61 6c 6c 79 20 61 74 74 61  s initially atta
20b20 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74  ched to the left
20b30 20 6f 70 65 72 61 6e 64 2e 20 20 42 75 74 20 74   operand.  But t
20b40 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
20b50 72 0a 2a 2a 20 65 78 70 65 63 74 73 20 74 68 65  r.** expects the
20b60 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 74   join operator t
20b70 6f 20 62 65 20 6f 6e 20 74 68 65 20 72 69 67 68  o be on the righ
20b80 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73  t operand.  This
20b90 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69 66   routine.** Shif
20ba0 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72  ts all join oper
20bb0 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74 20  ators from left 
20bc0 74 6f 20 72 69 67 68 74 20 66 6f 72 20 61 6e 20  to right for an 
20bd0 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20 63  entire FROM.** c
20be0 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  lause..**.** Exa
20bf0 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65 20 74 68  mple: Suppose th
20c00 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20 74  e join is like t
20c10 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
20c20 20 20 20 20 20 41 20 6e 61 74 75 72 61 6c 20 63       A natural c
20c30 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a  ross join B.**.*
20c40 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20 69  * The operator i
20c50 73 20 22 6e 61 74 75 72 61 6c 20 63 72 6f 73 73  s "natural cross
20c60 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41 20 61   join".  The A a
20c70 6e 64 20 42 20 6f 70 65 72 61 6e 64 73 20 61 72  nd B operands ar
20c80 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70  e stored.** in p
20c90 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61 5b  ->a[0] and p->a[
20ca0 31 5d 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  1], respectively
20cb0 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e  .  The parser in
20cc0 69 74 69 61 6c 6c 79 20 73 74 6f 72 65 73 20 74  itially stores t
20cd0 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 77  he.** operator w
20ce0 69 74 68 20 41 2e 20 20 54 68 69 73 20 72 6f 75  ith A.  This rou
20cf0 74 69 6e 65 20 73 68 69 66 74 73 20 74 68 61 74  tine shifts that
20d00 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72 20 74   operator over t
20d10 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  o B..*/.void sql
20d20 69 74 65 33 53 72 63 4c 69 73 74 53 68 69 66 74  ite3SrcListShift
20d30 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c 69 73 74  JoinType(SrcList
20d40 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
20d50 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
20d60 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b  for(i=p->nSrc-1;
20d70 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   i>0; i--){.    
20d80 20 20 70 2d 3e 61 5b 69 5d 2e 66 67 2e 6a 6f 69    p->a[i].fg.joi
20d90 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31  ntype = p->a[i-1
20da0 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20  ].fg.jointype;. 
20db0 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d     }.    p->a[0]
20dc0 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30  .fg.jointype = 0
20dd0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
20de0 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
20df0 65 20 66 6f 72 20 61 20 42 45 47 49 4e 20 73 74  e for a BEGIN st
20e00 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
20e10 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72 61   sqlite3BeginTra
20e20 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  nsaction(Parse *
20e30 70 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70 65  pParse, int type
20e40 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
20e50 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
20e60 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28  nt i;..  assert(
20e70 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20   pParse!=0 );.  
20e80 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
20e90 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
20ea0 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
20eb0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
20ec0 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e, SQLITE_TRANSA
20ed0 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20  CTION, "BEGIN", 
20ee0 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74  0, 0) ){.    ret
20ef0 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73  urn;.  }.  v = s
20f00 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
20f10 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20  arse);.  if( !v 
20f20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
20f30 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45  type!=TK_DEFERRE
20f40 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  D ){.    for(i=0
20f50 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
20f60 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
20f70 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
20f80 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c  _Transaction, i,
20f90 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55   (type==TK_EXCLU
20fa0 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 20 20  SIVE)+1);.      
20fb0 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
20fc0 74 72 65 65 28 76 2c 20 69 29 3b 0a 20 20 20 20  tree(v, i);.    
20fd0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  }.  }.  sqlite3V
20fe0 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
20ff0 41 75 74 6f 43 6f 6d 6d 69 74 29 3b 0a 7d 0a 0a  AutoCommit);.}..
21000 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
21010 44 42 45 20 63 6f 64 65 20 66 6f 72 20 61 20 43  DBE code for a C
21020 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43  OMMIT or ROLLBAC
21030 4b 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  K statement..** 
21040 43 6f 64 65 20 66 6f 72 20 52 4f 4c 4c 42 41 43  Code for ROLLBAC
21050 4b 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 69  K is generated i
21060 66 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c  f eType==TK_ROLL
21070 42 41 43 4b 2e 20 20 4f 74 68 65 72 77 69 73 65  BACK.  Otherwise
21080 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67 65 6e 65  .** code is gene
21090 72 61 74 65 64 20 66 6f 72 20 61 20 43 4f 4d 4d  rated for a COMM
210a0 49 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  IT..*/.void sqli
210b0 74 65 33 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  te3EndTransactio
210c0 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
210d0 20 69 6e 74 20 65 54 79 70 65 29 7b 0a 20 20 56   int eType){.  V
210e0 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 73  dbe *v;.  int is
210f0 52 6f 6c 6c 62 61 63 6b 3b 0a 0a 20 20 61 73 73  Rollback;..  ass
21100 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29  ert( pParse!=0 )
21110 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
21120 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61  se->db!=0 );.  a
21130 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 54 4b  ssert( eType==TK
21140 5f 43 4f 4d 4d 49 54 20 7c 7c 20 65 54 79 70 65  _COMMIT || eType
21150 3d 3d 54 4b 5f 45 4e 44 20 7c 7c 20 65 54 79 70  ==TK_END || eTyp
21160 65 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 20 29  e==TK_ROLLBACK )
21170 3b 0a 20 20 69 73 52 6f 6c 6c 62 61 63 6b 20 3d  ;.  isRollback =
21180 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c 42   eType==TK_ROLLB
21190 41 43 4b 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ACK;.  if( sqlit
211a0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
211b0 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
211c0 41 43 54 49 4f 4e 2c 20 0a 20 20 20 20 20 20 20  ACTION, .       
211d0 69 73 52 6f 6c 6c 62 61 63 6b 20 3f 20 22 52 4f  isRollback ? "RO
211e0 4c 4c 42 41 43 4b 22 20 3a 20 22 43 4f 4d 4d 49  LLBACK" : "COMMI
211f0 54 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20  T", 0, 0) ){.   
21200 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76   return;.  }.  v
21210 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
21220 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
21230 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
21240 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
21250 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c  P_AutoCommit, 1,
21260 20 69 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20   isRollback);.  
21270 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
21280 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
21290 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
212a0 20 77 68 65 6e 20 69 74 20 70 61 72 73 65 73 20   when it parses 
212b0 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 63 72 65  a command to cre
212c0 61 74 65 2c 0a 2a 2a 20 72 65 6c 65 61 73 65 20  ate,.** release 
212d0 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 53  or rollback an S
212e0 51 4c 20 73 61 76 65 70 6f 69 6e 74 2e 20 0a 2a  QL savepoint. .*
212f0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 61  /.void sqlite3Sa
21300 76 65 70 6f 69 6e 74 28 50 61 72 73 65 20 2a 70  vepoint(Parse *p
21310 50 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54  Parse, int op, T
21320 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
21330 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71  char *zName = sq
21340 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
21350 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
21360 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
21370 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  me ){.    Vdbe *
21380 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
21390 62 65 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e  be(pParse);.#ifn
213a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
213b0 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
213c0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
213d0 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 5b 5d  har * const az[]
213e0 20 3d 20 7b 20 22 42 45 47 49 4e 22 2c 20 22 52   = { "BEGIN", "R
213f0 45 4c 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42 41  ELEASE", "ROLLBA
21400 43 4b 22 20 7d 3b 0a 20 20 20 20 61 73 73 65 72  CK" };.    asser
21410 74 28 20 21 53 41 56 45 50 4f 49 4e 54 5f 42 45  t( !SAVEPOINT_BE
21420 47 49 4e 20 26 26 20 53 41 56 45 50 4f 49 4e 54  GIN && SAVEPOINT
21430 5f 52 45 4c 45 41 53 45 3d 3d 31 20 26 26 20 53  _RELEASE==1 && S
21440 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
21450 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 20  K==2 );.#endif. 
21460 20 20 20 69 66 28 20 21 76 20 7c 7c 20 73 71 6c     if( !v || sql
21470 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
21480 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 41 56  arse, SQLITE_SAV
21490 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20  EPOINT, az[op], 
214a0 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20  zName, 0) ){.   
214b0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
214c0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61  (pParse->db, zNa
214d0 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
214e0 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  n;.    }.    sql
214f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
21500 2c 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c 20  , OP_Savepoint, 
21510 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c  op, 0, 0, zName,
21520 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
21530 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
21540 73 75 72 65 20 74 68 65 20 54 45 4d 50 20 64 61  sure the TEMP da
21550 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61  tabase is open a
21560 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  nd available for
21570 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a   use.  Return.**
21580 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
21590 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e  rrors.  Leave an
215a0 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  y error messages
215b0 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
215c0 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74  tructure..*/.int
215d0 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70   sqlite3OpenTemp
215e0 44 61 74 61 62 61 73 65 28 50 61 72 73 65 20 2a  Database(Parse *
215f0 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
21600 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
21610 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61  >db;.  if( db->a
21620 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20  Db[1].pBt==0 && 
21630 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e  !pParse->explain
21640 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
21650 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a      Btree *pBt;.
21660 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
21670 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20 20   int flags = .  
21680 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
21690 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a  PEN_READWRITE |.
216a0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
216b0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20  _OPEN_CREATE |. 
216c0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
216d0 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c  OPEN_EXCLUSIVE |
216e0 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
216f0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
21700 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20  LOSE |.         
21710 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
21720 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20  P_DB;..    rc = 
21730 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e  sqlite3BtreeOpen
21740 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64 62  (db->pVfs, 0, db
21750 2c 20 26 70 42 74 2c 20 30 2c 20 66 6c 61 67 73  , &pBt, 0, flags
21760 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
21770 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21780 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
21790 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
217a0 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  e to open a temp
217b0 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22  orary database "
217c0 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66  .        "file f
217d0 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f  or storing tempo
217e0 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20  rary tables");. 
217f0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
21800 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
21810 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
21820 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 20 3d  db->aDb[1].pBt =
21830 20 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74   pBt;.    assert
21840 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ( db->aDb[1].pSc
21850 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20  hema );.    if( 
21860 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71  SQLITE_NOMEM==sq
21870 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
21880 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e  eSize(pBt, db->n
21890 65 78 74 50 61 67 65 73 69 7a 65 2c 20 2d 31 2c  extPagesize, -1,
218a0 20 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c   0) ){.      sql
218b0 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
218c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
218d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
218e0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
218f0 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   Record the fact
21900 20 74 68 61 74 20 74 68 65 20 73 63 68 65 6d 61   that the schema
21910 20 63 6f 6f 6b 69 65 20 77 69 6c 6c 20 6e 65 65   cookie will nee
21920 64 20 74 6f 20 62 65 20 76 65 72 69 66 69 65 64  d to be verified
21930 0a 2a 2a 20 66 6f 72 20 64 61 74 61 62 61 73 65  .** for database
21940 20 69 44 62 2e 20 20 54 68 65 20 63 6f 64 65 20   iDb.  The code 
21950 74 6f 20 61 63 74 75 61 6c 6c 79 20 76 65 72 69  to actually veri
21960 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  fy the schema co
21970 6f 6b 69 65 0a 2a 2a 20 77 69 6c 6c 20 6f 63 63  okie.** will occ
21980 75 72 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ur at the end of
21990 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 56   the top-level V
219a0 44 42 45 20 61 6e 64 20 77 69 6c 6c 20 62 65 20  DBE and will be 
219b0 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 6c 61 74  generated.** lat
219c0 65 72 2c 20 62 79 20 73 71 6c 69 74 65 33 46 69  er, by sqlite3Fi
219d0 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2f  nishCoding()..*/
219e0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
219f0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50 61  eVerifySchema(Pa
21a00 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
21a10 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a   iDb){.  Parse *
21a20 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
21a30 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
21a40 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 61 73 73  (pParse);..  ass
21a50 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
21a60 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e  Db<pParse->db->n
21a70 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
21a80 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
21a90 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69  iDb].pBt!=0 || i
21aa0 44 62 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  Db==1 );.  asser
21ab0 74 28 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41  t( iDb<SQLITE_MA
21ac0 58 5f 41 54 54 41 43 48 45 44 2b 32 20 29 3b 0a  X_ATTACHED+2 );.
21ad0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
21ae0 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
21af0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 69 44 62  (pParse->db, iDb
21b00 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20 44 62  , 0) );.  if( Db
21b10 4d 61 73 6b 54 65 73 74 28 70 54 6f 70 6c 65 76  MaskTest(pToplev
21b20 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20  el->cookieMask, 
21b30 69 44 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 44  iDb)==0 ){.    D
21b40 62 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c 65 76  bMaskSet(pToplev
21b50 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20  el->cookieMask, 
21b60 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 21 4f  iDb);.    if( !O
21b70 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
21b80 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  b==1 ){.      sq
21b90 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74  lite3OpenTempDat
21ba0 61 62 61 73 65 28 70 54 6f 70 6c 65 76 65 6c 29  abase(pToplevel)
21bb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
21bc0 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
21bd0 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 74 68   zDb is NULL, th
21be0 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 43  en call sqlite3C
21bf0 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
21c00 29 20 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20 61  ) for each .** a
21c10 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
21c20 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 6e 76  . Otherwise, inv
21c30 6f 6b 65 20 69 74 20 66 6f 72 20 74 68 65 20 64  oke it for the d
21c40 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20 7a 44  atabase named zD
21c50 62 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  b only..*/.void 
21c60 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
21c70 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 50 61 72  yNamedSchema(Par
21c80 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
21c90 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
21ca0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
21cb0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
21cc0 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
21cd0 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
21ce0 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
21cf0 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
21d00 28 20 70 44 62 2d 3e 70 42 74 20 26 26 20 28 21  ( pDb->pBt && (!
21d10 7a 44 62 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65  zDb || 0==sqlite
21d20 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 70 44  3StrICmp(zDb, pD
21d30 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 29 20 29 7b  b->zDbSName)) ){
21d40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
21d50 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
21d60 50 61 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d  Parse, i);.    }
21d70 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
21d80 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
21d90 20 74 68 61 74 20 70 72 65 70 61 72 65 73 20 66   that prepares f
21da0 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72  or doing an oper
21db0 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69  ation that.** mi
21dc0 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 64  ght change the d
21dd0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
21de0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72  his routine star
21df0 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  ts a new transac
21e00 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e  tion if we are n
21e10 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  ot already withi
21e20 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69  n.** a transacti
21e30 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20 61  on.  If we are a
21e40 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20 61 20  lready within a 
21e50 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
21e60 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a  n a checkpoint.*
21e70 2a 20 69 73 20 73 65 74 20 69 66 20 74 68 65 20  * is set if the 
21e80 73 65 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72  setStatement par
21e90 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e 20  ameter is true. 
21ea0 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68   A checkpoint sh
21eb0 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66  ould.** be set f
21ec0 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68  or operations th
21ed0 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64  at might fail (d
21ee0 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69  ue to a constrai
21ef0 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74  nt) part of.** t
21f00 68 65 20 77 61 79 20 74 68 72 6f 75 67 68 20 61  he way through a
21f10 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65  nd which will ne
21f20 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20  ed to undo some 
21f30 77 72 69 74 65 73 20 77 69 74 68 6f 75 74 20 68  writes without h
21f40 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c  aving to.** roll
21f50 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74  back the whole t
21f60 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72  ransaction.  For
21f70 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72   operations wher
21f80 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74  e all constraint
21f90 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63  s.** can be chec
21fa0 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63  ked before any c
21fb0 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
21fc0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  to the database,
21fd0 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20   it is never.** 
21fe0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64  necessary to und
21ff0 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20 74 68  o a write and th
22000 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f  e checkpoint sho
22010 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a  uld not be set..
22020 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
22030 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
22040 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
22050 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65  , int setStateme
22060 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  nt, int iDb){.  
22070 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
22080 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
22090 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
220a0 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  .  sqlite3CodeVe
220b0 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
220c0 65 2c 20 69 44 62 29 3b 0a 20 20 44 62 4d 61 73  e, iDb);.  DbMas
220d0 6b 53 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  kSet(pToplevel->
220e0 77 72 69 74 65 4d 61 73 6b 2c 20 69 44 62 29 3b  writeMask, iDb);
220f0 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73  .  pToplevel->is
22100 4d 75 6c 74 69 57 72 69 74 65 20 7c 3d 20 73 65  MultiWrite |= se
22110 74 53 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f  tStatement;.}../
22120 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  *.** Indicate th
22130 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  at the statement
22140 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
22150 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6d 69   construction mi
22160 67 68 74 20 77 72 69 74 65 0a 2a 2a 20 6d 6f 72  ght write.** mor
22170 65 20 74 68 61 6e 20 6f 6e 65 20 65 6e 74 72 79  e than one entry
22180 20 28 65 78 61 6d 70 6c 65 3a 20 64 65 6c 65 74   (example: delet
22190 69 6e 67 20 6f 6e 65 20 72 6f 77 20 74 68 65 6e  ing one row then
221a0 20 69 6e 73 65 72 74 69 6e 67 20 61 6e 6f 74 68   inserting anoth
221b0 65 72 2c 0a 2a 2a 20 69 6e 73 65 72 74 69 6e 67  er,.** inserting
221c0 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 69   multiple rows i
221d0 6e 20 61 20 74 61 62 6c 65 2c 20 6f 72 20 69 6e  n a table, or in
221e0 73 65 72 74 69 6e 67 20 61 20 72 6f 77 20 61 6e  serting a row an
221f0 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 2e  d index entries.
22200 29 0a 2a 2a 20 49 66 20 61 6e 20 61 62 6f 72 74  ).** If an abort
22210 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 73 6f   occurs after so
22220 6d 65 20 6f 66 20 74 68 65 73 65 20 77 72 69 74  me of these writ
22230 65 73 20 68 61 76 65 20 63 6f 6d 70 6c 65 74 65  es have complete
22240 64 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 0a  d, then it will.
22250 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79 20  ** be necessary 
22260 74 6f 20 75 6e 64 6f 20 74 68 65 20 63 6f 6d 70  to undo the comp
22270 6c 65 74 65 64 20 77 72 69 74 65 73 2e 0a 2a 2f  leted writes..*/
22280 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 75 6c  .void sqlite3Mul
22290 74 69 57 72 69 74 65 28 50 61 72 73 65 20 2a 70  tiWrite(Parse *p
222a0 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20  Parse){.  Parse 
222b0 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
222c0 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
222d0 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f  l(pParse);.  pTo
222e0 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57  plevel->isMultiW
222f0 72 69 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20  rite = 1;.}../* 
22300 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e  .** The code gen
22310 65 72 61 74 6f 72 20 63 61 6c 6c 73 20 74 68 69  erator calls thi
22320 73 20 72 6f 75 74 69 6e 65 20 69 66 20 69 73 20  s routine if is 
22330 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 69  discovers that i
22340 74 20 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65  t is.** possible
22350 20 74 6f 20 61 62 6f 72 74 20 61 20 73 74 61 74   to abort a stat
22360 65 6d 65 6e 74 20 70 72 69 6f 72 20 74 6f 20 63  ement prior to c
22370 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 6e 20 6f  ompletion.  In o
22380 72 64 65 72 20 74 6f 20 0a 2a 2a 20 70 65 72 66  rder to .** perf
22390 6f 72 6d 20 74 68 69 73 20 61 62 6f 72 74 20 77  orm this abort w
223a0 69 74 68 6f 75 74 20 63 6f 72 72 75 70 74 69 6e  ithout corruptin
223b0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  g the database, 
223c0 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 0a  we need to make.
223d0 2a 2a 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ** sure that the
223e0 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 72   statement is pr
223f0 6f 74 65 63 74 65 64 20 62 79 20 61 20 73 74 61  otected by a sta
22400 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
22410 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69  on..**.** Techni
22420 63 61 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79 20 6e  cally, we only n
22430 65 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 6d  eed to set the m
22440 61 79 41 62 6f 72 74 20 66 6c 61 67 20 69 66 20  ayAbort flag if 
22450 74 68 65 0a 2a 2a 20 69 73 4d 75 6c 74 69 57 72  the.** isMultiWr
22460 69 74 65 20 66 6c 61 67 20 77 61 73 20 70 72 65  ite flag was pre
22470 76 69 6f 75 73 6c 79 20 73 65 74 2e 20 20 54 68  viously set.  Th
22480 65 72 65 20 69 73 20 61 20 74 69 6d 65 20 64 65  ere is a time de
22490 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 73 75 63 68  pendency.** such
224a0 20 74 68 61 74 20 74 68 65 20 61 62 6f 72 74 20   that the abort 
224b0 6d 75 73 74 20 6f 63 63 75 72 20 61 66 74 65 72  must occur after
224c0 20 74 68 65 20 6d 75 6c 74 69 77 72 69 74 65 2e   the multiwrite.
224d0 20 20 54 68 69 73 20 6d 61 6b 65 73 0a 2a 2a 20    This makes.** 
224e0 73 6f 6d 65 20 73 74 61 74 65 6d 65 6e 74 73 20  some statements 
224f0 69 6e 76 6f 6c 76 69 6e 67 20 74 68 65 20 52 45  involving the RE
22500 50 4c 41 43 45 20 63 6f 6e 66 6c 69 63 74 20 72  PLACE conflict r
22510 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
22520 74 68 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69 74 74  thm.** go a litt
22530 6c 65 20 66 61 73 74 65 72 2e 20 20 42 75 74 20  le faster.  But 
22540 74 61 6b 69 6e 67 20 61 64 76 61 6e 74 61 67 65  taking advantage
22550 20 6f 66 20 74 68 69 73 20 74 69 6d 65 20 64 65   of this time de
22560 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65  pendency.** make
22570 73 20 69 74 20 6d 6f 72 65 20 64 69 66 66 69 63  s it more diffic
22580 75 6c 74 20 74 6f 20 70 72 6f 76 65 20 74 68 61  ult to prove tha
22590 74 20 74 68 65 20 63 6f 64 65 20 69 73 20 63 6f  t the code is co
225a0 72 72 65 63 74 20 28 69 6e 20 0a 2a 2a 20 70 61  rrect (in .** pa
225b0 72 74 69 63 75 6c 61 72 2c 20 69 74 20 70 72 65  rticular, it pre
225c0 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 77 72  vents us from wr
225d0 69 74 69 6e 67 20 61 6e 20 65 66 66 65 63 74 69  iting an effecti
225e0 76 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  ve.** implementa
225f0 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 41  tion of sqlite3A
22600 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 29  ssertMayAbort())
22610 20 61 6e 64 20 73 6f 20 77 65 20 68 61 76 65 20   and so we have 
22620 63 68 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b  chosen.** to tak
22630 65 20 74 68 65 20 73 61 66 65 20 72 6f 75 74 65  e the safe route
22640 20 61 6e 64 20 73 6b 69 70 20 74 68 65 20 6f 70   and skip the op
22650 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  timization..*/.v
22660 6f 69 64 20 73 71 6c 69 74 65 33 4d 61 79 41 62  oid sqlite3MayAb
22670 6f 72 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ort(Parse *pPars
22680 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f  e){.  Parse *pTo
22690 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
226a0 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
226b0 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76  arse);.  pToplev
226c0 65 6c 2d 3e 6d 61 79 41 62 6f 72 74 20 3d 20 31  el->mayAbort = 1
226d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  ;.}../*.** Code 
226e0 61 6e 20 4f 50 5f 48 61 6c 74 20 74 68 61 74 20  an OP_Halt that 
226f0 63 61 75 73 65 73 20 74 68 65 20 76 64 62 65 20  causes the vdbe 
22700 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  to return an SQL
22710 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 0a 2a  ITE_CONSTRAINT.*
22720 2a 20 65 72 72 6f 72 2e 20 54 68 65 20 6f 6e 45  * error. The onE
22730 72 72 6f 72 20 70 61 72 61 6d 65 74 65 72 20 64  rror parameter d
22740 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20  etermines which 
22750 28 69 66 20 61 6e 79 29 20 6f 66 20 74 68 65 20  (if any) of the 
22760 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64  statement.** and
22770 2f 6f 72 20 63 75 72 72 65 6e 74 20 74 72 61 6e  /or current tran
22780 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
22790 64 20 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  d back..*/.void 
227a0 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
227b0 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  raint(.  Parse *
227c0 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
227d0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
227e0 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20  .  int errCode, 
227f0 20 20 20 20 20 2f 2a 20 65 78 74 65 6e 64 65 64       /* extended
22800 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
22810 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
22820 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74     /* Constraint
22830 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20   type */.  char 
22840 2a 70 34 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *p4,         /* 
22850 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f  Error message */
22860 0a 20 20 69 38 20 70 34 74 79 70 65 2c 20 20 20  .  i8 p4type,   
22870 20 20 20 20 20 2f 2a 20 50 34 5f 53 54 41 54 49       /* P4_STATI
22880 43 20 6f 72 20 50 34 5f 54 52 41 4e 53 49 45 4e  C or P4_TRANSIEN
22890 54 20 2a 2f 0a 20 20 75 38 20 70 35 45 72 72 6d  T */.  u8 p5Errm
228a0 73 67 20 20 20 20 20 20 20 2f 2a 20 50 35 5f 45  sg       /* P5_E
228b0 72 72 4d 73 67 20 74 79 70 65 20 2a 2f 0a 29 7b  rrMsg type */.){
228c0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
228d0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
228e0 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  se);.  assert( (
228f0 65 72 72 43 6f 64 65 26 30 78 66 66 29 3d 3d 53  errCode&0xff)==S
22900 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
22910 20 29 3b 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f   );.  if( onErro
22920 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20  r==OE_Abort ){. 
22930 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f     sqlite3MayAbo
22940 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a  rt(pParse);.  }.
22950 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22960 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20  Op4(v, OP_Halt, 
22970 65 72 72 43 6f 64 65 2c 20 6f 6e 45 72 72 6f 72  errCode, onError
22980 2c 20 30 2c 20 70 34 2c 20 70 34 74 79 70 65 29  , 0, p4, p4type)
22990 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
229a0 68 61 6e 67 65 50 35 28 76 2c 20 70 35 45 72 72  hangeP5(v, p5Err
229b0 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  msg);.}../*.** C
229c0 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64  ode an OP_Halt d
229d0 75 65 20 74 6f 20 55 4e 49 51 55 45 20 6f 72 20  ue to UNIQUE or 
229e0 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
229f0 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e  traint violation
22a00 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22a10 33 55 6e 69 71 75 65 43 6f 6e 73 74 72 61 69 6e  3UniqueConstrain
22a20 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
22a30 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
22a40 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
22a50 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
22a60 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74   /* Constraint t
22a70 79 70 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ype */.  Index *
22a80 70 49 64 78 20 20 20 20 20 20 20 2f 2a 20 54 68  pIdx       /* Th
22a90 65 20 69 6e 64 65 78 20 74 68 61 74 20 74 72 69  e index that tri
22aa0 67 67 65 72 73 20 74 68 65 20 63 6f 6e 73 74 72  ggers the constr
22ab0 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  aint */.){.  cha
22ac0 72 20 2a 7a 45 72 72 3b 0a 20 20 69 6e 74 20 6a  r *zErr;.  int j
22ad0 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 65 72 72  ;.  StrAccum err
22ae0 4d 73 67 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  Msg;.  Table *pT
22af0 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  ab = pIdx->pTabl
22b00 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 53 74 72  e;..  sqlite3Str
22b10 41 63 63 75 6d 49 6e 69 74 28 26 65 72 72 4d 73  AccumInit(&errMs
22b20 67 2c 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 30  g, pParse->db, 0
22b30 2c 20 30 2c 20 32 30 30 29 3b 0a 20 20 69 66 28  , 0, 200);.  if(
22b40 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20   pIdx->aColExpr 
22b50 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
22b60 74 72 5f 61 70 70 65 6e 64 66 28 26 65 72 72 4d  tr_appendf(&errM
22b70 73 67 2c 20 22 69 6e 64 65 78 20 27 25 71 27 22  sg, "index '%q'"
22b80 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pIdx->zName);.
22b90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
22ba0 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b  (j=0; j<pIdx->nK
22bb0 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  eyCol; j++){.   
22bc0 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20     char *zCol;. 
22bd0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
22be0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d  x->aiColumn[j]>=
22bf0 30 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 20  0 );.      zCol 
22c00 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 64  = pTab->aCol[pId
22c10 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e  x->aiColumn[j]].
22c20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28  zName;.      if(
22c30 20 6a 20 29 20 73 71 6c 69 74 65 33 5f 73 74 72   j ) sqlite3_str
22c40 5f 61 70 70 65 6e 64 28 26 65 72 72 4d 73 67 2c  _append(&errMsg,
22c50 20 22 2c 20 22 2c 20 32 29 3b 0a 20 20 20 20 20   ", ", 2);.     
22c60 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
22c70 65 6e 64 61 6c 6c 28 26 65 72 72 4d 73 67 2c 20  endall(&errMsg, 
22c80 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
22c90 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
22ca0 61 70 70 65 6e 64 28 26 65 72 72 4d 73 67 2c 20  append(&errMsg, 
22cb0 22 2e 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  ".", 1);.      s
22cc0 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
22cd0 64 61 6c 6c 28 26 65 72 72 4d 73 67 2c 20 7a 43  dall(&errMsg, zC
22ce0 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ol);.    }.  }. 
22cf0 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 53   zErr = sqlite3S
22d00 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 65  trAccumFinish(&e
22d10 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
22d20 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
22d30 70 50 61 72 73 65 2c 20 0a 20 20 20 20 49 73 50  pParse, .    IsP
22d40 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
22d50 49 64 78 29 20 3f 20 53 51 4c 49 54 45 5f 43 4f  Idx) ? SQLITE_CO
22d60 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59  NSTRAINT_PRIMARY
22d70 4b 45 59 20 0a 20 20 20 20 20 20 20 20 20 20 20  KEY .           
22d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d90 20 3a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   : SQLITE_CONSTR
22da0 41 49 4e 54 5f 55 4e 49 51 55 45 2c 0a 20 20 20  AINT_UNIQUE,.   
22db0 20 6f 6e 45 72 72 6f 72 2c 20 7a 45 72 72 2c 20   onError, zErr, 
22dc0 50 34 5f 44 59 4e 41 4d 49 43 2c 20 50 35 5f 43  P4_DYNAMIC, P5_C
22dd0 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71 75 65 29  onstraintUnique)
22de0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  ;.}.../*.** Code
22df0 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65 20   an OP_Halt due 
22e00 74 6f 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f  to non-unique ro
22e10 77 69 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wid..*/.void sql
22e20 69 74 65 33 52 6f 77 69 64 43 6f 6e 73 74 72 61  ite3RowidConstra
22e30 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  int(.  Parse *pP
22e40 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
22e50 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
22e60 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
22e70 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72     /* Conflict r
22e80 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
22e90 74 68 6d 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  thm */.  Table *
22ea0 70 54 61 62 20 20 20 20 20 20 20 2f 2a 20 54 68  pTab       /* Th
22eb0 65 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  e table with the
22ec0 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69   non-unique rowi
22ed0 64 20 2a 2f 20 0a 29 7b 0a 20 20 63 68 61 72 20  d */ .){.  char 
22ee0 2a 7a 4d 73 67 3b 0a 20 20 69 6e 74 20 72 63 3b  *zMsg;.  int rc;
22ef0 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b  .  if( pTab->iPK
22f00 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 7a 4d 73  ey>=0 ){.    zMs
22f10 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
22f20 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
22f30 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  %s.%s", pTab->zN
22f40 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
22f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
22f60 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e  Tab->aCol[pTab->
22f70 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  iPKey].zName);. 
22f80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
22f90 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52  ONSTRAINT_PRIMAR
22fa0 59 4b 45 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  YKEY;.  }else{. 
22fb0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
22fc0 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
22fd0 3e 64 62 2c 20 22 25 73 2e 72 6f 77 69 64 22 2c  >db, "%s.rowid",
22fe0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
22ff0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
23000 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 3b  ONSTRAINT_ROWID;
23010 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61  .  }.  sqlite3Ha
23020 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  ltConstraint(pPa
23030 72 73 65 2c 20 72 63 2c 20 6f 6e 45 72 72 6f 72  rse, rc, onError
23040 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
23050 49 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  IC,.            
23060 20 20 20 20 20 20 20 20 20 20 20 20 50 35 5f 43              P5_C
23070 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71 75 65 29  onstraintUnique)
23080 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
23090 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e 64 65   to see if pInde
230a0 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61  x uses the colla
230b0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43  ting sequence pC
230c0 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  oll.  Return.** 
230d0 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 20  true if it does 
230e0 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69 74 20  and false if it 
230f0 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66  does not..*/.#if
23100 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
23110 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20  _REINDEX.static 
23120 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74  int collationMat
23130 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ch(const char *z
23140 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e  Coll, Index *pIn
23150 64 65 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  dex){.  int i;. 
23160 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d   assert( zColl!=
23170 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0 );.  for(i=0; 
23180 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  i<pIndex->nColum
23190 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  n; i++){.    con
231a0 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e  st char *z = pIn
231b0 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  dex->azColl[i];.
231c0 20 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30      assert( z!=0
231d0 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f   || pIndex->aiCo
231e0 6c 75 6d 6e 5b 69 5d 3c 30 20 29 3b 0a 20 20 20  lumn[i]<0 );.   
231f0 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 69 43   if( pIndex->aiC
23200 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 26 26 20 30  olumn[i]>=0 && 0
23210 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
23220 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  (z, zColl) ){.  
23230 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
23240 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
23250 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
23260 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c  .** Recompute al
23270 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61  l indices of pTa
23280 62 20 74 68 61 74 20 75 73 65 20 74 68 65 20 63  b that use the c
23290 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
232a0 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70  e pColl..** If p
232b0 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63  Coll==0 then rec
232c0 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
232d0 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23  es of pTab..*/.#
232e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
232f0 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69  IT_REINDEX.stati
23300 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61  c void reindexTa
23310 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
23320 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
23330 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
23340 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  l){.  Index *pIn
23350 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
23360 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73    /* An index as
23370 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
23380 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e  ab */..  for(pIn
23390 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  dex=pTab->pIndex
233a0 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ; pIndex; pIndex
233b0 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b  =pIndex->pNext){
233c0 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d  .    if( zColl==
233d0 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61  0 || collationMa
233e0 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65  tch(zColl, pInde
233f0 78 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  x) ){.      int 
23400 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
23410 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
23420 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
23430 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  hema);.      sql
23440 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
23450 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
23460 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73  0, iDb);.      s
23470 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
23480 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
23490 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , -1);.    }.  }
234a0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
234b0 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   Recompute all i
234c0 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61  ndices of all ta
234d0 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61  bles in all data
234e0 62 61 73 65 73 20 77 68 65 72 65 20 74 68 65 0a  bases where the.
234f0 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20 74  ** indices use t
23500 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
23510 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66  uence pColl.  If
23520 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72   pColl==0 then r
23530 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20  ecompute.** all 
23540 69 6e 64 69 63 65 73 20 65 76 65 72 79 77 68 65  indices everywhe
23550 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  re..*/.#ifndef S
23560 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
23570 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  EX.static void r
23580 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
23590 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
235a0 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c  har const *zColl
235b0 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20  ){.  Db *pDb;   
235c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235d0 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74   /* A single dat
235e0 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  abase */.  int i
235f0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
23600 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
23610 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d  tabase index num
23620 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ber */.  sqlite3
23630 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
23640 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  b;   /* The data
23650 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
23660 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b  */.  HashElem *k
23670 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23680 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
23690 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70  over tables in p
236a0 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  Db */.  Table *p
236b0 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
236c0 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69      /* A table i
236d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
236e0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
236f0 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c  ite3BtreeHoldsAl
23700 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 20  lMutexes(db) ); 
23710 20 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72 20 73   /* Needed for s
23720 63 68 65 6d 61 20 61 63 63 65 73 73 20 2a 2f 0a  chema access */.
23730 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62    for(iDb=0, pDb
23740 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62  =db->aDb; iDb<db
23750 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44  ->nDb; iDb++, pD
23760 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  b++){.    assert
23770 28 20 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20  ( pDb!=0 );.    
23780 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68  for(k=sqliteHash
23790 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68  First(&pDb->pSch
237a0 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20  ema->tblHash);  
237b0 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e  k; k=sqliteHashN
237c0 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70  ext(k)){.      p
237d0 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71  Tab = (Table*)sq
237e0 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b  liteHashData(k);
237f0 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 54 61  .      reindexTa
23800 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
23810 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a  , zColl);.    }.
23820 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
23830 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
23840 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45  e for the REINDE
23850 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  X command..**.**
23860 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
23870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23880 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a             -- 1.
23890 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
238a0 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20  X  <collation>  
238b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
238c0 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  2.**        REIN
238d0 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e  DEX  ?<database>
238e0 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d  .?<tablename>  -
238f0 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 3.**        RE
23900 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73  INDEX  ?<databas
23910 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20  e>.?<indexname> 
23920 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d   -- 4.**.** Form
23930 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e   1 causes all in
23940 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74  dices in all att
23950 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
23960 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a  to be rebuilt..*
23970 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64  * Form 2 rebuild
23980 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e  s all indices in
23990 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74   all databases t
239a0 68 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65  hat use the name
239b0 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66  d.** collating f
239c0 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20  unction.  Forms 
239d0 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20  3 and 4 rebuild 
239e0 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  the named index 
239f0 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65  or all.** indice
23a00 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
23a10 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  h the named tabl
23a20 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
23a30 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
23a40 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  X.void sqlite3Re
23a50 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  index(Parse *pPa
23a60 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  rse, Token *pNam
23a70 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  e1, Token *pName
23a80 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  2){.  CollSeq *p
23a90 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
23aa0 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
23ab0 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65  equence to be re
23ac0 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c  indexed, or NULL
23ad0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20   */.  char *z;  
23ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23af0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74    /* Name of a t
23b00 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f  able or index */
23b10 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
23b20 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Db;            /
23b30 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
23b40 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c  tabase */.  Tabl
23b50 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
23b60 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62          /* A tab
23b70 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  le in the databa
23b80 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  se */.  Index *p
23b90 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  Index;          
23ba0 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
23bb0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
23bc0 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44  pTab */.  int iD
23bd0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
23be0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
23bf0 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62  abase index numb
23c00 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
23c10 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
23c20 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
23c30 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
23c40 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e  /.  Token *pObjN
23c50 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
23c60 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
23c70 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f  able or index to
23c80 20 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f   be reindexed */
23c90 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
23ca0 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
23cb0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
23cc0 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  urs, leave an er
23cd0 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a  ror message.  **
23ce0 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61   and code in pPa
23cf0 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  rse and return N
23d00 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51  ULL. */.  if( SQ
23d10 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
23d20 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
23d30 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
23d40 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61  ;.  }..  if( pNa
23d50 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  me1==0 ){.    re
23d60 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70  indexDatabases(p
23d70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72  Parse, 0);.    r
23d80 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69  eturn;.  }else i
23d90 66 28 20 4e 45 56 45 52 28 70 4e 61 6d 65 32 3d  f( NEVER(pName2=
23da0 3d 30 29 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a  =0) || pName2->z
23db0 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
23dc0 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65  *zColl;.    asse
23dd0 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b  rt( pName1->z );
23de0 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c  .    zColl = sql
23df0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
23e00 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e  n(pParse->db, pN
23e10 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 21  ame1);.    if( !
23e20 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a  zColl ) return;.
23e30 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
23e40 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
23e50 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c  b, ENC(db), zCol
23e60 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  l, 0);.    if( p
23e70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65  Coll ){.      re
23e80 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70  indexDatabases(p
23e90 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  Parse, zColl);. 
23ea0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
23eb0 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  ee(db, zColl);. 
23ec0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
23ed0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
23ee0 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
23ef0 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
23f00 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
23f10 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
23f20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d  pName2, &pObjNam
23f30 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20  e);.  if( iDb<0 
23f40 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20  ) return;.  z = 
23f50 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
23f60 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d  oken(db, pObjNam
23f70 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  e);.  if( z==0 )
23f80 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d   return;.  zDb =
23f90 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44   db->aDb[iDb].zD
23fa0 62 53 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d  bSName;.  pTab =
23fb0 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
23fc0 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20  e(db, z, zDb);. 
23fd0 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
23fe0 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50   reindexTable(pP
23ff0 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a  arse, pTab, 0);.
24000 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
24010 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 72 65  e(db, z);.    re
24020 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64  turn;.  }.  pInd
24030 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ex = sqlite3Find
24040 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62  Index(db, z, zDb
24050 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
24060 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 69 66 28  ee(db, z);.  if(
24070 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73   pIndex ){.    s
24080 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
24090 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
240a0 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 0, iDb);.    s
240b0 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
240c0 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
240d0 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72  , -1);.    retur
240e0 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
240f0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
24100 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e   "unable to iden
24110 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20  tify the object 
24120 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 22  to be reindexed"
24130 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
24140 2a 2a 20 52 65 74 75 72 6e 20 61 20 4b 65 79 49  ** Return a KeyI
24150 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
24160 61 74 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  at is appropriat
24170 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  e for the given 
24180 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Index..**.** The
24190 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 69   caller should i
241a0 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 4b 65 79  nvoke sqlite3Key
241b0 49 6e 66 6f 55 6e 72 65 66 28 29 20 6f 6e 20 74  InfoUnref() on t
241c0 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65  he returned obje
241d0 63 74 0a 2a 2a 20 77 68 65 6e 20 69 74 20 68 61  ct.** when it ha
241e0 73 20 66 69 6e 69 73 68 65 64 20 75 73 69 6e 67  s finished using
241f0 20 69 74 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20   it..*/.KeyInfo 
24200 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f  *sqlite3KeyInfoO
24210 66 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  fIndex(Parse *pP
24220 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64  arse, Index *pId
24230 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  x){.  int i;.  i
24240 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  nt nCol = pIdx->
24250 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e  nColumn;.  int n
24260 4b 65 79 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79  Key = pIdx->nKey
24270 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  Col;.  KeyInfo *
24280 70 4b 65 79 3b 0a 20 20 69 66 28 20 70 50 61 72  pKey;.  if( pPar
24290 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
242a0 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 64 78 2d  n 0;.  if( pIdx-
242b0 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 29 7b 0a  >uniqNotNull ){.
242c0 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74      pKey = sqlit
242d0 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70  e3KeyInfoAlloc(p
242e0 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 2c  Parse->db, nKey,
242f0 20 6e 43 6f 6c 2d 6e 4b 65 79 29 3b 0a 20 20 7d   nCol-nKey);.  }
24300 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 20 3d  else{.    pKey =
24310 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
24320 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
24330 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20   nCol, 0);.  }. 
24340 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
24350 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
24360 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
24370 6c 65 28 70 4b 65 79 29 20 29 3b 0a 20 20 20 20  le(pKey) );.    
24380 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
24390 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e   i++){.      con
243a0 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d  st char *zColl =
243b0 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d   pIdx->azColl[i]
243c0 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43  ;.      pKey->aC
243d0 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3d 3d  oll[i] = zColl==
243e0 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
243f0 20 3f 20 30 20 3a 0a 20 20 20 20 20 20 20 20 20   ? 0 :.         
24400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
24410 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
24420 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
24430 6c 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e  l);.      pKey->
24440 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
24450 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
24460 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  [i];.    }.    i
24470 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
24480 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
24490 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c   pParse->rc==SQL
244a0 49 54 45 5f 45 52 52 4f 52 5f 4d 49 53 53 49 4e  ITE_ERROR_MISSIN
244b0 47 5f 43 4f 4c 4c 53 45 51 20 29 3b 0a 20 20 20  G_COLLSEQ );.   
244c0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 62 4e 6f     if( pIdx->bNo
244d0 51 75 65 72 79 3d 3d 30 20 29 7b 0a 20 20 20 20  Query==0 ){.    
244e0 20 20 20 20 2f 2a 20 44 65 61 63 74 69 76 61 74      /* Deactivat
244f0 65 20 74 68 65 20 69 6e 64 65 78 20 62 65 63 61  e the index beca
24500 75 73 65 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  use it contains 
24510 61 6e 20 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 6c 61  an unknown colla
24520 74 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ting.        ** 
24530 73 65 71 75 65 6e 63 65 2e 20 20 54 68 65 20 6f  sequence.  The o
24540 6e 6c 79 20 77 61 79 20 74 6f 20 72 65 61 63 74  nly way to react
24550 69 76 65 20 74 68 65 20 69 6e 64 65 78 20 69 73  ive the index is
24560 20 74 6f 20 72 65 6c 6f 61 64 20 74 68 65 0a 20   to reload the. 
24570 20 20 20 20 20 20 20 2a 2a 20 73 63 68 65 6d 61         ** schema
24580 2e 20 20 41 64 64 69 6e 67 20 74 68 65 20 6d 69  .  Adding the mi
24590 73 73 69 6e 67 20 63 6f 6c 6c 61 74 69 6e 67 20  ssing collating 
245a0 73 65 71 75 65 6e 63 65 20 6c 61 74 65 72 20 64  sequence later d
245b0 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20  oes not.        
245c0 2a 2a 20 72 65 61 63 74 69 76 65 20 74 68 65 20  ** reactive the 
245d0 69 6e 64 65 78 2e 20 20 54 68 65 20 61 70 70 6c  index.  The appl
245e0 69 63 61 74 69 6f 6e 20 68 61 64 20 74 68 65 20  ication had the 
245f0 63 68 61 6e 63 65 20 74 6f 20 72 65 67 69 73 74  chance to regist
24600 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  er.        ** th
24610 65 20 6d 69 73 73 69 6e 67 20 69 6e 64 65 78 20  e missing index 
24620 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74  using the collat
24630 69 6f 6e 2d 6e 65 65 64 65 64 20 63 61 6c 6c 62  ion-needed callb
24640 61 63 6b 2e 20 20 46 6f 72 0a 20 20 20 20 20 20  ack.  For.      
24650 20 20 2a 2a 20 73 69 6d 70 6c 69 63 69 74 79 2c    ** simplicity,
24660 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74   SQLite will not
24670 20 67 69 76 65 20 74 68 65 20 61 70 70 6c 69 63   give the applic
24680 61 74 69 6f 6e 20 61 20 73 65 63 6f 6e 64 20 63  ation a second c
24690 68 61 6e 63 65 2e 0a 20 20 20 20 20 20 20 20 2a  hance..        *
246a0 2f 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  /.        pIdx->
246b0 62 4e 6f 51 75 65 72 79 20 3d 20 31 3b 0a 20 20  bNoQuery = 1;.  
246c0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
246d0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 5f   = SQLITE_ERROR_
246e0 52 45 54 52 59 3b 0a 20 20 20 20 20 20 7d 0a 20  RETRY;.      }. 
246f0 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49       sqlite3KeyI
24700 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 29 3b 0a  nfoUnref(pKey);.
24710 20 20 20 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a        pKey = 0;.
24720 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
24730 72 6e 20 70 4b 65 79 3b 0a 7d 0a 0a 23 69 66 6e  rn pKey;.}..#ifn
24740 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
24750 43 54 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  CTE./* .** This 
24760 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b  routine is invok
24770 65 64 20 6f 6e 63 65 20 70 65 72 20 43 54 45 20  ed once per CTE 
24780 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
24790 69 6c 65 20 70 61 72 73 69 6e 67 20 61 20 0a 2a  ile parsing a .*
247a0 2a 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20 0a  * WITH clause. .
247b0 2a 2f 0a 57 69 74 68 20 2a 73 71 6c 69 74 65 33  */.With *sqlite3
247c0 57 69 74 68 41 64 64 28 0a 20 20 50 61 72 73 65  WithAdd(.  Parse
247d0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
247e0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
247f0 6e 74 65 78 74 20 2a 2f 0a 20 20 57 69 74 68 20  ntext */.  With 
24800 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20 20 20  *pWith,         
24810 20 20 20 2f 2a 20 45 78 69 73 74 69 6e 67 20 57     /* Existing W
24820 49 54 48 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e  ITH clause, or N
24830 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
24840 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  pName,          
24850 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
24860 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 20 2a 2f 0a  common-table */.
24870 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41 72 67    ExprList *pArg
24880 6c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4f 70 74  list,     /* Opt
24890 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ional column nam
248a0 65 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20 74  e list for the t
248b0 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  able */.  Select
248c0 20 2a 70 51 75 65 72 79 20 20 20 20 20 20 20 20   *pQuery        
248d0 20 20 2f 2a 20 51 75 65 72 79 20 75 73 65 64 20    /* Query used 
248e0 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  to initialize th
248f0 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  e table */.){.  
24900 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
24910 61 72 73 65 2d 3e 64 62 3b 0a 20 20 57 69 74 68  arse->db;.  With
24920 20 2a 70 4e 65 77 3b 0a 20 20 63 68 61 72 20 2a   *pNew;.  char *
24930 7a 4e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 43 68 65  zName;..  /* Che
24940 63 6b 20 74 68 61 74 20 74 68 65 20 43 54 45 20  ck that the CTE 
24950 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 20 77  name is unique w
24960 69 74 68 69 6e 20 74 68 69 73 20 57 49 54 48 20  ithin this WITH 
24970 63 6c 61 75 73 65 2e 20 49 66 0a 20 20 2a 2a 20  clause. If.  ** 
24980 6e 6f 74 2c 20 73 74 6f 72 65 20 61 6e 20 65 72  not, store an er
24990 72 6f 72 20 69 6e 20 74 68 65 20 50 61 72 73 65  ror in the Parse
249a0 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20   structure. */. 
249b0 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
249c0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  NameFromToken(pP
249d0 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29  arse->db, pName)
249e0 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 26 26  ;.  if( zName &&
249f0 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e   pWith ){.    in
24a00 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
24a10 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b  ; i<pWith->nCte;
24a20 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
24a30 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
24a40 7a 4e 61 6d 65 2c 20 70 57 69 74 68 2d 3e 61 5b  zName, pWith->a[
24a50 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
24a60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
24a70 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
24a80 22 64 75 70 6c 69 63 61 74 65 20 57 49 54 48 20  "duplicate WITH 
24a90 74 61 62 6c 65 20 6e 61 6d 65 3a 20 25 73 22 2c  table name: %s",
24aa0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   zName);.      }
24ab0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
24ac0 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69  ( pWith ){.    i
24ad0 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  nt nByte = sizeo
24ae0 66 28 2a 70 57 69 74 68 29 20 2b 20 28 73 69 7a  f(*pWith) + (siz
24af0 65 6f 66 28 70 57 69 74 68 2d 3e 61 5b 31 5d 29  eof(pWith->a[1])
24b00 20 2a 20 70 57 69 74 68 2d 3e 6e 43 74 65 29 3b   * pWith->nCte);
24b10 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
24b20 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
24b30 20 70 57 69 74 68 2c 20 6e 42 79 74 65 29 3b 0a   pWith, nByte);.
24b40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65    }else{.    pNe
24b50 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
24b60 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
24b70 6f 66 28 2a 70 57 69 74 68 29 29 3b 0a 20 20 7d  of(*pWith));.  }
24b80 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77  .  assert( (pNew
24b90 21 3d 30 20 26 26 20 7a 4e 61 6d 65 21 3d 30 29  !=0 && zName!=0)
24ba0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
24bb0 69 6c 65 64 20 29 3b 0a 0a 20 20 69 66 28 20 64  iled );..  if( d
24bc0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
24bd0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
24be0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
24bf0 20 70 41 72 67 6c 69 73 74 29 3b 0a 20 20 20 20   pArglist);.    
24c00 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
24c10 65 74 65 28 64 62 2c 20 70 51 75 65 72 79 29 3b  ete(db, pQuery);
24c20 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
24c30 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ee(db, zName);. 
24c40 20 20 20 70 4e 65 77 20 3d 20 70 57 69 74 68 3b     pNew = pWith;
24c50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
24c60 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65  ew->a[pNew->nCte
24c70 5d 2e 70 53 65 6c 65 63 74 20 3d 20 70 51 75 65  ].pSelect = pQue
24c80 72 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b  ry;.    pNew->a[
24c90 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 43 6f 6c  pNew->nCte].pCol
24ca0 73 20 3d 20 70 41 72 67 6c 69 73 74 3b 0a 20 20  s = pArglist;.  
24cb0 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
24cc0 6e 43 74 65 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e  nCte].zName = zN
24cd0 61 6d 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ame;.    pNew->a
24ce0 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 43 74  [pNew->nCte].zCt
24cf0 65 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 4e  eErr = 0;.    pN
24d00 65 77 2d 3e 6e 43 74 65 2b 2b 3b 0a 20 20 7d 0a  ew->nCte++;.  }.
24d10 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
24d20 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
24d30 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
24d40 65 20 57 69 74 68 20 6f 62 6a 65 63 74 20 70 61  e With object pa
24d50 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
24d60 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
24d70 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 74 68  void sqlite3With
24d80 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
24d90 64 62 2c 20 57 69 74 68 20 2a 70 57 69 74 68 29  db, With *pWith)
24da0 7b 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b  {.  if( pWith ){
24db0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
24dc0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69 74 68  for(i=0; i<pWith
24dd0 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCte; i++){.  
24de0 20 20 20 20 73 74 72 75 63 74 20 43 74 65 20 2a      struct Cte *
24df0 70 43 74 65 20 3d 20 26 70 57 69 74 68 2d 3e 61  pCte = &pWith->a
24e00 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  [i];.      sqlit
24e10 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
24e20 28 64 62 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73  (db, pCte->pCols
24e30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24e40 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
24e50 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 29 3b   pCte->pSelect);
24e60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
24e70 46 72 65 65 28 64 62 2c 20 70 43 74 65 2d 3e 7a  Free(db, pCte->z
24e80 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
24e90 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
24ea0 62 2c 20 70 57 69 74 68 29 3b 0a 20 20 7d 0a 7d  b, pWith);.  }.}
24eb0 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
24ec0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
24ed0 43 54 45 29 20 2a 2f 0a                          CTE) */.