/ Hex Artifact Content
Login

Artifact ae462f7766fa342ad6700f958111a0028253709ed0c2e01a458bf575e49b44fe:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
03a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
03b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
03c0: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
03d0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20  */.  int iTab;  
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03f0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
0400: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0410: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0420: 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20 20 20 20  sWriteLock;     
0430: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 77     /* True for w
0440: 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c 73  rite lock.  Fals
0450: 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f 63  e for a read loc
0460: 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  k */.  const cha
0470: 72 20 2a 7a 4c 6f 63 6b 4e 61 6d 65 3b 20 2f 2a  r *zLockName; /*
0480: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
0490: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
04a0: 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
04b0: 74 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20  that we want to 
04c0: 6c 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20  lock a table at 
04d0: 72 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a  run-time.  .**.*
04e0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
04f0: 65 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f  e locked has roo
0500: 74 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20  t page iTab and 
0510: 69 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61  is found in data
0520: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72  base iDb..** A r
0530: 65 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c  ead or a write l
0540: 6f 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e  ock can be taken
0550: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73   depending on is
0560: 57 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  Writelock..**.**
0570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
0580: 73 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66  st records the f
0590: 61 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63  act that the loc
05a0: 6b 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54  k is desired.  T
05b0: 68 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61  he.** code to ma
05c0: 6b 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75  ke the lock occu
05d0: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  r is generated b
05e0: 79 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74  y a later call t
05f0: 6f 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f  o.** codeTableLo
0600: 63 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75  cks() which occu
0610: 72 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  rs during sqlite
0620: 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
0630: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0640: 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72  TableLock(.  Par
0650: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0660: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0670: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
0680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
0690: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
06a0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
06b0: 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  he table to lock
06c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
06d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
06e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
06f0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0700: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0710: 73 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f  sWriteLock,    /
0720: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69  * True for a wri
0730: 74 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e  te lock */.  con
0740: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
0750: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0760: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0770: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
0780: 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
0790: 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
07a0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  l(pParse);.  int
07b0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   i;.  int nBytes
07c0: 3b 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70  ;.  TableLock *p
07d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
07e0: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62  =0 );..  if( iDb
07f0: 3d 3d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==1 ) return;.  
0800: 69 66 28 20 21 73 71 6c 69 74 65 33 42 74 72 65  if( !sqlite3Btre
0810: 65 53 68 61 72 61 62 6c 65 28 70 50 61 72 73 65  eSharable(pParse
0820: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ->db->aDb[iDb].p
0830: 42 74 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Bt) ) return;.  
0840: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 70 6c  for(i=0; i<pTopl
0850: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0860: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
0870: 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62  &pToplevel->aTab
0880: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0890: 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20 26  f( p->iDb==iDb &
08a0: 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62 20  & p->iTab==iTab 
08b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57 72  ){.      p->isWr
08c0: 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69 73  iteLock = (p->is
08d0: 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73 57  WriteLock || isW
08e0: 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  riteLock);.     
08f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
0900: 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20 73   }..  nBytes = s
0910: 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b 29  izeof(TableLock)
0920: 20 2a 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e   * (pToplevel->n
0930: 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20  TableLock+1);.  
0940: 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c  pToplevel->aTabl
0950: 65 4c 6f 63 6b 20 3d 0a 20 20 20 20 20 20 73 71  eLock =.      sq
0960: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
0970: 46 72 65 65 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  Free(pToplevel->
0980: 64 62 2c 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61  db, pToplevel->a
0990: 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74 65  TableLock, nByte
09a0: 73 29 3b 0a 20 20 69 66 28 20 70 54 6f 70 6c 65  s);.  if( pTople
09b0: 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20  vel->aTableLock 
09c0: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 54 6f 70  ){.    p = &pTop
09d0: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
09e0: 6b 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61  k[pToplevel->nTa
09f0: 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20  bleLock++];.    
0a00: 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  p->iDb = iDb;.  
0a10: 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62    p->iTab = iTab
0a20: 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65  ;.    p->isWrite
0a30: 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f  Lock = isWriteLo
0a40: 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4c 6f 63 6b  ck;.    p->zLock
0a50: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
0a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 70 6c  }else{.    pTopl
0a70: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0a80: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
0a90: 33 4f 6f 6d 46 61 75 6c 74 28 70 54 6f 70 6c 65  3OomFault(pTople
0aa0: 76 65 6c 2d 3e 64 62 29 3b 0a 20 20 7d 0a 7d 0a  vel->db);.  }.}.
0ab0: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
0ac0: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74  P_TableLock inst
0ad0: 72 75 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68  ruction for each
0ae0: 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79   table locked by
0af0: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
0b00: 74 20 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79  t (configured by
0b10: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
0b20: 33 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a  3TableLock())..*
0b30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
0b40: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72  deTableLocks(Par
0b50: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
0b60: 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56  nt i;.  Vdbe *pV
0b70: 64 62 65 3b 20 0a 0a 20 20 70 56 64 62 65 20 3d  dbe; ..  pVdbe =
0b80: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
0b90: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
0ba0: 74 28 20 70 56 64 62 65 21 3d 30 20 29 3b 20 2f  t( pVdbe!=0 ); /
0bb0: 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  * sqlite3GetVdbe
0bc0: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 3a 20 56 44   cannot fail: VD
0bd0: 42 45 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  BE already alloc
0be0: 61 74 65 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  ated */..  for(i
0bf0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54  =0; i<pParse->nT
0c00: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0c10: 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70      TableLock *p
0c20: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62   = &pParse->aTab
0c30: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0c40: 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a  nt p1 = p->iDb;.
0c50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
0c60: 64 64 4f 70 34 28 70 56 64 62 65 2c 20 4f 50 5f  ddOp4(pVdbe, OP_
0c70: 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70  TableLock, p1, p
0c80: 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73 57 72 69  ->iTab, p->isWri
0c90: 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  teLock,.        
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
0cb0: 3e 7a 4c 6f 63 6b 4e 61 6d 65 2c 20 50 34 5f 53  >zLockName, P4_S
0cc0: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  TATIC);.  }.}.#e
0cd0: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f  lse.  #define co
0ce0: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a  deTableLocks(x).
0cf0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0d00: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0d10: 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20 6f   given yDbMask o
0d20: 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20 2d  bject is empty -
0d30: 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 20   if it contains 
0d40: 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20 54  no.** 1 bits.  T
0d50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0d60: 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61 73  sed by the DbMas
0d70: 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20 44  kAllZero() and D
0d80: 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a 2a  bMaskNotZero().*
0d90: 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53 51  * macros when SQ
0da0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0db0: 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  D is greater tha
0dc0: 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  n 30..*/.#if SQL
0dd0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
0de0: 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33 44  >30.int sqlite3D
0df0: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44 62  bMaskAllZero(yDb
0e00: 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20 69  Mask m){.  int i
0e10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
0e20: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b 20  izeof(yDbMask); 
0e30: 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29 20  i++) if( m[i] ) 
0e40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
0e50: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
0e60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0e70: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
0e80: 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  er a single SQL 
0e90: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ea0: 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64  en.** parsed and
0eb0: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20   a VDBE program 
0ec0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20  to execute that 
0ed0: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ee0: 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e 20  en.** prepared. 
0ef0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
0f00: 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e 67  ts the finishing
0f10: 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65 0a   touches on the.
0f20: 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  ** VDBE program 
0f30: 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 70  and resets the p
0f40: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20  Parse structure 
0f50: 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20  for the next.** 
0f60: 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  parse..**.** Not
0f70: 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72 72  e that if an err
0f80: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20  or occurred, it 
0f90: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
0fa0: 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42  e that.** no VDB
0fb0: 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72  E code was gener
0fc0: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
0fd0: 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
0fe0: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
0ff0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1000: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
1010: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
1020: 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a 20  Toplevel==0 );. 
1030: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1040: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1050: 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b  nested ) return;
1060: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1070: 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
1080: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 69  e->nErr ){.    i
1090: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
10a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 72 73  QLITE_OK ) pPars
10b0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
10c0: 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
10d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
10e0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
10f0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
1100: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
1110: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
1120: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
1130: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1140: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
1150: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
1160: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20  isMultiWrite .  
1170: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
1180: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
1190: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  t(v, pParse->may
11a0: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76  Abort));.  if( v
11b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11c0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
11d0: 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53 51 4c 49  Halt);..#if SQLI
11e0: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
11f0: 43 41 54 49 4f 4e 0a 20 20 20 20 69 66 28 20 70  CATION.    if( p
1200: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
1210: 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  k>0 && db->init.
1220: 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  busy==0 ){.     
1230: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
1240: 49 6e 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20  Init(db);.      
1250: 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74  if( db->auth.aut
1260: 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55 73 65  hLevel<UAUTH_Use
1270: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
1280: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1290: 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20 61  rse, "user not a
12a0: 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b 0a  uthenticated");.
12b0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
12c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 48  rc = SQLITE_AUTH
12d0: 5f 55 53 45 52 3b 0a 20 20 20 20 20 20 20 20 72  _USER;.        r
12e0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
12f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1300: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
1310: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
1320: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
1330: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
1340: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
1350: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
1360: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
1370: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
1380: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
1390: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
13a0: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
13b0: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
13c0: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
13d0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
13e0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
13f0: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
1400: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
1410: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
1420: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
1430: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1440: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1450: 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 26 26  iled==0 .     &&
1460: 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72 6f 28   (DbMaskNonZero(
1470: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1480: 73 6b 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70  sk) || pParse->p
1490: 43 6f 6e 73 74 45 78 70 72 29 0a 20 20 20 20 29  ConstExpr).    )
14a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 2c  {.      int iDb,
14b0: 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   i;.      assert
14c0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
14d0: 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f 64 65  Op(v, 0)->opcode
14e0: 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20 20 20  ==OP_Init );.   
14f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1500: 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a 20 20  mpHere(v, 0);.  
1510: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69      for(iDb=0; i
1520: 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
1530: 2b 29 7b 0a 20 20 20 20 20 20 20 20 53 63 68 65  +){.        Sche
1540: 6d 61 20 2a 70 53 63 68 65 6d 61 3b 0a 20 20 20  ma *pSchema;.   
1550: 20 20 20 20 20 69 66 28 20 44 62 4d 61 73 6b 54       if( DbMaskT
1560: 65 73 74 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  est(pParse->cook
1570: 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
1580: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
15a0: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
15b0: 3b 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d  ;.        pSchem
15c0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
15d0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  .pSchema;.      
15e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f0: 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20 20 20  Op4Int(v,.      
1600: 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63 74 69      OP_Transacti
1610: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
1620: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
1630: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 44   */.          iD
1640: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20 20   /* P1 */.      
1670: 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74 28 70      DbMaskTest(p
1680: 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
1690: 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a 2f 0a  ,iDb), /* P2 */.
16a0: 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d            pSchem
16b0: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
16c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
16d0: 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  P3 */.          
16e0: 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
16f0: 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
1700: 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20     /* P4 */.    
1710: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1720: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1730: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
1740: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b  eChangeP5(v, 1);
1750: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
1760: 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20 20 20  ment((v,.       
1770: 20 20 20 20 20 20 20 22 75 73 65 73 53 74 6d 74         "usesStmt
1780: 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70 50 61  Journal=%d", pPa
1790: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20 26 26  rse->mayAbort &&
17a0: 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69   pParse->isMulti
17b0: 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20 20 7d  Write));.      }
17c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
17e0: 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  E.      for(i=0;
17f0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61 62   i<pParse->nVtab
1800: 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Lock; i++){.    
1810: 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20 3d      char *vtab =
1820: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1830: 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 50  GetVTable(db, pP
1840: 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63 6b  arse->apVtabLock
1850: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [i]);.        sq
1860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1870: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c  v, OP_VBegin, 0,
1880: 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f   0, 0, vtab, P4_
1890: 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a 20  VTAB);.      }. 
18a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 74       pParse->nVt
18b0: 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e 64  abLock = 0;.#end
18c0: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 63  if..      /* Onc
18d0: 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69 65  e all the cookie
18e0: 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72 69  s have been veri
18f0: 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61 63  fied and transac
1900: 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a 20  tions opened, . 
1910: 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 74       ** obtain t
1920: 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
1930: 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69 73  e-locks. This is
1940: 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
1950: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 68  the .      ** sh
1960: 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75  ared-cache featu
1970: 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20  re is enabled.. 
1980: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
1990: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50 61  deTableLocks(pPa
19a0: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  rse);..      /* 
19b0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20 41  Initialize any A
19c0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61 74  UTOINCREMENT dat
19d0: 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65 71  a structures req
19e0: 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  uired..      */.
19f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74        sqlite3Aut
1a00: 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e 28  oincrementBegin(
1a10: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1a20: 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e 74  /* Code constant
1a30: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1a40: 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65 64  t where factored
1a50: 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c 6f   out of inner lo
1a60: 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ops */.      if(
1a70: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1a80: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45  xpr ){.        E
1a90: 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20 70  xprList *pEL = p
1aa0: 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
1ab0: 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  r;.        pPars
1ac0: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
1ad0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
1ae0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e 45  r(i=0; i<pEL->nE
1af0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1b00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b10: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
1b20: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  ->a[i].pExpr, pE
1b30: 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73 74  L->a[i].u.iConst
1b40: 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20 20  ExprReg);.      
1b50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
1b60: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a     /* Finally, j
1b70: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1b80: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1b90: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65   executable code
1ba0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1bb0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31 29  e3VdbeGoto(v, 1)
1bc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
1bd0: 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20  /* Get the VDBE 
1be0: 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f  program ready fo
1bf0: 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f  r execution.  */
1c00: 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72  .  if( v && pPar
1c10: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21  se->nErr==0 && !
1c20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c30: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e   ){.    /* A min
1c40: 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73  imum of one curs
1c50: 6f 72 20 69 73 20 72 65 71 75 69 72 65 64 20 69  or is required i
1c60: 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
1c70: 69 73 20 75 73 65 64 0a 20 20 20 20 2a 20 20 53  is used.    *  S
1c80: 65 65 20 74 69 63 6b 65 74 20 5b 61 36 39 36 33  ee ticket [a6963
1c90: 37 39 63 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20  79c1f08866] */. 
1ca0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
1cb0: 65 2d 3e 70 41 69 6e 63 3d 3d 30 20 7c 7c 20 70  e->pAinc==0 || p
1cc0: 50 61 72 73 65 2d 3e 6e 54 61 62 3e 30 20 29 3b  Parse->nTab>0 );
1cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1ce0: 4d 61 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61  MakeReady(v, pPa
1cf0: 72 73 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65  rse);.    pParse
1d00: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f  ->rc = SQLITE_DO
1d10: 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NE;.  }else{.   
1d20: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
1d30: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
1d40: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65  }../*.** Run the
1d50: 20 70 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65   parser and code
1d60: 20 67 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72   generator recur
1d70: 73 69 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20  sively in order 
1d80: 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63  to generate.** c
1d90: 6f 64 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20  ode for the SQL 
1da0: 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20  statement given 
1db0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
1dc0: 74 68 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65  the pParse conte
1dd0: 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  xt.** currently 
1de0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
1df0: 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61  on.  When the pa
1e00: 72 73 65 72 20 69 73 20 72 75 6e 20 72 65 63 75  rser is run recu
1e10: 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20  rsively.** this 
1e20: 77 61 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f  way, the final O
1e30: 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70  P_Halt is not ap
1e40: 70 65 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72  pended and other
1e50: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
1e60: 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74  ** and finalizat
1e70: 69 6f 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d  ion steps are om
1e80: 69 74 74 65 64 20 62 65 63 61 75 73 65 20 74 68  itted because th
1e90: 6f 73 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67  ose are handling
1ea0: 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72   by the.** outer
1eb0: 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a  most parser..**.
1ec0: 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e  ** Not everythin
1ed0: 67 20 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20  g is nestable.  
1ee0: 54 68 69 73 20 66 61 63 69 6c 69 74 79 20 69 73  This facility is
1ef0: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72   designed to per
1f00: 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55  mit.** INSERT, U
1f10: 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54  PDATE, and DELET
1f20: 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61  E operations aga
1f30: 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54  inst SQLITE_MAST
1f40: 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65  ER.  Use.** care
1f50: 20 69 66 20 79 6f 75 20 64 65 63 69 64 65 20 74   if you decide t
1f60: 6f 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 69  o try to use thi
1f70: 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f  s routine for so
1f80: 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
1f90: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1fa0: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 50 61  e3NestedParse(Pa
1fb0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
1fc0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
1fd0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
1fe0: 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53  t ap;.  char *zS
1ff0: 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  ql;.  char *zErr
2000: 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Msg = 0;.  sqlit
2010: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
2020: 3e 64 62 3b 0a 20 20 63 68 61 72 20 73 61 76 65  >db;.  char save
2030: 42 75 66 5b 50 41 52 53 45 5f 54 41 49 4c 5f 53  Buf[PARSE_TAIL_S
2040: 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  Z];..  if( pPars
2050: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
2060: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
2070: 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b  se->nested<10 );
2080: 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f    /* Nesting sho
2090: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c  uld only be of l
20a0: 69 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a  imited depth */.
20b0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
20c0: 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20  Format);.  zSql 
20d0: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
20e0: 66 28 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  f(db, zFormat, a
20f0: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
2100: 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  ;.  if( zSql==0 
2110: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
2120: 61 6e 20 72 65 73 75 6c 74 20 65 69 74 68 65 72  an result either
2130: 20 66 72 6f 6d 20 61 6e 20 4f 4f 4d 20 6f 72 20   from an OOM or 
2140: 62 65 63 61 75 73 65 20 74 68 65 20 66 6f 72 6d  because the form
2150: 61 74 74 65 64 20 73 74 72 69 6e 67 0a 20 20 20  atted string.   
2160: 20 2a 2a 20 65 78 63 65 65 64 73 20 53 51 4c 49   ** exceeds SQLI
2170: 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 2e  TE_LIMIT_LENGTH.
2180: 20 20 49 6e 20 74 68 65 20 6c 61 74 74 65 72 20    In the latter 
2190: 63 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f  case, we need to
21a0: 20 73 65 74 0a 20 20 20 20 2a 2a 20 61 6e 20 65   set.    ** an e
21b0: 72 72 6f 72 20 2a 2f 0a 20 20 20 20 69 66 28 20  rror */.    if( 
21c0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
21d0: 64 20 29 20 70 50 61 72 73 65 2d 3e 72 63 20 3d  d ) pParse->rc =
21e0: 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3b 0a   SQLITE_TOOBIG;.
21f0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
2200: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
2210: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65    }.  pParse->ne
2220: 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79  sted++;.  memcpy
2230: 28 73 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f  (saveBuf, PARSE_
2240: 54 41 49 4c 28 70 50 61 72 73 65 29 2c 20 50 41  TAIL(pParse), PA
2250: 52 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20  RSE_TAIL_SZ);.  
2260: 6d 65 6d 73 65 74 28 50 41 52 53 45 5f 54 41 49  memset(PARSE_TAI
2270: 4c 28 70 50 61 72 73 65 29 2c 20 30 2c 20 50 41  L(pParse), 0, PA
2280: 52 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20  RSE_TAIL_SZ);.  
2290: 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72  sqlite3RunParser
22a0: 28 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26  (pParse, zSql, &
22b0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  zErrMsg);.  sqli
22c0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45  te3DbFree(db, zE
22d0: 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
22e0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c  3DbFree(db, zSql
22f0: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 50 41 52 53  );.  memcpy(PARS
2300: 45 5f 54 41 49 4c 28 70 50 61 72 73 65 29 2c 20  E_TAIL(pParse), 
2310: 73 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f 54  saveBuf, PARSE_T
2320: 41 49 4c 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73  AIL_SZ);.  pPars
2330: 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a  e->nested--;.}..
2340: 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  #if SQLITE_USER_
2350: 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 2f  AUTHENTICATION./
2360: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
2370: 20 69 66 20 7a 54 61 62 6c 65 20 69 73 20 74 68   if zTable is th
2380: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 73 79  e name of the sy
2390: 73 74 65 6d 20 74 61 62 6c 65 20 74 68 61 74 20  stem table that 
23a0: 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6c 69  stores the.** li
23b0: 73 74 20 6f 66 20 75 73 65 72 73 20 61 6e 64 20  st of users and 
23c0: 74 68 65 69 72 20 61 63 63 65 73 73 20 63 72 65  their access cre
23d0: 64 65 6e 74 69 61 6c 73 2e 0a 2a 2f 0a 69 6e 74  dentials..*/.int
23e0: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
23f0: 54 61 62 6c 65 28 63 6f 6e 73 74 20 63 68 61 72  Table(const char
2400: 20 2a 7a 54 61 62 6c 65 29 7b 0a 20 20 72 65 74   *zTable){.  ret
2410: 75 72 6e 20 73 71 6c 69 74 65 33 5f 73 74 72 69  urn sqlite3_stri
2420: 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c  cmp(zTable, "sql
2430: 69 74 65 5f 75 73 65 72 22 29 3d 3d 30 3b 0a 7d  ite_user")==0;.}
2440: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
2450: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 48  SQLITE_ENABLE_SH
2460: 41 52 45 44 5f 53 43 48 45 4d 41 0a 2f 2a 0a 2a  ARED_SCHEMA./*.*
2470: 2a 20 49 66 20 74 68 69 73 20 64 61 74 61 62 61  * If this databa
2480: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61  se connection wa
2490: 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20 74 68  s opened with th
24a0: 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48  e SQLITE_OPEN_SH
24b0: 41 52 45 44 5f 53 43 48 45 4d 41 0a 2a 2a 20 66  ARED_SCHEMA.** f
24c0: 6c 61 67 20 73 70 65 63 69 66 69 65 64 2c 20 74  lag specified, t
24d0: 68 65 6e 20 65 6e 73 75 72 65 20 74 68 61 74 20  hen ensure that 
24e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
24f0: 65 6d 61 20 66 6f 72 20 64 61 74 61 62 61 73 65  ema for database
2500: 20 69 44 62 0a 2a 2a 20 69 73 20 6c 6f 61 64 65   iDb.** is loade
2510: 64 2e 20 45 69 74 68 65 72 20 62 79 20 6f 62 74  d. Either by obt
2520: 61 69 6e 69 6e 67 20 61 20 53 63 68 65 6d 61 20  aining a Schema 
2530: 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 65 20  object from the 
2540: 73 63 68 65 6d 61 2d 70 6f 6f 6c 2c 20 6f 72 0a  schema-pool, or.
2550: 2a 2a 20 62 79 20 72 65 61 64 69 6e 67 20 74 68  ** by reading th
2560: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2570: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
2580: 74 61 62 6c 65 2e 20 55 6e 6c 65 73 73 20 69 74  table. Unless it
2590: 20 69 73 20 4e 55 4c 4c 2c 20 0a 2a 2a 20 74 68   is NULL, .** th
25a0: 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 64 69 63  e location indic
25b0: 61 74 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  ated by paramete
25c0: 72 20 70 62 55 6e 6c 6f 61 64 20 69 73 20 73 65  r pbUnload is se
25d0: 74 20 74 6f 20 31 20 69 66 20 61 20 73 68 61 72  t to 1 if a shar
25e0: 65 64 2d 73 63 68 65 6d 61 20 0a 2a 2a 20 69 73  ed-schema .** is
25f0: 20 6c 6f 61 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   loaded..**.** I
2600: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
2610: 61 6e 64 6c 65 20 77 61 73 20 6e 6f 74 20 6f 70  andle was not op
2620: 65 6e 65 64 20 77 69 74 68 20 53 51 4c 49 54 45  ened with SQLITE
2630: 5f 4f 50 45 4e 5f 53 48 41 52 45 44 5f 53 43 48  _OPEN_SHARED_SCH
2640: 45 4d 41 2c 20 6f 72 0a 2a 2a 20 69 66 20 74 68  EMA, or.** if th
2650: 65 20 73 63 68 65 6d 61 20 66 6f 72 20 64 61 74  e schema for dat
2660: 61 62 61 73 65 20 69 44 62 20 69 73 20 61 6c 72  abase iDb is alr
2670: 65 61 64 79 20 6c 6f 61 64 65 64 2c 20 74 68 69  eady loaded, thi
2680: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
2690: 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  no-op..**.** SQL
26a0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
26b0: 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ed if successful
26c0: 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  , or an SQLite e
26d0: 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77  rror code otherw
26e0: 69 73 65 2e 20 49 66 0a 2a 2a 20 61 6e 20 65 72  ise. If.** an er
26f0: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2700: 72 6e 65 64 2c 20 28 2a 70 7a 45 72 72 29 20 6d  rned, (*pzErr) m
2710: 61 79 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69  ay be set to poi
2720: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 0a 2a  nt to a buffer.*
2730: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20  * containing an 
2740: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 49  error message. I
2750: 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
2760: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
2770: 61 6c 6c 65 72 20 74 6f 0a 2a 2a 20 65 76 65 6e  aller to.** even
2780: 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68 69 73  tually free this
2790: 20 62 75 66 66 65 72 20 75 73 69 6e 67 20 73 71   buffer using sq
27a0: 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
27b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 63 68 65  .int sqlite3Sche
27c0: 6d 61 4c 6f 61 64 28 73 71 6c 69 74 65 33 20 2a  maLoad(sqlite3 *
27d0: 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74  db, int iDb, int
27e0: 20 2a 70 62 55 6e 6c 6f 61 64 2c 20 63 68 61 72   *pbUnload, char
27f0: 20 2a 2a 70 7a 45 72 72 29 7b 0a 20 20 69 6e 74   **pzErr){.  int
2800: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2810: 0a 20 20 69 66 28 20 49 73 53 68 61 72 65 64 53  .  if( IsSharedS
2820: 63 68 65 6d 61 28 64 62 29 20 0a 20 20 20 20 20  chema(db) .     
2830: 20 26 26 20 44 62 48 61 73 50 72 6f 70 65 72 74   && DbHasPropert
2840: 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 53 63  y(db, iDb, DB_Sc
2850: 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d 30 20 0a  hemaLoaded)==0 .
2860: 20 20 20 20 20 20 26 26 20 28 64 62 2d 3e 69 6e        && (db->in
2870: 69 74 2e 62 75 73 79 3d 3d 30 20 7c 7c 20 28 69  it.busy==0 || (i
2880: 44 62 21 3d 31 20 26 26 20 64 62 2d 3e 69 6e 69  Db!=1 && db->ini
2890: 74 2e 69 44 62 3d 3d 31 29 29 0a 20 20 29 7b 0a  t.iDb==1)).  ){.
28a0: 20 20 20 20 73 74 72 75 63 74 20 73 71 6c 69 74      struct sqlit
28b0: 65 33 49 6e 69 74 49 6e 66 6f 20 73 76 20 3d 20  e3InitInfo sv = 
28c0: 64 62 2d 3e 69 6e 69 74 3b 0a 20 20 20 20 6d 65  db->init;.    me
28d0: 6d 73 65 74 28 26 64 62 2d 3e 69 6e 69 74 2c 20  mset(&db->init, 
28e0: 30 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  0, sizeof(struct
28f0: 20 73 71 6c 69 74 65 33 49 6e 69 74 49 6e 66 6f   sqlite3InitInfo
2900: 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ));.    rc = sql
2910: 69 74 65 33 49 6e 69 74 4f 6e 65 28 64 62 2c 20  ite3InitOne(db, 
2920: 69 44 62 2c 20 70 7a 45 72 72 2c 20 30 29 3b 0a  iDb, pzErr, 0);.
2930: 20 20 20 20 64 62 2d 3e 69 6e 69 74 20 3d 20 73      db->init = s
2940: 76 3b 0a 20 20 20 20 69 66 28 20 70 62 55 6e 6c  v;.    if( pbUnl
2950: 6f 61 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  oad && rc==SQLIT
2960: 45 5f 4f 4b 20 26 26 20 69 44 62 21 3d 31 20 29  E_OK && iDb!=1 )
2970: 20 2a 70 62 55 6e 6c 6f 61 64 20 3d 20 31 3b 0a   *pbUnload = 1;.
2980: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2990: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
29a0: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
29b0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
29c0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61  that describes a
29d0: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
29e0: 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69  base.** table gi
29f0: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
2a00: 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28  that table and (
2a10: 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20  optionally) the 
2a20: 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  name of the.** d
2a30: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
2a40: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  ng the table.  R
2a50: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
2a60: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49  t found..**.** I
2a70: 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30  f zDatabase is 0
2a80: 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  , all databases 
2a90: 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72  are searched for
2aa0: 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74   the table and t
2ab0: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63  he.** first matc
2ac0: 68 69 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65  hing table is re
2ad0: 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65  turned.  (No che
2ae0: 63 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63  cking for duplic
2af0: 61 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d  ate table.** nam
2b00: 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68  es is done.)  Th
2b10: 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69  e search order i
2b20: 73 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68  s TEMP first, th
2b30: 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e  en MAIN, then an
2b40: 79 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64  y.** auxiliary d
2b50: 61 74 61 62 61 73 65 73 20 61 64 64 65 64 20 75  atabases added u
2b60: 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20  sing the ATTACH 
2b70: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53  command..**.** S
2b80: 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c  ee also sqlite3L
2b90: 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f  ocateTable()..*/
2ba0: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46  .Table *sqlite3F
2bb0: 69 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33  indTable(sqlite3
2bc0: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
2bd0: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
2be0: 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b  har *zDatabase){
2bf0: 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b  .  Table *p = 0;
2c00: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
2c10: 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72 65 20  All mutexes are 
2c20: 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 63 68  required for sch
2c30: 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d 61 6b  ema access.  Mak
2c40: 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64 20 74  e sure we hold t
2c50: 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  hem. */.  assert
2c60: 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 7c  ( zDatabase!=0 |
2c70: 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  | sqlite3BtreeHo
2c80: 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62  ldsAllMutexes(db
2c90: 29 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) );.#if SQLITE_
2ca0: 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
2cb0: 49 4f 4e 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68  ION.  /* Only th
2cc0: 65 20 61 64 6d 69 6e 20 75 73 65 72 20 69 73 20  e admin user is 
2cd0: 61 6c 6c 6f 77 65 64 20 74 6f 20 6b 6e 6f 77 20  allowed to know 
2ce0: 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 5f  that the sqlite_
2cf0: 75 73 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20  user table.  ** 
2d00: 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 66 28 20  exists */.  if( 
2d10: 64 62 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65 76  db->auth.authLev
2d20: 65 6c 3c 55 41 55 54 48 5f 41 64 6d 69 6e 20 26  el<UAUTH_Admin &
2d30: 26 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74  & sqlite3UserAut
2d40: 68 54 61 62 6c 65 28 7a 4e 61 6d 65 29 21 3d 30  hTable(zName)!=0
2d50: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
2d60: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77  ;.  }.#endif.  w
2d70: 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 66 6f 72  hile(1){.    for
2d80: 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20  (i=OMIT_TEMPDB; 
2d90: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
2da0: 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 28  .      int j = (
2db0: 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20  i<2) ? i^1 : i; 
2dc0: 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50    /* Search TEMP
2dd0: 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a   before MAIN */.
2de0: 20 20 20 20 20 20 69 66 28 20 7a 44 61 74 61 62        if( zDatab
2df0: 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
2e00: 33 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61  3StrICmp(zDataba
2e10: 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a  se, db->aDb[j].z
2e20: 44 62 53 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  DbSName)==0 ){. 
2e30: 20 20 20 20 20 20 20 69 6e 74 20 62 55 6e 6c 6f         int bUnlo
2e40: 61 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ad = 0;.        
2e50: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
2e60: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
2e70: 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20  b, j, 0) );.    
2e80: 20 20 20 20 69 66 28 20 49 73 53 68 61 72 65 64      if( IsShared
2e90: 53 63 68 65 6d 61 28 64 62 29 20 29 7b 0a 20 20  Schema(db) ){.  
2ea0: 20 20 20 20 20 20 20 20 50 61 72 73 65 20 2a 70          Parse *p
2eb0: 50 61 72 73 65 20 3d 20 64 62 2d 3e 70 50 61 72  Parse = db->pPar
2ec0: 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se;.          if
2ed0: 28 20 70 50 61 72 73 65 20 26 26 20 70 50 61 72  ( pParse && pPar
2ee0: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
2ef0: 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
2f00: 65 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 53  e->rc = sqlite3S
2f10: 63 68 65 6d 61 4c 6f 61 64 28 64 62 2c 20 6a 2c  chemaLoad(db, j,
2f20: 20 26 62 55 6e 6c 6f 61 64 2c 20 26 70 50 61 72   &bUnload, &pPar
2f30: 73 65 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  se->zErrMsg);.  
2f40: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
2f50: 61 72 73 65 2d 3e 72 63 20 29 20 70 50 61 72 73  arse->rc ) pPars
2f60: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
2f70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2f80: 0a 20 20 20 20 20 20 20 20 70 20 3d 20 73 71 6c  .        p = sql
2f90: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
2fa0: 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61  ->aDb[j].pSchema
2fb0: 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65  ->tblHash, zName
2fc0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2fd0: 20 29 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20   ) return p;.   
2fe0: 20 20 20 20 20 69 66 28 20 62 55 6e 6c 6f 61 64       if( bUnload
2ff0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
3000: 6c 69 74 65 33 53 63 68 65 6d 61 52 65 6c 65 61  lite3SchemaRelea
3010: 73 65 28 64 62 2c 20 6a 29 3b 0a 20 20 20 20 20  se(db, j);.     
3020: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
3030: 20 7d 0a 20 20 20 20 2f 2a 20 4e 6f 74 20 66 6f   }.    /* Not fo
3040: 75 6e 64 2e 20 20 49 66 20 74 68 65 20 6e 61 6d  und.  If the nam
3050: 65 20 77 65 20 77 65 72 65 20 6c 6f 6f 6b 69 6e  e we were lookin
3060: 67 20 66 6f 72 20 77 61 73 20 74 65 6d 70 2e 73  g for was temp.s
3070: 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 20  qlite_master.   
3080: 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 20   ** then change 
3090: 74 68 65 20 6e 61 6d 65 20 74 6f 20 73 71 6c 69  the name to sqli
30a0: 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 61  te_temp_master a
30b0: 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20 2a 2f  nd try again. */
30c0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
30d0: 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 4d  StrICmp(zName, M
30e0: 41 53 54 45 52 5f 4e 41 4d 45 29 21 3d 30 20 29  ASTER_NAME)!=0 )
30f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
3100: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
3110: 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61  zDatabase, db->a
3120: 44 62 5b 31 5d 2e 7a 44 62 53 4e 61 6d 65 29 21  Db[1].zDbSName)!
3130: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
3140: 7a 4e 61 6d 65 20 3d 20 54 45 4d 50 5f 4d 41 53  zName = TEMP_MAS
3150: 54 45 52 5f 4e 41 4d 45 3b 0a 20 20 7d 0a 20 20  TER_NAME;.  }.  
3160: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
3170: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
3180: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
3190: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
31a0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
31b0: 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20  tabase.** table 
31c0: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
31d0: 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64  f that table and
31e0: 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68   (optionally) th
31f0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
3200: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
3210: 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20  ning the table. 
3220: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
3230: 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f  not found.  Also
3240: 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72   leave an.** err
3250: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
3260: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
3270: 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
3280: 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
3290: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c   routine and sql
32a0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20  ite3FindTable() 
32b0: 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20  is that this.** 
32c0: 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61  routine leaves a
32d0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
32e0: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
32f0: 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69  sg where.** sqli
3300: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64  te3FindTable() d
3310: 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c  oes not..*/.Tabl
3320: 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  e *sqlite3Locate
3330: 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a  Table(.  Parse *
3340: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
3350: 2f 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68  /* context in wh
3360: 69 63 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72  ich to report er
3370: 72 6f 72 73 20 2a 2f 0a 20 20 75 33 32 20 66 6c  rors */.  u32 fl
3380: 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
3390: 20 2f 2a 20 4c 4f 43 41 54 45 5f 56 49 45 57 20   /* LOCATE_VIEW 
33a0: 6f 72 20 4c 4f 43 41 54 45 5f 4e 4f 45 52 52 20  or LOCATE_NOERR 
33b0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
33c0: 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e  *zName,     /* N
33d0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
33e0: 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20   we are looking 
33f0: 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  for */.  const c
3400: 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20 20 20  har *zDbase     
3410: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
3420: 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68 74 20  atabase.  Might 
3430: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
3440: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69  Table *p;.  sqli
3450: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
3460: 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  ->db;..  /* Read
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
3480: 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f  hema. If an erro
3490: 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
34a0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
34b0: 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69  .  ** and code i
34c0: 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
34d0: 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69  urn NULL. */.  i
34e0: 66 28 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73  f( (db->mDbFlags
34f0: 20 26 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61   & DBFLAG_Schema
3500: 4b 6e 6f 77 6e 4f 6b 29 3d 3d 30 20 0a 20 20 20  KnownOk)==0 .   
3510: 26 26 20 21 49 73 53 68 61 72 65 64 53 63 68 65  && !IsSharedSche
3520: 6d 61 28 64 62 29 0a 20 20 20 26 26 20 53 51 4c  ma(db).   && SQL
3530: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
3540: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
3550: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
3560: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20  n 0;.  }..  p = 
3570: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
3580: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61  (db, zName, zDba
3590: 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  se);.  if( p==0 
35a0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
35b0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
35c0: 42 4c 45 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e  BLE.    /* If zN
35d0: 61 6d 65 20 69 73 20 74 68 65 20 6e 6f 74 20 74  ame is the not t
35e0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 61 62  he name of a tab
35f0: 6c 65 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61  le in the schema
3600: 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 0a 20   created using. 
3610: 20 20 20 2a 2a 20 43 52 45 41 54 45 2c 20 74 68     ** CREATE, th
3620: 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  en check to see 
3630: 69 66 20 69 74 20 69 73 20 74 68 65 20 6e 61 6d  if it is the nam
3640: 65 20 6f 66 20 61 6e 20 76 69 72 74 75 61 6c 20  e of an virtual 
3650: 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20 2a  table that.    *
3660: 2a 20 63 61 6e 20 62 65 20 61 6e 20 65 70 6f 6e  * can be an epon
3670: 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61  ymous virtual ta
3680: 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ble. */.    if( 
3690: 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 56  pParse->disableV
36a0: 74 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tab==0 ){.      
36b0: 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28  Module *pMod = (
36c0: 4d 6f 64 75 6c 65 2a 29 73 71 6c 69 74 65 33 48  Module*)sqlite3H
36d0: 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 4d 6f  ashFind(&db->aMo
36e0: 64 75 6c 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  dule, zName);.  
36f0: 20 20 20 20 69 66 28 20 70 4d 6f 64 3d 3d 30 20      if( pMod==0 
3700: 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  && sqlite3_strni
3710: 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67  cmp(zName, "prag
3720: 6d 61 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20  ma_", 7)==0 ){. 
3730: 20 20 20 20 20 20 20 70 4d 6f 64 20 3d 20 73 71         pMod = sq
3740: 6c 69 74 65 33 50 72 61 67 6d 61 56 74 61 62 52  lite3PragmaVtabR
3750: 65 67 69 73 74 65 72 28 64 62 2c 20 7a 4e 61 6d  egister(db, zNam
3760: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
3770: 20 20 69 66 28 20 70 4d 6f 64 20 29 7b 0a 20 20    if( pMod ){.  
3780: 20 20 20 20 20 20 69 66 28 20 49 73 53 68 61 72        if( IsShar
3790: 65 64 53 63 68 65 6d 61 28 64 62 29 20 26 26 20  edSchema(db) && 
37a0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
37b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
37c0: 20 62 44 75 6d 6d 79 20 3d 20 30 3b 0a 20 20 20   bDummy = 0;.   
37d0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72         pParse->r
37e0: 63 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  c = sqlite3Schem
37f0: 61 4c 6f 61 64 28 64 62 2c 20 30 2c 20 26 62 44  aLoad(db, 0, &bD
3800: 75 6d 6d 79 2c 20 26 70 50 61 72 73 65 2d 3e 7a  ummy, &pParse->z
3810: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20  ErrMsg);.       
3820: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72     if( pParse->r
3830: 63 20 29 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  c ) pParse->nErr
3840: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
3850: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
3860: 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73 54 61  3VtabEponymousTa
3870: 62 6c 65 49 6e 69 74 28 70 50 61 72 73 65 2c 20  bleInit(pParse, 
3880: 70 4d 6f 64 29 20 29 7b 0a 20 20 20 20 20 20 20  pMod) ){.       
3890: 20 20 20 54 61 62 6c 65 20 2a 70 45 70 6f 54 61     Table *pEpoTa
38a0: 62 20 3d 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61  b = pMod->pEpoTa
38b0: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  b;.          ass
38c0: 65 72 74 28 20 49 73 53 68 61 72 65 64 53 63 68  ert( IsSharedSch
38d0: 65 6d 61 28 64 62 29 20 7c 7c 20 70 45 70 6f 54  ema(db) || pEpoT
38e0: 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d  ab->pSchema==db-
38f0: 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20  >aDb[0].pSchema 
3900: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 70  );.          pEp
3910: 6f 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20  oTab->pSchema = 
3920: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65  db->aDb[0].pSche
3930: 6d 61 3b 20 20 2f 2a 20 46 6f 72 20 53 48 41 52  ma;  /* For SHAR
3940: 45 44 5f 53 43 48 45 4d 41 20 6d 6f 64 65 20 2a  ED_SCHEMA mode *
3950: 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
3960: 72 6e 20 70 45 70 6f 54 61 62 3b 0a 20 20 20 20  rn pEpoTab;.    
3970: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
3980: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
3990: 66 28 20 66 6c 61 67 73 20 26 20 4c 4f 43 41 54  f( flags & LOCAT
39a0: 45 5f 4e 4f 45 52 52 20 29 20 72 65 74 75 72 6e  E_NOERR ) return
39b0: 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   0;.    pParse->
39c0: 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
39d0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56  .  }else if( IsV
39e0: 69 72 74 75 61 6c 28 70 29 20 26 26 20 70 50 61  irtual(p) && pPa
39f0: 72 73 65 2d 3e 64 69 73 61 62 6c 65 56 74 61 62  rse->disableVtab
3a00: 20 29 7b 0a 20 20 20 20 70 20 3d 20 30 3b 0a 20   ){.    p = 0;. 
3a10: 20 7d 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20 26   }..  if( p==0 &
3a20: 26 20 28 21 49 73 53 68 61 72 65 64 53 63 68 65  & (!IsSharedSche
3a30: 6d 61 28 64 62 29 20 7c 7c 20 70 50 61 72 73 65  ma(db) || pParse
3a40: 2d 3e 6e 45 72 72 3d 3d 30 29 20 29 7b 0a 20 20  ->nErr==0) ){.  
3a50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d    const char *zM
3a60: 73 67 20 3d 20 66 6c 61 67 73 20 26 20 4c 4f 43  sg = flags & LOC
3a70: 41 54 45 5f 56 49 45 57 20 3f 20 22 6e 6f 20 73  ATE_VIEW ? "no s
3a80: 75 63 68 20 76 69 65 77 22 20 3a 20 22 6e 6f 20  uch view" : "no 
3a90: 73 75 63 68 20 74 61 62 6c 65 22 3b 0a 20 20 20  such table";.   
3aa0: 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b 0a 20   if( zDbase ){. 
3ab0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
3ac0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
3ad0: 3a 20 25 73 2e 25 73 22 2c 20 7a 4d 73 67 2c 20  : %s.%s", zMsg, 
3ae0: 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a  zDbase, zName);.
3af0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3b00: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3b10: 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73  (pParse, "%s: %s
3b20: 22 2c 20 7a 4d 73 67 2c 20 7a 4e 61 6d 65 29 3b  ", zMsg, zName);
3b30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
3b40: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
3b50: 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
3b60: 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  e identified by 
3b70: 2a 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  *p..**.** This i
3b80: 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
3b90: 6e 64 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  nd sqlite3Locate
3ba0: 54 61 62 6c 65 28 29 2e 20 54 68 65 20 64 69 66  Table(). The dif
3bb0: 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 0a  ference between.
3bc0: 2a 2a 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  ** sqlite3Locate
3bd0: 54 61 62 6c 65 28 29 20 61 6e 64 20 74 68 69 73  Table() and this
3be0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 61   function is tha
3bf0: 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  t this function 
3c00: 72 65 73 74 72 69 63 74 73 0a 2a 2a 20 74 68 65  restricts.** the
3c10: 20 73 65 61 72 63 68 20 74 6f 20 73 63 68 65 6d   search to schem
3c20: 61 20 28 70 2d 3e 70 53 63 68 65 6d 61 29 20 69  a (p->pSchema) i
3c30: 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  f it is not NULL
3c40: 2e 20 70 2d 3e 70 53 63 68 65 6d 61 20 6d 61 79  . p->pSchema may
3c50: 20 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20   be.** non-NULL 
3c60: 69 66 20 69 74 20 69 73 20 70 61 72 74 20 6f 66  if it is part of
3c70: 20 61 20 76 69 65 77 20 6f 72 20 74 72 69 67 67   a view or trigg
3c80: 65 72 20 70 72 6f 67 72 61 6d 20 64 65 66 69 6e  er program defin
3c90: 69 74 69 6f 6e 2e 20 53 65 65 0a 2a 2a 20 73 71  ition. See.** sq
3ca0: 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28  lite3FixSrcList(
3cb0: 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  ) for details..*
3cc0: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
3cd0: 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28  LocateTableItem(
3ce0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
3cf0: 2c 20 0a 20 20 75 33 32 20 66 6c 61 67 73 2c 0a  , .  u32 flags,.
3d00: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
3d10: 5f 69 74 65 6d 20 2a 70 0a 29 7b 0a 20 20 63 6f  _item *p.){.  co
3d20: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20  nst char *zDb;. 
3d30: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 63 68   assert( p->pSch
3d40: 65 6d 61 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 61  ema==0 || p->zDa
3d50: 74 61 62 61 73 65 3d 3d 30 20 29 3b 0a 20 20 69  tabase==0 );.  i
3d60: 66 28 20 70 2d 3e 70 53 63 68 65 6d 61 20 29 7b  f( p->pSchema ){
3d70: 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73  .    int iDb = s
3d80: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
3d90: 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
3da0: 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  p->pSchema);.   
3db0: 20 7a 44 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   zDb = pParse->d
3dc0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
3dd0: 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Name;.  }else{. 
3de0: 20 20 20 7a 44 62 20 3d 20 70 2d 3e 7a 44 61 74     zDb = p->zDat
3df0: 61 62 61 73 65 3b 0a 20 20 7d 0a 20 20 72 65 74  abase;.  }.  ret
3e00: 75 72 6e 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  urn sqlite3Locat
3e10: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 66  eTable(pParse, f
3e20: 6c 61 67 73 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  lags, p->zName, 
3e30: 7a 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  zDb);.}../*.** L
3e40: 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ocate the in-mem
3e50: 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68  ory structure th
3e60: 61 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a  at describes .**
3e70: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e   a particular in
3e80: 64 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61  dex given the na
3e90: 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78  me of that index
3ea0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65  .** and the name
3eb0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
3ec0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
3ed0: 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74  he index..** Ret
3ee0: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
3ef0: 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  found..**.** If 
3f00: 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20  zDatabase is 0, 
3f10: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72  all databases ar
3f20: 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
3f30: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  he.** table and 
3f40: 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69  the first matchi
3f50: 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65 74 75  ng index is retu
3f60: 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b  rned.  (No check
3f70: 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69  ing.** for dupli
3f80: 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73  cate index names
3f90: 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20   is done.)  The 
3fa0: 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a  search order is.
3fb0: 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74  ** TEMP first, t
3fc0: 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61  hen MAIN, then a
3fd0: 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ny auxiliary dat
3fe0: 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20  abases added.** 
3ff0: 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48  using the ATTACH
4000: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64   command..*/.Ind
4010: 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49  ex *sqlite3FindI
4020: 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62  ndex(sqlite3 *db
4030: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
4040: 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
4050: 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a  *zDb){.  Index *
4060: 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  p = 0;.  int i;.
4070: 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73    /* All mutexes
4080: 20 61 72 65 20 72 65 71 75 69 72 65 64 20 66 6f   are required fo
4090: 72 20 73 63 68 65 6d 61 20 61 63 63 65 73 73 2e  r schema access.
40a0: 20 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68    Make sure we h
40b0: 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61  old them. */.  a
40c0: 73 73 65 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c  ssert( zDb!=0 ||
40d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
40e0: 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29  dsAllMutexes(db)
40f0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54   );.  for(i=OMIT
4100: 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e  _TEMPDB; i<db->n
4110: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  Db; i++){.    in
4120: 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e  t j = (i<2) ? i^
4130: 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63  1 : i;  /* Searc
4140: 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41  h TEMP before MA
4150: 49 4e 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61  IN */.    Schema
4160: 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e   *pSchema = db->
4170: 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a  aDb[j].pSchema;.
4180: 20 20 20 20 61 73 73 65 72 74 28 20 70 53 63 68      assert( pSch
4190: 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  ema );.    if( z
41a0: 44 62 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  Db && sqlite3Str
41b0: 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44  ICmp(zDb, db->aD
41c0: 62 5b 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29 20 29  b[j].zDbSName) )
41d0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
41e0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
41f0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
4200: 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 70  , j, 0) );.    p
4210: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
4220: 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78  nd(&pSchema->idx
4230: 48 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  Hash, zName);.  
4240: 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b    if( p ) break;
4250: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
4260: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69  .}../*.** Reclai
4270: 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65  m the memory use
4280: 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f  d by an index.*/
4290: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 72 65  .void sqlite3Fre
42a0: 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a  eIndex(sqlite3 *
42b0: 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 23  db, Index *p){.#
42c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
42d0: 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71 6c  IT_ANALYZE.  sql
42e0: 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78 53  ite3DeleteIndexS
42f0: 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a 23  amples(db, p);.#
4300: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 45  endif.  sqlite3E
4310: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
4320: 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 29 3b  >pPartIdxWhere);
4330: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
4340: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
4350: 61 43 6f 6c 45 78 70 72 29 3b 0a 20 20 73 71 6c  aColExpr);.  sql
4360: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4370: 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 69 66  ->zColAff);.  if
4380: 28 20 70 2d 3e 69 73 52 65 73 69 7a 65 64 20 29  ( p->isResized )
4390: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
43a0: 62 2c 20 28 76 6f 69 64 20 2a 29 70 2d 3e 61 7a  b, (void *)p->az
43b0: 43 6f 6c 6c 29 3b 0a 23 69 66 64 65 66 20 53 51  Coll);.#ifdef SQ
43c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
43d0: 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 73 71 6c  3_OR_STAT4.  sql
43e0: 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 69 52  ite3_free(p->aiR
43f0: 6f 77 45 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20  owEst);.#endif. 
4400: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4410: 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
4420: 46 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63 61  For the index ca
4430: 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68  lled zIdxName wh
4440: 69 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20  ich is found in 
4450: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 44 62  the database iDb
4460: 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74  ,.** unlike that
4470: 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20   index from its 
4480: 54 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76  Table then remov
4490: 65 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d  e the index from
44a0: 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61  .** the index ha
44b0: 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65  sh table and fre
44c0: 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72  e all memory str
44d0: 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74  uctures associat
44e0: 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69  ed.** with the i
44f0: 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ndex..*/.void sq
4500: 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65  lite3UnlinkAndDe
4510: 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65  leteIndex(sqlite
4520: 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20  3 *db, int iDb, 
4530: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78  const char *zIdx
4540: 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a  Name){.  Index *
4550: 70 49 6e 64 65 78 3b 0a 20 20 48 61 73 68 20 2a  pIndex;.  Hash *
4560: 70 48 61 73 68 3b 0a 0a 20 20 61 73 73 65 72 74  pHash;..  assert
4570: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
4580: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
4590: 2c 20 30 29 20 29 3b 0a 20 20 70 48 61 73 68 20  , 0) );.  pHash 
45a0: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  = &db->aDb[iDb].
45b0: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
45c0: 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  ;.  pIndex = sql
45d0: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 70  ite3HashInsert(p
45e0: 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20  Hash, zIdxName, 
45f0: 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  0);.  if( ALWAYS
4600: 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20  (pIndex) ){.    
4610: 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  if( pIndex->pTab
4620: 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64  le->pIndex==pInd
4630: 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64  ex ){.      pInd
4640: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
4650: 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  ex = pIndex->pNe
4660: 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
4670: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20       Index *p;. 
4680: 20 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69 63       /* Justific
4690: 61 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28  ation of ALWAYS(
46a0: 29 3b 20 20 54 68 65 20 69 6e 64 65 78 20 6d 75  );  The index mu
46b0: 73 74 20 62 65 20 6f 6e 20 74 68 65 20 6c 69 73  st be on the lis
46c0: 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e  t of.      ** in
46d0: 64 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  dices. */.      
46e0: 70 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  p = pIndex->pTab
46f0: 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  le->pIndex;.    
4700: 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
4710: 70 29 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d  p) && p->pNext!=
4720: 70 49 6e 64 65 78 20 29 7b 20 70 20 3d 20 70 2d  pIndex ){ p = p-
4730: 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 20 20  >pNext; }.      
4740: 69 66 28 20 41 4c 57 41 59 53 28 70 20 26 26 20  if( ALWAYS(p && 
4750: 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78  p->pNext==pIndex
4760: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ) ){.        p->
4770: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e  pNext = pIndex->
4780: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
4790: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
47a0: 46 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49  FreeIndex(db, pI
47b0: 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d  ndex);.  }.  db-
47c0: 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46  >mDbFlags |= DBF
47d0: 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65  LAG_SchemaChange
47e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20  ;.}../*.** Look 
47f0: 74 68 72 6f 75 67 68 20 74 68 65 20 6c 69 73 74  through the list
4800: 20 6f 66 20 6f 70 65 6e 20 64 61 74 61 62 61 73   of open databas
4810: 65 20 66 69 6c 65 73 20 69 6e 20 64 62 2d 3e 61  e files in db->a
4820: 44 62 5b 5d 20 61 6e 64 20 69 66 0a 2a 2a 20 61  Db[] and if.** a
4830: 6e 79 20 68 61 76 65 20 62 65 65 6e 20 63 6c 6f  ny have been clo
4840: 73 65 64 2c 20 72 65 6d 6f 76 65 20 74 68 65 6d  sed, remove them
4850: 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 2e 20   from the list. 
4860: 20 52 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 0a   Reallocate the.
4870: 2a 2a 20 64 62 2d 3e 61 44 62 5b 5d 20 73 74 72  ** db->aDb[] str
4880: 75 63 74 75 72 65 20 74 6f 20 61 20 73 6d 61 6c  ucture to a smal
4890: 6c 65 72 20 73 69 7a 65 2c 20 69 66 20 70 6f 73  ler size, if pos
48a0: 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45 6e 74  sible..**.** Ent
48b0: 72 79 20 30 20 28 74 68 65 20 22 6d 61 69 6e 22  ry 0 (the "main"
48c0: 20 64 61 74 61 62 61 73 65 29 20 61 6e 64 20 65   database) and e
48d0: 6e 74 72 79 20 31 20 28 74 68 65 20 22 74 65 6d  ntry 1 (the "tem
48e0: 70 22 20 64 61 74 61 62 61 73 65 29 0a 2a 2a 20  p" database).** 
48f0: 61 72 65 20 6e 65 76 65 72 20 63 61 6e 64 69 64  are never candid
4900: 61 74 65 73 20 66 6f 72 20 62 65 69 6e 67 20 63  ates for being c
4910: 6f 6c 6c 61 70 73 65 64 2e 0a 2a 2f 0a 76 6f 69  ollapsed..*/.voi
4920: 64 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73  d sqlite3Collaps
4930: 65 44 61 74 61 62 61 73 65 41 72 72 61 79 28 73  eDatabaseArray(s
4940: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
4950: 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69  nt i, j;.  for(i
4960: 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  =j=2; i<db->nDb;
4970: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
4980: 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d  t Db *pDb = &db-
4990: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aDb[i];.    if(
49a0: 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a   pDb->pBt==0 ){.
49b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
49c0: 72 65 65 28 64 62 2c 20 70 44 62 2d 3e 7a 44 62  ree(db, pDb->zDb
49d0: 53 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 44  SName);.      pD
49e0: 62 2d 3e 7a 44 62 53 4e 61 6d 65 20 3d 20 30 3b  b->zDbSName = 0;
49f0: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
4a00: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
4a10: 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  <i ){.      db->
4a20: 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62  aDb[j] = db->aDb
4a30: 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  [i];.    }.    j
4a40: 2b 2b 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 44  ++;.  }.  db->nD
4a50: 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d  b = j;.  if( db-
4a60: 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61  >nDb<=2 && db->a
4a70: 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61 74 69  Db!=db->aDbStati
4a80: 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  c ){.    memcpy(
4a90: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c 20 64  db->aDbStatic, d
4aa0: 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66  b->aDb, 2*sizeof
4ab0: 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20  (db->aDb[0]));. 
4ac0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4ad0: 28 64 62 2c 20 64 62 2d 3e 61 44 62 29 3b 0a 20  (db, db->aDb);. 
4ae0: 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d     db->aDb = db-
4af0: 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a  >aDbStatic;.  }.
4b00: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74  }../*.** Reset t
4b10: 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68  he schema for th
4b20: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 69 6e  e database at in
4b30: 64 65 78 20 69 44 62 2e 20 20 41 6c 73 6f 20 72  dex iDb.  Also r
4b40: 65 73 65 74 20 74 68 65 0a 2a 2a 20 54 45 4d 50  eset the.** TEMP
4b50: 20 73 63 68 65 6d 61 2e 20 20 54 68 65 20 72 65   schema.  The re
4b60: 73 65 74 20 69 73 20 64 65 66 65 72 72 65 64 20  set is deferred 
4b70: 69 66 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f  if db->nSchemaLo
4b80: 63 6b 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2e 0a  ck is not zero..
4b90: 2a 2a 20 44 65 66 65 72 72 65 64 20 72 65 73 65  ** Deferred rese
4ba0: 74 73 20 6d 61 79 20 62 65 20 72 75 6e 20 62 79  ts may be run by
4bb0: 20 63 61 6c 6c 69 6e 67 20 77 69 74 68 20 69 44   calling with iD
4bc0: 62 3c 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  b<0..*/.void sql
4bd0: 69 74 65 33 52 65 73 65 74 4f 6e 65 53 63 68 65  ite3ResetOneSche
4be0: 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ma(sqlite3 *db, 
4bf0: 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e 74 20  int iDb){.  int 
4c00: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  i;.  assert( iDb
4c10: 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 69  <db->nDb );..  i
4c20: 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20  f( iDb>=0 ){.   
4c30: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
4c40: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
4c50: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
4c60: 20 20 20 44 62 53 65 74 50 72 6f 70 65 72 74 79     DbSetProperty
4c70: 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 52 65 73  (db, iDb, DB_Res
4c80: 65 74 57 61 6e 74 65 64 29 3b 0a 20 20 20 20 44  etWanted);.    D
4c90: 62 53 65 74 50 72 6f 70 65 72 74 79 28 64 62 2c  bSetProperty(db,
4ca0: 20 31 2c 20 44 42 5f 52 65 73 65 74 57 61 6e 74   1, DB_ResetWant
4cb0: 65 64 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 44 62  ed);.    db->mDb
4cc0: 46 6c 61 67 73 20 26 3d 20 7e 44 42 46 4c 41 47  Flags &= ~DBFLAG
4cd0: 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 3b 0a  _SchemaKnownOk;.
4ce0: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53    }.  if( db->nS
4cf0: 63 68 65 6d 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  chemaLock==0 ){.
4d00: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
4d10: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
4d20: 20 20 20 20 69 66 28 20 44 62 48 61 73 50 72 6f      if( DbHasPro
4d30: 70 65 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f  perty(db, i, DB_
4d40: 52 65 73 65 74 57 61 6e 74 65 64 29 20 29 7b 0a  ResetWanted) ){.
4d50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
4d60: 63 68 65 6d 61 43 6c 65 61 72 4f 72 44 69 73 63  chemaClearOrDisc
4d70: 6f 6e 6e 65 63 74 28 64 62 2c 20 69 29 3b 0a 20  onnect(db, i);. 
4d80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
4d90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
4da0: 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72  all schema infor
4db0: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 6c 6c 20  mation from all 
4dc0: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
4dd0: 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a  es (including.**
4de0: 20 22 6d 61 69 6e 22 20 61 6e 64 20 22 74 65 6d   "main" and "tem
4df0: 70 22 29 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  p") for a single
4e00: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
4e10: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
4e20: 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
4e30: 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
4e40: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
4e50: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
4e60: 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64  3BtreeEnterAll(d
4e70: 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  b);.  for(i=0; i
4e80: 3c 64 62 2d 3e 6e 44 62 3b 20 69 3d 28 69 3f 69  <db->nDb; i=(i?i
4e90: 2b 31 3a 32 29 29 7b 0a 20 20 20 20 44 62 20 2a  +1:2)){.    Db *
4ea0: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
4eb0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
4ec0: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
4ed0: 20 69 66 28 20 64 62 2d 3e 6e 53 63 68 65 6d 61   if( db->nSchema
4ee0: 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
4ef0: 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61     sqlite3Schema
4f00: 43 6c 65 61 72 4f 72 44 69 73 63 6f 6e 6e 65 63  ClearOrDisconnec
4f10: 74 28 64 62 2c 20 69 29 3b 0a 20 20 20 20 20 20  t(db, i);.      
4f20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 44  }else{.        D
4f30: 62 53 65 74 50 72 6f 70 65 72 74 79 28 64 62 2c  bSetProperty(db,
4f40: 20 69 2c 20 44 42 5f 52 65 73 65 74 57 61 6e 74   i, DB_ResetWant
4f50: 65 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ed);.      }.   
4f60: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
4f70: 53 63 68 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e  SchemaClear(db->
4f80: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b  aDb[1].pSchema);
4f90: 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20  .  db->mDbFlags 
4fa0: 26 3d 20 7e 28 44 42 46 4c 41 47 5f 53 63 68 65  &= ~(DBFLAG_Sche
4fb0: 6d 61 43 68 61 6e 67 65 7c 44 42 46 4c 41 47 5f  maChange|DBFLAG_
4fc0: 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 29 3b 0a  SchemaKnownOk);.
4fd0: 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c    sqlite3VtabUnl
4fe0: 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20 20 73  ockList(db);.  s
4ff0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
5000: 41 6c 6c 28 64 62 29 3b 0a 20 20 69 66 28 20 64  All(db);.  if( d
5010: 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 3d 3d  b->nSchemaLock==
5020: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
5030: 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65  CollapseDatabase
5040: 41 72 72 61 79 28 64 62 29 3b 0a 20 20 7d 0a 7d  Array(db);.  }.}
5050: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
5060: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
5070: 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63  hen a commit occ
5080: 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  urs..*/.void sql
5090: 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e  ite3CommitIntern
50a0: 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  alChanges(sqlite
50b0: 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 6d 44  3 *db){.  db->mD
50c0: 62 46 6c 61 67 73 20 26 3d 20 7e 44 42 46 4c 41  bFlags &= ~DBFLA
50d0: 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a  G_SchemaChange;.
50e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
50f0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64  memory allocated
5100: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
5110: 6e 61 6d 65 73 20 6f 66 20 61 20 74 61 62 6c 65  names of a table
5120: 20 6f 72 20 76 69 65 77 20 28 74 68 65 0a 2a 2a   or view (the.**
5130: 20 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20 61 72   Table.aCol[] ar
5140: 72 61 79 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ray)..*/.void sq
5150: 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d  lite3DeleteColum
5160: 6e 4e 61 6d 65 73 28 73 71 6c 69 74 65 33 20 2a  nNames(sqlite3 *
5170: 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  db, Table *pTabl
5180: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43  e){.  int i;.  C
5190: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61  olumn *pCol;.  a
51a0: 73 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30  ssert( pTable!=0
51b0: 20 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20   );.  if( (pCol 
51c0: 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21  = pTable->aCol)!
51d0: 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  =0 ){.    for(i=
51e0: 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f  0; i<pTable->nCo
51f0: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
5200: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
5210: 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a  Free(db, pCol->z
5220: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Name);.      sql
5230: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
5240: 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b  b, pCol->pDflt);
5250: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
5260: 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a  Free(db, pCol->z
5270: 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Coll);.    }.   
5280: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5290: 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29  b, pTable->aCol)
52a0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
52b0: 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79  emove the memory
52c0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
52d0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
52e0: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61   the given.** Ta
52f0: 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73  ble.  No changes
5300: 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73   are made to dis
5310: 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  k by this routin
5320: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
5330: 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74  utine just delet
5340: 65 73 20 74 68 65 20 64 61 74 61 20 73 74 72 75  es the data stru
5350: 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20  cture.  It does 
5360: 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68  not unlink.** th
5370: 65 20 74 61 62 6c 65 20 64 61 74 61 20 73 74 72  e table data str
5380: 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
5390: 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74  hash table.  But
53a0: 20 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79   it does destroy
53b0: 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  .** memory struc
53c0: 74 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64  tures of the ind
53d0: 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e  ices and foreign
53e0: 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64   keys associated
53f0: 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61   with .** the ta
5400: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ble..**.** The d
5410: 62 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f  b parameter is o
5420: 70 74 69 6f 6e 61 6c 2e 20 20 49 74 20 69 73 20  ptional.  It is 
5430: 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 54 61  needed if the Ta
5440: 62 6c 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63  ble object .** c
5450: 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61 73 69 64  ontains lookasid
5460: 65 20 6d 65 6d 6f 72 79 2e 20 20 28 54 61 62 6c  e memory.  (Tabl
5470: 65 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65  e objects in the
5480: 20 73 63 68 65 6d 61 20 64 6f 20 6e 6f 74 20 75   schema do not u
5490: 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 20  se.** lookaside 
54a0: 6d 65 6d 6f 72 79 2c 20 62 75 74 20 73 6f 6d 65  memory, but some
54b0: 20 65 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65   ephemeral Table
54c0: 20 6f 62 6a 65 63 74 73 20 64 6f 2e 29 20 20 4f   objects do.)  O
54d0: 72 20 74 68 65 0a 2a 2a 20 64 62 20 70 61 72 61  r the.** db para
54e0: 6d 65 74 65 72 20 63 61 6e 20 62 65 20 75 73 65  meter can be use
54f0: 64 20 77 69 74 68 20 64 62 2d 3e 70 6e 42 79 74  d with db->pnByt
5500: 65 73 46 72 65 65 64 20 74 6f 20 6d 65 61 73 75  esFreed to measu
5510: 72 65 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a  re the memory.**
5520: 20 75 73 65 64 20 62 79 20 74 68 65 20 54 61 62   used by the Tab
5530: 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  le object..*/.st
5540: 61 74 69 63 20 76 6f 69 64 20 53 51 4c 49 54 45  atic void SQLITE
5550: 5f 4e 4f 49 4e 4c 49 4e 45 20 64 65 6c 65 74 65  _NOINLINE delete
5560: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
5570: 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  b, Table *pTable
5580: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
5590: 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 0a 23 69 66  ex, *pNext;..#if
55a0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
55b0: 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65  .  /* Record the
55c0: 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74   number of outst
55d0: 61 6e 64 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65  anding lookaside
55e0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 69 6e 20   allocations in 
55f0: 73 63 68 65 6d 61 20 54 61 62 6c 65 73 0a 20 20  schema Tables.  
5600: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e  ** prior to doin
5610: 67 20 61 6e 79 20 66 72 65 65 28 29 20 6f 70 65  g any free() ope
5620: 72 61 74 69 6f 6e 73 2e 20 20 53 69 6e 63 65 20  rations.  Since 
5630: 73 63 68 65 6d 61 20 54 61 62 6c 65 73 20 64 6f  schema Tables do
5640: 20 6e 6f 74 20 75 73 65 0a 20 20 2a 2a 20 6c 6f   not use.  ** lo
5650: 6f 6b 61 73 69 64 65 2c 20 74 68 69 73 20 6e 75  okaside, this nu
5660: 6d 62 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20  mber should not 
5670: 63 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 69 6e 74  change. */.  int
5680: 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 30 3b   nLookaside = 0;
5690: 0a 20 20 69 66 28 20 64 62 20 26 26 20 28 70 54  .  if( db && (pT
56a0: 61 62 6c 65 2d 3e 74 61 62 46 6c 61 67 73 20 26  able->tabFlags &
56b0: 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d   TF_Ephemeral)==
56c0: 30 20 29 7b 0a 20 20 20 20 6e 4c 6f 6f 6b 61 73  0 ){.    nLookas
56d0: 69 64 65 20 3d 20 73 71 6c 69 74 65 33 4c 6f 6f  ide = sqlite3Loo
56e0: 6b 61 73 69 64 65 55 73 65 64 28 64 62 2c 20 30  kasideUsed(db, 0
56f0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
5700: 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69   /* Delete all i
5710: 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65  ndices associate
5720: 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c  d with this tabl
5730: 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64  e. */.  for(pInd
5740: 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e  ex = pTable->pIn
5750: 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e  dex; pIndex; pIn
5760: 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  dex=pNext){.    
5770: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e  pNext = pIndex->
5780: 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72  pNext;.    asser
5790: 74 28 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  t( pIndex->pSche
57a0: 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63 68  ma==pTable->pSch
57b0: 65 6d 61 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ema.         || 
57c0: 28 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c  (IsVirtual(pTabl
57d0: 65 29 20 26 26 20 70 49 6e 64 65 78 2d 3e 69 64  e) && pIndex->id
57e0: 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44  xType!=SQLITE_ID
57f0: 58 54 59 50 45 5f 41 50 50 44 45 46 29 20 29 3b  XTYPE_APPDEF) );
5800: 0a 20 20 20 20 69 66 28 20 28 64 62 3d 3d 30 20  .    if( (db==0 
5810: 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  || db->pnBytesFr
5820: 65 65 64 3d 3d 30 29 20 26 26 20 21 49 73 56 69  eed==0) && !IsVi
5830: 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29 7b  rtual(pTable) ){
5840: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  .      char *zNa
5850: 6d 65 20 3d 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  me = pIndex->zNa
5860: 6d 65 3b 20 0a 20 20 20 20 20 20 54 45 53 54 4f  me; .      TESTO
5870: 4e 4c 59 20 28 20 49 6e 64 65 78 20 2a 70 4f 6c  NLY ( Index *pOl
5880: 64 20 3d 20 29 20 73 71 6c 69 74 65 33 48 61 73  d = ) sqlite3Has
5890: 68 49 6e 73 65 72 74 28 0a 20 20 20 20 20 20 20  hInsert(.       
58a0: 20 20 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65    &pIndex->pSche
58b0: 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61  ma->idxHash, zNa
58c0: 6d 65 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20  me, 0.      );. 
58d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 3d       assert( db=
58e0: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 63 68  =0 || sqlite3Sch
58f0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
5900: 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68   0, pIndex->pSch
5910: 65 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ema) );.      as
5920: 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 49 6e 64  sert( pOld==pInd
5930: 65 78 20 7c 7c 20 70 4f 6c 64 3d 3d 30 20 29 3b  ex || pOld==0 );
5940: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5950: 65 33 46 72 65 65 49 6e 64 65 78 28 64 62 2c 20  e3FreeIndex(db, 
5960: 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20  pIndex);.  }..  
5970: 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 66 6f  /* Delete any fo
5980: 72 65 69 67 6e 20 6b 65 79 73 20 61 74 74 61 63  reign keys attac
5990: 68 65 64 20 74 6f 20 74 68 69 73 20 74 61 62 6c  hed to this tabl
59a0: 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46  e. */.  sqlite3F
59b0: 6b 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62  kDelete(db, pTab
59c0: 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  le);..  /* Delet
59d0: 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  e the Table stru
59e0: 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20  cture itself..  
59f0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65  */.  sqlite3Dele
5a00: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62  teColumnNames(db
5a10: 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c  , pTable);.  sql
5a20: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5a30: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  Table->zName);. 
5a40: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5a50: 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41  b, pTable->zColA
5a60: 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ff);.  sqlite3Se
5a70: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
5a80: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b  Table->pSelect);
5a90: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
5aa0: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61  stDelete(db, pTa
5ab0: 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 69  ble->pCheck);.#i
5ac0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5ad0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
5ae0: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61   sqlite3VtabClea
5af0: 72 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 23  r(db, pTable);.#
5b00: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44  endif.  sqlite3D
5b10: 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65  bFree(db, pTable
5b20: 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  );..  /* Verify 
5b30: 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61 73 69 64  that no lookasid
5b40: 65 20 6d 65 6d 6f 72 79 20 77 61 73 20 75 73 65  e memory was use
5b50: 64 20 62 79 20 73 63 68 65 6d 61 20 74 61 62 6c  d by schema tabl
5b60: 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
5b70: 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30 20 7c 7c  nLookaside==0 ||
5b80: 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 73 71 6c   nLookaside==sql
5b90: 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55 73 65  ite3LookasideUse
5ba0: 64 28 64 62 2c 30 29 20 29 3b 0a 7d 0a 76 6f 69  d(db,0) );.}.voi
5bb0: 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54  d sqlite3DeleteT
5bc0: 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62  able(sqlite3 *db
5bd0: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
5be0: 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65  {.  /* Do not de
5bf0: 6c 65 74 65 20 74 68 65 20 74 61 62 6c 65 20 75  lete the table u
5c00: 6e 74 69 6c 20 74 68 65 20 72 65 66 65 72 65 6e  ntil the referen
5c10: 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  ce count reaches
5c20: 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 28 20   zero. */.  if( 
5c30: 21 70 54 61 62 6c 65 20 29 20 72 65 74 75 72 6e  !pTable ) return
5c40: 3b 0a 20 20 69 66 28 20 28 28 21 64 62 20 7c 7c  ;.  if( ((!db ||
5c50: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
5c60: 64 3d 3d 30 29 20 26 26 20 28 2d 2d 70 54 61 62  d==0) && (--pTab
5c70: 6c 65 2d 3e 6e 54 61 62 52 65 66 29 3e 30 29 20  le->nTabRef)>0) 
5c80: 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 65 6c 65  ) return;.  dele
5c90: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  teTable(db, pTab
5ca0: 6c 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55  le);.}.../*.** U
5cb0: 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20  nlink the given 
5cc0: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68  table from the h
5cd0: 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74  ash tables and t
5ce0: 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a  he delete the.**
5cf0: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
5d00: 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e   with all its in
5d10: 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67  dices and foreig
5d20: 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20  n keys..*/.void 
5d30: 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64  sqlite3UnlinkAnd
5d40: 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69  DeleteTable(sqli
5d50: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
5d60: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
5d70: 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65  abName){.  Table
5d80: 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a   *p;.  Db *pDb;.
5d90: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
5da0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44   );.  assert( iD
5db0: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
5dc0: 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
5dd0: 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20 61   zTabName );.  a
5de0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
5df0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
5e00: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 74  , iDb, 0) );.  t
5e10: 65 73 74 63 61 73 65 28 20 7a 54 61 62 4e 61 6d  estcase( zTabNam
5e20: 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20 5a  e[0]==0 );  /* Z
5e30: 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c 65  ero-length table
5e40: 20 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f 77   names are allow
5e50: 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64  ed */.  pDb = &d
5e60: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70  b->aDb[iDb];.  p
5e70: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
5e80: 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65  sert(&pDb->pSche
5e90: 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61  ma->tblHash, zTa
5ea0: 62 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c  bName, 0);.  sql
5eb0: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
5ec0: 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d 3e 6d 44  db, p);.  db->mD
5ed0: 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47  bFlags |= DBFLAG
5ee0: 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 7d  _SchemaChange;.}
5ef0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
5f00: 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61 20  token, return a 
5f10: 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e 73  string that cons
5f20: 69 73 74 73 20 6f 66 20 74 68 65 20 74 65 78 74  ists of the text
5f30: 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65   of that.** toke
5f40: 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  n.  Space to hol
5f50: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
5f60: 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61  tring.** is obta
5f70: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
5f80: 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  Malloc() and mus
5f90: 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
5fa0: 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
5fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79  ction..**.** Any
5fc0: 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73   quotation marks
5fd0: 20 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c 20 27   (ex:  "name", '
5fe0: 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20 6f  name', [name], o
5ff0: 72 20 60 6e 61 6d 65 60 29 20 74 68 61 74 0a 2a  r `name`) that.*
6000: 2a 20 73 75 72 72 6f 75 6e 64 20 74 68 65 20 62  * surround the b
6010: 6f 64 79 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e  ody of the token
6020: 20 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a   are removed..**
6030: 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f  .** Tokens are o
6040: 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65  ften just pointe
6050: 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67  rs into the orig
6060: 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e  inal SQL text an
6070: 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20  d so.** are not 
6080: 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20  \000 terminated 
6090: 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73  and are not pers
60a0: 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74  istent.  The ret
60b0: 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20  urned string.** 
60c0: 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  is \000 terminat
60d0: 65 64 20 61 6e 64 20 69 73 20 70 65 72 73 69 73  ed and is persis
60e0: 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  tent..*/.char *s
60f0: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
6100: 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ken(sqlite3 *db,
6110: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
6120: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
6130: 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20   if( pName ){.  
6140: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
6150: 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28  3DbStrNDup(db, (
6160: 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20  char*)pName->z, 
6170: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73  pName->n);.    s
6180: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e  qlite3Dequote(zN
6190: 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame);.  }else{. 
61a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20     zName = 0;.  
61b0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  }.  return zName
61c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
61d0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
61e0: 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69  r table stored i
61f0: 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65  n database numbe
6200: 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69  r iDb for.** wri
6210: 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20  ting. The table 
6220: 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  is opened using 
6230: 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69  cursor 0..*/.voi
6240: 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73  d sqlite3OpenMas
6250: 74 65 72 54 61 62 6c 65 28 50 61 72 73 65 20 2a  terTable(Parse *
6260: 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56  p, int iDb){.  V
6270: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
6280: 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73 71  GetVdbe(p);.  sq
6290: 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
62a0: 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52 4f  , iDb, MASTER_RO
62b0: 4f 54 2c 20 31 2c 20 4d 41 53 54 45 52 5f 4e 41  OT, 1, MASTER_NA
62c0: 4d 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ME);.  sqlite3Vd
62d0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
62e0: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20  P_OpenWrite, 0, 
62f0: 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 69 44 62  MASTER_ROOT, iDb
6300: 2c 20 35 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  , 5);.  if( p->n
6310: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  Tab==0 ){.    p-
6320: 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 7d 0a 7d  >nTab = 1;.  }.}
6330: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
6340: 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73 20 74  r zName points t
6350: 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  o a nul-terminat
6360: 65 64 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  ed buffer contai
6370: 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 0a 2a 2a  ning the name.**
6380: 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28   of a database (
6390: 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 6f  "main", "temp" o
63a0: 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e  r the name of an
63b0: 20 61 74 74 61 63 68 65 64 20 64 62 29 2e 20 54   attached db). T
63c0: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
63d0: 72 65 74 75 72 6e 73 20 74 68 65 20 69 6e 64 65  returns the inde
63e0: 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64  x of the named d
63f0: 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61  atabase in db->a
6400: 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d 31 20 69  Db[], or.** -1 i
6410: 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 63  f the named db c
6420: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
6430: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69  */.int sqlite3Fi
6440: 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69 74 65 33  ndDbName(sqlite3
6450: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
6460: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
6470: 69 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  i = -1;         
6480: 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62  /* Database numb
6490: 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a 4e 61 6d  er */.  if( zNam
64a0: 65 20 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62  e ){.    Db *pDb
64b0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 64 62 2d  ;.    for(i=(db-
64c0: 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26 64 62  >nDb-1), pDb=&db
64d0: 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20  ->aDb[i]; i>=0; 
64e0: 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20  i--, pDb--){.   
64f0: 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
6500: 33 5f 73 74 72 69 63 6d 70 28 70 44 62 2d 3e 7a  3_stricmp(pDb->z
6510: 44 62 53 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20  DbSName, zName) 
6520: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 2f  ) break;.      /
6530: 2a 20 22 6d 61 69 6e 22 20 69 73 20 61 6c 77 61  * "main" is alwa
6540: 79 73 20 61 6e 20 61 63 63 65 70 74 61 62 6c 65  ys an acceptable
6550: 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 70   alias for the p
6560: 72 69 6d 61 72 79 20 64 61 74 61 62 61 73 65 0a  rimary database.
6570: 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 69 66        ** even if
6580: 20 69 74 20 68 61 73 20 62 65 65 6e 20 72 65 6e   it has been ren
6590: 61 6d 65 64 20 75 73 69 6e 67 20 53 51 4c 49 54  amed using SQLIT
65a0: 45 5f 44 42 43 4f 4e 46 49 47 5f 4d 41 49 4e 44  E_DBCONFIG_MAIND
65b0: 42 4e 41 4d 45 2e 20 2a 2f 0a 20 20 20 20 20 20  BNAME. */.      
65c0: 69 66 28 20 69 3d 3d 30 20 26 26 20 30 3d 3d 73  if( i==0 && 0==s
65d0: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 22  qlite3_stricmp("
65e0: 6d 61 69 6e 22 2c 20 7a 4e 61 6d 65 29 20 29 20  main", zName) ) 
65f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
6600: 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a  .  return i;.}..
6610: 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20  /*.** The token 
6620: 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20  *pName contains 
6630: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61  the name of a da
6640: 74 61 62 61 73 65 20 28 65 69 74 68 65 72 20 22  tabase (either "
6650: 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d  main" or.** "tem
6660: 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f  p" or the name o
6670: 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62  f an attached db
6680: 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ). This routine 
6690: 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69  returns the.** i
66a0: 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65  ndex of the name
66b0: 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62  d database in db
66c0: 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69  ->aDb[], or -1 i
66d0: 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a  f the named db .
66e0: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  ** does not exis
66f0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
6700: 33 46 69 6e 64 44 62 28 73 71 6c 69 74 65 33 20  3FindDb(sqlite3 
6710: 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  *db, Token *pNam
6720: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
6730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
6750: 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f  tabase number */
6760: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  .  char *zName; 
6770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6780: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
6790: 77 65 20 61 72 65 20 73 65 61 72 63 68 69 6e 67  we are searching
67a0: 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20   for */.  zName 
67b0: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
67c0: 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65  mToken(db, pName
67d0: 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74 65 33  );.  i = sqlite3
67e0: 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a  FindDbName(db, z
67f0: 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
6800: 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
6810: 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  );.  return i;.}
6820: 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f  ../* The table o
6830: 72 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65  r view or trigge
6840: 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65 64  r name is passed
6850: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
6860: 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70   via tokens.** p
6870: 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32  Name1 and pName2
6880: 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e  . If the table n
6890: 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75  ame was fully qu
68a0: 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61  alified, for exa
68b0: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41  mple:.**.** CREA
68c0: 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79  TE TABLE xxx.yyy
68d0: 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54   (...);.** .** T
68e0: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
68f0: 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70  t to "xxx" and p
6900: 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20  Name2 "yyy". On 
6910: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69  the other hand i
6920: 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e  f.** the table n
6930: 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79  ame is not fully
6940: 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e   qualified, i.e.
6950: 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54  :.**.** CREATE T
6960: 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a  ABLE yyy(...);.*
6970: 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31  *.** Then pName1
6980: 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22   is set to "yyy"
6990: 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22   and pName2 is "
69a0: 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  "..**.** This ro
69b0: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 2a  utine sets the *
69c0: 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72  ppUnqual pointer
69d0: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
69e0: 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f   token (pName1 o
69f0: 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61  r.** pName2) tha
6a00: 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71  t stores the unq
6a10: 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e  ualified table n
6a20: 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78 20  ame.  The index 
6a30: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
6a40: 73 65 20 22 78 78 78 22 20 69 73 20 72 65 74 75  se "xxx" is retu
6a50: 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
6a60: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
6a70: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
6a80: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  ,      /* Parsin
6a90: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
6aa0: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
6ab0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
6ac0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78  ,      /* The "x
6ad0: 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  xx" in the name 
6ae0: 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78 78  "xxx.yyy" or "xx
6af0: 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  x" */.  Token *p
6b00: 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20 54  Name2,      /* T
6b10: 68 65 20 22 79 79 79 22 20 69 6e 20 74 68 65 20  he "yyy" in the 
6b20: 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 2a  name "xxx.yyy" *
6b30: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71  /.  Token **pUnq
6b40: 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ual     /* Write
6b50: 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64   the unqualified
6b60: 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65 72   object name her
6b70: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44  e */.){.  int iD
6b80: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
6b90: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
6ba0: 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62  e holding the ob
6bb0: 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
6bc0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
6bd0: 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  db;..  assert( p
6be0: 4e 61 6d 65 32 21 3d 30 20 29 3b 0a 20 20 69 66  Name2!=0 );.  if
6bf0: 28 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b  ( pName2->n>0 ){
6c00: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  .    if( db->ini
6c10: 74 2e 62 75 73 79 20 29 20 7b 0a 20 20 20 20 20  t.busy ) {.     
6c20: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
6c30: 28 70 50 61 72 73 65 2c 20 22 63 6f 72 72 75 70  (pParse, "corrup
6c40: 74 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20  t database");.  
6c50: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
6c60: 20 20 20 7d 0a 20 20 20 20 2a 70 55 6e 71 75 61     }.    *pUnqua
6c70: 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20  l = pName2;.    
6c80: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  iDb = sqlite3Fin
6c90: 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b  dDb(db, pName1);
6ca0: 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29  .    if( iDb<0 )
6cb0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
6cc0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
6cd0: 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73  "unknown databas
6ce0: 65 20 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a  e %T", pName1);.
6cf0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
6d00: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
6d10: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
6d20: 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64  init.iDb==0 || d
6d30: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20  b->init.busy || 
6d40: 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
6d50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
6d60: 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26   (db->mDbFlags &
6d70: 20 44 42 46 4c 41 47 5f 56 61 63 75 75 6d 29 21   DBFLAG_Vacuum)!
6d80: 3d 30 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64  =0);.    iDb = d
6d90: 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20  b->init.iDb;.   
6da0: 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d   *pUnqual = pNam
6db0: 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e1;.  }.  return
6dc0: 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   iDb;.}../*.** T
6dd0: 72 75 65 20 69 66 20 50 52 41 47 4d 41 20 77 72  rue if PRAGMA wr
6de0: 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 69 73  itable_schema is
6df0: 20 4f 4e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   ON.*/.int sqlit
6e00: 65 33 57 72 69 74 61 62 6c 65 53 63 68 65 6d 61  e3WritableSchema
6e10: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
6e20: 20 74 65 73 74 63 61 73 65 28 20 28 64 62 2d 3e   testcase( (db->
6e30: 66 6c 61 67 73 26 28 53 51 4c 49 54 45 5f 57 72  flags&(SQLITE_Wr
6e40: 69 74 65 53 63 68 65 6d 61 7c 53 51 4c 49 54 45  iteSchema|SQLITE
6e50: 5f 44 65 66 65 6e 73 69 76 65 29 29 3d 3d 30 20  _Defensive))==0 
6e60: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  );.  testcase( (
6e70: 64 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49 54  db->flags&(SQLIT
6e80: 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51  E_WriteSchema|SQ
6e90: 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65 29 29  LITE_Defensive))
6ea0: 3d 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ==.             
6eb0: 20 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63    SQLITE_WriteSc
6ec0: 68 65 6d 61 20 29 3b 0a 20 20 74 65 73 74 63 61  hema );.  testca
6ed0: 73 65 28 20 28 64 62 2d 3e 66 6c 61 67 73 26 28  se( (db->flags&(
6ee0: 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65  SQLITE_WriteSche
6ef0: 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e 73  ma|SQLITE_Defens
6f00: 69 76 65 29 29 3d 3d 0a 20 20 20 20 20 20 20 20  ive))==.        
6f10: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 65         SQLITE_De
6f20: 66 65 6e 73 69 76 65 20 29 3b 0a 20 20 74 65 73  fensive );.  tes
6f30: 74 63 61 73 65 28 20 28 64 62 2d 3e 66 6c 61 67  tcase( (db->flag
6f40: 73 26 28 53 51 4c 49 54 45 5f 57 72 69 74 65 53  s&(SQLITE_WriteS
6f50: 63 68 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66  chema|SQLITE_Def
6f60: 65 6e 73 69 76 65 29 29 3d 3d 0a 20 20 20 20 20  ensive))==.     
6f70: 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54            (SQLIT
6f80: 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51  E_WriteSchema|SQ
6f90: 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65 29 20  LITE_Defensive) 
6fa0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 64 62 2d  );.  return (db-
6fb0: 3e 66 6c 61 67 73 26 28 53 51 4c 49 54 45 5f 57  >flags&(SQLITE_W
6fc0: 72 69 74 65 53 63 68 65 6d 61 7c 53 51 4c 49 54  riteSchema|SQLIT
6fd0: 45 5f 44 65 66 65 6e 73 69 76 65 29 29 3d 3d 53  E_Defensive))==S
6fe0: 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d  QLITE_WriteSchem
6ff0: 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  a;.}../*.** This
7000: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
7010: 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65   to check if the
7020: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e   UTF-8 string zN
7030: 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a  ame is a legal.*
7040: 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6e 61  * unqualified na
7050: 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73 63 68  me for a new sch
7060: 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61 62 6c  ema object (tabl
7070: 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77 20 6f  e, index, view o
7080: 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e 20 41  r.** trigger). A
7090: 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c 65 67  ll names are leg
70a0: 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73 65 20  al except those 
70b0: 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20  that begin with 
70c0: 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73  the string.** "s
70d0: 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70 70 65  qlite_" (in uppe
70e0: 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65  r, lower or mixe
70f0: 64 20 63 61 73 65 29 2e 20 54 68 69 73 20 70 6f  d case). This po
7100: 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d  rtion of the nam
7110: 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72 65 73  espace.** is res
7120: 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e  erved for intern
7130: 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  al use..*/.int s
7140: 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63  qlite3CheckObjec
7150: 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70 50 61  tName(Parse *pPa
7160: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
7170: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 21  *zName){.  if( !
7180: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74  pParse->db->init
7190: 2e 62 75 73 79 20 26 26 20 70 50 61 72 73 65 2d  .busy && pParse-
71a0: 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20 20 20  >nested==0 .    
71b0: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
71c0: 57 72 69 74 61 62 6c 65 53 63 68 65 6d 61 28 70  WritableSchema(p
71d0: 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 0a 20 20  Parse->db)==0.  
71e0: 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
71f0: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e  lite3StrNICmp(zN
7200: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
7210: 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  7) ){.    sqlite
7220: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
7230: 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72  , "object name r
7240: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
7250: 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a  rnal use: %s", z
7260: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
7270: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
7280: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
7290: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
72a0: 20 52 65 74 75 72 6e 20 74 68 65 20 50 52 49 4d   Return the PRIM
72b0: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 6f 66  ARY KEY index of
72c0: 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49 6e 64 65   a table.*/.Inde
72d0: 78 20 2a 73 71 6c 69 74 65 33 50 72 69 6d 61 72  x *sqlite3Primar
72e0: 79 4b 65 79 49 6e 64 65 78 28 54 61 62 6c 65 20  yKeyIndex(Table 
72f0: 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20  *pTab){.  Index 
7300: 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 54 61 62  *p;.  for(p=pTab
7310: 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 21  ->pIndex; p && !
7320: 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
7330: 78 28 70 29 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  x(p); p=p->pNext
7340: 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  ){}.  return p;.
7350: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
7360: 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e  the column of in
7370: 64 65 78 20 70 49 64 78 20 74 68 61 74 20 63 6f  dex pIdx that co
7380: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 61 62  rresponds to tab
7390: 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f  le.** column iCo
73a0: 6c 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66  l.  Return -1 if
73b0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69   not found..*/.i
73c0: 31 36 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  16 sqlite3Column
73d0: 4f 66 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70  OfIndex(Index *p
73e0: 49 64 78 2c 20 69 31 36 20 69 43 6f 6c 29 7b 0a  Idx, i16 iCol){.
73f0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
7400: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; i<pIdx->nCol
7410: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  umn; i++){.    i
7420: 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61  f( iCol==pIdx->a
7430: 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20 72 65 74  iColumn[i] ) ret
7440: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
7450: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
7460: 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74   Begin construct
7470: 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20  ing a new table 
7480: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69  representation i
7490: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
74a0: 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
74b0: 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f  of several actio
74c0: 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20  n routines that 
74d0: 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65  get called in re
74e0: 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43  sponse.** to a C
74f0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
7500: 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69  ement.  In parti
7510: 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74  cular, this rout
7520: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  ine is called.**
7530: 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f   after seeing to
7540: 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e  kens "CREATE" an
7550: 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68  d "TABLE" and th
7560: 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68  e table name. Th
7570: 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67  e isTemp.** flag
7580: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
7590: 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20  table should be 
75a0: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75  stored in the au
75b0: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
75c0: 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64  .** file instead
75d0: 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   of in the main 
75e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
75f0: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
7600: 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65   the case.** whe
7610: 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20  n the "TEMP" or 
7620: 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77  "TEMPORARY" keyw
7630: 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65  ord occurs in be
7640: 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20  tween.** CREATE 
7650: 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a  and TABLE..**.**
7660: 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   The new table r
7670: 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c  ecord is initial
7680: 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20  ized and put in 
7690: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
76a0: 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66  e..** As more of
76b0: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
76c0: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  E statement is p
76d0: 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61  arsed, additiona
76e0: 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74  l action.** rout
76f0: 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c  ines will be cal
7700: 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20  led to add more 
7710: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
7720: 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41  his record..** A
7730: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
7740: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
7750: 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c  atement, the sql
7760: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72  ite3EndTable() r
7770: 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
7780: 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  led to complete 
7790: 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  the construction
77a0: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
77b0: 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69  e record..*/.voi
77c0: 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61  d sqlite3StartTa
77d0: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
77e0: 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65  arse,   /* Parse
77f0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
7800: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
7810: 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
7820: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
7830: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a   table or view *
7840: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
7850: 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70  2,   /* Second p
7860: 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20  art of the name 
7870: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
7880: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73  view */.  int is
7890: 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72  Temp,      /* Tr
78a0: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
78b0: 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20  TEMP table */.  
78c0: 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20 20  int isView,     
78d0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
78e0: 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20 20   is a VIEW */.  
78f0: 69 6e 74 20 69 73 56 69 72 74 75 61 6c 2c 20 20  int isVirtual,  
7900: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
7910: 20 69 73 20 61 20 56 49 52 54 55 41 4c 20 74 61   is a VIRTUAL ta
7920: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45  ble */.  int noE
7930: 72 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  rr        /* Do 
7940: 6e 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c 65  nothing if table
7950: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
7960: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
7970: 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a  Table;.  char *z
7980: 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65  Name = 0; /* The
7990: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77   name of the new
79a0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
79b0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
79c0: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ->db;.  Vdbe *v;
79d0: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
79e0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
79f0: 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65  number to create
7a00: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f   the table in */
7a10: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b  .  Token *pName;
7a20: 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69      /* Unqualifi
7a30: 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  ed name of the t
7a40: 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a  able to create *
7a50: 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  /..  if( db->ini
7a60: 74 2e 62 75 73 79 20 26 26 20 64 62 2d 3e 69 6e  t.busy && db->in
7a70: 69 74 2e 6e 65 77 54 6e 75 6d 3d 3d 31 20 29 7b  it.newTnum==1 ){
7a80: 0a 20 20 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  .    /* Special 
7a90: 63 61 73 65 3a 20 20 50 61 72 73 69 6e 67 20 74  case:  Parsing t
7aa0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
7ab0: 20 6f 72 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f   or sqlite_temp_
7ac0: 6d 61 73 74 65 72 20 73 63 68 65 6d 61 20 2a 2f  master schema */
7ad0: 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69  .    iDb = db->i
7ae0: 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 7a 4e 61  nit.iDb;.    zNa
7af0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
7b00: 72 44 75 70 28 64 62 2c 20 53 43 48 45 4d 41 5f  rDup(db, SCHEMA_
7b10: 54 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 20  TABLE(iDb));.   
7b20: 20 70 4e 61 6d 65 20 3d 20 70 4e 61 6d 65 31 3b   pName = pName1;
7b30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
7b40: 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   The common case
7b50: 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71   */.    iDb = sq
7b60: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
7b70: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
7b80: 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
7b90: 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
7ba0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66  ) return;.    if
7bb0: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
7bc0: 26 20 69 73 54 65 6d 70 20 26 26 20 70 4e 61 6d  & isTemp && pNam
7bd0: 65 32 2d 3e 6e 3e 30 20 26 26 20 69 44 62 21 3d  e2->n>0 && iDb!=
7be0: 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  1 ){.      /* If
7bf0: 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70   creating a temp
7c00: 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65   table, the name
7c10: 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c   may not be qual
7c20: 69 66 69 65 64 2e 20 55 6e 6c 65 73 73 20 0a 20  ified. Unless . 
7c30: 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
7c40: 62 61 73 65 20 6e 61 6d 65 20 69 73 20 22 74 65  base name is "te
7c50: 6d 70 22 20 61 6e 79 77 61 79 2e 20 20 2a 2f 0a  mp" anyway.  */.
7c60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
7c70: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
7c80: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e  emporary table n
7c90: 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75  ame must be unqu
7ca0: 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20  alified");.     
7cb0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
7cc0: 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
7cd0: 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 20  PDB && isTemp ) 
7ce0: 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 7a 4e 61  iDb = 1;.    zNa
7cf0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
7d00: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
7d10: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 49 4e  ame);.    if( IN
7d20: 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29  _RENAME_OBJECT )
7d30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
7d40: 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50  enameTokenMap(pP
7d50: 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 7a 4e 61  arse, (void*)zNa
7d60: 6d 65 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  me, pName);.    
7d70: 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  }.  }.  pParse->
7d80: 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e  sNameToken = *pN
7d90: 61 6d 65 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ame;.  if( zName
7da0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
7db0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
7dc0: 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63  qlite3CheckObjec
7dd0: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e  tName(pParse, zN
7de0: 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ame) ){.    goto
7df0: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
7e00: 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  or;.  }.  if( db
7e10: 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20  ->init.iDb==1 ) 
7e20: 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e  isTemp = 1;.#ifn
7e30: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7e40: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
7e50: 61 73 73 65 72 74 28 20 69 73 54 65 6d 70 3d 3d  assert( isTemp==
7e60: 30 20 7c 7c 20 69 73 54 65 6d 70 3d 3d 31 20 29  0 || isTemp==1 )
7e70: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 56 69  ;.  assert( isVi
7e80: 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69 65 77 3d  ew==0 || isView=
7e90: 3d 31 20 29 3b 0a 20 20 7b 0a 20 20 20 20 73 74  =1 );.  {.    st
7ea0: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 43  atic const u8 aC
7eb0: 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ode[] = {.      
7ec0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
7ed0: 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 53 51 4c  ABLE,.       SQL
7ee0: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
7ef0: 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 53 51  TABLE,.       SQ
7f00: 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57  LITE_CREATE_VIEW
7f10: 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ,.       SQLITE_
7f20: 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57  CREATE_TEMP_VIEW
7f30: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 68 61 72  .    };.    char
7f40: 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
7f50: 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20  iDb].zDbSName;. 
7f60: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
7f70: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
7f80: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53  SQLITE_INSERT, S
7f90: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65  CHEMA_TABLE(isTe
7fa0: 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  mp), 0, zDb) ){.
7fb0: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
7fc0: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
7fd0: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 56    }.    if( !isV
7fe0: 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74 65  irtual && sqlite
7ff0: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
8000: 65 2c 20 28 69 6e 74 29 61 43 6f 64 65 5b 69 73  e, (int)aCode[is
8010: 54 65 6d 70 2b 32 2a 69 73 56 69 65 77 5d 2c 0a  Temp+2*isView],.
8020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8040: 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 30 2c         zName, 0,
8050: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
8060: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
8070: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  error;.    }.  }
8080: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61  .#endif..  /* Ma
8090: 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20  ke sure the new 
80a0: 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20  table name does 
80b0: 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68  not collide with
80c0: 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a   an existing.  *
80d0: 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  * index or table
80e0: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 61 6d   name in the sam
80f0: 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 73 73  e database.  Iss
8100: 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ue an error mess
8110: 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74 20 64  age if.  ** it d
8120: 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70 74 69  oes. The excepti
8130: 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73 74 61  on is if the sta
8140: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70 61 72  tement being par
8150: 73 65 64 20 77 61 73 20 70 61 73 73 65 64 0a 20  sed was passed. 
8160: 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74 65   ** to an sqlite
8170: 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29  3_declare_vtab()
8180: 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63   call. In that c
8190: 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c  ase only the col
81a0: 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61  umn names.  ** a
81b0: 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20 62 65  nd types will be
81c0: 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72 65 20   used, so there 
81d0: 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65  is no need to te
81e0: 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61 63 65  st for namespace
81f0: 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73  .  ** collisions
8200: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e  ..  */.  if( !IN
8210: 5f 53 50 45 43 49 41 4c 5f 50 41 52 53 45 20 29  _SPECIAL_PARSE )
8220: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20  {.    char *zDb 
8230: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
8240: 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  DbSName;.    if(
8250: 20 21 49 73 53 68 61 72 65 64 53 63 68 65 6d 61   !IsSharedSchema
8260: 28 64 62 29 20 26 26 20 53 51 4c 49 54 45 5f 4f  (db) && SQLITE_O
8270: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
8280: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
8290: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
82a0: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
82b0: 20 20 7d 0a 20 20 20 20 70 54 61 62 6c 65 20 3d    }.    pTable =
82c0: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
82d0: 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  e(db, zName, zDb
82e0: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c  );.    if( pTabl
82f0: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  e ){.      if( !
8300: 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20  noErr ){.       
8310: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8320: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
8330: 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %T already exist
8340: 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  s", pName);.    
8350: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8360: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e   assert( !db->in
8370: 69 74 2e 62 75 73 79 20 7c 7c 20 43 4f 52 52 55  it.busy || CORRU
8380: 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 20  PT_DB );.       
8390: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
83a0: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
83b0: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20   iDb);.      }. 
83c0: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
83d0: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
83e0: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
83f0: 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
8400: 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29  zName, zDb)!=0 )
8410: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
8420: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
8430: 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
8440: 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64  y an index named
8450: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
8460: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
8470: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
8480: 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62 6c 65 20  }.  }..  pTable 
8490: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
84a0: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
84b0: 28 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20  (Table));.  if( 
84c0: 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  pTable==0 ){.   
84d0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
84e0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
84f0: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
8500: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
8510: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
8520: 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65  r++;.    goto be
8530: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
8540: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a  .  }.  pTable->z
8550: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
8560: 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20  pTable->iPKey = 
8570: 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53  -1;.  pTable->pS
8580: 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
8590: 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  iDb].pSchema;.  
85a0: 70 54 61 62 6c 65 2d 3e 6e 54 61 62 52 65 66 20  pTable->nTabRef 
85b0: 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 1;.#ifdef SQLI
85c0: 54 45 5f 44 45 46 41 55 4c 54 5f 52 4f 57 45 53  TE_DEFAULT_ROWES
85d0: 54 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77  T.  pTable->nRow
85e0: 4c 6f 67 45 73 74 20 3d 20 73 71 6c 69 74 65 33  LogEst = sqlite3
85f0: 4c 6f 67 45 73 74 28 53 51 4c 49 54 45 5f 44 45  LogEst(SQLITE_DE
8600: 46 41 55 4c 54 5f 52 4f 57 45 53 54 29 3b 0a 23  FAULT_ROWEST);.#
8610: 65 6c 73 65 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  else.  pTable->n
8620: 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b  RowLogEst = 200;
8630: 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71   assert( 200==sq
8640: 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38  lite3LogEst(1048
8650: 35 37 36 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  576) );.#endif. 
8660: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
8670: 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 3b  >pNewTable==0 );
8680: 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  .  pParse->pNewT
8690: 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a  able = pTable;..
86a0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
86b0: 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65  the magic sqlite
86c0: 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
86d0: 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72  used by autoincr
86e0: 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e  ement,.  ** then
86f0: 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65   record a pointe
8700: 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  r to this table 
8710: 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
8720: 62 61 73 65 20 73 74 72 75 63 74 75 72 65 0a 20  base structure. 
8730: 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45   ** so that INSE
8740: 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20  RT can find the 
8750: 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20  table easily..  
8760: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
8770: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
8780: 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61 72  MENT.  if( !pPar
8790: 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20 73 74  se->nested && st
87a0: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c  rcmp(zName, "sql
87b0: 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d  ite_sequence")==
87c0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
87d0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
87e0: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
87f0: 20 30 29 20 29 3b 0a 20 20 20 20 70 54 61 62 6c   0) );.    pTabl
8800: 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71  e->pSchema->pSeq
8810: 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  Tab = pTable;.  
8820: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42  }.#endif..  /* B
8830: 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20  egin generating 
8840: 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  the code that wi
8850: 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74 61  ll insert the ta
8860: 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a  ble record into.
8870: 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f    ** the SQLITE_
8880: 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e  MASTER table.  N
8890: 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61  ote in particula
88a0: 72 20 74 68 61 74 20 77 65 20 6d 75 73 74 20 67  r that we must g
88b0: 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64  o ahead.  ** and
88c0: 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65   allocate the re
88d0: 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20  cord number for 
88e0: 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
88f0: 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79  now.  Before any
8900: 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45  .  ** PRIMARY KE
8910: 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77  Y or UNIQUE keyw
8920: 6f 72 64 73 20 61 72 65 20 70 61 72 73 65 64 2e  ords are parsed.
8930: 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73    Those keywords
8940: 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a   will cause.  **
8950: 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63   indices to be c
8960: 72 65 61 74 65 64 20 61 6e 64 20 74 68 65 20 74  reated and the t
8970: 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74  able record must
8980: 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65   come before the
8990: 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20   .  ** indices. 
89a0: 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f   Hence, the reco
89b0: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
89c0: 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20  e table must be 
89d0: 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e  allocated.  ** n
89e0: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ow..  */.  if( !
89f0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
8a00: 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   (v = sqlite3Get
8a10: 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d 30  Vdbe(pParse))!=0
8a20: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
8a30: 31 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c 65 46  1;.    int fileF
8a40: 6f 72 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20 72  ormat;.    int r
8a50: 65 67 31 2c 20 72 65 67 32 2c 20 72 65 67 33 3b  eg1, reg2, reg3;
8a60: 0a 20 20 20 20 2f 2a 20 6e 75 6c 6c 52 6f 77 5b  .    /* nullRow[
8a70: 5d 20 69 73 20 61 6e 20 4f 50 5f 52 65 63 6f 72  ] is an OP_Recor
8a80: 64 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20  d encoding of a 
8a90: 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 35  row containing 5
8aa0: 20 4e 55 4c 4c 73 20 2a 2f 0a 20 20 20 20 73 74   NULLs */.    st
8ab0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
8ac0: 6e 75 6c 6c 52 6f 77 5b 5d 20 3d 20 7b 20 36 2c  nullRow[] = { 6,
8ad0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d   0, 0, 0, 0, 0 }
8ae0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
8af0: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
8b00: 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
8b10: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
8b20: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
8b30: 42 4c 45 0a 20 20 20 20 69 66 28 20 69 73 56 69  BLE.    if( isVi
8b40: 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73  rtual ){.      s
8b50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
8b60: 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a  (v, OP_VBegin);.
8b70: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
8b80: 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
8b90: 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f   format and enco
8ba0: 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61 74 61  ding in the data
8bb0: 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20 62 65  base have not be
8bc0: 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20  en set, .    ** 
8bd0: 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20  set them now..  
8be0: 20 20 2a 2f 0a 20 20 20 20 72 65 67 31 20 3d 20    */.    reg1 = 
8bf0: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64  pParse->regRowid
8c00: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
8c10: 6d 3b 0a 20 20 20 20 72 65 67 32 20 3d 20 70 50  m;.    reg2 = pP
8c20: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 20 3d 20  arse->regRoot = 
8c30: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
8c40: 20 20 20 20 72 65 67 33 20 3d 20 2b 2b 70 50 61      reg3 = ++pPa
8c50: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
8c60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
8c70: 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69  (v, OP_ReadCooki
8c80: 65 2c 20 69 44 62 2c 20 72 65 67 33 2c 20 42 54  e, iDb, reg3, BT
8c90: 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 29  REE_FILE_FORMAT)
8ca0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8cb0: 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44  eUsesBtree(v, iD
8cc0: 62 29 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20  b);.    addr1 = 
8cd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8ce0: 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 33  1(v, OP_If, reg3
8cf0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
8d00: 76 29 3b 0a 20 20 20 20 66 69 6c 65 46 6f 72 6d  v);.    fileForm
8d10: 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  at = (db->flags 
8d20: 26 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46  & SQLITE_LegacyF
8d30: 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a 20 20 20  ileFmt)!=0 ?.   
8d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
8d50: 20 3a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 49   : SQLITE_MAX_FI
8d60: 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20 20 20 20 73  LE_FORMAT;.    s
8d70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
8d80: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
8d90: 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 46 49 4c  , iDb, BTREE_FIL
8da0: 45 5f 46 4f 52 4d 41 54 2c 20 66 69 6c 65 46 6f  E_FORMAT, fileFo
8db0: 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  rmat);.    sqlit
8dc0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
8dd0: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
8de0: 62 2c 20 42 54 52 45 45 5f 54 45 58 54 5f 45 4e  b, BTREE_TEXT_EN
8df0: 43 4f 44 49 4e 47 2c 20 45 4e 43 28 64 62 29 29  CODING, ENC(db))
8e00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8e10: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
8e20: 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  r1);..    /* Thi
8e30: 73 20 6a 75 73 74 20 63 72 65 61 74 65 73 20 61  s just creates a
8e40: 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72 65   place-holder re
8e50: 63 6f 72 64 20 69 6e 20 74 68 65 20 73 71 6c 69  cord in the sqli
8e60: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
8e70: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f  .    ** The reco
8e80: 72 64 20 63 72 65 61 74 65 64 20 64 6f 65 73 20  rd created does 
8e90: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74  not contain anyt
8ea0: 68 69 6e 67 20 79 65 74 2e 20 20 49 74 20 77 69  hing yet.  It wi
8eb0: 6c 6c 20 62 65 20 72 65 70 6c 61 63 65 64 0a 20  ll be replaced. 
8ec0: 20 20 20 2a 2a 20 62 79 20 74 68 65 20 72 65 61     ** by the rea
8ed0: 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f 64 65 20  l entry in code 
8ee0: 67 65 6e 65 72 61 74 65 64 20 61 74 20 73 71 6c  generated at sql
8ef0: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a  ite3EndTable()..
8f00: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
8f10: 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20  e rowid for the 
8f20: 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6c 65 66  new entry is lef
8f30: 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50  t in register pP
8f40: 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 2e 0a  arse->regRowid..
8f50: 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 6f 74 20      ** The root 
8f60: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
8f70: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20  he new table is 
8f80: 6c 65 66 74 20 69 6e 20 72 65 67 20 70 50 61 72  left in reg pPar
8f90: 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20  se->regRoot..   
8fa0: 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 61 6e   ** The rowid an
8fb0: 64 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  d root page numb
8fc0: 65 72 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65  er values are ne
8fd0: 65 64 65 64 20 62 79 20 74 68 65 20 63 6f 64 65  eded by the code
8fe0: 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 73 71 6c   that.    ** sql
8ff0: 69 74 65 33 45 6e 64 54 61 62 6c 65 20 77 69 6c  ite3EndTable wil
9000: 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20  l generate..    
9010: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
9020: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
9030: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
9040: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
9050: 4c 54 41 42 4c 45 29 0a 20 20 20 20 69 66 28 20  LTABLE).    if( 
9060: 69 73 56 69 65 77 20 7c 7c 20 69 73 56 69 72 74  isView || isVirt
9070: 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ual ){.      sql
9080: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9090: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
90a0: 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 65 6c 73   reg2);.    }els
90b0: 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20  e.#endif.    {. 
90c0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 64 64       pParse->add
90d0: 72 43 72 54 61 62 20 3d 0a 20 20 20 20 20 20 20  rCrTab =.       
90e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
90f0: 4f 70 33 28 76 2c 20 4f 50 5f 43 72 65 61 74 65  Op3(v, OP_Create
9100: 42 74 72 65 65 2c 20 69 44 62 2c 20 72 65 67 32  Btree, iDb, reg2
9110: 2c 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 29 3b  , BTREE_INTKEY);
9120: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
9130: 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  e3OpenMasterTabl
9140: 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
9150: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9160: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
9170: 6f 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a  owid, 0, reg1);.
9180: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9190: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62  ddOp4(v, OP_Blob
91a0: 2c 20 36 2c 20 72 65 67 33 2c 20 30 2c 20 6e 75  , 6, reg3, 0, nu
91b0: 6c 6c 52 6f 77 2c 20 50 34 5f 53 54 41 54 49 43  llRow, P4_STATIC
91c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
91d0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
91e0: 6e 73 65 72 74 2c 20 30 2c 20 72 65 67 33 2c 20  nsert, 0, reg3, 
91f0: 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  reg1);.    sqlit
9200: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
9210: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
9220: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
9230: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43 6c  eAddOp0(v, OP_Cl
9240: 6f 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ose);.  }..  /* 
9250: 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f  Normal (non-erro
9260: 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20  r) return. */.  
9270: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66  return;..  /* If
9280: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
9290: 2c 20 77 65 20 6a 75 6d 70 20 68 65 72 65 20 2a  , we jump here *
92a0: 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  /.begin_table_er
92b0: 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62  ror:.  sqlite3Db
92c0: 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
92d0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
92e0: 20 53 65 74 20 70 72 6f 70 65 72 74 69 65 73 20   Set properties 
92f0: 6f 66 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d  of a table colum
9300: 6e 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 28  n based on the (
9310: 6d 61 67 69 63 61 6c 29 0a 2a 2a 20 6e 61 6d 65  magical).** name
9320: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a   of the column..
9330: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
9340: 41 42 4c 45 5f 48 49 44 44 45 4e 5f 43 4f 4c 55  ABLE_HIDDEN_COLU
9350: 4d 4e 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MNS.void sqlite3
9360: 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73  ColumnProperties
9370: 46 72 6f 6d 4e 61 6d 65 28 54 61 62 6c 65 20 2a  FromName(Table *
9380: 70 54 61 62 2c 20 43 6f 6c 75 6d 6e 20 2a 70 43  pTab, Column *pC
9390: 6f 6c 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  ol){.  if( sqlit
93a0: 65 33 5f 73 74 72 6e 69 63 6d 70 28 70 43 6f 6c  e3_strnicmp(pCol
93b0: 2d 3e 7a 4e 61 6d 65 2c 20 22 5f 5f 68 69 64 64  ->zName, "__hidd
93c0: 65 6e 5f 5f 22 2c 20 31 30 29 3d 3d 30 20 29 7b  en__", 10)==0 ){
93d0: 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c  .    pCol->colFl
93e0: 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48  ags |= COLFLAG_H
93f0: 49 44 44 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69  IDDEN;.  }else i
9400: 66 28 20 70 54 61 62 20 26 26 20 70 43 6f 6c 21  f( pTab && pCol!
9410: 3d 70 54 61 62 2d 3e 61 43 6f 6c 20 26 26 20 28  =pTab->aCol && (
9420: 70 43 6f 6c 5b 2d 31 5d 2e 63 6f 6c 46 6c 61 67  pCol[-1].colFlag
9430: 73 20 26 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44  s & COLFLAG_HIDD
9440: 45 4e 29 20 29 7b 0a 20 20 20 20 70 54 61 62 2d  EN) ){.    pTab-
9450: 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
9460: 4f 4f 4f 48 69 64 64 65 6e 3b 0a 20 20 7d 0a 7d  OOOHidden;.  }.}
9470: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
9480: 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e  Add a new column
9490: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
94a0: 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
94b0: 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a  nstructed..**.**
94c0: 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
94d0: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  s this routine o
94e0: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  nce for each col
94f0: 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  umn declaration.
9500: 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54  ** in a CREATE T
9510: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
9520: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
9530: 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64  le() gets called
9540: 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74  .** first to get
9550: 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20   things going.  
9560: 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  Then this routin
9570: 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  e is called for 
9580: 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a  each.** column..
9590: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
95a0: 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a  ddColumn(Parse *
95b0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
95c0: 4e 61 6d 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79  Name, Token *pTy
95d0: 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  pe){.  Table *p;
95e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
95f0: 20 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79   *z;.  char *zTy
9600: 70 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  pe;.  Column *pC
9610: 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ol;.  sqlite3 *d
9620: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
9630: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
9640: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
9650: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
9660: 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61   p->nCol+1>db->a
9670: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
9680: 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20  IT_COLUMN] ){.  
9690: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
96a0: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
96b0: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25  any columns on %
96c0: 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  s", p->zName);. 
96d0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
96e0: 20 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   z = sqlite3DbMa
96f0: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70 4e 61 6d  llocRaw(db, pNam
9700: 65 2d 3e 6e 20 2b 20 70 54 79 70 65 2d 3e 6e 20  e->n + pType->n 
9710: 2b 20 32 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  + 2);.  if( z==0
9720: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
9730: 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
9740: 54 20 29 20 73 71 6c 69 74 65 33 52 65 6e 61 6d  T ) sqlite3Renam
9750: 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73 65  eTokenMap(pParse
9760: 2c 20 28 76 6f 69 64 2a 29 7a 2c 20 70 4e 61 6d  , (void*)z, pNam
9770: 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20  e);.  memcpy(z, 
9780: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
9790: 3e 6e 29 3b 0a 20 20 7a 5b 70 4e 61 6d 65 2d 3e  >n);.  z[pName->
97a0: 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  n] = 0;.  sqlite
97b0: 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 66  3Dequote(z);.  f
97c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
97d0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
97e0: 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
97f0: 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (z, p->aCol[i].z
9800: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
9810: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9820: 67 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69  g(pParse, "dupli
9830: 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  cate column name
9840: 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20  : %s", z);.     
9850: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
9860: 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74  b, z);.      ret
9870: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  urn;.    }.  }. 
9880: 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20   if( (p->nCol & 
9890: 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43  0x7)==0 ){.    C
98a0: 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20  olumn *aNew;.   
98b0: 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   aNew = sqlite3D
98c0: 62 52 65 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61  bRealloc(db,p->a
98d0: 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a  Col,(p->nCol+8)*
98e0: 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30  sizeof(p->aCol[0
98f0: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65  ]));.    if( aNe
9900: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  w==0 ){.      sq
9910: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9920: 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  z);.      return
9930: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61  ;.    }.    p->a
9940: 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a  Col = aNew;.  }.
9950: 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f    pCol = &p->aCo
9960: 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65  l[p->nCol];.  me
9970: 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69  mset(pCol, 0, si
9980: 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29  zeof(p->aCol[0])
9990: 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  );.  pCol->zName
99a0: 20 3d 20 7a 3b 0a 20 20 73 71 6c 69 74 65 33 43   = z;.  sqlite3C
99b0: 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46  olumnPropertiesF
99c0: 72 6f 6d 4e 61 6d 65 28 70 2c 20 70 43 6f 6c 29  romName(p, pCol)
99d0: 3b 0a 20 0a 20 20 69 66 28 20 70 54 79 70 65 2d  ;. .  if( pType-
99e0: 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  >n==0 ){.    /* 
99f0: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74  If there is no t
9a00: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 63  ype specified, c
9a10: 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20  olumns have the 
9a20: 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79  default affinity
9a30: 0a 20 20 20 20 2a 2a 20 27 42 4c 4f 42 27 20 77  .    ** 'BLOB' w
9a40: 69 74 68 20 61 20 64 65 66 61 75 6c 74 20 73 69  ith a default si
9a50: 7a 65 20 6f 66 20 34 20 62 79 74 65 73 2e 20 2a  ze of 4 bytes. *
9a60: 2f 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69  /.    pCol->affi
9a70: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
9a80: 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c  F_BLOB;.    pCol
9a90: 2d 3e 73 7a 45 73 74 20 3d 20 31 3b 0a 23 69 66  ->szEst = 1;.#if
9aa0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
9ab0: 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
9ac0: 43 45 53 0a 20 20 20 20 69 66 28 20 34 3e 3d 73  CES.    if( 4>=s
9ad0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
9ae0: 69 67 2e 73 7a 53 6f 72 74 65 72 52 65 66 20 29  ig.szSorterRef )
9af0: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f  {.      pCol->co
9b00: 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41  lFlags |= COLFLA
9b10: 47 5f 53 4f 52 54 45 52 52 45 46 3b 0a 20 20 20  G_SORTERREF;.   
9b20: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73   }.#endif.  }els
9b30: 65 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 7a  e{.    zType = z
9b40: 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   + sqlite3Strlen
9b50: 33 30 28 7a 29 20 2b 20 31 3b 0a 20 20 20 20 6d  30(z) + 1;.    m
9b60: 65 6d 63 70 79 28 7a 54 79 70 65 2c 20 70 54 79  emcpy(zType, pTy
9b70: 70 65 2d 3e 7a 2c 20 70 54 79 70 65 2d 3e 6e 29  pe->z, pType->n)
9b80: 3b 0a 20 20 20 20 7a 54 79 70 65 5b 70 54 79 70  ;.    zType[pTyp
9b90: 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 73  e->n] = 0;.    s
9ba0: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 54  qlite3Dequote(zT
9bb0: 79 70 65 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  ype);.    pCol->
9bc0: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
9bd0: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a  e3AffinityType(z
9be0: 54 79 70 65 2c 20 70 43 6f 6c 29 3b 0a 20 20 20  Type, pCol);.   
9bf0: 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
9c00: 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41 53 54 59  |= COLFLAG_HASTY
9c10: 50 45 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 43 6f  PE;.  }.  p->nCo
9c20: 6c 2b 2b 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63  l++;.  pParse->c
9c30: 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20  onstraintName.n 
9c40: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  = 0;.}../*.** Th
9c50: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
9c60: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
9c70: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
9c80: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
9c90: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
9ca0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
9cb0: 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e  A "NOT NULL" con
9cc0: 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62  straint has.** b
9cd0: 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f  een seen on a co
9ce0: 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  lumn.  This rout
9cf0: 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74  ine sets the not
9d00: 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20  Null flag on.** 
9d10: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  the column curre
9d20: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
9d30: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
9d40: 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75   sqlite3AddNotNu
9d50: 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ll(Parse *pParse
9d60: 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a  , int onError){.
9d70: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f    Table *p;.  Co
9d80: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 70 20  lumn *pCol;.  p 
9d90: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
9da0: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
9db0: 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c  || NEVER(p->nCol
9dc0: 3c 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  <1) ) return;.  
9dd0: 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b  pCol = &p->aCol[
9de0: 70 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 70 43  p->nCol-1];.  pC
9df0: 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75  ol->notNull = (u
9e00: 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 2d 3e  8)onError;.  p->
9e10: 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48  tabFlags |= TF_H
9e20: 61 73 4e 6f 74 4e 75 6c 6c 3b 0a 0a 20 20 2f 2a  asNotNull;..  /*
9e30: 20 53 65 74 20 74 68 65 20 75 6e 69 71 4e 6f 74   Set the uniqNot
9e40: 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 20 61 6e 79  Null flag on any
9e50: 20 55 4e 49 51 55 45 20 6f 72 20 50 4b 20 69 6e   UNIQUE or PK in
9e60: 64 65 78 65 73 20 61 6c 72 65 61 64 79 20 63 72  dexes already cr
9e70: 65 61 74 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68  eated.  ** on th
9e80: 69 73 20 63 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a 20  is column.  */. 
9e90: 20 69 66 28 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c   if( pCol->colFl
9ea0: 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 55 4e  ags & COLFLAG_UN
9eb0: 49 51 55 45 20 29 7b 0a 20 20 20 20 49 6e 64 65  IQUE ){.    Inde
9ec0: 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72  x *pIdx;.    for
9ed0: 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b  (pIdx=p->pIndex;
9ee0: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
9ef0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
9f00: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 4b  assert( pIdx->nK
9f10: 65 79 43 6f 6c 3d 3d 31 20 26 26 20 70 49 64 78  eyCol==1 && pIdx
9f20: 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
9f30: 6e 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ne );.      if( 
9f40: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30  pIdx->aiColumn[0
9f50: 5d 3d 3d 70 2d 3e 6e 43 6f 6c 2d 31 20 29 7b 0a  ]==p->nCol-1 ){.
9f60: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 75 6e          pIdx->un
9f70: 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20  iqNotNull = 1;. 
9f80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9f90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74  .}../*.** Scan t
9fa0: 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e  he column type n
9fb0: 61 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74  ame zType (lengt
9fc0: 68 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74  h nType) and ret
9fd0: 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63  urn the.** assoc
9fe0: 69 61 74 65 64 20 61 66 66 69 6e 69 74 79 20 74  iated affinity t
9ff0: 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ype..**.** This 
a000: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63  routine does a c
a010: 61 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20  ase-independent 
a020: 73 65 61 72 63 68 20 6f 66 20 7a 54 79 70 65 20  search of zType 
a030: 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75 62 73  for the .** subs
a040: 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 66 6f  trings in the fo
a050: 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20 49  llowing table. I
a060: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62  f one of the sub
a070: 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f  strings is.** fo
a080: 75 6e 64 2c 20 74 68 65 20 63 6f 72 72 65 73 70  und, the corresp
a090: 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69 74 79 20  onding affinity 
a0a0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
a0b0: 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a  zType contains.*
a0c0: 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  * more than one 
a0d0: 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67  of the substring
a0e0: 73 2c 20 65 6e 74 72 69 65 73 20 74 6f 77 61 72  s, entries towar
a0f0: 64 20 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a  d the top of .**
a100: 20 74 68 65 20 74 61 62 6c 65 20 74 61 6b 65 20   the table take 
a110: 70 72 69 6f 72 69 74 79 2e 20 46 6f 72 20 65 78  priority. For ex
a120: 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70 65 20  ample, if zType 
a130: 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a  is 'BLOBINT', .*
a140: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  * SQLITE_AFF_INT
a150: 45 47 45 52 20 69 73 20 72 65 74 75 72 6e 65 64  EGER is returned
a160: 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e  ..**.** Substrin
a170: 67 20 20 20 20 20 7c 20 41 66 66 69 6e 69 74 79  g     | Affinity
a180: 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
a190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a1a0: 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20  ----.** 'INT'   
a1b0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
a1c0: 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43  FF_INTEGER.** 'C
a1d0: 48 41 52 27 20 20 20 20 20 20 20 20 7c 20 53 51  HAR'        | SQ
a1e0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
a1f0: 20 27 43 4c 4f 42 27 20 20 20 20 20 20 20 20 7c   'CLOB'        |
a200: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
a210: 0a 2a 2a 20 27 54 45 58 54 27 20 20 20 20 20 20  .** 'TEXT'      
a220: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54    | SQLITE_AFF_T
a230: 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20  EXT.** 'BLOB'   
a240: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
a250: 46 5f 42 4c 4f 42 0a 2a 2a 20 27 52 45 41 4c 27  F_BLOB.** 'REAL'
a260: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
a270: 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c  _AFF_REAL.** 'FL
a280: 4f 41 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OA'        | SQL
a290: 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20  ITE_AFF_REAL.** 
a2a0: 27 44 4f 55 42 27 20 20 20 20 20 20 20 20 7c 20  'DOUB'        | 
a2b0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
a2c0: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66  **.** If none of
a2d0: 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20   the substrings 
a2e0: 69 6e 20 74 68 65 20 61 62 6f 76 65 20 74 61 62  in the above tab
a2f0: 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a  le are found,.**
a300: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
a310: 52 49 43 20 69 73 20 72 65 74 75 72 6e 65 64 2e  RIC is returned.
a320: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
a330: 41 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e  AffinityType(con
a340: 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20 43 6f  st char *zIn, Co
a350: 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b 0a 20 20 75  lumn *pCol){.  u
a360: 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72  32 h = 0;.  char
a370: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
a380: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e  F_NUMERIC;.  con
a390: 73 74 20 63 68 61 72 20 2a 7a 43 68 61 72 20 3d  st char *zChar =
a3a0: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 7a   0;..  assert( z
a3b0: 49 6e 21 3d 30 20 29 3b 0a 20 20 77 68 69 6c 65  In!=0 );.  while
a3c0: 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20 20 20  ( zIn[0] ){.    
a3d0: 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c  h = (h<<8) + sql
a3e0: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
a3f0: 5b 28 2a 7a 49 6e 29 26 30 78 66 66 5d 3b 0a 20  [(*zIn)&0xff];. 
a400: 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66     zIn++;.    if
a410: 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b  ( h==(('c'<<24)+
a420: 28 27 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c  ('h'<<16)+('a'<<
a430: 38 29 2b 27 72 27 29 20 29 7b 20 20 20 20 20 20  8)+'r') ){      
a440: 20 20 20 20 20 20 20 2f 2a 20 43 48 41 52 20 2a         /* CHAR *
a450: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
a460: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
a470: 20 20 20 20 20 7a 43 68 61 72 20 3d 20 7a 49 6e       zChar = zIn
a480: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
a490: 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27  h==(('c'<<24)+('
a4a0: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
a4b0: 2b 27 62 27 29 20 29 7b 20 20 20 20 20 20 20 2f  +'b') ){       /
a4c0: 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20  * CLOB */.      
a4d0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
a4e0: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _TEXT;.    }else
a4f0: 20 69 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32   if( h==(('t'<<2
a500: 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 78  4)+('e'<<16)+('x
a510: 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20  '<<8)+'t') ){   
a520: 20 20 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20      /* TEXT */. 
a530: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
a540: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
a550: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
a560: 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  b'<<24)+('l'<<16
a570: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20  )+('o'<<8)+'b') 
a580: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42           /* BLOB
a590: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 28   */.        && (
a5a0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
a5b0: 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d 3d  NUMERIC || aff==
a5c0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 29  SQLITE_AFF_REAL)
a5d0: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
a5e0: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b  SQLITE_AFF_BLOB;
a5f0: 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e 5b 30  .      if( zIn[0
a600: 5d 3d 3d 27 28 27 20 29 20 7a 43 68 61 72 20 3d  ]=='(' ) zChar =
a610: 20 7a 49 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51   zIn;.#ifndef SQ
a620: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
a630: 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c  NG_POINT.    }el
a640: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c  se if( h==(('r'<
a650: 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28  <24)+('e'<<16)+(
a660: 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20  'a'<<8)+'l')    
a670: 20 20 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f        /* REAL */
a680: 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d  .        && aff=
a690: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
a6a0: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66  RIC ){.      aff
a6b0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   = SQLITE_AFF_RE
a6c0: 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  AL;.    }else if
a6d0: 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b  ( h==(('f'<<24)+
a6e0: 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c  ('l'<<16)+('o'<<
a6f0: 38 29 2b 27 61 27 29 20 20 20 20 20 20 20 20 20  8)+'a')         
a700: 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20   /* FLOA */.    
a710: 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49      && aff==SQLI
a720: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
a730: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
a740: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20  LITE_AFF_REAL;. 
a750: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
a760: 28 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c  (('d'<<24)+('o'<
a770: 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62  <16)+('u'<<8)+'b
a780: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ')          /* D
a790: 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  OUB */.        &
a7a0: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
a7b0: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
a7c0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
a7d0: 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66  AFF_REAL;.#endif
a7e0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
a7f0: 68 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28  h&0x00FFFFFF)==(
a800: 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c  ('i'<<16)+('n'<<
a810: 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a  8)+'t') ){    /*
a820: 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66   INT */.      af
a830: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  f = SQLITE_AFF_I
a840: 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72  NTEGER;.      br
a850: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
a860: 20 20 2f 2a 20 49 66 20 70 43 6f 6c 20 69 73 20    /* If pCol is 
a870: 6e 6f 74 20 4e 55 4c 4c 2c 20 73 74 6f 72 65 20  not NULL, store 
a880: 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  an estimate of t
a890: 68 65 20 66 69 65 6c 64 20 73 69 7a 65 2e 20 20  he field size.  
a8a0: 54 68 65 0a 20 20 2a 2a 20 65 73 74 69 6d 61 74  The.  ** estimat
a8b0: 65 20 69 73 20 73 63 61 6c 65 64 20 73 6f 20 74  e is scaled so t
a8c0: 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
a8d0: 61 6e 20 69 6e 74 65 67 65 72 20 69 73 20 31 2e  an integer is 1.
a8e0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 6f 6c 20    */.  if( pCol 
a8f0: 29 7b 0a 20 20 20 20 69 6e 74 20 76 20 3d 20 30  ){.    int v = 0
a900: 3b 20 20 20 2f 2a 20 64 65 66 61 75 6c 74 20 73  ;   /* default s
a910: 69 7a 65 20 69 73 20 61 70 70 72 6f 78 20 34 20  ize is approx 4 
a920: 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 66 28  bytes */.    if(
a930: 20 61 66 66 3c 53 51 4c 49 54 45 5f 41 46 46 5f   aff<SQLITE_AFF_
a940: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
a950: 20 69 66 28 20 7a 43 68 61 72 20 29 7b 0a 20 20   if( zChar ){.  
a960: 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 43 68        while( zCh
a970: 61 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20  ar[0] ){.       
a980: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73     if( sqlite3Is
a990: 64 69 67 69 74 28 7a 43 68 61 72 5b 30 5d 29 20  digit(zChar[0]) 
a9a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
a9b0: 2a 20 42 4c 4f 42 28 6b 29 2c 20 56 41 52 43 48  * BLOB(k), VARCH
a9c0: 41 52 28 6b 29 2c 20 43 48 41 52 28 6b 29 20 2d  AR(k), CHAR(k) -
a9d0: 3e 20 72 3d 28 6b 2f 34 2b 31 29 20 2a 2f 0a 20  > r=(k/4+1) */. 
a9e0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
a9f0: 65 33 47 65 74 49 6e 74 33 32 28 7a 43 68 61 72  e3GetInt32(zChar
aa00: 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20  , &v);.         
aa10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
aa20: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
aa30: 7a 43 68 61 72 2b 2b 3b 0a 20 20 20 20 20 20 20  zChar++;.       
aa40: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
aa50: 20 20 20 20 20 20 20 20 76 20 3d 20 31 36 3b 20          v = 16; 
aa60: 20 20 2f 2a 20 42 4c 4f 42 2c 20 54 45 58 54 2c    /* BLOB, TEXT,
aa70: 20 43 4c 4f 42 20 2d 3e 20 72 3d 35 20 20 28 61   CLOB -> r=5  (a
aa80: 70 70 72 6f 78 20 32 30 20 62 79 74 65 73 29 2a  pprox 20 bytes)*
aa90: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
aaa0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
aab0: 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45  ABLE_SORTER_REFE
aac0: 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20 76  RENCES.    if( v
aad0: 3e 3d 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  >=sqlite3GlobalC
aae0: 6f 6e 66 69 67 2e 73 7a 53 6f 72 74 65 72 52 65  onfig.szSorterRe
aaf0: 66 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  f ){.      pCol-
ab00: 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c  >colFlags |= COL
ab10: 46 4c 41 47 5f 53 4f 52 54 45 52 52 45 46 3b 0a  FLAG_SORTERREF;.
ab20: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
ab30: 20 76 20 3d 20 76 2f 34 20 2b 20 31 3b 0a 20 20   v = v/4 + 1;.  
ab40: 20 20 69 66 28 20 76 3e 32 35 35 20 29 20 76 20    if( v>255 ) v 
ab50: 3d 20 32 35 35 3b 0a 20 20 20 20 70 43 6f 6c 2d  = 255;.    pCol-
ab60: 3e 73 7a 45 73 74 20 3d 20 76 3b 0a 20 20 7d 0a  >szEst = v;.  }.
ab70: 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a    return aff;.}.
ab80: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65  ./*.** The expre
ab90: 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66  ssion is the def
aba0: 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
abb0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
abc0: 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a   added column.**
abd0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 75   of the table cu
abe0: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
abf0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
ac00: 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20  * Default value 
ac10: 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74  expressions must
ac20: 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52   be constant.  R
ac30: 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f  aise an exceptio
ac40: 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  n if this.** is 
ac50: 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a  not the case..**
ac60: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ac70: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
ac80: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
ac90: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
aca0: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
acb0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
acc0: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
acd0: 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61  ite3AddDefaultVa
ace0: 6c 75 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  lue(.  Parse *pP
acf0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
ad00: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
ad10: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
ad20: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
ad30: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20 65   /* The parsed e
ad40: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65  xpression of the
ad50: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a   default value *
ad60: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
ad70: 7a 53 74 61 72 74 2c 20 20 20 20 20 20 2f 2a 20  zStart,      /* 
ad80: 53 74 61 72 74 20 6f 66 20 74 68 65 20 64 65 66  Start of the def
ad90: 61 75 6c 74 20 76 61 6c 75 65 20 74 65 78 74 20  ault value text 
ada0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
adb0: 2a 7a 45 6e 64 20 20 20 20 20 20 20 20 20 2f 2a  *zEnd         /*
adc0: 20 46 69 72 73 74 20 63 68 61 72 61 63 74 65 72   First character
add0: 20 70 61 73 74 20 65 6e 64 20 6f 66 20 64 65 66   past end of def
ade0: 61 75 74 20 76 61 6c 75 65 20 74 65 78 74 20 2a  aut value text *
adf0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
ae00: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
ae10: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
ae20: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
ae30: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
ae40: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 21 3d 30  able;.  if( p!=0
ae50: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26   ){.    pCol = &
ae60: 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c  (p->aCol[p->nCol
ae70: 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73  -1]);.    if( !s
ae80: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
ae90: 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70  tantOrFunction(p
aea0: 45 78 70 72 2c 20 64 62 2d 3e 69 6e 69 74 2e 62  Expr, db->init.b
aeb0: 75 73 79 29 20 29 7b 0a 20 20 20 20 20 20 73 71  usy) ){.      sq
aec0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
aed0: 61 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76  arse, "default v
aee0: 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b  alue of column [
aef0: 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  %s] is not const
af00: 61 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ant",.          
af10: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
af20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
af30: 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 45 78 70  * A copy of pExp
af40: 72 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61  r is used instea
af50: 64 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  d of the origina
af60: 6c 2c 20 61 73 20 70 45 78 70 72 20 63 6f 6e 74  l, as pExpr cont
af70: 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ains.      ** to
af80: 6b 65 6e 73 20 74 68 61 74 20 70 6f 69 6e 74 20  kens that point 
af90: 74 6f 20 76 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f  to volatile memo
afa0: 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ry..      */.   
afb0: 20 20 20 45 78 70 72 20 78 3b 0a 20 20 20 20 20     Expr x;.     
afc0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
afd0: 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66  te(db, pCol->pDf
afe0: 6c 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  lt);.      memse
aff0: 74 28 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&x, 0, sizeof(
b000: 78 29 29 3b 0a 20 20 20 20 20 20 78 2e 6f 70 20  x));.      x.op 
b010: 3d 20 54 4b 5f 53 50 41 4e 3b 0a 20 20 20 20 20  = TK_SPAN;.     
b020: 20 78 2e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 73 71   x.u.zToken = sq
b030: 6c 69 74 65 33 44 62 53 70 61 6e 44 75 70 28 64  lite3DbSpanDup(d
b040: 62 2c 20 7a 53 74 61 72 74 2c 20 7a 45 6e 64 29  b, zStart, zEnd)
b050: 3b 0a 20 20 20 20 20 20 78 2e 70 4c 65 66 74 20  ;.      x.pLeft 
b060: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 78  = pExpr;.      x
b070: 2e 66 6c 61 67 73 20 3d 20 45 50 5f 53 6b 69 70  .flags = EP_Skip
b080: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44  ;.      pCol->pD
b090: 66 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  flt = sqlite3Exp
b0a0: 72 44 75 70 28 64 62 2c 20 26 78 2c 20 45 58 50  rDup(db, &x, EXP
b0b0: 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
b0c0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
b0d0: 65 28 64 62 2c 20 78 2e 75 2e 7a 54 6f 6b 65 6e  e(db, x.u.zToken
b0e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
b0f0: 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
b100: 45 43 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ECT ){.    sqlit
b110: 65 33 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d 61  e3RenameExprUnma
b120: 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  p(pParse, pExpr)
b130: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
b140: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
b150: 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  xpr);.}../*.** B
b160: 61 63 6b 77 61 72 64 73 20 43 6f 6d 70 61 74 69  ackwards Compati
b170: 62 69 6c 69 74 79 20 48 61 63 6b 3a 0a 2a 2a 20  bility Hack:.** 
b180: 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c 20 76  .** Historical v
b190: 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
b1a0: 65 20 61 63 63 65 70 74 65 64 20 73 74 72 69 6e  e accepted strin
b1b0: 67 73 20 61 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d  gs as column nam
b1c0: 65 73 20 69 6e 0a 2a 2a 20 69 6e 64 65 78 65 73  es in.** indexes
b1d0: 20 61 6e 64 20 50 52 49 4d 41 52 59 20 4b 45 59   and PRIMARY KEY
b1e0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 6e 64   constraints and
b1f0: 20 69 6e 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   in UNIQUE const
b200: 72 61 69 6e 74 73 2e 20 20 45 78 61 6d 70 6c 65  raints.  Example
b210: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41  :.**.**     CREA
b220: 54 45 20 54 41 42 4c 45 20 78 79 7a 28 61 2c 62  TE TABLE xyz(a,b
b230: 2c 63 2c 64 2c 65 2c 50 52 49 4d 41 52 59 20 4b  ,c,d,e,PRIMARY K
b240: 45 59 28 27 61 27 29 2c 55 4e 49 51 55 45 28 27  EY('a'),UNIQUE('
b250: 62 27 2c 27 63 27 20 43 4f 4c 4c 41 54 45 20 74  b','c' COLLATE t
b260: 72 69 6d 29 0a 2a 2a 20 20 20 20 20 43 52 45 41  rim).**     CREA
b270: 54 45 20 49 4e 44 45 58 20 61 62 63 20 4f 4e 20  TE INDEX abc ON 
b280: 78 79 7a 28 27 63 27 2c 27 64 27 20 44 45 53 43  xyz('c','d' DESC
b290: 2c 27 65 27 20 43 4f 4c 4c 41 54 45 20 6e 6f 63  ,'e' COLLATE noc
b2a0: 61 73 65 20 44 45 53 43 29 3b 0a 2a 2a 0a 2a 2a  ase DESC);.**.**
b2b0: 20 54 68 69 73 20 69 73 20 67 6f 6f 66 79 2e 20   This is goofy. 
b2c0: 20 42 75 74 20 74 6f 20 70 72 65 73 65 72 76 65   But to preserve
b2d0: 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
b2e0: 74 69 62 69 6c 69 74 79 20 77 65 20 63 6f 6e 74  tibility we cont
b2f0: 69 6e 75 65 20 74 6f 0a 2a 2a 20 61 63 63 65 70  inue to.** accep
b300: 74 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  t it.  This rout
b310: 69 6e 65 20 64 6f 65 73 20 74 68 65 20 6e 65 63  ine does the nec
b320: 65 73 73 61 72 79 20 63 6f 6e 76 65 72 73 69 6f  essary conversio
b330: 6e 2e 20 20 49 74 20 63 6f 6e 76 65 72 74 73 0a  n.  It converts.
b340: 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ** the expressio
b350: 6e 20 67 69 76 65 6e 20 69 6e 20 69 74 73 20 61  n given in its a
b360: 72 67 75 6d 65 6e 74 20 66 72 6f 6d 20 61 20 54  rgument from a T
b370: 4b 5f 53 54 52 49 4e 47 20 69 6e 74 6f 20 61 20  K_STRING into a 
b380: 54 4b 5f 49 44 0a 2a 2a 20 69 66 20 74 68 65 20  TK_ID.** if the 
b390: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6a 75  expression is ju
b3a0: 73 74 20 61 20 54 4b 5f 53 54 52 49 4e 47 20 77  st a TK_STRING w
b3b0: 69 74 68 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20  ith an optional 
b3c0: 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73 65 2e 0a  COLLATE clause..
b3d0: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
b3e0: 73 69 6f 6e 20 69 73 20 61 6e 79 74 68 69 6e 67  sion is anything
b3f0: 20 6f 74 68 65 72 20 74 68 61 6e 20 54 4b 5f 53   other than TK_S
b400: 54 52 49 4e 47 2c 20 74 68 65 20 65 78 70 72 65  TRING, the expre
b410: 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 75 6e 63 68  ssion is.** unch
b420: 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  anged..*/.static
b430: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 72   void sqlite3Str
b440: 69 6e 67 54 6f 49 64 28 45 78 70 72 20 2a 70 29  ingToId(Expr *p)
b450: 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  {.  if( p->op==T
b460: 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20  K_STRING ){.    
b470: 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a 20  p->op = TK_ID;. 
b480: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70   }else if( p->op
b490: 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20  ==TK_COLLATE && 
b4a0: 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  p->pLeft->op==TK
b4b0: 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 70  _STRING ){.    p
b4c0: 2d 3e 70 4c 65 66 74 2d 3e 6f 70 20 3d 20 54 4b  ->pLeft->op = TK
b4d0: 5f 49 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _ID;.  }.}../*.*
b4e0: 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68 65 20  * Designate the 
b4f0: 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20  PRIMARY KEY for 
b500: 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73  the table.  pLis
b510: 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e  t is a list of n
b520: 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75  ames .** of colu
b530: 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68  mns that form th
b540: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20  e primary key.  
b550: 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c  If pList is NULL
b560: 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f  , then the.** mo
b570: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
b580: 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  d column of the 
b590: 74 61 62 6c 65 20 69 73 20 74 68 65 20 70 72 69  table is the pri
b5a0: 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20  mary key..**.** 
b5b0: 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65  A table can have
b5c0: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69   at most one pri
b5d0: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68  mary key.  If th
b5e0: 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  e table already 
b5f0: 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79  has.** a primary
b600: 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20 69   key (and this i
b610: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69  s the second pri
b620: 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63  mary key) then c
b630: 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f  reate an.** erro
b640: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
b650: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f  PRIMARY KEY is o
b660: 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  n a single colum
b670: 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79 70 65  n whose datatype
b680: 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20   is INTEGER,.** 
b690: 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79  then we will try
b6a0: 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c   to use that col
b6b0: 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 69 64  umn as the rowid
b6c0: 2e 20 20 53 65 74 20 74 68 65 20 54 61 62 6c 65  .  Set the Table
b6d0: 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20  .iPKey.** field 
b6e0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64  of the table und
b6f0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
b700: 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78 20  to be the index 
b710: 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45  of the.** INTEGE
b720: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  R PRIMARY KEY co
b730: 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b  lumn.  Table.iPK
b740: 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20  ey is set to -1 
b750: 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  if there is.** n
b760: 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  o INTEGER PRIMAR
b770: 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Y KEY..**.** If 
b780: 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61  the key is not a
b790: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
b7a0: 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61  Y KEY, then crea
b7b0: 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69  te a unique.** i
b7c0: 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79  ndex for the key
b7d0: 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63  .  No index is c
b7e0: 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47  reated for INTEG
b7f0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e  ER PRIMARY KEYs.
b800: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
b810: 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 0a 20  AddPrimaryKey(. 
b820: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
b830: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
b840: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
b850: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20  ist *pList,  /* 
b860: 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 20 6e 61  List of field na
b870: 6d 65 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mes to be indexe
b880: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  d */.  int onErr
b890: 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57 68 61 74  or,      /* What
b8a0: 20 74 6f 20 64 6f 20 77 69 74 68 20 61 20 75 6e   to do with a un
b8b0: 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63  iqueness conflic
b8c0: 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49  t */.  int autoI
b8d0: 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65  nc,      /* True
b8e0: 20 69 66 20 74 68 65 20 41 55 54 4f 49 4e 43 52   if the AUTOINCR
b8f0: 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20 69 73  EMENT keyword is
b900: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
b910: 74 20 73 6f 72 74 4f 72 64 65 72 20 20 20 20 20  t sortOrder     
b920: 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  /* SQLITE_SO_ASC
b930: 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45   or SQLITE_SO_DE
b940: 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  SC */.){.  Table
b950: 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   *pTab = pParse-
b960: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 43 6f  >pNewTable;.  Co
b970: 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a  lumn *pCol = 0;.
b980: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c    int iCol = -1,
b990: 20 69 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b   i;.  int nTerm;
b9a0: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
b9b0: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
b9c0: 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54  y_exit;.  if( pT
b9d0: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
b9e0: 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 20  F_HasPrimaryKey 
b9f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
ba00: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
ba10: 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25        "table \"%
ba20: 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61  s\" has more tha
ba30: 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65  n one primary ke
ba40: 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  y", pTab->zName)
ba50: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61  ;.    goto prima
ba60: 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d  ry_key_exit;.  }
ba70: 0a 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  .  pTab->tabFlag
ba80: 73 20 7c 3d 20 54 46 5f 48 61 73 50 72 69 6d 61  s |= TF_HasPrima
ba90: 72 79 4b 65 79 3b 0a 20 20 69 66 28 20 70 4c 69  ryKey;.  if( pLi
baa0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f  st==0 ){.    iCo
bab0: 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d  l = pTab->nCol -
bac0: 20 31 3b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26   1;.    pCol = &
bad0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
bae0: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46  ;.    pCol->colF
baf0: 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
bb00: 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 6e 54 65  PRIMKEY;.    nTe
bb10: 72 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  rm = 1;.  }else{
bb20: 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 70 4c 69  .    nTerm = pLi
bb30: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66  st->nExpr;.    f
bb40: 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b  or(i=0; i<nTerm;
bb50: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
bb60: 72 20 2a 70 43 45 78 70 72 20 3d 20 73 71 6c 69  r *pCExpr = sqli
bb70: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
bb80: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  te(pList->a[i].p
bb90: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 61 73 73  Expr);.      ass
bba0: 65 72 74 28 20 70 43 45 78 70 72 21 3d 30 20 29  ert( pCExpr!=0 )
bbb0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
bbc0: 74 72 69 6e 67 54 6f 49 64 28 70 43 45 78 70 72  tringToId(pCExpr
bbd0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 45  );.      if( pCE
bbe0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  xpr->op==TK_ID )
bbf0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
bc00: 63 68 61 72 20 2a 7a 43 4e 61 6d 65 20 3d 20 70  char *zCName = p
bc10: 43 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  CExpr->u.zToken;
bc20: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 43 6f  .        for(iCo
bc30: 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  l=0; iCol<pTab->
bc40: 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
bc50: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
bc60: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 4e 61  ite3StrICmp(zCNa
bc70: 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  me, pTab->aCol[i
bc80: 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  Col].zName)==0 )
bc90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  {.            pC
bca0: 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c  ol = &pTab->aCol
bcb0: 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 20 20  [iCol];.        
bcc0: 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
bcd0: 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52  gs |= COLFLAG_PR
bce0: 49 4d 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 20  IMKEY;.         
bcf0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bd00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
bd10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
bd20: 7d 0a 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d 31  }.  if( nTerm==1
bd30: 0a 20 20 20 26 26 20 70 43 6f 6c 0a 20 20 20 26  .   && pCol.   &
bd40: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
bd50: 28 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79  (sqlite3ColumnTy
bd60: 70 65 28 70 43 6f 6c 2c 22 22 29 2c 20 22 49 4e  pe(pCol,""), "IN
bd70: 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 26 26  TEGER")==0.   &&
bd80: 20 73 6f 72 74 4f 72 64 65 72 21 3d 53 51 4c 49   sortOrder!=SQLI
bd90: 54 45 5f 53 4f 5f 44 45 53 43 0a 20 20 29 7b 0a  TE_SO_DESC.  ){.
bda0: 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d      if( IN_RENAM
bdb0: 45 5f 4f 42 4a 45 43 54 20 26 26 20 70 4c 69 73  E_OBJECT && pLis
bdc0: 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  t ){.      Expr 
bdd0: 2a 70 43 45 78 70 72 20 3d 20 73 71 6c 69 74 65  *pCExpr = sqlite
bde0: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
bdf0: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  (pList->a[0].pEx
be00: 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
be10: 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d  e3RenameTokenRem
be20: 61 70 28 70 50 61 72 73 65 2c 20 26 70 54 61 62  ap(pParse, &pTab
be30: 2d 3e 69 50 4b 65 79 2c 20 70 43 45 78 70 72 29  ->iPKey, pCExpr)
be40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
be50: 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a  ->iPKey = iCol;.
be60: 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e      pTab->keyCon
be70: 66 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b  f = (u8)onError;
be80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 75 74  .    assert( aut
be90: 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75 74 6f 49  oInc==0 || autoI
bea0: 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54 61  nc==1 );.    pTa
beb0: 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 61  b->tabFlags |= a
bec0: 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74 6f 69 6e  utoInc*TF_Autoin
bed0: 63 72 65 6d 65 6e 74 3b 0a 20 20 20 20 69 66 28  crement;.    if(
bee0: 20 70 4c 69 73 74 20 29 20 70 50 61 72 73 65 2d   pList ) pParse-
bef0: 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72 20 3d 20  >iPkSortOrder = 
bf00: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74  pList->a[0].sort
bf10: 4f 72 64 65 72 3b 0a 20 20 7d 65 6c 73 65 20 69  Order;.  }else i
bf20: 66 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69  f( autoInc ){.#i
bf30: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
bf40: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
bf50: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
bf60: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 41 55 54  Msg(pParse, "AUT
bf70: 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e  OINCREMENT is on
bf80: 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e  ly allowed on an
bf90: 20 22 0a 20 20 20 20 20 20 20 22 49 4e 54 45 47   ".       "INTEG
bfa0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 29  ER PRIMARY KEY")
bfb0: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
bfc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65  {.    sqlite3Cre
bfd0: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
bfe0: 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c   0, 0, 0, pList,
bff0: 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 0a 20 20 20   onError, 0,.   
c000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c010: 20 20 20 20 20 20 20 20 30 2c 20 73 6f 72 74 4f          0, sortO
c020: 72 64 65 72 2c 20 30 2c 20 53 51 4c 49 54 45 5f  rder, 0, SQLITE_
c030: 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b  IDXTYPE_PRIMARYK
c040: 45 59 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  EY);.    pList =
c050: 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79   0;.  }..primary
c060: 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c  _key_exit:.  sql
c070: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
c080: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
c090: 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b  List);.  return;
c0a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
c0b0: 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  new CHECK constr
c0c0: 61 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c  aint to the tabl
c0d0: 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
c0e0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
c0f0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
c100: 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e  ddCheckConstrain
c110: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
c120: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
c130: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
c140: 78 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20  xpr *pCheckExpr 
c150: 20 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78   /* The check ex
c160: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23  pression */.){.#
c170: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c180: 49 54 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c 65  IT_CHECK.  Table
c190: 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   *pTab = pParse-
c1a0: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 73 71  >pNewTable;.  sq
c1b0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
c1c0: 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 54  se->db;.  if( pT
c1d0: 61 62 20 26 26 20 21 49 4e 5f 44 45 43 4c 41 52  ab && !IN_DECLAR
c1e0: 45 5f 56 54 41 42 0a 20 20 20 26 26 20 21 73 71  E_VTAB.   && !sq
c1f0: 6c 69 74 65 33 42 74 72 65 65 49 73 52 65 61 64  lite3BtreeIsRead
c200: 6f 6e 6c 79 28 64 62 2d 3e 61 44 62 5b 64 62 2d  only(db->aDb[db-
c210: 3e 69 6e 69 74 2e 69 44 62 5d 2e 70 42 74 29 0a  >init.iDb].pBt).
c220: 20 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 70    ){.    pTab->p
c230: 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  Check = sqlite3E
c240: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
c250: 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65  arse, pTab->pChe
c260: 63 6b 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b  ck, pCheckExpr);
c270: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
c280: 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e  >constraintName.
c290: 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  n ){.      sqlit
c2a0: 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d  e3ExprListSetNam
c2b0: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e  e(pParse, pTab->
c2c0: 70 43 68 65 63 6b 2c 20 26 70 50 61 72 73 65 2d  pCheck, &pParse-
c2d0: 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2c  >constraintName,
c2e0: 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   1);.    }.  }el
c2f0: 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20  se.#endif.  {.  
c300: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
c310: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
c320: 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 7d  pCheckExpr);.  }
c330: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
c340: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  e collation func
c350: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
c360: 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64   recently parsed
c370: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a   table column.**
c380: 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71 20   to the CollSeq 
c390: 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  given..*/.void s
c3a0: 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65  qlite3AddCollate
c3b0: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
c3c0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  se, Token *pToke
c3d0: 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  n){.  Table *p;.
c3e0: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
c3f0: 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *zColl;         
c400: 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74 65 64       /* Dequoted
c410: 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69   name of collati
c420: 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20  on sequence */. 
c430: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20   sqlite3 *db;.. 
c440: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
c450: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
c460: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
c470: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64 62 20  p->nCol-1;.  db 
c480: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
c490: 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e  zColl = sqlite3N
c4a0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
c4b0: 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20   pToken);.  if( 
c4c0: 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b  !zColl ) return;
c4d0: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c  ..  if( sqlite3L
c4e0: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
c4f0: 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20  rse, zColl) ){. 
c500: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
c510: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
c520: 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d  e(db, p->aCol[i]
c530: 2e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e  .zColl);.    p->
c540: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20  aCol[i].zColl = 
c550: 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a  zColl;.  .    /*
c560: 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69   If the column i
c570: 73 20 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c  s declared as "<
c580: 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45  name> PRIMARY KE
c590: 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e  Y COLLATE <type>
c5a0: 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61  ",.    ** then a
c5b0: 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61 76 65  n index may have
c5c0: 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f 6e   been created on
c5d0: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66   this column bef
c5e0: 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  ore the.    ** c
c5f0: 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61  ollation type wa
c600: 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74  s added. Correct
c610: 20 74 68 69 73 20 69 66 20 69 74 20 69 73 20 74   this if it is t
c620: 68 65 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  he case..    */.
c630: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e      for(pIdx=p->
c640: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
c650: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
c660: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
c670: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20  Idx->nKeyCol==1 
c680: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  );.      if( pId
c690: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
c6a0: 69 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64  i ){.        pId
c6b0: 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70  x->azColl[0] = p
c6c0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b  ->aCol[i].zColl;
c6d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c6e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
c6f0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43  te3DbFree(db, zC
c700: 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  oll);.  }.}../*.
c710: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
c720: 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c   returns the col
c730: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
c740: 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e 61 74  for database nat
c750: 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f  ive text.** enco
c760: 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20  ding identified 
c770: 62 79 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e  by the string zN
c780: 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d  ame, length nNam
c790: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
c7a0: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74  requested collat
c7b0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20  ion sequence is 
c7c0: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f  not available, o
c7d0: 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a  r not available.
c7e0: 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
c7f0: 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69  se native encodi
c800: 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ng, the collatio
c810: 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76  n factory is inv
c820: 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65  oked to.** reque
c830: 73 74 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f  st it. If the co
c840: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
c850: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20  does not supply 
c860: 73 75 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c  such a sequence,
c870: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75  .** and the sequ
c880: 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c  ence is availabl
c890: 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78  e in another tex
c8a0: 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e  t encoding, then
c8b0: 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75   that is.** retu
c8c0: 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  rned instead..**
c8d0: 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f  .** If no versio
c8e0: 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75 65 73  ns of the reques
c8f0: 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73  ted collations s
c900: 65 71 75 65 6e 63 65 20 61 72 65 20 61 76 61 69  equence are avai
c910: 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f  lable, or.** ano
c920: 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72  ther error occur
c930: 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
c940: 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ned and an error
c950: 20 6d 65 73 73 61 67 65 20 77 72 69 74 74 65 6e   message written
c960: 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e   into.** pParse.
c970: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
c980: 69 6e 65 20 69 73 20 61 20 77 72 61 70 70 65 72  ine is a wrapper
c990: 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 46   around sqlite3F
c9a0: 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54  indCollSeq().  T
c9b0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
c9c0: 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61  nvokes the colla
c9d0: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 66 20  tion factory if 
c9e0: 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74  the named collat
c9f0: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  ion cannot be fo
ca00: 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72  und.** and gener
ca10: 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  ates an error me
ca20: 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  ssage..**.** See
ca30: 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33 46 69   also: sqlite3Fi
ca40: 6e 64 43 6f 6c 6c 53 65 71 28 29 2c 20 73 71 6c  ndCollSeq(), sql
ca50: 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 29  ite3GetCollSeq()
ca60: 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c  .*/.CollSeq *sql
ca70: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
ca80: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
ca90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
caa0: 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  me){.  sqlite3 *
cab0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
cac0: 0a 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28  .  u8 enc = ENC(
cad0: 64 62 29 3b 0a 20 20 75 38 20 69 6e 69 74 62 75  db);.  u8 initbu
cae0: 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75  sy = db->init.bu
caf0: 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  sy;.  CollSeq *p
cb00: 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d  Coll;..  pColl =
cb10: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
cb20: 53 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61  Seq(db, enc, zNa
cb30: 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20  me, initbusy);. 
cb40: 20 69 66 28 20 21 69 6e 69 74 62 75 73 79 20 26   if( !initbusy &
cb50: 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43  & (!pColl || !pC
cb60: 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20  oll->xCmp) ){.  
cb70: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
cb80: 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  3GetCollSeq(pPar
cb90: 73 65 2c 20 65 6e 63 2c 20 70 43 6f 6c 6c 2c 20  se, enc, pColl, 
cba0: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 72  zName);.  }..  r
cbb0: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
cbc0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
cbd0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
cbe0: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68  ncrement the sch
cbf0: 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a  ema cookie..**.*
cc00: 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  * The schema coo
cc10: 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  kie is used to d
cc20: 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68  etermine when th
cc30: 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65  e schema for the
cc40: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61  .** database cha
cc50: 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61 63  nges.  After eac
cc60: 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c  h schema change,
cc70: 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75   the cookie valu
cc80: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57  e.** changes.  W
cc90: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69  hen a process fi
cca0: 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73 63  rst reads the sc
ccb0: 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20  hema it records 
ccc0: 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20  the.** cookie.  
ccd0: 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e  Thereafter, when
cce0: 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20  ever it goes to 
ccf0: 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
cd00: 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b  ase,.** it check
cd10: 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20  s the cookie to 
cd20: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63  make sure the sc
cd30: 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61  hema has not cha
cd40: 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74  nged.** since it
cd50: 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a   was last read..
cd60: 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20  **.** This plan 
cd70: 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c  is not completel
cd80: 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20  y bullet-proof. 
cd90: 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
cda0: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d  for.** the schem
cdb0: 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74  a to change mult
cdc0: 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66  iple times and f
cdd0: 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  or the cookie to
cde0: 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20   be.** set back 
cdf0: 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20  to prior value. 
ce00: 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e   But schema chan
ce10: 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75 65  ges are infreque
ce20: 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72  nt.** and the pr
ce30: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74  obability of hit
ce40: 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f  ting the same co
ce50: 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e  okie value is on
ce60: 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69  ly.** 1 chance i
ce70: 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72  n 2^32.  So we'r
ce80: 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a  e safe enough..*
ce90: 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54  *.** IMPLEMENTAT
cea0: 49 4f 4e 2d 4f 46 3a 20 52 2d 33 34 32 33 30 2d  ION-OF: R-34230-
ceb0: 35 36 30 34 39 20 53 51 4c 69 74 65 20 61 75 74  56049 SQLite aut
cec0: 6f 6d 61 74 69 63 61 6c 6c 79 20 69 6e 63 72 65  omatically incre
ced0: 6d 65 6e 74 73 0a 2a 2a 20 74 68 65 20 73 63 68  ments.** the sch
cee0: 65 6d 61 2d 76 65 72 73 69 6f 6e 20 77 68 65 6e  ema-version when
cef0: 65 76 65 72 20 74 68 65 20 73 63 68 65 6d 61 20  ever the schema 
cf00: 63 68 61 6e 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64  changes..*/.void
cf10: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
cf20: 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50 61 72  okie(Parse *pPar
cf30: 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
cf40: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
cf50: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
cf60: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
cf70: 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73  dbe;.  assert( s
cf80: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
cf90: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
cfa0: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ) );.  sqlite3Vd
cfb0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
cfc0: 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42  etCookie, iDb, B
cfd0: 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52 53  TREE_SCHEMA_VERS
cfe0: 49 4f 4e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ION, .          
cff0: 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 31           (int)(1
d000: 2b 28 75 6e 73 69 67 6e 65 64 29 64 62 2d 3e 61  +(unsigned)db->a
d010: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
d020: 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 29 29  >schema_cookie))
d030: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75  ;.}../*.** Measu
d040: 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  re the number of
d050: 20 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64   characters need
d060: 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65  ed to output the
d070: 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69   given.** identi
d080: 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65  fier.  The numbe
d090: 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75  r returned inclu
d0a0: 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75  des any quotes u
d0b0: 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20  sed.** but does 
d0c0: 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20  not include the 
d0d0: 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e  null terminator.
d0e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d  .**.** The estim
d0f0: 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74  ate is conservat
d100: 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62  ive.  It might b
d110: 65 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68  e larger that wh
d120: 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20  at is.** really 
d130: 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
d140: 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74  c int identLengt
d150: 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  h(const char *z)
d160: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72  {.  int n;.  for
d170: 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a  (n=0; *z; n++, z
d180: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d  ++){.    if( *z=
d190: 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20  ='"' ){ n++; }. 
d1a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20   }.  return n + 
d1b0: 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  2;.}../*.** The 
d1c0: 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20  first parameter 
d1d0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
d1e0: 61 6e 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  an output buffer
d1f0: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  . The second .**
d200: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
d210: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
d220: 74 65 67 65 72 20 74 68 61 74 20 63 6f 6e 74 61  teger that conta
d230: 69 6e 73 20 74 68 65 20 6f 66 66 73 65 74 20 61  ins the offset a
d240: 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20 77 72  t.** which to wr
d250: 69 74 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ite into the out
d260: 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 69 73  put buffer. This
d270: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73   function copies
d280: 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d   the.** nul-term
d290: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 70 6f  inated string po
d2a0: 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
d2b0: 74 68 69 72 64 20 70 61 72 61 6d 65 74 65 72 2c  third parameter,
d2c0: 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a 2a   zSignedIdent,.*
d2d0: 2a 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  * to the specifi
d2e0: 65 64 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65  ed offset in the
d2f0: 20 62 75 66 66 65 72 20 61 6e 64 20 75 70 64 61   buffer and upda
d300: 74 65 73 20 2a 70 49 64 78 20 74 6f 20 72 65 66  tes *pIdx to ref
d310: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72  er.** to the fir
d320: 73 74 20 62 79 74 65 20 61 66 74 65 72 20 74 68  st byte after th
d330: 65 20 6c 61 73 74 20 62 79 74 65 20 77 72 69 74  e last byte writ
d340: 74 65 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72  ten before retur
d350: 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  ning..** .** If 
d360: 74 68 65 20 73 74 72 69 6e 67 20 7a 53 69 67 6e  the string zSign
d370: 65 64 49 64 65 6e 74 20 63 6f 6e 73 69 73 74 73  edIdent consists
d380: 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c 70   entirely of alp
d390: 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68  ha-numeric.** ch
d3a0: 61 72 61 63 74 65 72 73 2c 20 64 6f 65 73 20 6e  aracters, does n
d3b0: 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  ot begin with a 
d3c0: 64 69 67 69 74 20 61 6e 64 20 69 73 20 6e 6f 74  digit and is not
d3d0: 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64 2c   an SQL keyword,
d3e0: 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 63  .** then it is c
d3f0: 6f 70 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74  opied to the out
d400: 70 75 74 20 62 75 66 66 65 72 20 65 78 61 63 74  put buffer exact
d410: 6c 79 20 61 73 20 69 74 20 69 73 2e 20 4f 74 68  ly as it is. Oth
d420: 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69 73  erwise,.** it is
d430: 20 71 75 6f 74 65 64 20 75 73 69 6e 67 20 64 6f   quoted using do
d440: 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a  uble-quotes..*/.
d450: 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e  static void iden
d460: 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e  tPut(char *z, in
d470: 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a  t *pIdx, char *z
d480: 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20  SignedIdent){.  
d490: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
d4a0: 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65  Ident = (unsigne
d4b0: 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49  d char*)zSignedI
d4c0: 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  dent;.  int i, j
d4d0: 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69  , needQuote;.  i
d4e0: 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f 72   = *pIdx;..  for
d4f0: 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b  (j=0; zIdent[j];
d500: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   j++){.    if( !
d510: 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a  sqlite3Isalnum(z
d520: 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64  Ident[j]) && zId
d530: 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72  ent[j]!='_' ) br
d540: 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51  eak;.  }.  needQ
d550: 75 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 49 73  uote = sqlite3Is
d560: 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29  digit(zIdent[0])
d570: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
d580: 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f  sqlite3KeywordCo
d590: 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54  de(zIdent, j)!=T
d5a0: 4b 5f 49 44 0a 20 20 20 20 20 20 20 20 20 20 20  K_ID.           
d5b0: 20 7c 7c 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30   || zIdent[j]!=0
d5c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
d5d0: 6a 3d 3d 30 3b 0a 0a 20 20 69 66 28 20 6e 65 65  j==0;..  if( nee
d5e0: 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20  dQuote ) z[i++] 
d5f0: 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30  = '"';.  for(j=0
d600: 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b  ; zIdent[j]; j++
d610: 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20  ){.    z[i++] = 
d620: 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69  zIdent[j];.    i
d630: 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22  f( zIdent[j]=='"
d640: 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  ' ) z[i++] = '"'
d650: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64  ;.  }.  if( need
d660: 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d  Quote ) z[i++] =
d670: 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30   '"';.  z[i] = 0
d680: 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d  ;.  *pIdx = i;.}
d690: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
d6a0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
d6b0: 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70  statement approp
d6c0: 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69  riate for the gi
d6d0: 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d  ven.** table.  M
d6e0: 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  emory to hold th
d6f0: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 73 74  e text of the st
d700: 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69  atement is obtai
d710: 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69  ned.** from sqli
d720: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  teMalloc() and m
d730: 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
d740: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
d750: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
d760: 63 68 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c  char *createTabl
d770: 65 53 74 6d 74 28 73 71 6c 69 74 65 33 20 2a 64  eStmt(sqlite3 *d
d780: 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20  b, Table *p){.  
d790: 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63  int i, k, n;.  c
d7a0: 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68  har *zStmt;.  ch
d7b0: 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32  ar *zSep, *zSep2
d7c0: 2c 20 2a 7a 45 6e 64 3b 0a 20 20 43 6f 6c 75 6d  , *zEnd;.  Colum
d7d0: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30  n *pCol;.  n = 0
d7e0: 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70  ;.  for(pCol = p
d7f0: 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70  ->aCol, i=0; i<p
d800: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
d810: 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69  l++){.    n += i
d820: 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d  dentLength(pCol-
d830: 3e 7a 4e 61 6d 65 29 20 2b 20 35 3b 0a 20 20 7d  >zName) + 5;.  }
d840: 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e  .  n += identLen
d850: 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  gth(p->zName);. 
d860: 20 69 66 28 20 6e 3c 35 30 20 29 7b 20 0a 20 20   if( n<50 ){ .  
d870: 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20    zSep = "";.   
d880: 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20   zSep2 = ",";.  
d890: 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20    zEnd = ")";.  
d8a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20  }else{.    zSep 
d8b0: 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53  = "\n  ";.    zS
d8c0: 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20  ep2 = ",\n  ";. 
d8d0: 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b     zEnd = "\n)";
d8e0: 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b  .  }.  n += 35 +
d8f0: 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53   6*p->nCol;.  zS
d900: 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  tmt = sqlite3DbM
d910: 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 29 3b 0a  allocRaw(0, n);.
d920: 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29    if( zStmt==0 )
d930: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d  {.    sqlite3Oom
d940: 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 72  Fault(db);.    r
d950: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
d960: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
d970: 6e 2c 20 7a 53 74 6d 74 2c 20 22 43 52 45 41 54  n, zStmt, "CREAT
d980: 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20  E TABLE ");.  k 
d990: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
d9a0: 30 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e  0(zStmt);.  iden
d9b0: 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20  tPut(zStmt, &k, 
d9c0: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74  p->zName);.  zSt
d9d0: 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20  mt[k++] = '(';. 
d9e0: 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f   for(pCol=p->aCo
d9f0: 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  l, i=0; i<p->nCo
da00: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
da10: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
da20: 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61  t char * const a
da30: 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  zType[] = {.    
da40: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
da50: 46 5f 42 4c 4f 42 20 20 20 20 2a 2f 20 22 22 2c  F_BLOB    */ "",
da60: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49  .        /* SQLI
da70: 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20 2a  TE_AFF_TEXT    *
da80: 2f 20 22 20 54 45 58 54 22 2c 0a 20 20 20 20 20  / " TEXT",.     
da90: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
daa0: 5f 4e 55 4d 45 52 49 43 20 2a 2f 20 22 20 4e 55  _NUMERIC */ " NU
dab0: 4d 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  M",.        /* S
dac0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
dad0: 52 20 2a 2f 20 22 20 49 4e 54 22 2c 0a 20 20 20  R */ " INT",.   
dae0: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
daf0: 46 46 5f 52 45 41 4c 20 20 20 20 2a 2f 20 22 20  FF_REAL    */ " 
db00: 52 45 41 4c 22 0a 20 20 20 20 7d 3b 0a 20 20 20  REAL".    };.   
db10: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63 6f   int len;.    co
db20: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
db30: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ..    sqlite3_sn
db40: 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74  printf(n-k, &zSt
db50: 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20  mt[k], zSep);.  
db60: 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53 74    k += sqlite3St
db70: 72 6c 65 6e 33 30 28 26 7a 53 74 6d 74 5b 6b 5d  rlen30(&zStmt[k]
db80: 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53  );.    zSep = zS
db90: 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75  ep2;.    identPu
dba0: 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f  t(zStmt, &k, pCo
dbb0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 61  l->zName);.    a
dbc0: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66  ssert( pCol->aff
dbd0: 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46  inity-SQLITE_AFF
dbe0: 5f 42 4c 4f 42 20 3e 3d 20 30 20 29 3b 0a 20 20  _BLOB >= 0 );.  
dbf0: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e    assert( pCol->
dc00: 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f  affinity-SQLITE_
dc10: 41 46 46 5f 42 4c 4f 42 20 3c 20 41 72 72 61 79  AFF_BLOB < Array
dc20: 53 69 7a 65 28 61 7a 54 79 70 65 29 20 29 3b 0a  Size(azType) );.
dc30: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
dc40: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
dc50: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b  LITE_AFF_BLOB );
dc60: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
dc70: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
dc80: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29  QLITE_AFF_TEXT )
dc90: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
dca0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
dcb0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
dcc0: 49 43 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IC );.    testca
dcd0: 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  se( pCol->affini
dce0: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ty==SQLITE_AFF_I
dcf0: 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 74 65  NTEGER );.    te
dd00: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
dd10: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
dd20: 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20 20 20 0a  FF_REAL );.    .
dd30: 20 20 20 20 7a 54 79 70 65 20 3d 20 61 7a 54 79      zType = azTy
dd40: 70 65 5b 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  pe[pCol->affinit
dd50: 79 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  y - SQLITE_AFF_B
dd60: 4c 4f 42 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  LOB];.    len = 
dd70: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
dd80: 7a 54 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65  zType);.    asse
dd90: 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  rt( pCol->affini
dda0: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ty==SQLITE_AFF_B
ddb0: 4c 4f 42 20 0a 20 20 20 20 20 20 20 20 20 20 20  LOB .           
ddc0: 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69   || pCol->affini
ddd0: 74 79 3d 3d 73 71 6c 69 74 65 33 41 66 66 69 6e  ty==sqlite3Affin
dde0: 69 74 79 54 79 70 65 28 7a 54 79 70 65 2c 20 30  ityType(zType, 0
ddf0: 29 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ) );.    memcpy(
de00: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79 70 65  &zStmt[k], zType
de10: 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d  , len);.    k +=
de20: 20 6c 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74   len;.    assert
de30: 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20  ( k<=n );.  }.  
de40: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
de50: 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c  (n-k, &zStmt[k],
de60: 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20   "%s", zEnd);.  
de70: 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a  return zStmt;.}.
de80: 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 61 6e  ./*.** Resize an
de90: 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f   Index object to
dea0: 20 68 6f 6c 64 20 4e 20 63 6f 6c 75 6d 6e 73 20   hold N columns 
deb0: 74 6f 74 61 6c 2e 20 20 52 65 74 75 72 6e 20 53  total.  Return S
dec0: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
ded0: 75 63 63 65 73 73 20 61 6e 64 20 53 51 4c 49 54  uccess and SQLIT
dee0: 45 5f 4e 4f 4d 45 4d 20 6f 6e 20 61 6e 20 4f 4f  E_NOMEM on an OO
def0: 4d 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  M error..*/.stat
df00: 69 63 20 69 6e 74 20 72 65 73 69 7a 65 49 6e 64  ic int resizeInd
df10: 65 78 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33  exObject(sqlite3
df20: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64   *db, Index *pId
df30: 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 63 68 61  x, int N){.  cha
df40: 72 20 2a 7a 45 78 74 72 61 3b 0a 20 20 69 6e 74  r *zExtra;.  int
df50: 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 49   nByte;.  if( pI
df60: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 4e 20 29  dx->nColumn>=N )
df70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
df80: 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  K;.  assert( pId
df90: 78 2d 3e 69 73 52 65 73 69 7a 65 64 3d 3d 30 20  x->isResized==0 
dfa0: 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 28 73 69  );.  nByte = (si
dfb0: 7a 65 6f 66 28 63 68 61 72 2a 29 20 2b 20 73 69  zeof(char*) + si
dfc0: 7a 65 6f 66 28 69 31 36 29 20 2b 20 31 29 2a 4e  zeof(i16) + 1)*N
dfd0: 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20 73 71 6c  ;.  zExtra = sql
dfe0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
dff0: 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  (db, nByte);.  i
e000: 66 28 20 7a 45 78 74 72 61 3d 3d 30 20 29 20 72  f( zExtra==0 ) r
e010: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
e020: 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d 63 70  EM_BKPT;.  memcp
e030: 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e  y(zExtra, pIdx->
e040: 61 7a 43 6f 6c 6c 2c 20 73 69 7a 65 6f 66 28 63  azColl, sizeof(c
e050: 68 61 72 2a 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c  har*)*pIdx->nCol
e060: 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 7a  umn);.  pIdx->az
e070: 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68  Coll = (const ch
e080: 61 72 2a 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a  ar**)zExtra;.  z
e090: 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28  Extra += sizeof(
e0a0: 63 68 61 72 2a 29 2a 4e 3b 0a 20 20 6d 65 6d 63  char*)*N;.  memc
e0b0: 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d  py(zExtra, pIdx-
e0c0: 3e 61 69 43 6f 6c 75 6d 6e 2c 20 73 69 7a 65 6f  >aiColumn, sizeo
e0d0: 66 28 69 31 36 29 2a 70 49 64 78 2d 3e 6e 43 6f  f(i16)*pIdx->nCo
e0e0: 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61  lumn);.  pIdx->a
e0f0: 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29  iColumn = (i16*)
e100: 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61  zExtra;.  zExtra
e110: 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a   += sizeof(i16)*
e120: 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74  N;.  memcpy(zExt
e130: 72 61 2c 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  ra, pIdx->aSortO
e140: 72 64 65 72 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c  rder, pIdx->nCol
e150: 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 53  umn);.  pIdx->aS
e160: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
e170: 7a 45 78 74 72 61 3b 0a 20 20 70 49 64 78 2d 3e  zExtra;.  pIdx->
e180: 6e 43 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a 20 20 70  nColumn = N;.  p
e190: 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64 20 3d  Idx->isResized =
e1a0: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
e1b0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
e1c0: 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 74 6f   Estimate the to
e1d0: 74 61 6c 20 72 6f 77 20 77 69 64 74 68 20 66 6f  tal row width fo
e1e0: 72 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  r a table..*/.st
e1f0: 61 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61  atic void estima
e200: 74 65 54 61 62 6c 65 57 69 64 74 68 28 54 61 62  teTableWidth(Tab
e210: 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 75 6e 73  le *pTab){.  uns
e220: 69 67 6e 65 64 20 77 54 61 62 6c 65 20 3d 20 30  igned wTable = 0
e230: 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e  ;.  const Column
e240: 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 69 6e 74   *pTabCol;.  int
e250: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 54 61 62   i;.  for(i=pTab
e260: 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 43 6f 6c 3d  ->nCol, pTabCol=
e270: 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3e 30 3b  pTab->aCol; i>0;
e280: 20 69 2d 2d 2c 20 70 54 61 62 43 6f 6c 2b 2b 29   i--, pTabCol++)
e290: 7b 0a 20 20 20 20 77 54 61 62 6c 65 20 2b 3d 20  {.    wTable += 
e2a0: 70 54 61 62 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a  pTabCol->szEst;.
e2b0: 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e    }.  if( pTab->
e2c0: 69 50 4b 65 79 3c 30 20 29 20 77 54 61 62 6c 65  iPKey<0 ) wTable
e2d0: 2b 2b 3b 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61  ++;.  pTab->szTa
e2e0: 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  bRow = sqlite3Lo
e2f0: 67 45 73 74 28 77 54 61 62 6c 65 2a 34 29 3b 0a  gEst(wTable*4);.
e300: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  }../*.** Estimat
e310: 65 20 74 68 65 20 61 76 65 72 61 67 65 20 73 69  e the average si
e320: 7a 65 20 6f 66 20 61 20 72 6f 77 20 66 6f 72 20  ze of a row for 
e330: 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  an index..*/.sta
e340: 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61 74  tic void estimat
e350: 65 49 6e 64 65 78 57 69 64 74 68 28 49 6e 64 65  eIndexWidth(Inde
e360: 78 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69  x *pIdx){.  unsi
e370: 67 6e 65 64 20 77 49 6e 64 65 78 20 3d 20 30 3b  gned wIndex = 0;
e380: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
e390: 74 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d  t Column *aCol =
e3a0: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61   pIdx->pTable->a
e3b0: 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Col;.  for(i=0; 
e3c0: 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  i<pIdx->nColumn;
e3d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 31 36 20 78   i++){.    i16 x
e3e0: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
e3f0: 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  n[i];.    assert
e400: 28 20 78 3c 70 49 64 78 2d 3e 70 54 61 62 6c 65  ( x<pIdx->pTable
e410: 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 77 49  ->nCol );.    wI
e420: 6e 64 65 78 20 2b 3d 20 78 3c 30 20 3f 20 31 20  ndex += x<0 ? 1 
e430: 3a 20 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43  : aCol[pIdx->aiC
e440: 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73 7a 45 73 74 3b  olumn[i]].szEst;
e450: 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e 73 7a 49  .  }.  pIdx->szI
e460: 64 78 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  dxRow = sqlite3L
e470: 6f 67 45 73 74 28 77 49 6e 64 65 78 2a 34 29 3b  ogEst(wIndex*4);
e480: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 72  .}../* Return tr
e490: 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 6e 75 6d  ue if column num
e4a0: 62 65 72 20 78 20 69 73 20 61 6e 79 20 6f 66 20  ber x is any of 
e4b0: 74 68 65 20 66 69 72 73 74 20 6e 43 6f 6c 20 65  the first nCol e
e4c0: 6e 74 72 69 65 73 20 6f 66 20 61 69 43 6f 6c 5b  ntries of aiCol[
e4d0: 5d 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73  ]..** This is us
e4e0: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
e4f0: 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75  if the column nu
e500: 6d 62 65 72 20 78 20 61 70 70 65 61 72 73 20 69  mber x appears i
e510: 6e 20 61 6e 79 20 6f 66 20 74 68 65 0a 2a 2a 20  n any of the.** 
e520: 66 69 72 73 74 20 6e 43 6f 6c 20 65 6e 74 72 69  first nCol entri
e530: 65 73 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 0a  es of an index..
e540: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
e550: 73 43 6f 6c 75 6d 6e 28 63 6f 6e 73 74 20 69 31  sColumn(const i1
e560: 36 20 2a 61 69 43 6f 6c 2c 20 69 6e 74 20 6e 43  6 *aiCol, int nC
e570: 6f 6c 2c 20 69 6e 74 20 78 29 7b 0a 20 20 77 68  ol, int x){.  wh
e580: 69 6c 65 28 20 6e 43 6f 6c 2d 2d 20 3e 20 30 20  ile( nCol-- > 0 
e590: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  ){.    assert( a
e5a0: 69 43 6f 6c 5b 30 5d 3e 3d 30 20 29 3b 0a 20 20  iCol[0]>=0 );.  
e5b0: 20 20 69 66 28 20 78 3d 3d 2a 28 61 69 43 6f 6c    if( x==*(aiCol
e5c0: 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ++) ){.      ret
e5d0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
e5e0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
e5f0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
e600: 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  e if any of the 
e610: 66 69 72 73 74 20 6e 4b 65 79 20 65 6e 74 72 69  first nKey entri
e620: 65 73 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78  es of index pIdx
e630: 20 65 78 61 63 74 6c 79 0a 2a 2a 20 6d 61 74 63   exactly.** matc
e640: 68 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 65 6e  h the iCol-th en
e650: 74 72 79 20 6f 66 20 70 50 6b 2e 20 20 70 50 6b  try of pPk.  pPk
e660: 20 69 73 20 61 6c 77 61 79 73 20 61 20 57 49 54   is always a WIT
e670: 48 4f 55 54 20 52 4f 57 49 44 0a 2a 2a 20 50 52  HOUT ROWID.** PR
e680: 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e  IMARY KEY index.
e690: 20 20 70 49 64 78 20 69 73 20 61 6e 20 69 6e 64    pIdx is an ind
e6a0: 65 78 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  ex on the same t
e6b0: 61 62 6c 65 2e 20 20 70 49 64 78 20 6d 61 79 0a  able.  pIdx may.
e6c0: 2a 2a 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ** or may not be
e6d0: 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20   the same index 
e6e0: 61 73 20 70 50 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  as pPk..**.** Th
e6f0: 65 20 66 69 72 73 74 20 6e 4b 65 79 20 65 6e 74  e first nKey ent
e700: 72 69 65 73 20 6f 66 20 70 49 64 78 20 61 72 65  ries of pIdx are
e710: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
e720: 65 20 6f 72 64 69 6e 61 72 79 20 63 6f 6c 75 6d  e ordinary colum
e730: 6e 73 2c 0a 2a 2a 20 6e 6f 74 20 61 20 72 6f 77  ns,.** not a row
e740: 69 64 20 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  id or expression
e750: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
e760: 74 69 6e 65 20 64 69 66 66 65 72 73 20 66 72 6f  tine differs fro
e770: 6d 20 68 61 73 43 6f 6c 75 6d 6e 28 29 20 69 6e  m hasColumn() in
e780: 20 74 68 61 74 20 62 6f 74 68 20 74 68 65 20 63   that both the c
e790: 6f 6c 75 6d 6e 20 61 6e 64 20 74 68 65 0a 2a 2a  olumn and the.**
e7a0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
e7b0: 6e 63 65 20 6d 75 73 74 20 6d 61 74 63 68 20 66  nce must match f
e7c0: 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  or this routine,
e7d0: 20 62 75 74 20 66 6f 72 20 68 61 73 43 6f 6c 75   but for hasColu
e7e0: 6d 6e 28 29 20 6f 6e 6c 79 0a 2a 2a 20 74 68 65  mn() only.** the
e7f0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6d 75 73   column name mus
e800: 74 20 6d 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74  t match..*/.stat
e810: 69 63 20 69 6e 74 20 69 73 44 75 70 43 6f 6c 75  ic int isDupColu
e820: 6d 6e 28 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  mn(Index *pIdx, 
e830: 69 6e 74 20 6e 4b 65 79 2c 20 49 6e 64 65 78 20  int nKey, Index 
e840: 2a 70 50 6b 2c 20 69 6e 74 20 69 43 6f 6c 29 7b  *pPk, int iCol){
e850: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61  .  int i, j;.  a
e860: 73 73 65 72 74 28 20 6e 4b 65 79 3c 3d 70 49 64  ssert( nKey<=pId
e870: 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  x->nColumn );.  
e880: 61 73 73 65 72 74 28 20 69 43 6f 6c 3c 4d 41 58  assert( iCol<MAX
e890: 28 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 2c 70 50  (pPk->nColumn,pP
e8a0: 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 20 29 3b 0a 20  k->nKeyCol) );. 
e8b0: 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e 69 64   assert( pPk->id
e8c0: 78 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44  xType==SQLITE_ID
e8d0: 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59  XTYPE_PRIMARYKEY
e8e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
e8f0: 6b 2d 3e 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c  k->pTable->tabFl
e900: 61 67 73 20 26 20 54 46 5f 57 69 74 68 6f 75 74  ags & TF_Without
e910: 52 6f 77 69 64 20 29 3b 0a 20 20 61 73 73 65 72  Rowid );.  asser
e920: 74 28 20 70 50 6b 2d 3e 70 54 61 62 6c 65 3d 3d  t( pPk->pTable==
e930: 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 29 3b 0a  pIdx->pTable );.
e940: 20 20 74 65 73 74 63 61 73 65 28 20 70 50 6b 3d    testcase( pPk=
e950: 3d 70 49 64 78 20 29 3b 0a 20 20 6a 20 3d 20 70  =pIdx );.  j = p
e960: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f  Pk->aiColumn[iCo
e970: 6c 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 21  l];.  assert( j!
e980: 3d 58 4e 5f 52 4f 57 49 44 20 26 26 20 6a 21 3d  =XN_ROWID && j!=
e990: 58 4e 5f 45 58 50 52 20 29 3b 0a 20 20 66 6f 72  XN_EXPR );.  for
e9a0: 28 69 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b  (i=0; i<nKey; i+
e9b0: 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
e9c0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
e9d0: 5d 3e 3d 30 20 7c 7c 20 6a 3e 3d 30 20 29 3b 0a  ]>=0 || j>=0 );.
e9e0: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
e9f0: 43 6f 6c 75 6d 6e 5b 69 5d 3d 3d 6a 20 0a 20 20  Column[i]==j .  
ea00: 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72     && sqlite3Str
ea10: 49 43 6d 70 28 70 49 64 78 2d 3e 61 7a 43 6f 6c  ICmp(pIdx->azCol
ea20: 6c 5b 69 5d 2c 20 70 50 6b 2d 3e 61 7a 43 6f 6c  l[i], pPk->azCol
ea30: 6c 5b 69 43 6f 6c 5d 29 3d 3d 30 0a 20 20 20 20  l[iCol])==0.    
ea40: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
ea50: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
ea60: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 52  eturn 0;.}../* R
ea70: 65 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c  ecompute the col
ea80: 4e 6f 74 49 64 78 65 64 20 66 69 65 6c 64 20 6f  NotIdxed field o
ea90: 66 20 74 68 65 20 49 6e 64 65 78 2e 0a 2a 2a 0a  f the Index..**.
eaa0: 2a 2a 20 63 6f 6c 4e 6f 74 49 64 78 65 64 20 69  ** colNotIdxed i
eab0: 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74  s a bitmask that
eac0: 20 68 61 73 20 61 20 30 20 62 69 74 20 72 65 70   has a 0 bit rep
ead0: 72 65 73 65 6e 74 69 6e 67 20 65 61 63 68 20 69  resenting each i
eae0: 6e 64 65 78 65 64 0a 2a 2a 20 63 6f 6c 75 6d 6e  ndexed.** column
eaf0: 73 20 74 68 61 74 20 61 72 65 20 77 69 74 68 69  s that are withi
eb00: 6e 20 74 68 65 20 66 69 72 73 74 20 36 33 20 63  n the first 63 c
eb10: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61  olumns of the ta
eb20: 62 6c 65 2e 20 20 54 68 65 0a 2a 2a 20 68 69 67  ble.  The.** hig
eb30: 68 2d 6f 72 64 65 72 20 62 69 74 20 6f 66 20 63  h-order bit of c
eb40: 6f 6c 4e 6f 74 49 64 78 65 64 20 69 73 20 61 6c  olNotIdxed is al
eb50: 77 61 79 73 20 31 2e 20 20 41 6c 6c 20 75 6e 69  ways 1.  All uni
eb60: 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 0a 2a  ndexed columns.*
eb70: 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 68  * of the table h
eb80: 61 76 65 20 61 20 31 2e 0a 2a 2a 0a 2a 2a 20 54  ave a 1..**.** T
eb90: 68 65 20 63 6f 6c 4e 6f 74 49 64 78 65 64 20 6d  he colNotIdxed m
eba0: 61 73 6b 20 69 73 20 41 4e 44 2d 65 64 20 77 69  ask is AND-ed wi
ebb0: 74 68 20 74 68 65 20 53 72 63 4c 69 73 74 2e 61  th the SrcList.a
ebc0: 5b 5d 2e 63 6f 6c 55 73 65 64 20 6d 61 73 6b 0a  [].colUsed mask.
ebd0: 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
ebe0: 69 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  if the index is 
ebf0: 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a  covering index..
ec00: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
ec10: 65 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 73 4e  ecomputeColumnsN
ec20: 6f 74 49 6e 64 65 78 65 64 28 49 6e 64 65 78 20  otIndexed(Index 
ec30: 2a 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73  *pIdx){.  Bitmas
ec40: 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  k m = 0;.  int j
ec50: 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e  ;.  for(j=pIdx->
ec60: 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b  nColumn-1; j>=0;
ec70: 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78   j--){.    int x
ec80: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
ec90: 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 78 3e  n[j];.    if( x>
eca0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  =0 ){.      test
ecb0: 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29  case( x==BMS-1 )
ecc0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
ecd0: 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20  ( x==BMS-2 );.  
ece0: 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20      if( x<BMS-1 
ecf0: 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78  ) m |= MASKBIT(x
ed00: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
ed10: 49 64 78 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65 64  Idx->colNotIdxed
ed20: 20 3d 20 7e 6d 3b 0a 20 20 61 73 73 65 72 74 28   = ~m;.  assert(
ed30: 20 28 70 49 64 78 2d 3e 63 6f 6c 4e 6f 74 49 64   (pIdx->colNotId
ed40: 78 65 64 3e 3e 36 33 29 3d 3d 31 20 29 3b 0a 7d  xed>>63)==1 );.}
ed50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
ed60: 74 69 6e 65 20 72 75 6e 73 20 61 74 20 74 68 65  tine runs at the
ed70: 20 65 6e 64 20 6f 66 20 70 61 72 73 69 6e 67 20   end of parsing 
ed80: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
ed90: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 0a 2a 2a  tatement that.**
eda0: 20 68 61 73 20 61 20 57 49 54 48 4f 55 54 20 52   has a WITHOUT R
edb0: 4f 57 49 44 20 63 6c 61 75 73 65 2e 20 20 54 68  OWID clause.  Th
edc0: 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f  e job of this ro
edd0: 75 74 69 6e 65 20 69 73 20 74 6f 20 63 6f 6e 76  utine is to conv
ede0: 65 72 74 20 62 6f 74 68 0a 2a 2a 20 69 6e 74 65  ert both.** inte
edf0: 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 61 74 61  rnal schema data
ee00: 20 73 74 72 75 63 74 75 72 65 73 20 61 6e 64 20   structures and 
ee10: 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 56 44  the generated VD
ee20: 42 45 20 63 6f 64 65 20 73 6f 20 74 68 61 74 20  BE code so that 
ee30: 74 68 65 79 0a 2a 2a 20 61 72 65 20 61 70 70 72  they.** are appr
ee40: 6f 70 72 69 61 74 65 20 66 6f 72 20 61 20 57 49  opriate for a WI
ee50: 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
ee60: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 72  e instead of a r
ee70: 6f 77 69 64 20 74 61 62 6c 65 2e 0a 2a 2a 20 43  owid table..** C
ee80: 68 61 6e 67 65 73 20 69 6e 63 6c 75 64 65 3a 0a  hanges include:.
ee90: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 53  **.**     (1)  S
eea0: 65 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f  et all columns o
eeb0: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
eec0: 59 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20  Y schema object 
eed0: 74 6f 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a  to be NOT NULL..
eee0: 2a 2a 20 20 20 20 20 28 32 29 20 20 43 6f 6e 76  **     (2)  Conv
eef0: 65 72 74 20 50 33 20 70 61 72 61 6d 65 74 65 72  ert P3 parameter
ef00: 20 6f 66 20 74 68 65 20 4f 50 5f 43 72 65 61 74   of the OP_Creat
ef10: 65 42 74 72 65 65 20 66 72 6f 6d 20 42 54 52 45  eBtree from BTRE
ef20: 45 5f 49 4e 54 4b 45 59 20 0a 2a 2a 20 20 20 20  E_INTKEY .**    
ef30: 20 20 20 20 20 20 69 6e 74 6f 20 42 54 52 45 45        into BTREE
ef40: 5f 42 4c 4f 42 4b 45 59 2e 0a 2a 2a 20 20 20 20  _BLOBKEY..**    
ef50: 20 28 33 29 20 20 42 79 70 61 73 73 20 74 68 65   (3)  Bypass the
ef60: 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65   creation of the
ef70: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
ef80: 61 62 6c 65 20 65 6e 74 72 79 0a 2a 2a 20 20 20  able entry.**   
ef90: 20 20 20 20 20 20 20 66 6f 72 20 74 68 65 20 50         for the P
efa0: 52 49 4d 41 52 59 20 4b 45 59 20 61 73 20 74 68  RIMARY KEY as th
efb0: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e  e primary key in
efc0: 64 65 78 20 69 73 20 6e 6f 77 0a 2a 2a 20 20 20  dex is now.**   
efd0: 20 20 20 20 20 20 20 69 64 65 6e 74 69 66 69 65         identifie
efe0: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 5f  d by the sqlite_
eff0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74  master table ent
f000: 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ry of the table 
f010: 69 74 73 65 6c 66 2e 0a 2a 2a 20 20 20 20 20 28  itself..**     (
f020: 34 29 20 20 53 65 74 20 74 68 65 20 49 6e 64 65  4)  Set the Inde
f030: 78 2e 74 6e 75 6d 20 6f 66 20 74 68 65 20 50 52  x.tnum of the PR
f040: 49 4d 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20  IMARY KEY Index 
f050: 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a  object in the.**
f060: 20 20 20 20 20 20 20 20 20 20 73 63 68 65 6d 61            schema
f070: 20 74 6f 20 74 68 65 20 72 6f 6f 74 70 61 67 65   to the rootpage
f080: 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74   from the main t
f090: 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 35 29  able..**     (5)
f0a0: 20 20 41 64 64 20 61 6c 6c 20 74 61 62 6c 65 20    Add all table 
f0b0: 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 50  columns to the P
f0c0: 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64 65 78  RIMARY KEY Index
f0d0: 20 6f 62 6a 65 63 74 0a 2a 2a 20 20 20 20 20 20   object.**      
f0e0: 20 20 20 20 73 6f 20 74 68 61 74 20 74 68 65 20      so that the 
f0f0: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 61  PRIMARY KEY is a
f100: 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e   covering index.
f110: 20 20 54 68 65 20 73 75 72 70 6c 75 73 0a 2a 2a    The surplus.**
f120: 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e            column
f130: 73 20 61 72 65 20 70 61 72 74 20 6f 66 20 4b 65  s are part of Ke
f140: 79 49 6e 66 6f 2e 6e 41 6c 6c 46 69 65 6c 64 20  yInfo.nAllField 
f150: 61 6e 64 20 61 72 65 20 6e 6f 74 20 75 73 65 64  and are not used
f160: 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20   for.**         
f170: 20 73 6f 72 74 69 6e 67 20 6f 72 20 6c 6f 6f 6b   sorting or look
f180: 75 70 20 6f 72 20 75 6e 69 71 75 65 6e 65 73 73  up or uniqueness
f190: 20 63 68 65 63 6b 73 2e 0a 2a 2a 20 20 20 20 20   checks..**     
f1a0: 28 36 29 20 20 52 65 70 6c 61 63 65 20 74 68 65  (6)  Replace the
f1b0: 20 72 6f 77 69 64 20 74 61 69 6c 20 6f 6e 20 61   rowid tail on a
f1c0: 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
f1d0: 20 67 65 6e 65 72 61 74 65 64 20 55 4e 49 51 55   generated UNIQU
f1e0: 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e  E.**          in
f1f0: 64 69 63 65 73 20 77 69 74 68 20 74 68 65 20 50  dices with the P
f200: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
f210: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 76 69  ns..**.** For vi
f220: 72 74 75 61 6c 20 74 61 62 6c 65 73 2c 20 6f 6e  rtual tables, on
f230: 6c 79 20 28 31 29 20 69 73 20 70 65 72 66 6f 72  ly (1) is perfor
f240: 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  med..*/.static v
f250: 6f 69 64 20 63 6f 6e 76 65 72 74 54 6f 57 69 74  oid convertToWit
f260: 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28 50  houtRowidTable(P
f270: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
f280: 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e  ble *pTab){.  In
f290: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 49 6e 64  dex *pIdx;.  Ind
f2a0: 65 78 20 2a 70 50 6b 3b 0a 20 20 69 6e 74 20 6e  ex *pPk;.  int n
f2b0: 50 6b 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  Pk;.  int i, j;.
f2c0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
f2d0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64  pParse->db;.  Vd
f2e0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
f2f0: 70 56 64 62 65 3b 0a 0a 20 20 2f 2a 20 4d 61 72  pVdbe;..  /* Mar
f300: 6b 20 65 76 65 72 79 20 50 52 49 4d 41 52 59 20  k every PRIMARY 
f310: 4b 45 59 20 63 6f 6c 75 6d 6e 20 61 73 20 4e 4f  KEY column as NO
f320: 54 20 4e 55 4c 4c 20 28 65 78 63 65 70 74 20 66  T NULL (except f
f330: 6f 72 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  or imposter tabl
f340: 65 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  es).  */.  if( !
f350: 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65  db->init.imposte
f360: 72 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 66 6f  rTable ){.    fo
f370: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e  r(i=0; i<pTab->n
f380: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
f390: 20 69 66 28 20 28 70 54 61 62 2d 3e 61 43 6f 6c   if( (pTab->aCol
f3a0: 5b 69 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43  [i].colFlags & C
f3b0: 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21  OLFLAG_PRIMKEY)!
f3c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  =0 ){.        pT
f3d0: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e  ab->aCol[i].notN
f3e0: 75 6c 6c 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ull = OE_Abort;.
f3f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f400: 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  }..  /* Convert 
f410: 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 6f  the P3 operand o
f420: 66 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65 42  f the OP_CreateB
f430: 74 72 65 65 20 6f 70 63 6f 64 65 20 66 72 6f 6d  tree opcode from
f440: 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 0a 20 20   BTREE_INTKEY.  
f450: 2a 2a 20 69 6e 74 6f 20 42 54 52 45 45 5f 42 4c  ** into BTREE_BL
f460: 4f 42 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 69 66  OBKEY..  */.  if
f470: 28 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72  ( pParse->addrCr
f480: 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Tab ){.    asser
f490: 74 28 20 76 20 29 3b 0a 20 20 20 20 73 71 6c 69  t( v );.    sqli
f4a0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
f4b0: 76 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43  v, pParse->addrC
f4c0: 72 54 61 62 2c 20 42 54 52 45 45 5f 42 4c 4f 42  rTab, BTREE_BLOB
f4d0: 4b 45 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  KEY);.  }..  /* 
f4e0: 4c 6f 63 61 74 65 20 74 68 65 20 50 52 49 4d 41  Locate the PRIMA
f4f0: 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 20 4f  RY KEY index.  O
f500: 72 2c 20 69 66 20 74 68 69 73 20 74 61 62 6c 65  r, if this table
f510: 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a   was originally.
f520: 20 20 2a 2a 20 61 6e 20 49 4e 54 45 47 45 52 20    ** an INTEGER 
f530: 50 52 49 4d 41 52 59 20 4b 45 59 20 74 61 62 6c  PRIMARY KEY tabl
f540: 65 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  e, create a new 
f550: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
f560: 78 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  x. .  */.  if( p
f570: 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b  Tab->iPKey>=0 ){
f580: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
f590: 4c 69 73 74 3b 0a 20 20 20 20 54 6f 6b 65 6e 20  List;.    Token 
f5a0: 69 70 6b 54 6f 6b 65 6e 3b 0a 20 20 20 20 73 71  ipkToken;.    sq
f5b0: 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26  lite3TokenInit(&
f5c0: 69 70 6b 54 6f 6b 65 6e 2c 20 70 54 61 62 2d 3e  ipkToken, pTab->
f5d0: 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79  aCol[pTab->iPKey
f5e0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c  ].zName);.    pL
f5f0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
f600: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
f610: 73 65 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  se, 0, .        
f620: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f630: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
f640: 4b 5f 49 44 2c 20 26 69 70 6b 54 6f 6b 65 6e 2c  K_ID, &ipkToken,
f650: 20 30 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c   0));.    if( pL
f660: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
f670: 0a 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41  .    if( IN_RENA
f680: 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20  ME_OBJECT ){.   
f690: 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65     sqlite3Rename
f6a0: 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61 72 73  TokenRemap(pPars
f6b0: 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  e, pList->a[0].p
f6c0: 45 78 70 72 2c 20 26 70 54 61 62 2d 3e 69 50 4b  Expr, &pTab->iPK
f6d0: 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ey);.    }.    p
f6e0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  List->a[0].sortO
f6f0: 72 64 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 69  rder = pParse->i
f700: 50 6b 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  PkSortOrder;.   
f710: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
f720: 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 70 54 61 62  >pNewTable==pTab
f730: 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50   );.    pTab->iP
f740: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71  Key = -1;.    sq
f750: 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78  lite3CreateIndex
f760: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30  (pParse, 0, 0, 0
f770: 2c 20 70 4c 69 73 74 2c 20 70 54 61 62 2d 3e 6b  , pList, pTab->k
f780: 65 79 43 6f 6e 66 2c 20 30 2c 20 30 2c 20 30 2c  eyConf, 0, 0, 0,
f790: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
f7a0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
f7b0: 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52  E_IDXTYPE_PRIMAR
f7c0: 59 4b 45 59 29 3b 0a 20 20 20 20 69 66 28 20 64  YKEY);.    if( d
f7d0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f7e0: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
f7f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 50  ) return;.    pP
f800: 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  k = sqlite3Prima
f810: 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
f820: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
f830: 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
f840: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
f850: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
f860: 50 6b 21 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a  Pk!=0 );..    /*
f870: 0a 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 61  .    ** Remove a
f880: 6c 6c 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c  ll redundant col
f890: 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 50 52  umns from the PR
f8a0: 49 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f 72 20  IMARY KEY.  For 
f8b0: 65 78 61 6d 70 6c 65 2c 20 63 68 61 6e 67 65 0a  example, change.
f8c0: 20 20 20 20 2a 2a 20 22 50 52 49 4d 41 52 59 20      ** "PRIMARY 
f8d0: 4b 45 59 28 61 2c 62 2c 61 2c 62 2c 63 2c 62 2c  KEY(a,b,a,b,c,b,
f8e0: 63 2c 64 29 22 20 69 6e 74 6f 20 6a 75 73 74 20  c,d)" into just 
f8f0: 22 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62  "PRIMARY KEY(a,b
f900: 2c 63 2c 64 29 22 2e 20 20 4c 61 74 65 72 0a 20  ,c,d)".  Later. 
f910: 20 20 20 2a 2a 20 63 6f 64 65 20 61 73 73 75 6d     ** code assum
f920: 65 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  es the PRIMARY K
f930: 45 59 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72  EY contains no r
f940: 65 70 65 61 74 65 64 20 63 6f 6c 75 6d 6e 73 2e  epeated columns.
f950: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
f960: 69 3d 6a 3d 31 3b 20 69 3c 70 50 6b 2d 3e 6e 4b  i=j=1; i<pPk->nK
f970: 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  eyCol; i++){.   
f980: 20 20 20 69 66 28 20 69 73 44 75 70 43 6f 6c 75     if( isDupColu
f990: 6d 6e 28 70 50 6b 2c 20 6a 2c 20 70 50 6b 2c 20  mn(pPk, j, pPk, 
f9a0: 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  i) ){.        pP
f9b0: 6b 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 0a 20 20  k->nColumn--;.  
f9c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f9d0: 20 20 20 74 65 73 74 63 61 73 65 28 20 68 61 73     testcase( has
f9e0: 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f  Column(pPk->aiCo
f9f0: 6c 75 6d 6e 2c 20 6a 2c 20 70 50 6b 2d 3e 61 69  lumn, j, pPk->ai
fa00: 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 3b 0a 20 20  Column[i]) );.  
fa10: 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c        pPk->aiCol
fa20: 75 6d 6e 5b 6a 2b 2b 5d 20 3d 20 70 50 6b 2d 3e  umn[j++] = pPk->
fa30: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
fa40: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
fa50: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6a 3b  Pk->nKeyCol = j;
fa60: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
fa70: 50 6b 21 3d 30 20 29 3b 0a 20 20 70 50 6b 2d 3e  Pk!=0 );.  pPk->
fa80: 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b 0a  isCovering = 1;.
fa90: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
faa0: 69 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 29 20  imposterTable ) 
fab0: 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  pPk->uniqNotNull
fac0: 20 3d 20 31 3b 0a 20 20 6e 50 6b 20 3d 20 70 50   = 1;.  nPk = pP
fad0: 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 0a 20 20 2f  k->nKeyCol;..  /
fae0: 2a 20 42 79 70 61 73 73 20 74 68 65 20 63 72 65  * Bypass the cre
faf0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 50 52 49  ation of the PRI
fb00: 4d 41 52 59 20 4b 45 59 20 62 74 72 65 65 20 61  MARY KEY btree a
fb10: 6e 64 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  nd the sqlite_ma
fb20: 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20  ster.  ** table 
fb30: 65 6e 74 72 79 2e 20 54 68 69 73 20 69 73 20 6f  entry. This is o
fb40: 6e 6c 79 20 72 65 71 75 69 72 65 64 20 69 66 20  nly required if 
fb50: 63 75 72 72 65 6e 74 6c 79 20 67 65 6e 65 72 61  currently genera
fb60: 74 69 6e 67 20 56 44 42 45 0a 20 20 2a 2a 20 63  ting VDBE.  ** c
fb70: 6f 64 65 20 66 6f 72 20 61 20 43 52 45 41 54 45  ode for a CREATE
fb80: 20 54 41 42 4c 45 20 28 6e 6f 74 20 77 68 65 6e   TABLE (not when
fb90: 20 70 61 72 73 69 6e 67 20 6f 6e 65 20 61 73 20   parsing one as 
fba0: 70 61 72 74 20 6f 66 20 72 65 61 64 69 6e 67 0a  part of reading.
fbb0: 20 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20    ** a database 
fbc0: 73 63 68 65 6d 61 29 2e 20 20 2a 2f 0a 20 20 69  schema).  */.  i
fbd0: 66 28 20 76 20 26 26 20 70 50 6b 2d 3e 74 6e 75  f( v && pPk->tnu
fbe0: 6d 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  m>0 ){.    asser
fbf0: 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  t( db->init.busy
fc00: 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ==0 );.    sqlit
fc10: 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f  e3VdbeChangeOpco
fc20: 64 65 28 76 2c 20 70 50 6b 2d 3e 74 6e 75 6d 2c  de(v, pPk->tnum,
fc30: 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 7d 0a 0a   OP_Goto);.  }..
fc40: 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61    /* The root pa
fc50: 67 65 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52  ge of the PRIMAR
fc60: 59 20 4b 45 59 20 69 73 20 74 68 65 20 74 61 62  Y KEY is the tab
fc70: 6c 65 20 72 6f 6f 74 20 70 61 67 65 20 2a 2f 0a  le root page */.
fc80: 20 20 70 50 6b 2d 3e 74 6e 75 6d 20 3d 20 70 54    pPk->tnum = pT
fc90: 61 62 2d 3e 74 6e 75 6d 3b 0a 0a 20 20 2f 2a 20  ab->tnum;..  /* 
fca0: 55 70 64 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Update the in-me
fcb0: 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
fcc0: 69 6f 6e 20 6f 66 20 61 6c 6c 20 55 4e 49 51 55  ion of all UNIQU
fcd0: 45 20 69 6e 64 69 63 65 73 20 62 79 20 63 6f 6e  E indices by con
fce0: 76 65 72 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  verting.  ** the
fcf0: 20 66 69 6e 61 6c 20 72 6f 77 69 64 20 63 6f 6c   final rowid col
fd00: 75 6d 6e 20 69 6e 74 6f 20 6f 6e 65 20 6f 72 20  umn into one or 
fd10: 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  more columns of 
fd20: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  the PRIMARY KEY.
fd30: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78  .  */.  for(pIdx
fd40: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
fd50: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
fd60: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20  pNext){.    int 
fd70: 6e 3b 0a 20 20 20 20 69 66 28 20 49 73 50 72 69  n;.    if( IsPri
fd80: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64  maryKeyIndex(pId
fd90: 78 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  x) ) continue;. 
fda0: 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c     for(i=n=0; i<
fdb0: 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nPk; i++){.     
fdc0: 20 69 66 28 20 21 69 73 44 75 70 43 6f 6c 75 6d   if( !isDupColum
fdd0: 6e 28 70 49 64 78 2c 20 70 49 64 78 2d 3e 6e 4b  n(pIdx, pIdx->nK
fde0: 65 79 43 6f 6c 2c 20 70 50 6b 2c 20 69 29 20 29  eyCol, pPk, i) )
fdf0: 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
fe00: 73 65 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70 49  se( hasColumn(pI
fe10: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49  dx->aiColumn, pI
fe20: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b  dx->nKeyCol, pPk
fe30: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29  ->aiColumn[i]) )
fe40: 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  ;.        n++;. 
fe50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
fe60: 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
fe70: 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78     /* This index
fe80: 20 69 73 20 61 20 73 75 70 65 72 73 65 74 20 6f   is a superset o
fe90: 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  f the primary ke
fea0: 79 20 2a 2f 0a 20 20 20 20 20 20 70 49 64 78 2d  y */.      pIdx-
feb0: 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d  >nColumn = pIdx-
fec0: 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20  >nKeyCol;.      
fed0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
fee0: 20 20 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e      if( resizeIn
fef0: 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 49  dexObject(db, pI
ff00: 64 78 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  dx, pIdx->nKeyCo
ff10: 6c 2b 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  l+n) ) return;. 
ff20: 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 49     for(i=0, j=pI
ff30: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 3c 6e  dx->nKeyCol; i<n
ff40: 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Pk; i++){.      
ff50: 69 66 28 20 21 69 73 44 75 70 43 6f 6c 75 6d 6e  if( !isDupColumn
ff60: 28 70 49 64 78 2c 20 70 49 64 78 2d 3e 6e 4b 65  (pIdx, pIdx->nKe
ff70: 79 43 6f 6c 2c 20 70 50 6b 2c 20 69 29 20 29 7b  yCol, pPk, i) ){
ff80: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
ff90: 65 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64  e( hasColumn(pId
ffa0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64  x->aiColumn, pId
ffb0: 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d  x->nKeyCol, pPk-
ffc0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 3b  >aiColumn[i]) );
ffd0: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
ffe0: 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 50 6b  iColumn[j] = pPk
fff0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
10000 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
10010 6f 6c 6c 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 7a  oll[j] = pPk->az
10020 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Coll[i];.       
10030 20 69 66 28 20 70 50 6b 2d 3e 61 53 6f 72 74 4f   if( pPk->aSortO
10040 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20  rder[i] ){.     
10050 20 20 20 20 20 2f 2a 20 53 65 65 20 74 69 63 6b       /* See tick
10060 65 74 20 68 74 74 70 73 3a 2f 2f 77 77 77 2e 73  et https://www.s
10070 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e  qlite.org/src/in
10080 66 6f 2f 62 62 61 37 62 36 39 66 39 38 34 39 62  fo/bba7b69f9849b
10090 35 62 66 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  5bf */.         
100a0 20 70 49 64 78 2d 3e 62 41 73 63 4b 65 79 42 75   pIdx->bAscKeyBu
100b0 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  g = 1;.        }
100c0 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  .        j++;.  
100d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
100e0 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43  assert( pIdx->nC
100f0 6f 6c 75 6d 6e 3e 3d 70 49 64 78 2d 3e 6e 4b 65  olumn>=pIdx->nKe
10100 79 43 6f 6c 2b 6e 20 29 3b 0a 20 20 20 20 61 73  yCol+n );.    as
10110 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
10120 75 6d 6e 3e 3d 6a 20 29 3b 0a 20 20 7d 0a 0a 20  umn>=j );.  }.. 
10130 20 2f 2a 20 41 64 64 20 61 6c 6c 20 74 61 62 6c   /* Add all tabl
10140 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65  e columns to the
10150 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
10160 65 78 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50  ex.  */.  if( nP
10170 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  k<pTab->nCol ){.
10180 20 20 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e      if( resizeIn
10190 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 50  dexObject(db, pP
101a0 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  k, pTab->nCol) )
101b0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72   return;.    for
101c0 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20 69 3c 70  (i=0, j=nPk; i<p
101d0 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
101e0 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43  .      if( !hasC
101f0 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c  olumn(pPk->aiCol
10200 75 6d 6e 2c 20 6a 2c 20 69 29 20 29 7b 0a 20 20  umn, j, i) ){.  
10210 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
10220 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  pPk->nColumn );.
10230 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43          pPk->aiC
10240 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a 20 20  olumn[j] = i;.  
10250 20 20 20 20 20 20 70 50 6b 2d 3e 61 7a 43 6f 6c        pPk->azCol
10260 6c 5b 6a 5d 20 3d 20 73 71 6c 69 74 65 33 53 74  l[j] = sqlite3St
10270 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 20  rBINARY;.       
10280 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   j++;.      }.  
10290 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
102a0 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20  pPk->nColumn==j 
102b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
102c0 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a  Tab->nCol==j );.
102d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b    }else{.    pPk
102e0 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61 62  ->nColumn = pTab
102f0 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65  ->nCol;.  }.  re
10300 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f  computeColumnsNo
10310 74 49 6e 64 65 78 65 64 28 70 50 6b 29 3b 0a 7d  tIndexed(pPk);.}
10320 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10330 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
10340 4c 45 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  LE./*.** Return 
10350 74 72 75 65 20 69 66 20 7a 4e 61 6d 65 20 69 73  true if zName is
10360 20 61 20 73 68 61 64 6f 77 20 74 61 62 6c 65 20   a shadow table 
10370 6e 61 6d 65 20 69 6e 20 74 68 65 20 63 75 72 72  name in the curr
10380 65 6e 74 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ent database.** 
10390 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
103a0 2a 20 7a 4e 61 6d 65 20 69 73 20 74 65 6d 70 6f  * zName is tempo
103b0 72 61 72 69 6c 79 20 6d 6f 64 69 66 69 65 64 20  rarily modified 
103c0 77 68 69 6c 65 20 74 68 69 73 20 72 6f 75 74 69  while this routi
103d0 6e 65 20 69 73 20 72 75 6e 6e 69 6e 67 2c 20 62  ne is running, b
103e0 75 74 20 69 73 0a 2a 2a 20 72 65 73 74 6f 72 65  ut is.** restore
103f0 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
10400 6c 20 76 61 6c 75 65 20 70 72 69 6f 72 20 74 6f  l value prior to
10410 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
10420 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
10430 69 63 20 69 6e 74 20 69 73 53 68 61 64 6f 77 54  ic int isShadowT
10440 61 62 6c 65 4e 61 6d 65 28 73 71 6c 69 74 65 33  ableName(sqlite3
10450 20 2a 64 62 2c 20 63 68 61 72 20 2a 7a 4e 61 6d   *db, char *zNam
10460 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 61 69  e){.  char *zTai
10470 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
10480 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
10490 6f 20 74 68 65 20 6c 61 73 74 20 22 5f 22 20 69  o the last "_" i
104a0 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 54 61 62  n zName */.  Tab
104b0 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
104c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
104d0 62 6c 65 20 74 68 61 74 20 7a 4e 61 6d 65 20 69  ble that zName i
104e0 73 20 61 20 73 68 61 64 6f 77 20 6f 66 20 2a 2f  s a shadow of */
104f0 0a 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 3b  .  Module *pMod;
10500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10510 20 2f 2a 20 4d 6f 64 75 6c 65 20 66 6f 72 20 74   /* Module for t
10520 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
10530 20 2a 2f 0a 0a 20 20 7a 54 61 69 6c 20 3d 20 73   */..  zTail = s
10540 74 72 72 63 68 72 28 7a 4e 61 6d 65 2c 20 27 5f  trrchr(zName, '_
10550 27 29 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c 3d  ');.  if( zTail=
10560 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
10570 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 70   *zTail = 0;.  p
10580 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Tab = sqlite3Fin
10590 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
105a0 2c 20 30 29 3b 0a 20 20 2a 7a 54 61 69 6c 20 3d  , 0);.  *zTail =
105b0 20 27 5f 27 3b 0a 20 20 69 66 28 20 70 54 61 62   '_';.  if( pTab
105c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
105d0 20 20 69 66 28 20 21 49 73 56 69 72 74 75 61 6c    if( !IsVirtual
105e0 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
105f0 30 3b 0a 20 20 70 4d 6f 64 20 3d 20 28 4d 6f 64  0;.  pMod = (Mod
10600 75 6c 65 2a 29 73 71 6c 69 74 65 33 48 61 73 68  ule*)sqlite3Hash
10610 46 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c  Find(&db->aModul
10620 65 2c 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c  e, pTab->azModul
10630 65 41 72 67 5b 30 5d 29 3b 0a 20 20 69 66 28 20  eArg[0]);.  if( 
10640 70 4d 6f 64 3d 3d 30 20 29 20 72 65 74 75 72 6e  pMod==0 ) return
10650 20 30 3b 0a 20 20 69 66 28 20 70 4d 6f 64 2d 3e   0;.  if( pMod->
10660 70 4d 6f 64 75 6c 65 2d 3e 69 56 65 72 73 69 6f  pModule->iVersio
10670 6e 3c 33 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  n<3 ) return 0;.
10680 20 20 69 66 28 20 70 4d 6f 64 2d 3e 70 4d 6f 64    if( pMod->pMod
10690 75 6c 65 2d 3e 78 53 68 61 64 6f 77 4e 61 6d 65  ule->xShadowName
106a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
106b0 20 20 72 65 74 75 72 6e 20 70 4d 6f 64 2d 3e 70    return pMod->p
106c0 4d 6f 64 75 6c 65 2d 3e 78 53 68 61 64 6f 77 4e  Module->xShadowN
106d0 61 6d 65 28 7a 54 61 69 6c 2b 31 29 3b 0a 7d 0a  ame(zTail+1);.}.
106e0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 69  #else.# define i
106f0 73 53 68 61 64 6f 77 54 61 62 6c 65 4e 61 6d 65  sShadowTableName
10700 28 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 20 2f  (x,y) 0.#endif /
10710 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
10720 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
10730 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  E */../*.** This
10740 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
10750 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65  ed to report the
10760 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20   final ")" that 
10770 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20  terminates.** a 
10780 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
10790 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
107a0 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  e table structur
107b0 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74  e that other act
107c0 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76  ion routines hav
107d0 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a  e been building.
107e0 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ** is added to t
107f0 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  he internal hash
10800 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e   tables, assumin
10810 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65  g no errors have
10820 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  .** occurred..**
10830 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72  .** An entry for
10840 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61   the table is ma
10850 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  de in the master
10860 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20   table on disk, 
10870 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69  unless.** this i
10880 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  s a temporary ta
10890 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e  ble or db->init.
108a0 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64  busy==1.  When d
108b0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a  b->init.busy==1.
108c0 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61  ** it means we a
108d0 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73  re reading the s
108e0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
108f0 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75  le because we ju
10900 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20  st.** connected 
10910 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
10920 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73  or because the s
10930 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
10940 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74  le has.** recent
10950 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74  ly changed, so t
10960 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69  he entry for thi
10970 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  s table already 
10980 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65  exists in.** the
10990 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
109a0 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74  able.  We do not
109b0 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20   want to create 
109c0 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  it again..**.** 
109d0 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61  If the pSelect a
109e0 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e  rgument is not N
109f0 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ULL, it means th
10a00 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  at this routine.
10a10 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  ** was called to
10a20 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20   create a table 
10a30 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61  generated from a
10a40 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42   .** "CREATE TAB
10a50 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54  LE ... AS SELECT
10a60 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e   ..." statement.
10a70 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d    The column nam
10a80 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  es of.** the new
10a90 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63   table will matc
10aa0 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  h the result set
10ab0 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a   of the SELECT..
10ac0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
10ad0 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  ndTable(.  Parse
10ae0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
10af0 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
10b00 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
10b10 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20  pCons,          
10b20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65   /* The ',' toke
10b30 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74  n after the last
10b40 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f   column defn. */
10b50 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20  .  Token *pEnd, 
10b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10b70 65 20 27 29 27 20 62 65 66 6f 72 65 20 6f 70 74  e ')' before opt
10b80 69 6f 6e 73 20 69 6e 20 74 68 65 20 43 52 45 41  ions in the CREA
10b90 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 75 38  TE TABLE */.  u8
10ba0 20 74 61 62 4f 70 74 73 2c 20 20 20 20 20 20 20   tabOpts,       
10bb0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 74        /* Extra t
10bc0 61 62 6c 65 20 6f 70 74 69 6f 6e 73 2e 20 55 73  able options. Us
10bd0 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a 20 20 53 65  ually 0. */.  Se
10be0 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20  lect *pSelect   
10bf0 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20        /* Select 
10c00 66 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e  from a "CREATE .
10c10 2e 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f  .. AS SELECT" */
10c20 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 20  .){.  Table *p; 
10c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c40 2f 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65  /* The new table
10c50 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
10c60 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
10c70 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
10c80 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
10c90 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
10ca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
10cb0 61 62 61 73 65 20 69 6e 20 77 68 69 63 68 20 74  abase in which t
10cc0 68 65 20 74 61 62 6c 65 20 6c 69 76 65 73 20 2a  he table lives *
10cd0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  /.  Index *pIdx;
10ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10cf0 20 41 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65   An implied inde
10d00 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  x of the table *
10d10 2f 0a 0a 20 20 69 66 28 20 70 45 6e 64 3d 3d 30  /..  if( pEnd==0
10d20 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 20 29   && pSelect==0 )
10d30 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
10d40 7d 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  }.  assert( !db-
10d50 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
10d60 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
10d70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
10d80 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  p==0 ) return;..
10d90 20 20 69 66 28 20 70 53 65 6c 65 63 74 3d 3d 30    if( pSelect==0
10da0 20 26 26 20 69 73 53 68 61 64 6f 77 54 61 62 6c   && isShadowTabl
10db0 65 4e 61 6d 65 28 64 62 2c 20 70 2d 3e 7a 4e 61  eName(db, p->zNa
10dc0 6d 65 29 20 29 7b 0a 20 20 20 20 70 2d 3e 74 61  me) ){.    p->ta
10dd0 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 53 68 61  bFlags |= TF_Sha
10de0 64 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  dow;.  }..  /* I
10df0 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  f the db->init.b
10e00 75 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e  usy is 1 it mean
10e10 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
10e20 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65   the SQL off the
10e30 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61  .  ** "sqlite_ma
10e40 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65  ster" or "sqlite
10e50 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61  _temp_master" ta
10e60 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e  ble on the disk.
10e70 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20  .  ** So do not 
10e80 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73  write to the dis
10e90 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63  k again.  Extrac
10ea0 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  t the root page 
10eb0 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20  number.  ** for 
10ec0 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  the table from t
10ed0 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  he db->init.newT
10ee0 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65  num field.  (The
10ef0 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
10f00 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  * should have be
10f10 65 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20  en put there by 
10f20 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62  the sqliteOpenCb
10f30 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2a 0a   routine.).  **.
10f40 20 20 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f 74    ** If the root
10f50 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
10f60 31 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  1, that means th
10f70 69 73 20 69 73 20 74 68 65 20 73 71 6c 69 74 65  is is the sqlite
10f80 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62  _master.  ** tab
10f90 6c 65 20 69 74 73 65 6c 66 2e 20 20 53 6f 20 6d  le itself.  So m
10fa0 61 72 6b 20 69 74 20 72 65 61 64 2d 6f 6e 6c 79  ark it read-only
10fb0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
10fc0 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
10fd0 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
10fe0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
10ff0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
11000 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
11010 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74  ;.    }.    p->t
11020 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e  num = db->init.n
11030 65 77 54 6e 75 6d 3b 0a 20 20 20 20 69 66 28 20  ewTnum;.    if( 
11040 70 2d 3e 74 6e 75 6d 3d 3d 31 20 29 20 70 2d 3e  p->tnum==1 ) p->
11050 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 52  tabFlags |= TF_R
11060 65 61 64 6f 6e 6c 79 3b 0a 20 20 7d 0a 0a 20 20  eadonly;.  }..  
11070 61 73 73 65 72 74 28 20 28 70 2d 3e 74 61 62 46  assert( (p->tabF
11080 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50 72 69  lags & TF_HasPri
11090 6d 61 72 79 4b 65 79 29 3d 3d 30 0a 20 20 20 20  maryKey)==0.    
110a0 20 20 20 7c 7c 20 70 2d 3e 69 50 4b 65 79 3e 3d     || p->iPKey>=
110b0 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 72 69 6d  0 || sqlite3Prim
110c0 61 72 79 4b 65 79 49 6e 64 65 78 28 70 29 21 3d  aryKeyIndex(p)!=
110d0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
110e0 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  p->tabFlags & TF
110f0 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 29 21  _HasPrimaryKey)!
11100 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 2d  =0.       || (p-
11110 3e 69 50 4b 65 79 3c 30 20 26 26 20 73 71 6c 69  >iPKey<0 && sqli
11120 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
11130 65 78 28 70 29 3d 3d 30 29 20 29 3b 0a 0a 20 20  ex(p)==0) );..  
11140 2f 2a 20 53 70 65 63 69 61 6c 20 70 72 6f 63 65  /* Special proce
11150 73 73 69 6e 67 20 66 6f 72 20 57 49 54 48 4f 55  ssing for WITHOU
11160 54 20 52 4f 57 49 44 20 54 61 62 6c 65 73 20 2a  T ROWID Tables *
11170 2f 0a 20 20 69 66 28 20 74 61 62 4f 70 74 73 20  /.  if( tabOpts 
11180 26 20 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69  & TF_WithoutRowi
11190 64 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d  d ){.    if( (p-
111a0 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41  >tabFlags & TF_A
111b0 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 20 29 7b  utoincrement) ){
111c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
111d0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
111e0 20 20 20 20 20 20 20 20 20 22 41 55 54 4f 49 4e           "AUTOIN
111f0 43 52 45 4d 45 4e 54 20 6e 6f 74 20 61 6c 6c 6f  CREMENT not allo
11200 77 65 64 20 6f 6e 20 57 49 54 48 4f 55 54 20 52  wed on WITHOUT R
11210 4f 57 49 44 20 74 61 62 6c 65 73 22 29 3b 0a 20  OWID tables");. 
11220 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
11230 20 7d 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74   }.    if( (p->t
11240 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73  abFlags & TF_Has
11250 50 72 69 6d 61 72 79 4b 65 79 29 3d 3d 30 20 29  PrimaryKey)==0 )
11260 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11270 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11280 22 50 52 49 4d 41 52 59 20 4b 45 59 20 6d 69 73  "PRIMARY KEY mis
11290 73 69 6e 67 20 6f 6e 20 74 61 62 6c 65 20 25 73  sing on table %s
112a0 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  ", p->zName);.  
112b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
112c0 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
112d0 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20 7c 20  _WithoutRowid | 
112e0 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69  TF_NoVisibleRowi
112f0 64 3b 0a 20 20 20 20 20 20 63 6f 6e 76 65 72 74  d;.      convert
11300 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61  ToWithoutRowidTa
11310 62 6c 65 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ble(pParse, p);.
11320 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 44 62      }.  }..  iDb
11330 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
11340 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70  ToIndex(db, p->p
11350 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65  Schema);..#ifnde
11360 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
11370 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65  ECK.  /* Resolve
11380 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48   names in all CH
11390 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 65  ECK constraint e
113a0 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f  xpressions..  */
113b0 0a 20 20 69 66 28 20 70 2d 3e 70 43 68 65 63 6b  .  if( p->pCheck
113c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
113d0 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65  esolveSelfRefere
113e0 6e 63 65 28 70 50 61 72 73 65 2c 20 70 2c 20 4e  nce(pParse, p, N
113f0 43 5f 49 73 43 68 65 63 6b 2c 20 30 2c 20 70 2d  C_IsCheck, 0, p-
11400 3e 70 43 68 65 63 6b 29 3b 0a 20 20 7d 0a 23 65  >pCheck);.  }.#e
11410 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
11420 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45  (SQLITE_OMIT_CHE
11430 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 45 73 74  CK) */..  /* Est
11440 69 6d 61 74 65 20 74 68 65 20 61 76 65 72 61 67  imate the averag
11450 65 20 72 6f 77 20 73 69 7a 65 20 66 6f 72 20 74  e row size for t
11460 68 65 20 74 61 62 6c 65 20 61 6e 64 20 66 6f 72  he table and for
11470 20 61 6c 6c 20 69 6d 70 6c 69 65 64 20 69 6e 64   all implied ind
11480 69 63 65 73 20 2a 2f 0a 20 20 65 73 74 69 6d 61  ices */.  estima
11490 74 65 54 61 62 6c 65 57 69 64 74 68 28 70 29 3b  teTableWidth(p);
114a0 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70  .  for(pIdx=p->p
114b0 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
114c0 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
114d0 20 20 20 20 65 73 74 69 6d 61 74 65 49 6e 64 65      estimateInde
114e0 78 57 69 64 74 68 28 70 49 64 78 29 3b 0a 20 20  xWidth(pIdx);.  
114f0 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69  }..  /* If not i
11500 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65  nitializing, the
11510 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72  n create a recor
11520 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  d for the new ta
11530 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ble.  ** in the 
11540 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
11550 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ble of the datab
11560 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ase..  **.  ** I
11570 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50  f this is a TEMP
11580 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69  ORARY table, wri
11590 74 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74  te the entry int
115a0 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a  o the auxiliary.
115b0 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61    ** file instea
115c0 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61  d of into the ma
115d0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
115e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ..  */.  if( !db
115f0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
11600 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64     int n;.    Vd
11610 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20  be *v;.    char 
11620 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76  *zType;    /* "v
11630 69 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20  iew" or "table" 
11640 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79  */.    char *zTy
11650 70 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22  pe2;   /* "VIEW"
11660 20 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20   or "TABLE" */. 
11670 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20     char *zStmt; 
11680 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68     /* Text of th
11690 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f  e CREATE TABLE o
116a0 72 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  r CREATE VIEW st
116b0 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20  atement */..    
116c0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
116d0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
116e0 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20  if( NEVER(v==0) 
116f0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73  ) return;..    s
11700 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
11710 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29  (v, OP_Close, 0)
11720 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a  ;..    /* .    *
11730 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79  * Initialize zTy
11740 70 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76  pe for the new v
11750 69 65 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20  iew or table..  
11760 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
11770 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
11780 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72      /* A regular
11790 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
117a0 7a 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b  zType = "table";
117b0 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20  .      zType2 = 
117c0 22 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66  "TABLE";.#ifndef
117d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
117e0 57 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  W.    }else{.   
117f0 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a     /* A view */.
11800 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76        zType = "v
11810 69 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70  iew";.      zTyp
11820 65 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e  e2 = "VIEW";.#en
11830 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  dif.    }..    /
11840 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 43  * If this is a C
11850 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 20 41  REATE TABLE xx A
11860 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78  S SELECT ..., ex
11870 65 63 75 74 65 20 74 68 65 20 53 45 4c 45 43 54  ecute the SELECT
11880 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  .    ** statemen
11890 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  t to populate th
118a0 65 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65  e new table. The
118b0 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
118c0 72 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  r for the.    **
118d0 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 69 6e   new table is in
118e0 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65   register pParse
118f0 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a  ->regRoot..    *
11900 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68  *.    ** Once th
11910 65 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65  e SELECT has bee
11920 6e 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74  n coded by sqlit
11930 65 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69  e3Select(), it i
11940 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75  s in a.    ** su
11950 69 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20  itable state to 
11960 71 75 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f  query for the co
11970 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74  lumn names and t
11980 79 70 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a  ypes to be used.
11990 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65      ** by the ne
119a0 77 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a  w table..    **.
119b0 20 20 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d      ** A shared-
119c0 63 61 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b  cache write-lock
119d0 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
119e0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
119f0 20 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20   new table,.    
11a00 2a 2a 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c  ** as a schema-l
11a10 6f 63 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c  ock must have al
11a20 72 65 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69  ready been obtai
11a30 6e 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 74  ned to create it
11a40 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61  . Since.    ** a
11a50 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63   schema-lock exc
11a60 6c 75 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20  ludes all other 
11a70 64 61 74 61 62 61 73 65 20 75 73 65 72 73 2c 20  database users, 
11a80 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  the write-lock w
11a90 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72  ould.    ** be r
11aa0 65 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f  edundant..    */
11ab0 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
11ac0 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74   ){.      Select
11ad0 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 2f 2a  Dest dest;    /*
11ae0 20 57 68 65 72 65 20 74 68 65 20 53 45 4c 45 43   Where the SELEC
11af0 54 20 73 68 6f 75 6c 64 20 73 74 6f 72 65 20 72  T should store r
11b00 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20  esults */.      
11b10 69 6e 74 20 72 65 67 59 69 65 6c 64 3b 20 20 20  int regYield;   
11b20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
11b30 68 6f 6c 64 69 6e 67 20 63 6f 2d 72 6f 75 74 69  holding co-routi
11b40 6e 65 20 65 6e 74 72 79 2d 70 6f 69 6e 74 20 2a  ne entry-point *
11b50 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
11b60 54 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  Top;        /* T
11b70 6f 70 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75  op of the co-rou
11b80 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tine */.      in
11b90 74 20 72 65 67 52 65 63 3b 20 20 20 20 20 20 20  t regRec;       
11ba0 20 20 2f 2a 20 41 20 72 65 63 6f 72 64 20 74 6f    /* A record to
11bb0 20 62 65 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   be insert into 
11bc0 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f  the new table */
11bd0 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 6f  .      int regRo
11be0 77 69 64 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f  wid;       /* Ro
11bf0 77 69 64 20 6f 66 20 74 68 65 20 6e 65 78 74 20  wid of the next 
11c00 72 6f 77 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f  row to insert */
11c10 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 49  .      int addrI
11c20 6e 73 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 6f  nsLoop;    /* To
11c30 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  p of the loop fo
11c40 72 20 69 6e 73 65 72 74 69 6e 67 20 72 6f 77 73  r inserting rows
11c50 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
11c60 2a 70 53 65 6c 54 61 62 3b 20 20 20 20 20 2f 2a  *pSelTab;     /*
11c70 20 41 20 74 61 62 6c 65 20 74 68 61 74 20 64 65   A table that de
11c80 73 63 72 69 62 65 73 20 74 68 65 20 53 45 4c 45  scribes the SELE
11c90 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20  CT results */.. 
11ca0 20 20 20 20 20 72 65 67 59 69 65 6c 64 20 3d 20       regYield = 
11cb0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
11cc0 20 20 20 20 20 20 72 65 67 52 65 63 20 3d 20 2b        regRec = +
11cd0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
11ce0 20 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20       regRowid = 
11cf0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
11d00 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
11d10 72 73 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20  rse->nTab==1);. 
11d20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41       sqlite3MayA
11d30 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20  bort(pParse);.  
11d40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11d50 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
11d60 57 72 69 74 65 2c 20 31 2c 20 70 50 61 72 73 65  Write, 1, pParse
11d70 2d 3e 72 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b  ->regRoot, iDb);
11d80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11d90 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
11da0 46 4c 41 47 5f 50 32 49 53 52 45 47 29 3b 0a 20  FLAG_P2ISREG);. 
11db0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61       pParse->nTa
11dc0 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 61 64 64  b = 2;.      add
11dd0 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
11de0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
11df0 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   + 1;.      sqli
11e00 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
11e10 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e   OP_InitCoroutin
11e20 65 2c 20 72 65 67 59 69 65 6c 64 2c 20 30 2c 20  e, regYield, 0, 
11e30 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20  addrTop);.      
11e40 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
11e50 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
11e60 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74   pSelTab = sqlit
11e70 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
11e80 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
11e90 65 63 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ect);.      if( 
11ea0 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74  pSelTab==0 ) ret
11eb0 75 72 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72  urn;.      asser
11ec0 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b  t( p->aCol==0 );
11ed0 0a 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d  .      p->nCol =
11ee0 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
11ef0 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20        p->aCol = 
11f00 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
11f10 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43       pSelTab->nC
11f20 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53  ol = 0;.      pS
11f30 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
11f40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
11f50 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53  leteTable(db, pS
11f60 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 73 71  elTab);.      sq
11f70 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
11f80 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43  nit(&dest, SRT_C
11f90 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65  oroutine, regYie
11fa0 6c 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ld);.      sqlit
11fb0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
11fc0 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29   pSelect, &dest)
11fd0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
11fe0 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
11ff0 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  n;.      sqlite3
12000 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65  VdbeEndCoroutine
12010 28 76 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20  (v, regYield);. 
12020 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12030 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
12040 54 6f 70 20 2d 20 31 29 3b 0a 20 20 20 20 20 20  Top - 1);.      
12050 61 64 64 72 49 6e 73 4c 6f 6f 70 20 3d 20 73 71  addrInsLoop = sq
12060 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
12070 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 64 65 73  v, OP_Yield, des
12080 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  t.iSDParm);.    
12090 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
120a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
120b0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
120c0 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 64 65 73  _MakeRecord, des
120d0 74 2e 69 53 64 73 74 2c 20 64 65 73 74 2e 6e 53  t.iSdst, dest.nS
120e0 64 73 74 2c 20 72 65 67 52 65 63 29 3b 0a 20 20  dst, regRec);.  
120f0 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
12100 41 66 66 69 6e 69 74 79 28 76 2c 20 70 2c 20 30  Affinity(v, p, 0
12110 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12120 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12130 5f 4e 65 77 52 6f 77 69 64 2c 20 31 2c 20 72 65  _NewRowid, 1, re
12140 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
12150 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
12160 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 31  (v, OP_Insert, 1
12170 2c 20 72 65 67 52 65 63 2c 20 72 65 67 52 6f 77  , regRec, regRow
12180 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
12190 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64  e3VdbeGoto(v, ad
121a0 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20  drInsLoop);.    
121b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
121c0 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e 73  pHere(v, addrIns
121d0 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Loop);.      sql
121e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
121f0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a  , OP_Close, 1);.
12200 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
12210 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65  mpute the comple
12220 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43  te text of the C
12230 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  REATE statement 
12240 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65  */.    if( pSele
12250 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d  ct ){.      zStm
12260 74 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53  t = createTableS
12270 74 6d 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  tmt(db, p);.    
12280 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 6f 6b  }else{.      Tok
12290 65 6e 20 2a 70 45 6e 64 32 20 3d 20 74 61 62 4f  en *pEnd2 = tabO
122a0 70 74 73 20 3f 20 26 70 50 61 72 73 65 2d 3e 73  pts ? &pParse->s
122b0 4c 61 73 74 54 6f 6b 65 6e 20 3a 20 70 45 6e 64  LastToken : pEnd
122c0 3b 0a 20 20 20 20 20 20 6e 20 3d 20 28 69 6e 74  ;.      n = (int
122d0 29 28 70 45 6e 64 32 2d 3e 7a 20 2d 20 70 50 61  )(pEnd2->z - pPa
122e0 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
122f0 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  z);.      if( pE
12300 6e 64 32 2d 3e 7a 5b 30 5d 21 3d 27 3b 27 20 29  nd2->z[0]!=';' )
12310 20 6e 20 2b 3d 20 70 45 6e 64 32 2d 3e 6e 3b 0a   n += pEnd2->n;.
12320 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71        zStmt = sq
12330 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
12340 20 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45   .          "CRE
12350 41 54 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54  ATE %s %.*s", zT
12360 79 70 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d  ype2, n, pParse-
12370 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20  >sNameToken.z.  
12380 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
12390 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20    /* A slot for 
123a0 74 68 65 20 72 65 63 6f 72 64 20 68 61 73 20 61  the record has a
123b0 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
123c0 63 61 74 65 64 20 69 6e 20 74 68 65 20 0a 20 20  cated in the .  
123d0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54    ** SQLITE_MAST
123e0 45 52 20 74 61 62 6c 65 2e 20 20 57 65 20 6a 75  ER table.  We ju
123f0 73 74 20 6e 65 65 64 20 74 6f 20 75 70 64 61 74  st need to updat
12400 65 20 74 68 61 74 20 73 6c 6f 74 20 77 69 74 68  e that slot with
12410 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20   all.    ** the 
12420 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76  information we'v
12430 65 20 63 6f 6c 6c 65 63 74 65 64 2e 0a 20 20 20  e collected..   
12440 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   */.    sqlite3N
12450 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
12460 65 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54 45  e,.      "UPDATE
12470 20 25 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20   %Q.%s ".       
12480 20 20 22 53 45 54 20 74 79 70 65 3d 27 25 73 27    "SET type='%s'
12490 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e  , name=%Q, tbl_n
124a0 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65  ame=%Q, rootpage
124b0 3d 23 25 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20  =#%d, sql=%Q ". 
124c0 20 20 20 20 20 20 22 57 48 45 52 45 20 72 6f 77        "WHERE row
124d0 69 64 3d 23 25 64 22 2c 0a 20 20 20 20 20 20 64  id=#%d",.      d
124e0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
124f0 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d  Name, MASTER_NAM
12500 45 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a  E,.      zType,.
12510 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
12520 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
12530 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65        pParse->re
12540 67 52 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53 74  gRoot,.      zSt
12550 6d 74 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65  mt,.      pParse
12560 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20 20 20 29  ->regRowid.    )
12570 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
12580 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a  ree(db, zStmt);.
12590 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
125a0 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
125b0 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  iDb);..#ifndef S
125c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
125d0 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20  NCREMENT.    /* 
125e0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
125f0 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  we need to creat
12600 65 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75  e an sqlite_sequ
12610 65 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20  ence table for. 
12620 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72     ** keeping tr
12630 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65  ack of autoincre
12640 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a  ment keys..    *
12650 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61  /.    if( (p->ta
12660 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
12670 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30 20 29 7b  increment)!=0 ){
12680 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d  .      Db *pDb =
12690 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
126a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
126b0 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
126c0 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
126d0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44   );.      if( pD
126e0 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71  b->pSchema->pSeq
126f0 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
12700 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
12710 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
12720 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54         "CREATE T
12730 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f 73  ABLE %Q.sqlite_s
12740 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71  equence(name,seq
12750 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44  )",.          pD
12760 62 2d 3e 7a 44 62 53 4e 61 6d 65 0a 20 20 20 20  b->zDbSName.    
12770 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
12780 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
12790 20 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65 72   /* Reparse ever
127a0 79 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65  ything to update
127b0 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61   our internal da
127c0 74 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f  ta structures */
127d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
127e0 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70  AddParseSchemaOp
127f0 28 70 50 61 72 73 65 2c 20 69 44 62 2c 0a 20 20  (pParse, iDb,.  
12800 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12810 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c  MPrintf(db, "tbl
12820 5f 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74  _name='%q' AND t
12830 79 70 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c  ype!='trigger'",
12840 20 70 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d   p->zName));.  }
12850 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  ...  /* Add the 
12860 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d  table to the in-
12870 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
12880 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74  ation of the dat
12890 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  abase..  */.  if
128a0 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
128b0 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f  ){.    Table *pO
128c0 6c 64 3b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a  ld;.    Schema *
128d0 70 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63  pSchema = p->pSc
128e0 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74  hema;.    assert
128f0 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
12900 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
12910 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 4f 6c 64  , 0) );.    pOld
12920 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
12930 73 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74  sert(&pSchema->t
12940 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65  blHash, p->zName
12950 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  , p);.    if( pO
12960 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ld ){.      asse
12970 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20  rt( p==pOld );  
12980 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
12990 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64  ave failed insid
129a0 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a  e HashInsert() *
129b0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  /.      sqlite3O
129c0 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20  omFault(db);.   
129d0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
129e0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  .    pParse->pNe
129f0 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  wTable = 0;.    
12a00 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20  db->mDbFlags |= 
12a10 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61  DBFLAG_SchemaCha
12a20 6e 67 65 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  nge;..#ifndef SQ
12a30 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54  LITE_OMIT_ALTERT
12a40 41 42 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d  ABLE.    if( !p-
12a50 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
12a60 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
12a70 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
12a80 72 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d  r *)pParse->sNam
12a90 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20  eToken.z;.      
12aa0 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20  int nName;.     
12ab0 20 61 73 73 65 72 74 28 20 21 70 53 65 6c 65 63   assert( !pSelec
12ac0 74 20 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45  t && pCons && pE
12ad0 6e 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nd );.      if( 
12ae0 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  pCons->z==0 ){. 
12af0 20 20 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70         pCons = p
12b00 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  End;.      }.   
12b10 20 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29     nName = (int)
12b20 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70  ((const char *)p
12b30 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29  Cons->z - zName)
12b40 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f  ;.      p->addCo
12b50 6c 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73  lOffset = 13 + s
12b60 71 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c 65  qlite3Utf8CharLe
12b70 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  n(zName, nName);
12b80 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
12b90 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
12ba0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a  ITE_OMIT_VIEW./*
12bb0 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
12bc0 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
12bd0 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72  e in order to cr
12be0 65 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a  eate a new VIEW.
12bf0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
12c00 72 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72  reateView(.  Par
12c10 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
12c20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
12c30 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
12c40 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f  n *pBegin,     /
12c50 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b  * The CREATE tok
12c60 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74  en that begins t
12c70 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
12c80 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
12c90 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65       /* The toke
12ca0 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  n that holds the
12cb0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65   name of the vie
12cc0 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  w */.  Token *pN
12cd0 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65  ame2,     /* The
12ce0 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64   token that hold
12cf0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
12d00 65 20 76 69 65 77 20 2a 2f 0a 20 20 45 78 70 72  e view */.  Expr
12d10 4c 69 73 74 20 2a 70 43 4e 61 6d 65 73 2c 20 2f  List *pCNames, /
12d20 2a 20 4f 70 74 69 6f 6e 61 6c 20 6c 69 73 74 20  * Optional list 
12d30 6f 66 20 76 69 65 77 20 63 6f 6c 75 6d 6e 20 6e  of view column n
12d40 61 6d 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ames */.  Select
12d50 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20   *pSelect,   /* 
12d60 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  A SELECT stateme
12d70 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63  nt that will bec
12d80 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65 77  ome the new view
12d90 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70   */.  int isTemp
12da0 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45  ,        /* TRUE
12db0 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59   for a TEMPORARY
12dc0 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e   view */.  int n
12dd0 6f 45 72 72 20 20 20 20 20 20 20 20 20 20 2f 2a  oErr          /*
12de0 20 53 75 70 70 72 65 73 73 20 65 72 72 6f 72 20   Suppress error 
12df0 6d 65 73 73 61 67 65 73 20 69 66 20 56 49 45 57  messages if VIEW
12e00 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
12e10 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
12e20 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e  ;.  int n;.  con
12e30 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f  st char *z;.  To
12e40 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69  ken sEnd;.  DbFi
12e50 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65  xer sFix;.  Toke
12e60 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  n *pName = 0;.  
12e70 69 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74  int iDb;.  sqlit
12e80 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
12e90 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  >db;..  if( pPar
12ea0 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20  se->nVar>0 ){.  
12eb0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
12ec0 67 28 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d  g(pParse, "param
12ed0 65 74 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c  eters are not al
12ee0 6c 6f 77 65 64 20 69 6e 20 76 69 65 77 73 22 29  lowed in views")
12ef0 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74  ;.    goto creat
12f00 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20 7d  e_view_fail;.  }
12f10 0a 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  .  sqlite3StartT
12f20 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61  able(pParse, pNa
12f30 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54  me1, pName2, isT
12f40 65 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72  emp, 1, 0, noErr
12f50 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  );.  p = pParse-
12f60 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
12f70 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  ( p==0 || pParse
12f80 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 63 72  ->nErr ) goto cr
12f90 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a  eate_view_fail;.
12fa0 20 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74    sqlite3TwoPart
12fb0 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
12fc0 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e  me1, pName2, &pN
12fd0 61 6d 65 29 3b 0a 20 20 69 44 62 20 3d 20 73 71  ame);.  iDb = sq
12fe0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
12ff0 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d  ex(db, p->pSchem
13000 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 78  a);.  sqlite3Fix
13010 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72  Init(&sFix, pPar
13020 73 65 2c 20 69 44 62 2c 20 22 76 69 65 77 22 2c  se, iDb, "view",
13030 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73   pName);.  if( s
13040 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74 28  qlite3FixSelect(
13050 26 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29 20  &sFix, pSelect) 
13060 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69  ) goto create_vi
13070 65 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4d  ew_fail;..  /* M
13080 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
13090 65 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20  e entire SELECT 
130a0 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64  statement that d
130b0 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e  efines the view.
130c0 0a 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  .  ** This will 
130d0 66 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78  force all the Ex
130e0 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65  pr.token.z value
130f0 73 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61  s to be dynamica
13100 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  lly.  ** allocat
13110 65 64 20 72 61 74 68 65 72 20 74 68 61 6e 20 70  ed rather than p
13120 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75  oint to the inpu
13130 74 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68  t string - which
13140 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a   means that.  **
13150 20 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69   they will persi
13160 73 74 20 61 66 74 65 72 20 74 68 65 20 63 75 72  st after the cur
13170 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65  rent sqlite3_exe
13180 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  c() call returns
13190 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 4e 5f  ..  */.  if( IN_
131a0 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
131b0 0a 20 20 20 20 70 2d 3e 70 53 65 6c 65 63 74 20  .    p->pSelect 
131c0 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 70  = pSelect;.    p
131d0 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 7d 65  Select = 0;.  }e
131e0 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 70 53 65 6c  lse{.    p->pSel
131f0 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
13200 65 63 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65  ectDup(db, pSele
13210 63 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55  ct, EXPRDUP_REDU
13220 43 45 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 43  CE);.  }.  p->pC
13230 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78  heck = sqlite3Ex
13240 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 43  prListDup(db, pC
13250 4e 61 6d 65 73 2c 20 45 58 50 52 44 55 50 5f 52  Names, EXPRDUP_R
13260 45 44 55 43 45 29 3b 0a 20 20 69 66 28 20 64 62  EDUCE);.  if( db
13270 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
13280 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65   goto create_vie
13290 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4c 6f  w_fail;..  /* Lo
132a0 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20  cate the end of 
132b0 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20  the CREATE VIEW 
132c0 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65  statement.  Make
132d0 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20   sEnd point to. 
132e0 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a   ** the end..  *
132f0 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73  /.  sEnd = pPars
13300 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20  e->sLastToken;. 
13310 20 61 73 73 65 72 74 28 20 73 45 6e 64 2e 7a 5b   assert( sEnd.z[
13320 30 5d 21 3d 30 20 7c 7c 20 73 45 6e 64 2e 6e 3d  0]!=0 || sEnd.n=
13330 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 45 6e 64  =0 );.  if( sEnd
13340 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20  .z[0]!=';' ){.  
13350 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64    sEnd.z += sEnd
13360 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e  .n;.  }.  sEnd.n
13370 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74   = 0;.  n = (int
13380 29 28 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69  )(sEnd.z - pBegi
13390 6e 2d 3e 7a 29 3b 0a 20 20 61 73 73 65 72 74 28  n->z);.  assert(
133a0 20 6e 3e 30 20 29 3b 0a 20 20 7a 20 3d 20 70 42   n>0 );.  z = pB
133b0 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65  egin->z;.  while
133c0 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ( sqlite3Isspace
133d0 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b  (z[n-1]) ){ n--;
133e0 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a   }.  sEnd.z = &z
133f0 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20  [n-1];.  sEnd.n 
13400 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73  = 1;..  /* Use s
13410 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29  qlite3EndTable()
13420 20 74 6f 20 61 64 64 20 74 68 65 20 76 69 65 77   to add the view
13430 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   to the SQLITE_M
13440 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20  ASTER table */. 
13450 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
13460 28 70 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e  (pParse, 0, &sEn
13470 64 2c 20 30 2c 20 30 29 3b 0a 0a 63 72 65 61 74  d, 0, 0);..creat
13480 65 5f 76 69 65 77 5f 66 61 69 6c 3a 0a 20 20 73  e_view_fail:.  s
13490 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
134a0 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b  te(db, pSelect);
134b0 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45  .  if( IN_RENAME
134c0 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 73  _OBJECT ){.    s
134d0 71 6c 69 74 65 33 52 65 6e 61 6d 65 45 78 70 72  qlite3RenameExpr
134e0 6c 69 73 74 55 6e 6d 61 70 28 70 50 61 72 73 65  listUnmap(pParse
134f0 2c 20 70 43 4e 61 6d 65 73 29 3b 0a 20 20 7d 0a  , pCNames);.  }.
13500 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
13510 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 4e 61  tDelete(db, pCNa
13520 6d 65 73 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  mes);.  return;.
13530 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
13540 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
13550 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
13560 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
13570 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
13580 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
13590 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ABLE)./*.** The 
135a0 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
135b0 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79  pTable is really
135c0 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69   a VIEW.  Fill i
135d0 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a  n the names of.*
135e0 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  * the columns of
135f0 20 74 68 65 20 76 69 65 77 20 69 6e 20 74 68 65   the view in the
13600 20 70 54 61 62 6c 65 20 73 74 72 75 63 74 75 72   pTable structur
13610 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  e.  Return the n
13620 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f  umber.** of erro
13630 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72  rs.  If an error
13640 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61   is seen leave a
13650 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
13660 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
13670 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
13680 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
13690 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61 72  ames(Parse *pPar
136a0 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  se, Table *pTabl
136b0 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65  e){.  Table *pSe
136c0 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b  lTab;   /* A fak
136d0 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69  e table from whi
136e0 63 68 20 77 65 20 67 65 74 20 74 68 65 20 72 65  ch we get the re
136f0 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65  sult set */.  Se
13700 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20  lect *pSel;     
13710 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53  /* Copy of the S
13720 45 4c 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65  ELECT that imple
13730 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a  ments the view *
13740 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30  /.  int nErr = 0
13750 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
13760 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e  of errors encoun
13770 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  tered */.  int n
13780 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
13790 54 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64  Temporarily hold
137a0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
137b0 63 75 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64  cursors assigned
137c0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
137d0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
137e0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
137f0 6e 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c  nection for mall
13800 6f 63 20 65 72 72 6f 72 73 20 2a 2f 0a 23 69 66  oc errors */.#if
13810 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13820 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
13830 69 6e 74 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23  int rc;.#endif.#
13840 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13850 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
13860 0a 20 20 73 71 6c 69 74 65 33 5f 78 61 75 74 68  .  sqlite3_xauth
13870 20 78 41 75 74 68 3b 20 20 20 20 20 20 20 2f 2a   xAuth;       /*
13880 20 53 61 76 65 64 20 78 41 75 74 68 20 70 6f 69   Saved xAuth poi
13890 6e 74 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  nter */.#endif..
138a0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
138b0 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
138c0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
138d0 54 41 42 4c 45 0a 20 20 64 62 2d 3e 6e 53 63 68  TABLE.  db->nSch
138e0 65 6d 61 4c 6f 63 6b 2b 2b 3b 0a 20 20 72 63 20  emaLock++;.  rc 
138f0 3d 20 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c  = sqlite3VtabCal
13900 6c 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c  lConnect(pParse,
13910 20 70 54 61 62 6c 65 29 3b 0a 20 20 64 62 2d 3e   pTable);.  db->
13920 6e 53 63 68 65 6d 61 4c 6f 63 6b 2d 2d 3b 0a 20  nSchemaLock--;. 
13930 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
13940 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
13950 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
13960 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ble) ) return 0;
13970 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
13980 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
13990 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76  W.  /* A positiv
139a0 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65  e nCol means the
139b0 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66   columns names f
139c0 6f 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65  or this view are
139d0 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e  .  ** already kn
139e0 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  own..  */.  if( 
139f0 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29  pTable->nCol>0 )
13a00 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
13a10 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c   A negative nCol
13a20 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61   is a special ma
13a30 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61  rker meaning tha
13a40 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74  t we are current
13a50 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74  ly.  ** trying t
13a60 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  o compute the co
13a70 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20  lumn names.  If 
13a80 77 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f  we enter this ro
13a90 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20  utine with.  ** 
13aa0 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c  a negative nCol,
13ab0 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72   it means two or
13ac0 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d   more views form
13ad0 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68   a loop, like th
13ae0 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
13af0 20 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e    CREATE VIEW on
13b00 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  e AS SELECT * FR
13b10 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20  OM two;.  **    
13b20 20 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f   CREATE VIEW two
13b30 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
13b40 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  M one;.  **.  **
13b50 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 65   Actually, the e
13b60 72 72 6f 72 20 61 62 6f 76 65 20 69 73 20 6e 6f  rror above is no
13b70 77 20 63 61 75 67 68 74 20 70 72 69 6f 72 20 74  w caught prior t
13b80 6f 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20  o reaching this 
13b90 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74 20  point..  ** But 
13ba0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65  the following te
13bb0 73 74 20 69 73 20 73 74 69 6c 6c 20 69 6d 70 6f  st is still impo
13bc0 72 74 61 6e 74 20 61 73 20 69 74 20 64 6f 65 73  rtant as it does
13bd0 20 63 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69 6e   come up.  ** in
13be0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
13bf0 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 43    ** .  **     C
13c00 52 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e  REATE TABLE main
13c10 2e 65 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20 20  .ex1(a);.  **   
13c20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20 56 49    CREATE TEMP VI
13c30 45 57 20 65 78 31 20 41 53 20 53 45 4c 45 43 54  EW ex1 AS SELECT
13c40 20 61 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20 2a   a FROM ex1;.  *
13c50 2a 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  *     SELECT * F
13c60 52 4f 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20 20  ROM temp.ex1;.  
13c70 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
13c80 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73  >nCol<0 ){.    s
13c90 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
13ca0 50 61 72 73 65 2c 20 22 76 69 65 77 20 25 73 20  Parse, "view %s 
13cb0 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65  is circularly de
13cc0 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e  fined", pTable->
13cd0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
13ce0 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 1;.  }.  asse
13cf0 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  rt( pTable->nCol
13d00 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  >=0 );..  /* If 
13d10 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c  we get this far,
13d20 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65   it means we nee
13d30 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  d to compute the
13d40 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20   table names..  
13d50 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
13d60 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
13d70 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
13d80 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20  t() will expand 
13d90 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65  any.  ** "*" ele
13da0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73  ments in the res
13db0 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65 20  ults set of the 
13dc0 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73  view and will as
13dd0 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a  sign cursors.  *
13de0 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74  * to the element
13df0 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  s of the FROM cl
13e00 61 75 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f  ause.  But we do
13e10 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20   not want these 
13e20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20  changes.  ** to 
13e30 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53  be permanent.  S
13e40 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f  o the computatio
13e50 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63  n is done on a c
13e60 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
13e70 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  T.  ** statement
13e80 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
13e90 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61  e view..  */.  a
13ea0 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70  ssert( pTable->p
13eb0 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65 6c  Select );.  pSel
13ec0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
13ed0 44 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e  Dup(db, pTable->
13ee0 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69  pSelect, 0);.  i
13ef0 66 28 20 70 53 65 6c 20 29 7b 0a 23 69 66 6e 64  f( pSel ){.#ifnd
13f00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
13f10 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20 75 38  LTERTABLE.    u8
13f20 20 65 50 61 72 73 65 4d 6f 64 65 20 3d 20 70 50   eParseMode = pP
13f30 61 72 73 65 2d 3e 65 50 61 72 73 65 4d 6f 64 65  arse->eParseMode
13f40 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 65 50  ;.    pParse->eP
13f50 61 72 73 65 4d 6f 64 65 20 3d 20 50 41 52 53 45  arseMode = PARSE
13f60 5f 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3b 0a 23 65  _MODE_NORMAL;.#e
13f70 6e 64 69 66 0a 20 20 20 20 6e 20 3d 20 70 50 61  ndif.    n = pPa
13f80 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73  rse->nTab;.    s
13f90 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
13fa0 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
13fb0 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a  e, pSel->pSrc);.
13fc0 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
13fd0 20 3d 20 2d 31 3b 0a 20 20 20 20 64 62 2d 3e 6c   = -1;.    db->l
13fe0 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c  ookaside.bDisabl
13ff0 65 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  e++;.#ifndef SQL
14000 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
14010 5a 41 54 49 4f 4e 0a 20 20 20 20 78 41 75 74 68  ZATION.    xAuth
14020 20 3d 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20   = db->xAuth;.  
14030 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b    db->xAuth = 0;
14040 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73  .    pSelTab = s
14050 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
14060 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
14070 70 53 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 78  pSel);.    db->x
14080 41 75 74 68 20 3d 20 78 41 75 74 68 3b 0a 23 65  Auth = xAuth;.#e
14090 6c 73 65 0a 20 20 20 20 70 53 65 6c 54 61 62 20  lse.    pSelTab 
140a0 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  = sqlite3ResultS
140b0 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
140c0 65 2c 20 70 53 65 6c 29 3b 0a 23 65 6e 64 69 66  e, pSel);.#endif
140d0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61  .    pParse->nTa
140e0 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70  b = n;.    if( p
140f0 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 20 29 7b  Table->pCheck ){
14100 0a 20 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45  .      /* CREATE
14110 20 56 49 45 57 20 6e 61 6d 65 28 61 72 67 6c 69   VIEW name(argli
14120 73 74 29 20 41 53 20 2e 2e 2e 0a 20 20 20 20 20  st) AS ....     
14130 20 2a 2a 20 54 68 65 20 6e 61 6d 65 73 20 6f 66   ** The names of
14140 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   the columns in 
14150 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 74 61  the table are ta
14160 6b 65 6e 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a  ken from.      *
14170 2a 20 61 72 67 6c 69 73 74 20 77 68 69 63 68 20  * arglist which 
14180 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 54 61  is stored in pTa
14190 62 6c 65 2d 3e 70 43 68 65 63 6b 2e 20 20 54 68  ble->pCheck.  Th
141a0 65 20 70 43 68 65 63 6b 20 66 69 65 6c 64 0a 20  e pCheck field. 
141b0 20 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 6c 79       ** normally
141c0 20 68 6f 6c 64 73 20 43 48 45 43 4b 20 63 6f 6e   holds CHECK con
141d0 73 74 72 61 69 6e 74 73 20 6f 6e 20 61 6e 20 6f  straints on an o
141e0 72 64 69 6e 61 72 79 20 74 61 62 6c 65 2c 20 62  rdinary table, b
141f0 75 74 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20  ut for.      ** 
14200 61 20 56 49 45 57 20 69 74 20 68 6f 6c 64 73 20  a VIEW it holds 
14210 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  the list of colu
14220 6d 6e 20 6e 61 6d 65 73 2e 0a 20 20 20 20 20 20  mn names..      
14230 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
14240 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
14250 69 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ist(pParse, pTab
14260 6c 65 2d 3e 70 43 68 65 63 6b 2c 20 0a 20 20 20  le->pCheck, .   
14270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
14290 54 61 62 6c 65 2d 3e 6e 43 6f 6c 2c 20 26 70 54  Table->nCol, &pT
142a0 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20  able->aCol);.   
142b0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
142c0 63 46 61 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20  cFailed==0 .    
142d0 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45     && pParse->nE
142e0 72 72 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20  rr==0.       && 
142f0 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 70 53  pTable->nCol==pS
14300 65 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  el->pEList->nExp
14310 72 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  r.      ){.     
14320 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
14330 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
14340 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65  Collation(pParse
14350 2c 20 70 54 61 62 6c 65 2c 20 70 53 65 6c 29 3b  , pTable, pSel);
14360 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
14370 73 65 20 69 66 28 20 70 53 65 6c 54 61 62 20 29  se if( pSelTab )
14380 7b 0a 20 20 20 20 20 20 2f 2a 20 43 52 45 41 54  {.      /* CREAT
14390 45 20 56 49 45 57 20 6e 61 6d 65 20 41 53 2e 2e  E VIEW name AS..
143a0 2e 20 20 77 69 74 68 6f 75 74 20 61 6e 20 61 72  .  without an ar
143b0 67 75 6d 65 6e 74 20 6c 69 73 74 2e 20 20 43 6f  gument list.  Co
143c0 6e 73 74 72 75 63 74 0a 20 20 20 20 20 20 2a 2a  nstruct.      **
143d0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
143e0 73 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43  s from the SELEC
143f0 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
14400 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65   defines the vie
14410 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  w..      */.    
14420 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
14430 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
14440 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
14450 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
14460 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61  .      pTable->a
14470 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61  Col = pSelTab->a
14480 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54  Col;.      pSelT
14490 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
144a0 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f      pSelTab->aCo
144b0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  l = 0;.      ass
144c0 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
144d0 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
144e0 30 2c 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65  0, pTable->pSche
144f0 6d 61 29 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ma) );.    }else
14500 7b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  {.      pTable->
14510 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nCol = 0;.      
14520 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nErr++;.    }.  
14530 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
14540 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62  able(db, pSelTab
14550 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
14560 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
14570 53 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f  Sel);.    db->lo
14580 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65  okaside.bDisable
14590 2d 2d 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  --;.#ifndef SQLI
145a0 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42  TE_OMIT_ALTERTAB
145b0 4c 45 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 65  LE.    pParse->e
145c0 50 61 72 73 65 4d 6f 64 65 20 3d 20 65 50 61 72  ParseMode = ePar
145d0 73 65 4d 6f 64 65 3b 0a 23 65 6e 64 69 66 0a 20  seMode;.#endif. 
145e0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45   } else {.    nE
145f0 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rr++;.  }.  pTab
14600 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68  le->pSchema->sch
14610 65 6d 61 46 6c 61 67 73 20 7c 3d 20 44 42 5f 55  emaFlags |= DB_U
14620 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 20 20 69  nresetViews;.  i
14630 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
14640 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  led ){.    sqlit
14650 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61  e3DeleteColumnNa
14660 6d 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  mes(db, pTable);
14670 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f  .    pTable->aCo
14680 6c 20 3d 20 30 3b 0a 20 20 20 20 70 54 61 62 6c  l = 0;.    pTabl
14690 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d  e->nCol = 0;.  }
146a0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
146b0 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20  E_OMIT_VIEW */. 
146c0 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a   return nErr;  .
146d0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
146e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
146f0 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
14700 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
14710 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a  IRTUALTABLE) */.
14720 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14730 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20  OMIT_VIEW./*.** 
14740 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e  Clear the column
14750 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72   names from ever
14760 79 20 56 49 45 57 20 69 6e 20 64 61 74 61 62 61  y VIEW in databa
14770 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69  se idx..*/.stati
14780 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65  c void sqliteVie
14790 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65  wResetAll(sqlite
147a0 33 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b  3 *db, int idx){
147b0 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a  .  HashElem *i;.
147c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
147d0 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
147e0 28 64 62 2c 20 69 64 78 2c 20 30 29 20 29 3b 0a  (db, idx, 0) );.
147f0 20 20 69 66 28 20 21 44 62 48 61 73 50 72 6f 70    if( !DbHasProp
14800 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42  erty(db, idx, DB
14810 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 20 29  _UnresetViews) )
14820 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
14830 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
14840 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70  (&db->aDb[idx].p
14850 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29  Schema->tblHash)
14860 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68  ; i;i=sqliteHash
14870 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61  Next(i)){.    Ta
14880 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
14890 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
148a0 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
148b0 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71  lect ){.      sq
148c0 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d  lite3DeleteColum
148d0 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62 29  nNames(db, pTab)
148e0 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43  ;.      pTab->aC
148f0 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 54  ol = 0;.      pT
14900 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
14910 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61    }.  }.  DbClea
14920 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64  rProperty(db, id
14930 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  x, DB_UnresetVie
14940 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  ws);.}.#else.# d
14950 65 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77  efine sqliteView
14960 52 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65  ResetAll(A,B).#e
14970 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
14980 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a  MIT_VIEW */../*.
14990 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
149a0 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
149b0 65 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74  e VDBE to adjust
149c0 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63   the internal sc
149d0 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20  hema.** used by 
149e0 53 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20  SQLite when the 
149f0 62 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65  btree layer move
14a00 73 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70  s a table root p
14a10 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74  age. The.** root
14a20 2d 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65  -page of a table
14a30 20 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74   or index in dat
14a40 61 62 61 73 65 20 69 44 62 20 68 61 73 20 63 68  abase iDb has ch
14a50 61 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d  anged from iFrom
14a60 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a  .** to iTo..**.*
14a70 2a 20 54 69 63 6b 65 74 20 23 31 37 32 38 3a 20  * Ticket #1728: 
14a80 20 54 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c   The symbol tabl
14a90 65 20 6d 69 67 68 74 20 73 74 69 6c 6c 20 63 6f  e might still co
14aa0 6e 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ntain informatio
14ab0 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61  n.** on tables a
14ac0 6e 64 2f 6f 72 20 69 6e 64 69 63 65 73 20 74 68  nd/or indices th
14ad0 61 74 20 61 72 65 20 74 68 65 20 70 72 6f 63 65  at are the proce
14ae0 73 73 20 6f 66 20 62 65 69 6e 67 20 64 65 6c 65  ss of being dele
14af0 74 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61  ted..** If you a
14b00 72 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20  re unlucky, one 
14b10 6f 66 20 74 68 6f 73 65 20 64 65 6c 65 74 65 64  of those deleted
14b20 20 69 6e 64 69 63 65 73 20 6f 72 20 74 61 62 6c   indices or tabl
14b30 65 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65  es might.** have
14b40 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 70 61   the same rootpa
14b50 67 65 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65  ge number as the
14b60 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 69   real table or i
14b70 6e 64 65 78 20 74 68 61 74 20 69 73 0a 2a 2a 20  ndex that is.** 
14b80 62 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f  being moved.  So
14b90 20 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20   we cannot stop 
14ba0 73 65 61 72 63 68 69 6e 67 20 61 66 74 65 72 20  searching after 
14bb0 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20  the first match 
14bc0 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20  .** because the 
14bd0 66 69 72 73 74 20 6d 61 74 63 68 20 6d 69 67 68  first match migh
14be0 74 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20  t be for one of 
14bf0 74 68 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69  the deleted indi
14c00 63 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73  ces.** or tables
14c10 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 62   and not the tab
14c20 6c 65 2f 69 6e 64 65 78 20 74 68 61 74 20 69 73  le/index that is
14c30 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20   actually being 
14c40 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73  moved..** We mus
14c50 74 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69  t continue loopi
14c60 6e 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62  ng until all tab
14c70 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20  les and indices 
14c80 77 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65  with.** rootpage
14c90 3d 3d 69 46 72 6f 6d 20 68 61 76 65 20 62 65 65  ==iFrom have bee
14ca0 6e 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 68  n converted to h
14cb0 61 76 65 20 61 20 72 6f 6f 74 70 61 67 65 20 6f  ave a rootpage o
14cc0 66 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65  f iTo.** in orde
14cd0 72 20 74 6f 20 62 65 20 63 65 72 74 61 69 6e 20  r to be certain 
14ce0 74 68 61 74 20 77 65 20 67 6f 74 20 74 68 65 20  that we got the 
14cf0 72 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69  right one..*/.#i
14d00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14d10 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69  T_AUTOVACUUM.voi
14d20 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67  d sqlite3RootPag
14d30 65 4d 6f 76 65 64 28 73 71 6c 69 74 65 33 20 2a  eMoved(sqlite3 *
14d40 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74  db, int iDb, int
14d50 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29   iFrom, int iTo)
14d60 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45  {.  HashElem *pE
14d70 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61  lem;.  Hash *pHa
14d80 73 68 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a  sh;.  Db *pDb;..
14d90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
14da0 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
14db0 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
14dc0 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
14dd0 5b 69 44 62 5d 3b 0a 20 20 70 48 61 73 68 20 3d  [iDb];.  pHash =
14de0 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e   &pDb->pSchema->
14df0 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70  tblHash;.  for(p
14e00 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
14e10 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c  irst(pHash); pEl
14e20 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65  em; pElem=sqlite
14e30 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
14e40 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
14e50 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
14e60 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69  ta(pElem);.    i
14e70 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69  f( pTab->tnum==i
14e80 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54  From ){.      pT
14e90 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a  ab->tnum = iTo;.
14ea0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73      }.  }.  pHas
14eb0 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d  h = &pDb->pSchem
14ec0 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f  a->idxHash;.  fo
14ed0 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
14ee0 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20  shFirst(pHash); 
14ef0 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c  pElem; pElem=sql
14f00 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65  iteHashNext(pEle
14f10 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  m)){.    Index *
14f20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73  pIdx = sqliteHas
14f30 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
14f40 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d    if( pIdx->tnum
14f50 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
14f60 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54   pIdx->tnum = iT
14f70 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  o;.    }.  }.}.#
14f80 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  endif../*.** Wri
14f90 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65  te code to erase
14fa0 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
14fb0 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65  root-page iTable
14fc0 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69   from database i
14fd0 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74  Db..** Also writ
14fe0 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79  e code to modify
14ff0 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
15000 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74  er table and int
15010 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20  ernal schema.** 
15020 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f  if a root-page o
15030 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20  f another table 
15040 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20  is moved by the 
15050 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c  btree-layer whil
15060 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54  st.** erasing iT
15070 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68  able (this can h
15080 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75  appen with an au
15090 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
150a0 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  se)..*/ .static 
150b0 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74  void destroyRoot
150c0 50 61 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  Page(Parse *pPar
150d0 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  se, int iTable, 
150e0 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65  int iDb){.  Vdbe
150f0 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
15100 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
15110 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
15120 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
15130 65 29 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65  e);.  if( iTable
15140 3c 32 20 29 20 73 71 6c 69 74 65 33 45 72 72 6f  <2 ) sqlite3Erro
15150 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f  rMsg(pParse, "co
15160 72 72 75 70 74 20 73 63 68 65 6d 61 22 29 3b 0a  rrupt schema");.
15170 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15180 4f 70 33 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f  Op3(v, OP_Destro
15190 79 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 69  y, iTable, r1, i
151a0 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61  Db);.  sqlite3Ma
151b0 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a  yAbort(pParse);.
151c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
151d0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
151e0 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 73   /* OP_Destroy s
151f0 74 6f 72 65 73 20 61 6e 20 69 6e 20 69 6e 74 65  tores an in inte
15200 67 65 72 20 72 31 2e 20 49 66 20 74 68 69 73 20  ger r1. If this 
15210 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73 20  integer.  ** is 
15220 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69  non-zero, then i
15230 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61  t is the root pa
15240 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 74  ge number of a t
15250 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20  able moved to.  
15260 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62  ** location iTab
15270 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  le. The followin
15280 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73 20  g code modifies 
15290 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
152a0 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20  r table to.  ** 
152b0 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20 20  reflect this..  
152c0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 4e 4e  **.  ** The "#NN
152d0 4e 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73  N" in the SQL is
152e0 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74   a special const
152f0 61 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77  ant that means w
15300 68 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20  hatever value.  
15310 2a 2a 20 69 73 20 69 6e 20 72 65 67 69 73 74 65  ** is in registe
15320 72 20 4e 4e 4e 2e 20 20 53 65 65 20 67 72 61 6d  r NNN.  See gram
15330 6d 61 72 20 72 75 6c 65 73 20 61 73 73 6f 63 69  mar rules associ
15340 61 74 65 64 20 77 69 74 68 20 74 68 65 20 54 4b  ated with the TK
15350 5f 52 45 47 49 53 54 45 52 0a 20 20 2a 2a 20 74  _REGISTER.  ** t
15360 6f 6b 65 6e 20 66 6f 72 20 61 64 64 69 74 69 6f  oken for additio
15370 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
15380 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e  .  */.  sqlite3N
15390 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
153a0 65 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54 45  e, .     "UPDATE
153b0 20 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74 70   %Q.%s SET rootp
153c0 61 67 65 3d 25 64 20 57 48 45 52 45 20 23 25 64  age=%d WHERE #%d
153d0 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 25   AND rootpage=#%
153e0 64 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d  d",.     pParse-
153f0 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44  >db->aDb[iDb].zD
15400 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e  bSName, MASTER_N
15410 41 4d 45 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c  AME, iTable, r1,
15420 20 72 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73   r1);.#endif.  s
15430 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
15440 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
15450 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
15460 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72   VDBE code to er
15470 61 73 65 20 74 61 62 6c 65 20 70 54 61 62 20 61  ase table pTab a
15480 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65  nd all associate
15490 64 20 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73  d indices on dis
154a0 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70  k..** Code to up
154b0 64 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f  date the sqlite_
154c0 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e  master tables an
154d0 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  d internal schem
154e0 61 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a  a definitions.**
154f0 20 69 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d   in case a root-
15500 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74  page belonging t
15510 6f 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20  o another table 
15520 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20  is moved by the 
15530 62 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69  btree layer.** i
15540 73 20 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68  s also added (th
15550 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69  is can happen wi
15560 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  th an auto-vacuu
15570 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a  m database)..*/.
15580 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74  static void dest
15590 72 6f 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a  royTable(Parse *
155a0 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
155b0 54 61 62 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68  Tab){.  /* If th
155c0 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 62  e database may b
155d0 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61  e auto-vacuum ca
155e0 70 61 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45  pable (if SQLITE
155f0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
15600 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66  .  ** is not def
15610 69 6e 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69  ined), then it i
15620 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63  s important to c
15630 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f  all OP_Destroy o
15640 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65  n the.  ** table
15650 20 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d   and index root-
15660 70 61 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20  pages in order, 
15670 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68  starting with th
15680 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20  e numerically . 
15690 20 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74   ** largest root
156a0 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68  -page number. Th
156b0 69 73 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  is guarantees th
156c0 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72  at none of the r
156d0 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74  oot-pages.  ** t
156e0 6f 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 69  o be destroyed i
156f0 73 20 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61  s relocated by a
15700 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73  n earlier OP_Des
15710 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68  troy. i.e. if th
15720 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  e.  ** following
15730 20 77 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a   were coded:.  *
15740 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f  *.  ** OP_Destro
15750 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20  y 4 0.  ** .... 
15760 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35   ** OP_Destroy 5
15770 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64   0.  **.  ** and
15780 20 72 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70   root page 5 hap
15790 70 65 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20  pened to be the 
157a0 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
157b0 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a  e number in the.
157c0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74    ** database, t
157d0 68 65 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20  hen root page 5 
157e0 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74  would be moved t
157f0 6f 20 70 61 67 65 20 34 20 62 79 20 74 68 65 20  o page 4 by the 
15800 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f  .  ** "OP_Destro
15810 79 20 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54  y 4 0" opcode. T
15820 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f  he subsequent "O
15830 50 5f 44 65 73 74 72 6f 79 20 35 20 30 22 20 77  P_Destroy 5 0" w
15840 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20  ould hit.  ** a 
15850 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a  free-list page..
15860 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20    */.  int iTab 
15870 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20  = pTab->tnum;.  
15880 69 6e 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d  int iDestroyed =
15890 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20   0;..  while( 1 
158a0 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
158b0 64 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72  dx;.    int iLar
158c0 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69  gest = 0;..    i
158d0 66 28 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30  f( iDestroyed==0
158e0 20 7c 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f   || iTab<iDestro
158f0 79 65 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61  yed ){.      iLa
15900 72 67 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20  rgest = iTab;.  
15910 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78    }.    for(pIdx
15920 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
15930 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
15940 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
15950 74 20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74  t iIdx = pIdx->t
15960 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  num;.      asser
15970 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61  t( pIdx->pSchema
15980 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ==pTab->pSchema 
15990 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 44  );.      if( (iD
159a0 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28  estroyed==0 || (
159b0 69 49 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29  iIdx<iDestroyed)
159c0 29 20 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65  ) && iIdx>iLarge
159d0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c  st ){.        iL
159e0 61 72 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20  argest = iIdx;. 
159f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
15a00 20 69 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30   if( iLargest==0
15a10 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
15a20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15a30 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
15a40 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
15a50 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
15a60 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
15a70 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3e      assert( iDb>
15a80 3d 30 20 26 26 20 69 44 62 3c 70 50 61 72 73 65  =0 && iDb<pParse
15a90 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20  ->db->nDb );.   
15aa0 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61     destroyRootPa
15ab0 67 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67  ge(pParse, iLarg
15ac0 65 73 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  est, iDb);.     
15ad0 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c   iDestroyed = iL
15ae0 61 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20  argest;.    }.  
15af0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  }.}../*.** Remov
15b00 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74  e entries from t
15b10 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20  he sqlite_statN 
15b20 74 61 62 6c 65 73 20 28 66 6f 72 20 4e 20 69 6e  tables (for N in
15b30 20 28 31 2c 32 2c 33 29 29 0a 2a 2a 20 61 66 74   (1,2,3)).** aft
15b40 65 72 20 61 20 44 52 4f 50 20 49 4e 44 45 58 20  er a DROP INDEX 
15b50 6f 72 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6f  or DROP TABLE co
15b60 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  mmand..*/.static
15b70 20 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65   void sqlite3Cle
15b80 61 72 53 74 61 74 54 61 62 6c 65 73 28 0a 20 20  arStatTables(.  
15b90 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
15ba0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
15bb0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
15bc0 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20  .  int iDb,     
15bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15be0 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   database number
15bf0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
15c00 20 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a 20   *zType,     /* 
15c10 22 69 64 78 22 20 6f 72 20 22 74 62 6c 22 20 2a  "idx" or "tbl" *
15c20 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
15c30 7a 4e 61 6d 65 20 20 20 20 20 20 2f 2a 20 4e 61  zName      /* Na
15c40 6d 65 20 6f 66 20 69 6e 64 65 78 20 6f 72 20 74  me of index or t
15c50 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  able */.){.  int
15c60 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   i;.  const char
15c70 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 70 50 61 72   *zDbName = pPar
15c80 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
15c90 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 66 6f 72  .zDbSName;.  for
15ca0 28 69 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b 2b 29  (i=1; i<=4; i++)
15cb0 7b 0a 20 20 20 20 63 68 61 72 20 7a 54 61 62 5b  {.    char zTab[
15cc0 32 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  24];.    sqlite3
15cd0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
15ce0 28 7a 54 61 62 29 2c 7a 54 61 62 2c 22 73 71 6c  (zTab),zTab,"sql
15cf0 69 74 65 5f 73 74 61 74 25 64 22 2c 69 29 3b 0a  ite_stat%d",i);.
15d00 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
15d10 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d  indTable(pParse-
15d20 3e 64 62 2c 20 7a 54 61 62 2c 20 7a 44 62 4e 61  >db, zTab, zDbNa
15d30 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  me) ){.      sql
15d40 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
15d50 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
15d60 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
15d70 25 73 20 57 48 45 52 45 20 25 73 3d 25 51 22 2c  %s WHERE %s=%Q",
15d80 0a 20 20 20 20 20 20 20 20 7a 44 62 4e 61 6d 65  .        zDbName
15d90 2c 20 7a 54 61 62 2c 20 7a 54 79 70 65 2c 20 7a  , zTab, zType, z
15da0 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  Name.      );.  
15db0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
15dc0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
15dd0 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65 2e 0a  o drop a table..
15de0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
15df0 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 50 61 72  odeDropTable(Par
15e00 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
15e10 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 44 62  e *pTab, int iDb
15e20 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20  , int isView){. 
15e30 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
15e40 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
15e50 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67 65 72 20  ->db;.  Trigger 
15e60 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 44 62 20  *pTrigger;.  Db 
15e70 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
15e80 69 44 62 5d 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  iDb];..  v = sql
15e90 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
15ea0 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  se);.  assert( v
15eb0 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
15ec0 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
15ed0 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
15ee0 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  Db);..#ifndef SQ
15ef0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
15f00 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56  LTABLE.  if( IsV
15f10 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
15f20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15f30 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67  ddOp0(v, OP_VBeg
15f40 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  in);.  }.#endif.
15f50 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74  .  /* Drop all t
15f60 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74  riggers associat
15f70 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
15f80 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e  e being dropped.
15f90 20 43 6f 64 65 0a 20 20 2a 2a 20 69 73 20 67 65   Code.  ** is ge
15fa0 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76  nerated to remov
15fb0 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73  e entries from s
15fc0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64  qlite_master and
15fd0 2f 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f  /or.  ** sqlite_
15fe0 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72  temp_master if r
15ff0 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20  equired..  */.  
16000 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74  pTrigger = sqlit
16010 65 33 54 72 69 67 67 65 72 4c 69 73 74 28 70 50  e3TriggerList(pP
16020 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 77  arse, pTab);.  w
16030 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20 29  hile( pTrigger )
16040 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  {.    assert( pT
16050 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d  rigger->pSchema=
16060 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c  =pTab->pSchema |
16070 7c 20 0a 20 20 20 20 20 20 20 20 70 54 72 69 67  | .        pTrig
16080 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62  ger->pSchema==db
16090 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
160a0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   );.    sqlite3D
160b0 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50  ropTriggerPtr(pP
160c0 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b  arse, pTrigger);
160d0 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20  .    pTrigger = 
160e0 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b  pTrigger->pNext;
160f0 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
16100 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
16110 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d  CREMENT.  /* Rem
16120 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20  ove any entries 
16130 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65  of the sqlite_se
16140 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73  quence table ass
16150 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20 20 2a  ociated with.  *
16160 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * the table bein
16170 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20  g dropped. This 
16180 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74  is done before t
16190 68 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70  he table is drop
161a0 70 65 64 0a 20 20 2a 2a 20 61 74 20 74 68 65 20  ped.  ** at the 
161b0 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20  btree level, in 
161c0 63 61 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  case the sqlite_
161d0 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 6e  sequence table n
161e0 65 65 64 73 20 74 6f 0a 20 20 2a 2a 20 6d 6f 76  eeds to.  ** mov
161f0 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  e as a result of
16200 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e 20 68   the drop (can h
16210 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61  appen in auto-va
16220 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 2a 2f  cuum mode)..  */
16230 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62  .  if( pTab->tab
16240 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69  Flags & TF_Autoi
16250 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  ncrement ){.    
16260 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
16270 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
16280 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
16290 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  .sqlite_sequence
162a0 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c   WHERE name=%Q",
162b0 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53  .      pDb->zDbS
162c0 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
162d0 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e  e.    );.  }.#en
162e0 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61  dif..  /* Drop a
162f0 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ll SQLITE_MASTER
16300 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
16310 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65   entries that re
16320 66 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  fer to the.  ** 
16330 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72  table. The progr
16340 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68  am name loops th
16350 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72  rough the master
16360 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74   table and delet
16370 65 73 0a 20 20 2a 2a 20 65 76 65 72 79 20 72 6f  es.  ** every ro
16380 77 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  w that refers to
16390 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20   a table of the 
163a0 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
163b0 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20   one being.  ** 
163c0 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72  dropped. Trigger
163d0 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65  s are handled se
163e0 70 61 72 61 74 65 6c 79 20 62 65 63 61 75 73 65  parately because
163f0 20 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62   a trigger can b
16400 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69  e.  ** created i
16410 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  n the temp datab
16420 61 73 65 20 74 68 61 74 20 72 65 66 65 72 73 20  ase that refers 
16430 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e  to a table in an
16440 6f 74 68 65 72 0a 20 20 2a 2a 20 64 61 74 61 62  other.  ** datab
16450 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ase..  */.  sqli
16460 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
16470 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 44  Parse, .      "D
16480 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73  ELETE FROM %Q.%s
16490 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d   WHERE tbl_name=
164a0 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72  %Q and type!='tr
164b0 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 70  igger'",.      p
164c0 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41  Db->zDbSName, MA
164d0 53 54 45 52 5f 4e 41 4d 45 2c 20 70 54 61 62 2d  STER_NAME, pTab-
164e0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21  >zName);.  if( !
164f0 69 73 56 69 65 77 20 26 26 20 21 49 73 56 69 72  isView && !IsVir
16500 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
16510 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70    destroyTable(p
16520 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20  Parse, pTab);.  
16530 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  }..  /* Remove t
16540 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66  he table entry f
16550 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74  rom SQLite's int
16560 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64  ernal schema and
16570 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68 65   modify.  ** the
16580 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a   schema cookie..
16590 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72    */.  if( IsVir
165a0 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
165b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
165c0 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65 73 74 72  Op4(v, OP_VDestr
165d0 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70  oy, iDb, 0, 0, p
165e0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Tab->zName, 0);.
165f0 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62      sqlite3MayAb
16600 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  ort(pParse);.  }
16610 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
16620 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54  dOp4(v, OP_DropT
16630 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c  able, iDb, 0, 0,
16640 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
16650 3b 0a 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67  ;.  sqlite3Chang
16660 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
16670 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 56 69  iDb);.  sqliteVi
16680 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69  ewResetAll(db, i
16690 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Db);.}../*.** Th
166a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
166b0 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77  lled to do the w
166c0 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41  ork of a DROP TA
166d0 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
166e0 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e  * pName is the n
166f0 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
16700 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a   to be dropped..
16710 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
16720 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a  ropTable(Parse *
16730 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
16740 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69  *pName, int isVi
16750 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a  ew, int noErr){.
16760 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
16770 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
16780 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
16790 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b  ->db;.  int iDb;
167a0 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ..  if( db->mall
167b0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
167c0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
167d0 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  able;.  }.  asse
167e0 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  rt( pParse->nErr
167f0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
16800 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20   pName->nSrc==1 
16810 29 3b 0a 20 20 69 66 28 20 21 49 73 53 68 61 72  );.  if( !IsShar
16820 65 64 53 63 68 65 6d 61 28 64 62 29 20 26 26 20  edSchema(db) && 
16830 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
16840 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f  a(pParse) ) goto
16850 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
16860 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20  ;.  if( noErr ) 
16870 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72 2b  db->suppressErr+
16880 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 56  +;.  assert( isV
16890 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69 65 77  iew==0 || isView
168a0 3d 3d 4c 4f 43 41 54 45 5f 56 49 45 57 20 29 3b  ==LOCATE_VIEW );
168b0 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
168c0 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d  3LocateTableItem
168d0 28 70 50 61 72 73 65 2c 20 69 73 56 69 65 77 2c  (pParse, isView,
168e0 20 26 70 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a   &pName->a[0]);.
168f0 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64 62    if( noErr ) db
16900 2d 3e 73 75 70 70 72 65 73 73 45 72 72 2d 2d 3b  ->suppressErr--;
16910 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ..  if( pTab==0 
16920 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f 45 72 72  ){.    if( noErr
16930 20 29 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65   ) sqlite3CodeVe
16940 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28  rifyNamedSchema(
16950 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61  pParse, pName->a
16960 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
16970 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
16980 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  op_table;.  }.  
16990 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
169a0 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
169b0 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
169c0 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
169d0 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
169e0 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d  ;.  sqlite3Schem
169f0 61 57 72 69 74 61 62 6c 65 28 70 50 61 72 73 65  aWritable(pParse
16a00 2c 20 69 44 62 29 3b 0a 0a 20 20 2f 2a 20 49 66  , iDb);..  /* If
16a10 20 70 54 61 62 20 69 73 20 61 20 76 69 72 74 75   pTab is a virtu
16a20 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56  al table, call V
16a30 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
16a40 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a 20 20  s() to ensure.  
16a50 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c  ** it is initial
16a60 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ized..  */.  if(
16a70 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
16a80 20 26 26 20 73 71 6c 69 74 65 33 56 69 65 77 47   && sqlite3ViewG
16a90 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
16aa0 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20  arse, pTab) ){. 
16ab0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
16ac0 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66  p_table;.  }.#if
16ad0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16ae0 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
16af0 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b   {.    int code;
16b00 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
16b10 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
16b20 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 63  ABLE(iDb);.    c
16b30 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
16b40 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44   db->aDb[iDb].zD
16b50 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73  bSName;.    cons
16b60 74 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20  t char *zArg2 = 
16b70 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
16b80 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
16b90 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
16ba0 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29  E, zTab, 0, zDb)
16bb0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
16bc0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
16bd0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56     }.    if( isV
16be0 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28  iew ){.      if(
16bf0 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
16c00 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
16c10 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
16c20 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b  _DROP_TEMP_VIEW;
16c30 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16c40 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
16c50 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20  ITE_DROP_VIEW;. 
16c60 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
16c70 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
16c80 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73  ALTABLE.    }els
16c90 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28  e if( IsVirtual(
16ca0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63  pTab) ){.      c
16cb0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
16cc0 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  P_VTABLE;.      
16cd0 7a 41 72 67 32 20 3d 20 73 71 6c 69 74 65 33 47  zArg2 = sqlite3G
16ce0 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61  etVTable(db, pTa
16cf0 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b  b)->pMod->zName;
16d00 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
16d10 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  e{.      if( !OM
16d20 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
16d30 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
16d40 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
16d50 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20  P_TEMP_TABLE;.  
16d60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16d70 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
16d80 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _DROP_TABLE;.   
16d90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
16da0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
16db0 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
16dc0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
16dd0 41 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Arg2, zDb) ){.  
16de0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
16df0 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
16e00 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
16e10 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
16e20 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
16e30 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20  pTab->zName, 0, 
16e40 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
16e50 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
16e60 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  le;.    }.  }.#e
16e70 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74  ndif.  if( sqlit
16e80 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d  e3StrNICmp(pTab-
16e90 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  >zName, "sqlite_
16ea0 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 26 26  ", 7)==0 .    &&
16eb0 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
16ec0 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73  (pTab->zName, "s
16ed0 71 6c 69 74 65 5f 73 74 61 74 22 2c 20 31 31 29  qlite_stat", 11)
16ee0 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
16ef0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
16f00 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79  e, "table %s may
16f10 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22   not be dropped"
16f20 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
16f30 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
16f40 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23  op_table;.  }..#
16f50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16f60 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73  IT_VIEW.  /* Ens
16f70 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69  ure DROP TABLE i
16f80 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20  s not used on a 
16f90 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56  view, and DROP V
16fa0 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a  IEW is not used.
16fb0 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e    ** on a table.
16fc0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69  .  */.  if( isVi
16fd0 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c  ew && pTab->pSel
16fe0 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ect==0 ){.    sq
16ff0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
17000 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20  arse, "use DROP 
17010 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20  TABLE to delete 
17020 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d  table %s", pTab-
17030 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
17040 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
17050 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73  e;.  }.  if( !is
17060 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53  View && pTab->pS
17070 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
17080 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
17090 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56  rse, "use DROP V
170a0 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69  IEW to delete vi
170b0 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  ew %s", pTab->zN
170c0 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
170d0 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
170e0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
170f0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
17100 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62  o remove the tab
17110 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  le from the mast
17120 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e  er table.  ** on
17130 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20   disk..  */.  v 
17140 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
17150 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
17160 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
17170 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
17180 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
17190 44 62 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73  Db);.    if( !is
171a0 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 73 71  View ){.      sq
171b0 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61  lite3ClearStatTa
171c0 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44 62  bles(pParse, iDb
171d0 2c 20 22 74 62 6c 22 2c 20 70 54 61 62 2d 3e 7a  , "tbl", pTab->z
171e0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Name);.      sql
171f0 69 74 65 33 46 6b 44 72 6f 70 54 61 62 6c 65 28  ite3FkDropTable(
17200 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2c 20 70  pParse, pName, p
17210 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Tab);.    }.    
17220 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f 70 54  sqlite3CodeDropT
17230 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
17240 62 2c 20 69 44 62 2c 20 69 73 56 69 65 77 29 3b  b, iDb, isView);
17250 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f  .  }..exit_drop_
17260 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33  table:.  sqlite3
17270 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
17280 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  , pName);.}../*.
17290 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
172a0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  is called to cre
172b0 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67  ate a new foreig
172c0 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62  n key on the tab
172d0 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  le.** currently 
172e0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
172f0 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65  on.  pFromCol de
17300 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63  termines which c
17310 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
17320 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70   current table p
17330 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65  oint to the fore
17340 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72  ign key.  If pFr
17350 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a  omCol==0 then.**
17360 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79   connect the key
17370 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   to the last col
17380 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70  umn inserted.  p
17390 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  To is the name o
173a0 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72  f.** the table r
173b0 65 66 65 72 72 65 64 20 74 6f 20 28 61 2e 6b 2e  eferred to (a.k.
173c0 61 20 74 68 65 20 22 70 61 72 65 6e 74 22 20 74  a the "parent" t
173d0 61 62 6c 65 29 2e 20 20 70 54 6f 43 6f 6c 20 69  able).  pToCol i
173e0 73 20 61 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 74  s a list.** of t
173f0 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 61 72  ables in the par
17400 65 6e 74 20 70 54 6f 20 74 61 62 6c 65 2e 20 20  ent pTo table.  
17410 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61  flags contains a
17420 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ll.** informatio
17430 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66  n about the conf
17440 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
17450 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69  algorithms speci
17460 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f  fied.** in the O
17470 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44  N DELETE, ON UPD
17480 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52  ATE and ON INSER
17490 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  T clauses..**.**
174a0 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75   An FKey structu
174b0 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  re is created an
174c0 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74  d added to the t
174d0 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a  able currently.*
174e0 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  * under construc
174f0 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72  tion in the pPar
17500 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69  se->pNewTable fi
17510 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  eld..**.** The f
17520 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65  oreign key is se
17530 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20  t for IMMEDIATE 
17540 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73  processing.  A s
17550 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a  ubsequent call.*
17560 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65  * to sqlite3Defe
17570 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69  rForeignKey() mi
17580 67 68 74 20 63 68 61 6e 67 65 20 74 68 69 73 20  ght change this 
17590 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a  to DEFERRED..*/.
175a0 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61  void sqlite3Crea
175b0 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20  teForeignKey(.  
175c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
175d0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
175e0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
175f0 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c  rList *pFromCol,
17600 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20    /* Columns in 
17610 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20  this table that 
17620 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74  point to other t
17630 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  able */.  Token 
17640 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  *pTo,          /
17650 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74  * Name of the ot
17660 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45  her table */.  E
17670 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c  xprList *pToCol,
17680 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69      /* Columns i
17690 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c  n the other tabl
176a0 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
176b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
176c0 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
176d0 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a  on algorithms. *
176e0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
176f0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
17700 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17710 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
17720 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d  .  FKey *pFKey =
17730 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e 65 78   0;.  FKey *pNex
17740 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20  tTo;.  Table *p 
17750 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
17760 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  ble;.  int nByte
17770 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
17780 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a   nCol;.  char *z
17790 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  ;..  assert( pTo
177a0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  !=0 );.  if( p==
177b0 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f  0 || IN_DECLARE_
177c0 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b 5f 65  VTAB ) goto fk_e
177d0 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43  nd;.  if( pFromC
177e0 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ol==0 ){.    int
177f0 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d   iCol = p->nCol-
17800 31 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  1;.    if( NEVER
17810 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74 6f 20  (iCol<0) ) goto 
17820 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20  fk_end;.    if( 
17830 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c  pToCol && pToCol
17840 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20  ->nExpr!=1 ){.  
17850 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
17860 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72  Msg(pParse, "for
17870 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a  eign key on %s".
17880 20 20 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c           " shoul
17890 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79  d reference only
178a0 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   one column of t
178b0 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20  able %T",.      
178c0 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d     p->aCol[iCol]
178d0 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20  .zName, pTo);.  
178e0 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
178f0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20  .    }.    nCol 
17900 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
17910 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f   pToCol && pToCo
17920 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43  l->nExpr!=pFromC
17930 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  ol->nExpr ){.   
17940 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
17950 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
17960 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75   "number of colu
17970 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b  mns in foreign k
17980 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ey does not matc
17990 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  h the number of 
179a0 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d  ".        "colum
179b0 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65  ns in the refere
179c0 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20  nced table");.  
179d0 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
179e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c   }else{.    nCol
179f0 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78   = pFromCol->nEx
17a00 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20  pr;.  }.  nByte 
17a10 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29  = sizeof(*pFKey)
17a20 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65   + (nCol-1)*size
17a30 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30  of(pFKey->aCol[0
17a40 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b  ]) + pTo->n + 1;
17a50 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b  .  if( pToCol ){
17a60 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
17a70 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69  pToCol->nExpr; i
17a80 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65  ++){.      nByte
17a90 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
17aa0 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  n30(pToCol->a[i]
17ab0 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20  .zName) + 1;.   
17ac0 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d   }.  }.  pFKey =
17ad0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
17ae0 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 29  Zero(db, nByte )
17af0 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30  ;.  if( pFKey==0
17b00 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f   ){.    goto fk_
17b10 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b 65 79  end;.  }.  pFKey
17b20 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70  ->pFrom = p;.  p
17b30 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20  FKey->pNextFrom 
17b40 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20  = p->pFKey;.  z 
17b50 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79 2d  = (char*)&pFKey-
17b60 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70  >aCol[nCol];.  p
17b70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20  FKey->zTo = z;. 
17b80 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
17b90 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 73 71 6c  BJECT ){.    sql
17ba0 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d  ite3RenameTokenM
17bb0 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64  ap(pParse, (void
17bc0 2a 29 7a 2c 20 70 54 6f 29 3b 0a 20 20 7d 0a 20  *)z, pTo);.  }. 
17bd0 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e   memcpy(z, pTo->
17be0 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b  z, pTo->n);.  z[
17bf0 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73  pTo->n] = 0;.  s
17c00 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29  qlite3Dequote(z)
17c10 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b  ;.  z += pTo->n+
17c20 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c  1;.  pFKey->nCol
17c30 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70   = nCol;.  if( p
17c40 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  FromCol==0 ){.  
17c50 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d    pFKey->aCol[0]
17c60 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c  .iFrom = p->nCol
17c70 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  -1;.  }else{.   
17c80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
17c90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
17ca0 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
17cb0 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a  =0; j<p->nCol; j
17cc0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
17cd0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
17ce0 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  p->aCol[j].zName
17cf0 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d  , pFromCol->a[i]
17d00 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
17d10 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61          pFKey->a
17d20 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a  Col[i].iFrom = j
17d30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
17d40 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
17d50 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
17d60 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  >=p->nCol ){.   
17d70 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
17d80 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
17d90 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e          "unknown
17da0 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69   column \"%s\" i
17db0 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  n foreign key de
17dc0 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20  finition", .    
17dd0 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e        pFromCol->
17de0 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
17df0 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64       goto fk_end
17e00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17e10 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
17e20 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20  JECT ){.        
17e30 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b  sqlite3RenameTok
17e40 65 6e 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20  enRemap(pParse, 
17e50 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2c  &pFKey->aCol[i],
17e60 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e   pFromCol->a[i].
17e70 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
17e80 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
17e90 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f  pToCol ){.    fo
17ea0 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
17eb0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ++){.      int n
17ec0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
17ed0 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  30(pToCol->a[i].
17ee0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46  zName);.      pF
17ef0 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  Key->aCol[i].zCo
17f00 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 69 66 28  l = z;.      if(
17f10 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
17f20 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  T ){.        sql
17f30 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52  ite3RenameTokenR
17f40 65 6d 61 70 28 70 50 61 72 73 65 2c 20 7a 2c 20  emap(pParse, z, 
17f50 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
17f60 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
17f70 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f     memcpy(z, pTo
17f80 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  Col->a[i].zName,
17f90 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20   n);.      z[n] 
17fa0 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20  = 0;.      z += 
17fb0 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n+1;.    }.  }. 
17fc0 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72   pFKey->isDeferr
17fd0 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d  ed = 0;.  pFKey-
17fe0 3e 61 41 63 74 69 6f 6e 5b 30 5d 20 3d 20 28 75  >aAction[0] = (u
17ff0 38 29 28 66 6c 61 67 73 20 26 20 30 78 66 66 29  8)(flags & 0xff)
18000 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
18010 4f 4e 20 44 45 4c 45 54 45 20 61 63 74 69 6f 6e  ON DELETE action
18020 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63   */.  pFKey->aAc
18030 74 69 6f 6e 5b 31 5d 20 3d 20 28 75 38 29 28 28  tion[1] = (u8)((
18040 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30  flags >> 8 ) & 0
18050 78 66 66 29 3b 20 20 20 20 2f 2a 20 4f 4e 20 55  xff);    /* ON U
18060 50 44 41 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a  PDATE action */.
18070 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
18080 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
18090 64 28 64 62 2c 20 30 2c 20 70 2d 3e 70 53 63 68  d(db, 0, p->pSch
180a0 65 6d 61 29 20 29 3b 0a 20 20 70 4e 65 78 74 54  ema) );.  pNextT
180b0 6f 20 3d 20 28 46 4b 65 79 20 2a 29 73 71 6c 69  o = (FKey *)sqli
180c0 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
180d0 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48  ->pSchema->fkeyH
180e0 61 73 68 2c 20 0a 20 20 20 20 20 20 70 46 4b 65  ash, .      pFKe
180f0 79 2d 3e 7a 54 6f 2c 20 28 76 6f 69 64 20 2a 29  y->zTo, (void *)
18100 70 46 4b 65 79 0a 20 20 29 3b 0a 20 20 69 66 28  pFKey.  );.  if(
18110 20 70 4e 65 78 74 54 6f 3d 3d 70 46 4b 65 79 20   pNextTo==pFKey 
18120 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  ){.    sqlite3Oo
18130 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
18140 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d  goto fk_end;.  }
18150 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f 20 29  .  if( pNextTo )
18160 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
18170 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d  extTo->pPrevTo==
18180 30 20 29 3b 0a 20 20 20 20 70 46 4b 65 79 2d 3e  0 );.    pFKey->
18190 70 4e 65 78 74 54 6f 20 3d 20 70 4e 65 78 74 54  pNextTo = pNextT
181a0 6f 3b 0a 20 20 20 20 70 4e 65 78 74 54 6f 2d 3e  o;.    pNextTo->
181b0 70 50 72 65 76 54 6f 20 3d 20 70 46 4b 65 79 3b  pPrevTo = pFKey;
181c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  .  }..  /* Link 
181d0 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  the foreign key 
181e0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73 20  to the table as 
181f0 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20  the last step.. 
18200 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d   */.  p->pFKey =
18210 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20   pFKey;.  pFKey 
18220 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20  = 0;..fk_end:.  
18230 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
18240 2c 20 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66  , pFKey);.#endif
18250 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
18260 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
18270 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74  _KEY) */.  sqlit
18280 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
18290 28 64 62 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a  (db, pFromCol);.
182a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
182b0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 43  tDelete(db, pToC
182c0 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ol);.}../*.** Th
182d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
182e0 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49  lled when an INI
182f0 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
18300 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45   or INITIALLY DE
18310 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65  FERRED.** clause
18320 20 69 73 20 73 65 65 6e 20 61 73 20 70 61 72 74   is seen as part
18330 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65   of a foreign ke
18340 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54  y definition.  T
18350 68 65 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a  he isDeferred.**
18360 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 31 20   parameter is 1 
18370 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45  for INITIALLY DE
18380 46 45 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72  FERRED and 0 for
18390 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
183a0 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68  IATE..** The beh
183b0 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73  avior of the mos
183c0 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74  t recently creat
183d0 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69  ed foreign key i
183e0 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63  s adjusted.** ac
183f0 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f  cordingly..*/.vo
18400 69 64 20 73 71 6c 69 74 65 33 44 65 66 65 72 46  id sqlite3DeferF
18410 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20  oreignKey(Parse 
18420 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44  *pParse, int isD
18430 65 66 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65  eferred){.#ifnde
18440 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
18450 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c  REIGN_KEY.  Tabl
18460 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20  e *pTab;.  FKey 
18470 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70  *pFKey;.  if( (p
18480 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
18490 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28  ewTable)==0 || (
184a0 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46  pFKey = pTab->pF
184b0 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  Key)==0 ) return
184c0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 44 65  ;.  assert( isDe
184d0 66 65 72 72 65 64 3d 3d 30 20 7c 7c 20 69 73 44  ferred==0 || isD
184e0 65 66 65 72 72 65 64 3d 3d 31 20 29 3b 20 2f 2a  eferred==1 ); /*
184f0 20 45 56 3a 20 52 2d 33 30 33 32 33 2d 32 31 39   EV: R-30323-219
18500 31 37 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 69  17 */.  pFKey->i
18510 73 44 65 66 65 72 72 65 64 20 3d 20 28 75 38 29  sDeferred = (u8)
18520 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64  isDeferred;.#end
18530 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  if.}../*.** Gene
18540 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
18550 69 6c 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65  ill erase and re
18560 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78  fill index *pIdx
18570 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73  .  This is.** us
18580 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ed to initialize
18590 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64   a newly created
185a0 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63   index or to rec
185b0 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f  ompute the.** co
185c0 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65  ntent of an inde
185d0 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f  x in response to
185e0 20 61 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61   a REINDEX comma
185f0 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d  nd..**.** if mem
18600 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20  RootPage is not 
18610 6e 65 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61  negative, it mea
18620 6e 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65  ns that the inde
18630 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72  x is newly.** cr
18640 65 61 74 65 64 2e 20 20 54 68 65 20 72 65 67 69  eated.  The regi
18650 73 74 65 72 20 73 70 65 63 69 66 69 65 64 20 62  ster specified b
18660 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f  y memRootPage co
18670 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f  ntains the.** ro
18680 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
18690 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66  f the index.  If
186a0 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20   memRootPage is 
186b0 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a  negative, then.*
186c0 2a 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65  * the index alre
186d0 61 64 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d  ady exists and m
186e0 75 73 74 20 62 65 20 63 6c 65 61 72 65 64 20 62  ust be cleared b
186f0 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69  efore being refi
18700 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20  lled and.** the 
18710 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
18720 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73   of the index is
18730 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64   taken from pInd
18740 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61  ex->tnum..*/.sta
18750 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
18760 52 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73  RefillIndex(Pars
18770 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78  e *pParse, Index
18780 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65   *pIndex, int me
18790 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61  mRootPage){.  Ta
187a0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64  ble *pTab = pInd
187b0 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20  ex->pTable;  /* 
187c0 54 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  The table that i
187d0 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  s indexed */.  i
187e0 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65  nt iTab = pParse
187f0 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a  ->nTab++;     /*
18800 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73   Btree cursor us
18810 65 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20  ed for pTab */. 
18820 20 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72   int iIdx = pPar
18830 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
18840 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20  /* Btree cursor 
18850 75 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20  used for pIndex 
18860 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 65 72  */.  int iSorter
18870 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18880 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70      /* Cursor op
18890 65 6e 65 64 20 62 79 20 4f 70 65 6e 53 6f 72 74  ened by OpenSort
188a0 65 72 20 28 69 66 20 69 6e 20 75 73 65 29 20 2a  er (if in use) *
188b0 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20  /.  int addr1;  
188c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188d0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
188e0 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a   top of loop */.
188f0 20 20 69 6e 74 20 61 64 64 72 32 3b 20 20 20 20    int addr2;    
18900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18910 20 2f 2a 20 41 64 64 72 65 73 73 20 74 6f 20 6a   /* Address to j
18920 75 6d 70 20 74 6f 20 66 6f 72 20 6e 65 78 74 20  ump to for next 
18930 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  iteration */.  i
18940 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20  nt tnum;        
18950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18960 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e   Root page of in
18970 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  dex */.  int iPa
18980 72 74 49 64 78 4c 61 62 65 6c 3b 20 20 20 20 20  rtIdxLabel;     
18990 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
189a0 74 6f 20 74 68 69 73 20 6c 61 62 65 6c 20 74 6f  to this label to
189b0 20 73 6b 69 70 20 61 20 72 6f 77 20 2a 2f 0a 20   skip a row */. 
189c0 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
189d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189e0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
189f0 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75   into this virtu
18a00 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20  al machine */.  
18a10 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20  KeyInfo *pKey;  
18a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18a30 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e  * KeyInfo for in
18a40 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  dex */.  int reg
18a50 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20  Record;         
18a60 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
18a70 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 73 73 65  ter holding asse
18a80 6d 62 6c 65 64 20 69 6e 64 65 78 20 72 65 63 6f  mbled index reco
18a90 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  rd */.  sqlite3 
18aa0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
18ab0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61  ;      /* The da
18ac0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
18ad0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d  n */.  int iDb =
18ae0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
18af0 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
18b00 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66  ->pSchema);..#if
18b10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18b20 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
18b30 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
18b40 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
18b50 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20 70 49  LITE_REINDEX, pI
18b60 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a  ndex->zName, 0,.
18b70 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
18b80 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 29 20 29 7b  b].zDbSName ) ){
18b90 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
18ba0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65  .#endif..  /* Re
18bb0 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f  quire a write-lo
18bc0 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  ck on the table 
18bd0 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20  to perform this 
18be0 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73  operation */.  s
18bf0 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
18c00 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
18c10 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62  b->tnum, 1, pTab
18c20 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d  ->zName);..  v =
18c30 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
18c40 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
18c50 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
18c60 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e  if( memRootPage>
18c70 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d  =0 ){.    tnum =
18c80 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20   memRootPage;.  
18c90 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20  }else{.    tnum 
18ca0 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a  = pIndex->tnum;.
18cb0 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c    }.  pKey = sql
18cc0 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64  ite3KeyInfoOfInd
18cd0 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
18ce0 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b  x);.  assert( pK
18cf0 65 79 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  ey!=0 || db->mal
18d00 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
18d10 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 0a 20 20  rse->nErr );..  
18d20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 6f 72 74  /* Open the sort
18d30 65 72 20 63 75 72 73 6f 72 20 69 66 20 77 65 20  er cursor if we 
18d40 61 72 65 20 74 6f 20 75 73 65 20 6f 6e 65 2e 20  are to use one. 
18d50 2a 2f 0a 20 20 69 53 6f 72 74 65 72 20 3d 20 70  */.  iSorter = p
18d60 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
18d70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18d80 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f  p4(v, OP_SorterO
18d90 70 65 6e 2c 20 69 53 6f 72 74 65 72 2c 20 30 2c  pen, iSorter, 0,
18da0 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c   pIndex->nKeyCol
18db0 2c 20 28 63 68 61 72 2a 29 0a 20 20 20 20 20 20  , (char*).      
18dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
18dd0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28  lite3KeyInfoRef(
18de0 70 4b 65 79 29 2c 20 50 34 5f 4b 45 59 49 4e 46  pKey), P4_KEYINF
18df0 4f 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74  O);..  /* Open t
18e00 68 65 20 74 61 62 6c 65 2e 20 4c 6f 6f 70 20 74  he table. Loop t
18e10 68 72 6f 75 67 68 20 61 6c 6c 20 72 6f 77 73 20  hrough all rows 
18e20 6f 66 20 74 68 65 20 74 61 62 6c 65 2c 20 69 6e  of the table, in
18e30 73 65 72 74 69 6e 67 20 69 6e 64 65 78 0a 20 20  serting index.  
18e40 2a 2a 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20  ** records into 
18e50 74 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f 0a 20  the sorter. */. 
18e60 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
18e70 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20  e(pParse, iTab, 
18e80 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70  iDb, pTab, OP_Op
18e90 65 6e 52 65 61 64 29 3b 0a 20 20 61 64 64 72 31  enRead);.  addr1
18ea0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
18eb0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
18ec0 64 2c 20 69 54 61 62 2c 20 30 29 3b 20 56 64 62  d, iTab, 0); Vdb
18ed0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
18ee0 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69  regRecord = sqli
18ef0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
18f00 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
18f10 4d 75 6c 74 69 57 72 69 74 65 28 70 50 61 72 73  MultiWrite(pPars
18f20 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47 65  e);..  sqlite3Ge
18f30 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70  nerateIndexKey(p
18f40 50 61 72 73 65 2c 70 49 6e 64 65 78 2c 69 54 61  Parse,pIndex,iTa
18f50 62 2c 72 65 67 52 65 63 6f 72 64 2c 30 2c 26 69  b,regRecord,0,&i
18f60 50 61 72 74 49 64 78 4c 61 62 65 6c 2c 30 2c 30  PartIdxLabel,0,0
18f70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
18f80 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
18f90 74 65 72 49 6e 73 65 72 74 2c 20 69 53 6f 72 74  terInsert, iSort
18fa0 65 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  er, regRecord);.
18fb0 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
18fc0 50 61 72 74 49 64 78 4c 61 62 65 6c 28 70 50 61  PartIdxLabel(pPa
18fd0 72 73 65 2c 20 69 50 61 72 74 49 64 78 4c 61 62  rse, iPartIdxLab
18fe0 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  el);.  sqlite3Vd
18ff0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
19000 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31  ext, iTab, addr1
19010 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +1); VdbeCoverag
19020 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
19030 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
19040 64 64 72 31 29 3b 0a 20 20 69 66 28 20 6d 65 6d  ddr1);.  if( mem
19050 52 6f 6f 74 50 61 67 65 3c 30 20 29 20 73 71 6c  RootPage<0 ) sql
19060 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19070 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d  , OP_Clear, tnum
19080 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , iDb);.  sqlite
19090 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
190a0 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64  P_OpenWrite, iId
190b0 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20  x, tnum, iDb, . 
190c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190d0 20 20 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c     (char *)pKey,
190e0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
190f0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
19100 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42 55  eP5(v, OPFLAG_BU
19110 4c 4b 43 53 52 7c 28 28 6d 65 6d 52 6f 6f 74 50  LKCSR|((memRootP
19120 61 67 65 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f 50  age>=0)?OPFLAG_P
19130 32 49 53 52 45 47 3a 30 29 29 3b 0a 0a 20 20 61  2ISREG:0));..  a
19140 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
19150 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
19160 6f 72 74 65 72 53 6f 72 74 2c 20 69 53 6f 72 74  orterSort, iSort
19170 65 72 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65  er, 0); VdbeCove
19180 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20 49  rage(v);.  if( I
19190 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e  sUniqueIndex(pIn
191a0 64 65 78 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  dex) ){.    int 
191b0 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j2 = sqlite3Vdbe
191c0 47 6f 74 6f 28 76 2c 20 31 29 3b 0a 20 20 20 20  Goto(v, 1);.    
191d0 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
191e0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
191f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
19200 62 65 56 65 72 69 66 79 41 62 6f 72 74 61 62 6c  beVerifyAbortabl
19210 65 28 76 2c 20 4f 45 5f 41 62 6f 72 74 29 3b 0a  e(v, OE_Abort);.
19220 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19230 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53  ddOp4Int(v, OP_S
19240 6f 72 74 65 72 43 6f 6d 70 61 72 65 2c 20 69 53  orterCompare, iS
19250 6f 72 74 65 72 2c 20 6a 32 2c 20 72 65 67 52 65  orter, j2, regRe
19260 63 6f 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20  cord,.          
19270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
19280 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b  Index->nKeyCol);
19290 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
192a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 55 6e 69  ;.    sqlite3Uni
192b0 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  queConstraint(pP
192c0 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72 74 2c 20  arse, OE_Abort, 
192d0 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c  pIndex);.    sql
192e0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
192f0 28 76 2c 20 6a 32 29 3b 0a 20 20 7d 65 6c 73 65  (v, j2);.  }else
19300 7b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71  {.    addr2 = sq
19310 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
19320 41 64 64 72 28 76 29 3b 0a 20 20 7d 0a 20 20 73  Addr(v);.  }.  s
19330 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
19340 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74  (v, OP_SorterDat
19350 61 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52  a, iSorter, regR
19360 65 63 6f 72 64 2c 20 69 49 64 78 29 3b 0a 20 20  ecord, iIdx);.  
19370 69 66 28 20 21 70 49 6e 64 65 78 2d 3e 62 41 73  if( !pIndex->bAs
19380 63 4b 65 79 42 75 67 20 29 7b 0a 20 20 20 20 2f  cKeyBug ){.    /
19390 2a 20 54 68 69 73 20 4f 50 5f 53 65 65 6b 45 6e  * This OP_SeekEn
193a0 64 20 6f 70 63 6f 64 65 20 6d 61 6b 65 73 20 69  d opcode makes i
193b0 6e 64 65 78 20 69 6e 73 65 72 74 20 66 6f 72 20  ndex insert for 
193c0 61 20 52 45 49 4e 44 45 58 20 67 6f 20 6d 75 63  a REINDEX go muc
193d0 68 0a 20 20 20 20 2a 2a 20 66 61 73 74 65 72 20  h.    ** faster 
193e0 62 79 20 61 76 6f 69 64 69 6e 67 20 75 6e 6e 65  by avoiding unne
193f0 63 65 73 73 61 72 79 20 73 65 65 6b 73 2e 20 20  cessary seeks.  
19400 42 75 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 61  But the optimiza
19410 74 69 6f 6e 20 64 6f 65 73 0a 20 20 20 20 2a 2a  tion does.    **
19420 20 6e 6f 74 20 77 6f 72 6b 20 66 6f 72 20 55 4e   not work for UN
19430 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
19440 69 6e 64 65 78 65 73 20 6f 6e 20 57 49 54 48 4f  indexes on WITHO
19450 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 0a  UT ROWID tables.
19460 20 20 20 20 2a 2a 20 77 69 74 68 20 44 45 53 43      ** with DESC
19470 20 70 72 69 6d 61 72 79 20 6b 65 79 73 2c 20 73   primary keys, s
19480 69 6e 63 65 20 74 68 6f 73 65 20 69 6e 64 65 78  ince those index
19490 65 73 20 68 61 76 65 20 74 68 65 72 65 20 6b 65  es have there ke
194a0 79 73 20 69 6e 0a 20 20 20 20 2a 2a 20 61 20 64  ys in.    ** a d
194b0 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 66  ifferent order f
194c0 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74 61 62  rom the main tab
194d0 6c 65 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74  le..    ** See t
194e0 69 63 6b 65 74 3a 20 68 74 74 70 73 3a 2f 2f 77  icket: https://w
194f0 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72  ww.sqlite.org/sr
19500 63 2f 69 6e 66 6f 2f 62 62 61 37 62 36 39 66 39  c/info/bba7b69f9
19510 38 34 39 62 35 62 66 0a 20 20 20 20 2a 2f 0a 20  849b5bf.    */. 
19520 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19530 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65 65 6b 45  dOp1(v, OP_SeekE
19540 6e 64 2c 20 69 49 64 78 29 3b 0a 20 20 7d 0a 20  nd, iIdx);.  }. 
19550 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19560 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
19570 72 74 2c 20 69 49 64 78 2c 20 72 65 67 52 65 63  rt, iIdx, regRec
19580 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ord);.  sqlite3V
19590 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
195a0 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
195b0 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ULT);.  sqlite3R
195c0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
195d0 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29  arse, regRecord)
195e0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
195f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
19600 65 72 4e 65 78 74 2c 20 69 53 6f 72 74 65 72 2c  erNext, iSorter,
19610 20 61 64 64 72 32 29 3b 20 56 64 62 65 43 6f 76   addr2); VdbeCov
19620 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
19630 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
19640 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 73 71  v, addr1);..  sq
19650 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
19660 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61  v, OP_Close, iTa
19670 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  b);.  sqlite3Vdb
19680 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
19690 6f 73 65 2c 20 69 49 64 78 29 3b 0a 20 20 73 71  ose, iIdx);.  sq
196a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
196b0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 53 6f  v, OP_Close, iSo
196c0 72 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rter);.}../*.** 
196d0 41 6c 6c 6f 63 61 74 65 20 68 65 61 70 20 73 70  Allocate heap sp
196e0 61 63 65 20 74 6f 20 68 6f 6c 64 20 61 6e 20 49  ace to hold an I
196f0 6e 64 65 78 20 6f 62 6a 65 63 74 20 77 69 74 68  ndex object with
19700 20 6e 43 6f 6c 20 63 6f 6c 75 6d 6e 73 2e 0a 2a   nCol columns..*
19710 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68  *.** Increase th
19720 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a  e allocation siz
19730 65 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20  e to provide an 
19740 65 78 74 72 61 20 6e 45 78 74 72 61 20 62 79 74  extra nExtra byt
19750 65 73 0a 2a 2a 20 6f 66 20 38 2d 62 79 74 65 20  es.** of 8-byte 
19760 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 66  aligned space af
19770 74 65 72 20 74 68 65 20 49 6e 64 65 78 20 6f 62  ter the Index ob
19780 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20  ject and return 
19790 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20  a.** pointer to 
197a0 74 68 69 73 20 65 78 74 72 61 20 73 70 61 63 65  this extra space
197b0 20 69 6e 20 2a 70 70 45 78 74 72 61 2e 0a 2a 2f   in *ppExtra..*/
197c0 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 41  .Index *sqlite3A
197d0 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65  llocateIndexObje
197e0 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ct(.  sqlite3 *d
197f0 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  b,         /* Da
19800 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
19810 6e 20 2a 2f 0a 20 20 69 31 36 20 6e 43 6f 6c 2c  n */.  i16 nCol,
19820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19830 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63  otal number of c
19840 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e  olumns in the in
19850 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  dex */.  int nEx
19860 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  tra,          /*
19870 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
19880 20 6f 66 20 65 78 74 72 61 20 73 70 61 63 65 20   of extra space 
19890 74 6f 20 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68  to alloc */.  ch
198a0 61 72 20 2a 2a 70 70 45 78 74 72 61 20 20 20 20  ar **ppExtra    
198b0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
198c0 20 74 68 65 20 22 65 78 74 72 61 22 20 73 70 61   the "extra" spa
198d0 63 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  ce */.){.  Index
198e0 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
198f0 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 69 6e 64  /* Allocated ind
19900 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  ex object */.  i
19910 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
19920 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
19930 73 70 61 63 65 20 66 6f 72 20 49 6e 64 65 78 20  space for Index 
19940 6f 62 6a 65 63 74 20 2b 20 61 72 72 61 79 73 20  object + arrays 
19950 2a 2f 0a 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f  */..  nByte = RO
19960 55 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65  UND8(sizeof(Inde
19970 78 29 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  x)) +           
19980 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75     /* Index stru
19990 63 74 75 72 65 20 20 2a 2f 0a 20 20 20 20 20 20  cture  */.      
199a0 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f      ROUND8(sizeo
199b0 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 20 2b  f(char*)*nCol) +
199c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
199d0 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a  x.azColl     */.
199e0 20 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38            ROUND8
199f0 28 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a  (sizeof(LogEst)*
19a00 28 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20 2f  (nCol+1) +     /
19a10 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77 4c 6f 67  * Index.aiRowLog
19a20 45 73 74 20 20 20 2a 2f 0a 20 20 20 20 20 20 20  Est   */.       
19a30 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
19a40 28 69 31 36 29 2a 6e 43 6f 6c 20 2b 20 20 20 20  (i16)*nCol +    
19a50 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
19a60 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20  .aiColumn   */. 
19a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a80 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 29  sizeof(u8)*nCol)
19a90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
19aa0 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65   Index.aSortOrde
19ab0 72 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74  r */.  p = sqlit
19ac0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
19ad0 62 2c 20 6e 42 79 74 65 20 2b 20 6e 45 78 74 72  b, nByte + nExtr
19ae0 61 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  a);.  if( p ){. 
19af0 20 20 20 63 68 61 72 20 2a 70 45 78 74 72 61 20     char *pExtra 
19b00 3d 20 28 28 63 68 61 72 2a 29 70 29 2b 52 4f 55  = ((char*)p)+ROU
19b10 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65 78  ND8(sizeof(Index
19b20 29 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 43 6f 6c  ));.    p->azCol
19b30 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  l = (const char*
19b40 2a 29 70 45 78 74 72 61 3b 20 70 45 78 74 72 61  *)pExtra; pExtra
19b50 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f   += ROUND8(sizeo
19b60 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 3b 0a  f(char*)*nCol);.
19b70 20 20 20 20 70 2d 3e 61 69 52 6f 77 4c 6f 67 45      p->aiRowLogE
19b80 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70 45  st = (LogEst*)pE
19b90 78 74 72 61 3b 20 70 45 78 74 72 61 20 2b 3d 20  xtra; pExtra += 
19ba0 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28  sizeof(LogEst)*(
19bb0 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 70 2d 3e  nCol+1);.    p->
19bc0 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a  aiColumn = (i16*
19bd0 29 70 45 78 74 72 61 3b 20 20 20 20 20 20 20 70  )pExtra;       p
19be0 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28  Extra += sizeof(
19bf0 69 31 36 29 2a 6e 43 6f 6c 3b 0a 20 20 20 20 70  i16)*nCol;.    p
19c00 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
19c10 75 38 2a 29 70 45 78 74 72 61 3b 0a 20 20 20 20  u8*)pExtra;.    
19c20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f  p->nColumn = nCo
19c30 6c 3b 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 43 6f  l;.    p->nKeyCo
19c40 6c 20 3d 20 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20  l = nCol - 1;.  
19c50 20 20 2a 70 70 45 78 74 72 61 20 3d 20 28 28 63    *ppExtra = ((c
19c60 68 61 72 2a 29 70 29 20 2b 20 6e 42 79 74 65 3b  har*)p) + nByte;
19c70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
19c80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
19c90 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72   a new index for
19ca0 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20   an SQL table.  
19cb0 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73  pName1.pName2 is
19cc0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
19cd0 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70   index .** and p
19ce0 54 62 6c 4c 69 73 74 20 69 73 20 74 68 65 20 6e  TblList is the n
19cf0 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
19d00 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69   that is to be i
19d10 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69  ndexed.  Both wi
19d20 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66  ll .** be NULL f
19d30 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  or a primary key
19d40 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61   or an index tha
19d50 74 20 69 73 20 63 72 65 61 74 65 64 20 74 6f 20  t is created to 
19d60 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49  satisfy a.** UNI
19d70 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
19d80 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70   If pTable and p
19d90 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20  Index are NULL, 
19da0 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  use pParse->pNew
19db0 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20  Table.** as the 
19dc0 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  table to be inde
19dd0 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e  xed.  pParse->pN
19de0 65 77 54 61 62 6c 65 20 69 73 20 61 20 74 61 62  ewTable is a tab
19df0 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75  le that is.** cu
19e00 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
19e10 6e 73 74 72 75 63 74 65 64 20 62 79 20 61 20 43  nstructed by a C
19e20 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
19e30 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69  ement..**.** pLi
19e40 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  st is a list of 
19e50 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
19e60 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69  dexed.  pList wi
19e70 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68  ll be NULL if th
19e80 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61  is.** is a prima
19e90 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65  ry key or unique
19ea0 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74  -constraint on t
19eb0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63  he most recent c
19ec0 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74  olumn added.** t
19ed0 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
19ee0 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
19ef0 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76  truction.  .*/.v
19f00 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74  oid sqlite3Creat
19f10 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  eIndex(.  Parse 
19f20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
19f30 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  All information 
19f40 61 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65  about this parse
19f50 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
19f60 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69 72 73  me1,     /* Firs
19f70 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20  t part of index 
19f80 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c  name. May be NUL
19f90 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  L */.  Token *pN
19fa0 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53 65 63  ame2,     /* Sec
19fb0 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65  ond part of inde
19fc0 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e  x name. May be N
19fd0 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ULL */.  SrcList
19fe0 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54   *pTblName, /* T
19ff0 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55  able to index. U
1a000 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
1a010 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45  able if 0 */.  E
1a020 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
1a030 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63    /* A list of c
1a040 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
1a050 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  exed */.  int on
1a060 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20  Error,       /* 
1a070 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e  OE_Abort, OE_Ign
1a080 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c  ore, OE_Replace,
1a090 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20   or OE_None */. 
1a0a0 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20   Token *pStart, 
1a0b0 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54      /* The CREAT
1a0c0 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67  E token that beg
1a0d0 69 6e 73 20 74 68 69 73 20 73 74 61 74 65 6d 65  ins this stateme
1a0e0 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 50  nt */.  Expr *pP
1a0f0 49 57 68 65 72 65 2c 20 20 20 20 2f 2a 20 57 48  IWhere,    /* WH
1a100 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 70  ERE clause for p
1a110 61 72 74 69 61 6c 20 69 6e 64 69 63 65 73 20 2a  artial indices *
1a120 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
1a130 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f  r,     /* Sort o
1a140 72 64 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20  rder of primary 
1a150 6b 65 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d  key when pList==
1a160 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66  NULL */.  int if
1a170 4e 6f 74 45 78 69 73 74 2c 20 20 20 20 2f 2a 20  NotExist,    /* 
1a180 4f 6d 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e  Omit error if in
1a190 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
1a1a0 74 73 20 2a 2f 0a 20 20 75 38 20 69 64 78 54 79  ts */.  u8 idxTy
1a1b0 70 65 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  pe         /* Th
1a1c0 65 20 69 6e 64 65 78 20 74 79 70 65 20 2a 2f 0a  e index type */.
1a1d0 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
1a1e0 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61 62   = 0;     /* Tab
1a1f0 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
1a200 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
1a210 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68  dex = 0;   /* Th
1a220 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72  e index to be cr
1a230 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  eated */.  char 
1a240 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  *zName = 0;     
1a250 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69  /* Name of the i
1a260 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  ndex */.  int nN
1a270 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
1a280 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  * Number of char
1a290 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20  acters in zName 
1a2a0 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  */.  int i, j;. 
1a2b0 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20   DbFixer sFix;  
1a2c0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73        /* For ass
1a2d0 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20  igning database 
1a2e0 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20  names to pTable 
1a2f0 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
1a300 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74  erMask;   /* 1 t
1a310 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20  o honor DESC in 
1a320 69 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e  index.  0 to ign
1a330 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ore. */.  sqlite
1a340 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1a350 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20  db;.  Db *pDb;  
1a360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1a370 65 20 73 70 65 63 69 66 69 63 20 74 61 62 6c 65  e specific table
1a380 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1a390 69 6e 64 65 78 65 64 20 64 61 74 61 62 61 73 65  indexed database
1a3a0 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
1a3b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1a3c0 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
1a3d0 61 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e  ase that is bein
1a3e0 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54  g written */.  T
1a3f0 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b  oken *pName = 0;
1a400 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69      /* Unqualifi
1a410 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  ed name of the i
1a420 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a  ndex to create *
1a430 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  /.  struct ExprL
1a440 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49  ist_item *pListI
1a450 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  tem; /* For loop
1a460 69 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a  ing over pList *
1a470 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d  /.  int nExtra =
1a480 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1a490 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c       /* Space al
1a4a0 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 45 78 74  located for zExt
1a4b0 72 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ra[] */.  int nE
1a4c0 78 74 72 61 43 6f 6c 3b 20 20 20 20 20 20 20 20  xtraCol;        
1a4d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1a4e0 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 63 6f  mber of extra co
1a4f0 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 2a 2f 0a  lumns needed */.
1a500 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61 20 3d    char *zExtra =
1a510 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1a520 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63     /* Extra spac
1a530 65 20 61 66 74 65 72 20 74 68 65 20 49 6e 64 65  e after the Inde
1a540 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 49 6e  x object */.  In
1a550 64 65 78 20 2a 70 50 6b 20 3d 20 30 3b 20 20 20  dex *pPk = 0;   
1a560 20 20 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45     /* PRIMARY KE
1a570 59 20 69 6e 64 65 78 20 66 6f 72 20 57 49 54 48  Y index for WITH
1a580 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73  OUT ROWID tables
1a590 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d   */..  if( db->m
1a5a0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
1a5b0 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b  Parse->nErr>0 ){
1a5c0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
1a5d0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
1a5e0 0a 20 20 69 66 28 20 49 4e 5f 44 45 43 4c 41 52  .  if( IN_DECLAR
1a5f0 45 5f 56 54 41 42 20 26 26 20 69 64 78 54 79 70  E_VTAB && idxTyp
1a600 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50  e!=SQLITE_IDXTYP
1a610 45 5f 50 52 49 4d 41 52 59 4b 45 59 20 29 7b 0a  E_PRIMARYKEY ){.
1a620 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1a630 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
1a640 20 20 69 66 28 20 21 49 73 53 68 61 72 65 64 53    if( !IsSharedS
1a650 63 68 65 6d 61 28 64 62 29 20 26 26 20 53 51 4c  chema(db) && SQL
1a660 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
1a670 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
1a680 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  ) ){.    goto ex
1a690 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1a6a0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
1a6b0 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74  Find the table t
1a6c0 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64  hat is to be ind
1a6d0 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61  exed.  Return ea
1a6e0 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  rly if not found
1a6f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62  ..  */.  if( pTb
1a700 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20  lName!=0 ){..   
1a710 20 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d   /* Use the two-
1a720 70 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20  part index name 
1a730 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
1a740 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a   database .    *
1a750 2a 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20  * to search for 
1a760 74 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27  the table. 'Fix'
1a770 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
1a780 74 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a  to this db.    *
1a790 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67  * before looking
1a7a0 20 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20   up the table.. 
1a7b0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
1a7c0 28 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d  ( pName1 && pNam
1a7d0 65 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20  e2 );.    iDb = 
1a7e0 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
1a7f0 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
1a800 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
1a810 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  e);.    if( iDb<
1a820 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
1a830 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1a840 61 73 73 65 72 74 28 20 70 4e 61 6d 65 20 26 26  assert( pName &&
1a850 20 70 4e 61 6d 65 2d 3e 7a 20 29 3b 0a 0a 23 69   pName->z );..#i
1a860 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a870 54 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20  T_TEMPDB.    /* 
1a880 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  If the index nam
1a890 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65  e was unqualifie
1a8a0 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  d, check if the 
1a8b0 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  table.    ** is 
1a8c0 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66  a temp table. If
1a8d0 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74   so, set the dat
1a8e0 61 62 61 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e  abase to 1. Do n
1a8f0 6f 74 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a  ot do this.    *
1a900 2a 20 69 66 20 69 6e 69 74 69 61 6c 69 73 69 6e  * if initialisin
1a910 67 20 61 20 64 61 74 61 62 61 73 65 20 73 63 68  g a database sch
1a920 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ema..    */.    
1a930 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
1a940 73 79 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  sy ){.      pTab
1a950 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
1a960 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20  tLookup(pParse, 
1a970 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20  pTblName);.     
1a980 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d   if( pName2->n==
1a990 30 20 26 26 20 70 54 61 62 20 26 26 20 70 54 61  0 && pTab && pTa
1a9a0 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e  b->pSchema==db->
1a9b0 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29  aDb[1].pSchema )
1a9c0 7b 0a 20 20 20 20 20 20 20 20 69 44 62 20 3d 20  {.        iDb = 
1a9d0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1a9e0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c  .#endif..    sql
1a9f0 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69  ite3FixInit(&sFi
1aa00 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20  x, pParse, iDb, 
1aa10 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 3b  "index", pName);
1aa20 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1aa30 46 69 78 53 72 63 4c 69 73 74 28 26 73 46 69 78  FixSrcList(&sFix
1aa40 2c 20 70 54 62 6c 4e 61 6d 65 29 20 29 7b 0a 20  , pTblName) ){. 
1aa50 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20       /* Because 
1aa60 74 68 65 20 70 61 72 73 65 72 20 63 6f 6e 73 74  the parser const
1aa70 72 75 63 74 73 20 70 54 62 6c 4e 61 6d 65 20 66  ructs pTblName f
1aa80 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 69 64 65  rom a single ide
1aa90 6e 74 69 66 69 65 72 2c 0a 20 20 20 20 20 20 2a  ntifier,.      *
1aaa0 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c  * sqlite3FixSrcL
1aab0 69 73 74 20 63 61 6e 20 6e 65 76 65 72 20 66 61  ist can never fa
1aac0 69 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  il. */.      ass
1aad0 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ert(0);.    }.  
1aae0 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
1aaf0 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28  LocateTableItem(
1ab00 70 50 61 72 73 65 2c 20 30 2c 20 26 70 54 62 6c  pParse, 0, &pTbl
1ab10 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 20  Name->a[0]);.   
1ab20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
1ab30 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20  locFailed==0 || 
1ab40 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69  pTab==0 );.    i
1ab50 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74  f( pTab==0 ) got
1ab60 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1ab70 64 65 78 3b 0a 20 20 20 20 69 66 28 20 69 44 62  dex;.    if( iDb
1ab80 3d 3d 31 20 26 26 20 64 62 2d 3e 61 44 62 5b 69  ==1 && db->aDb[i
1ab90 44 62 5d 2e 70 53 63 68 65 6d 61 21 3d 70 54 61  Db].pSchema!=pTa
1aba0 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  b->pSchema ){.  
1abb0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1abc0 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
1abd0 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20          "cannot 
1abe0 63 72 65 61 74 65 20 61 20 54 45 4d 50 20 69 6e  create a TEMP in
1abf0 64 65 78 20 6f 6e 20 6e 6f 6e 2d 54 45 4d 50 20  dex on non-TEMP 
1ac00 74 61 62 6c 65 20 5c 22 25 73 5c 22 22 2c 0a 20  table \"%s\"",. 
1ac10 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
1ac20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f  zName);.      go
1ac30 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1ac40 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
1ac50 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
1ac60 61 62 29 20 29 20 70 50 6b 20 3d 20 73 71 6c 69  ab) ) pPk = sqli
1ac70 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
1ac80 65 78 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73  ex(pTab);.  }els
1ac90 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
1aca0 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Name==0 );.    a
1acb0 73 73 65 72 74 28 20 70 53 74 61 72 74 3d 3d 30  ssert( pStart==0
1acc0 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70   );.    pTab = p
1acd0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
1ace0 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 20  ;.    if( !pTab 
1acf0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
1ad00 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44  te_index;.    iD
1ad10 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
1ad20 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
1ad30 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d  b->pSchema);.  }
1ad40 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  .  pDb = &db->aD
1ad50 62 5b 69 44 62 5d 3b 0a 0a 20 20 61 73 73 65 72  b[iDb];..  asser
1ad60 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
1ad70 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1ad80 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28  nErr==0 );.  if(
1ad90 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
1ada0 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73  (pTab->zName, "s
1adb0 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a  qlite_", 7)==0 .
1adc0 20 20 20 20 20 20 20 26 26 20 64 62 2d 3e 69 6e         && db->in
1add0 69 74 2e 62 75 73 79 3d 3d 30 0a 20 20 20 20 20  it.busy==0.     
1ade0 20 20 26 26 20 70 54 62 6c 4e 61 6d 65 21 3d 30    && pTblName!=0
1adf0 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52  .#if SQLITE_USER
1ae00 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
1ae10 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
1ae20 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 70  3UserAuthTable(p
1ae30 54 61 62 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 0a 23  Tab->zName)==0.#
1ae40 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
1ae50 49 54 45 5f 41 4c 4c 4f 57 5f 53 51 4c 49 54 45  ITE_ALLOW_SQLITE
1ae60 5f 4d 41 53 54 45 52 5f 49 4e 44 45 58 0a 20 20  _MASTER_INDEX.  
1ae70 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53       && sqlite3S
1ae80 74 72 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e  trICmp(&pTab->zN
1ae90 61 6d 65 5b 37 5d 2c 22 6d 61 73 74 65 72 22 29  ame[7],"master")
1aea0 21 3d 30 0a 23 65 6e 64 69 66 0a 20 29 7b 0a 20  !=0.#endif. ){. 
1aeb0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1aec0 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
1aed0 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  e %s may not be 
1aee0 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e  indexed", pTab->
1aef0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
1af00 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1af10 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  ex;.  }.#ifndef 
1af20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1af30 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65  .  if( pTab->pSe
1af40 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
1af50 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1af60 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e  se, "views may n
1af70 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b  ot be indexed");
1af80 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
1af90 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
1afa0 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
1afb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1afc0 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49  UALTABLE.  if( I
1afd0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
1afe0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
1aff0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
1b000 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 6d 61  irtual tables ma
1b010 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
1b020 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  ");.    goto exi
1b030 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1b040 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1b050 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e  .  ** Find the n
1b060 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
1b070 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  .  Make sure the
1b080 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  re is not alread
1b090 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69  y another.  ** i
1b0a0 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69  ndex or table wi
1b0b0 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
1b0c0 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  .  .  **.  ** Ex
1b0d0 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20  ception:  If we 
1b0e0 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
1b0f0 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65  names of permane
1b100 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20  nt indices from 
1b110 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f  the.  ** sqlite_
1b120 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28 62 65  master table (be
1b130 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72  cause some other
1b140 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64   process changed
1b150 20 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64   the schema) and
1b160 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65  .  ** one of the
1b170 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c   index names col
1b180 6c 69 64 65 73 20 77 69 74 68 20 74 68 65 20 6e  lides with the n
1b190 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61  ame of a tempora
1b1a0 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a  ry table or.  **
1b1b0 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20   index, then we 
1b1c0 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
1b1d0 20 70 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e   process this in
1b1e0 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  dex..  **.  ** I
1b1f0 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65  f pName==0 it me
1b200 61 6e 73 20 74 68 61 74 20 77 65 20 61 72 65 0a  ans that we are.
1b210 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74    ** dealing wit
1b220 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  h a primary key 
1b230 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  or UNIQUE constr
1b240 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74  aint.  We have t
1b250 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a  o invent our.  *
1b260 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f  * own name..  */
1b270 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a  .  if( pName ){.
1b280 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
1b290 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1b2a0 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20  (db, pName);.   
1b2b0 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
1b2c0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1b2d0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65  _index;.    asse
1b2e0 72 74 28 20 70 4e 61 6d 65 2d 3e 7a 21 3d 30 20  rt( pName->z!=0 
1b2f0 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  );.    if( SQLIT
1b300 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65  E_OK!=sqlite3Che
1b310 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61  ckObjectName(pPa
1b320 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  rse, zName) ){. 
1b330 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
1b340 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
1b350 20 7d 0a 20 20 20 20 69 66 28 20 21 49 4e 5f 52   }.    if( !IN_R
1b360 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a  ENAME_OBJECT ){.
1b370 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69        if( !db->i
1b380 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
1b390 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
1b3a0 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
1b3b0 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20  me, 0)!=0 ){.   
1b3c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1b3d0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1b3e0 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
1b3f0 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25   a table named %
1b400 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
1b410 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1b420 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1b430 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1b440 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1b450 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
1b460 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 44 62 53 4e  Name, pDb->zDbSN
1b470 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
1b480 20 20 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69     if( !ifNotExi
1b490 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
1b4a0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1b4b0 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25  pParse, "index %
1b4c0 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  s already exists
1b4d0 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
1b4e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b4f0 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d      assert( !db-
1b500 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
1b510 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
1b520 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
1b530 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
1b540 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b550 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1b560 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
1b570 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1b580 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e     int n;.    In
1b590 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20  dex *pLoop;.    
1b5a0 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e  for(pLoop=pTab->
1b5b0 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f  pIndex, n=1; pLo
1b5c0 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
1b5d0 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20  >pNext, n++){}. 
1b5e0 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
1b5f0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73  e3MPrintf(db, "s
1b600 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f  qlite_autoindex_
1b610 25 73 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  %s_%d", pTab->zN
1b620 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28  ame, n);.    if(
1b630 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
1b640 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1b650 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
1b660 0a 0a 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61 74  ..    /* Automat
1b670 69 63 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 67  ic index names g
1b680 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 77 69  enerated from wi
1b690 74 68 69 6e 20 73 71 6c 69 74 65 33 5f 64 65 63  thin sqlite3_dec
1b6a0 6c 61 72 65 5f 76 74 61 62 28 29 0a 20 20 20 20  lare_vtab().    
1b6b0 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 6e 61 6d  ** must have nam
1b6c0 65 73 20 74 68 61 74 20 61 72 65 20 64 69 73 74  es that are dist
1b6d0 69 6e 63 74 20 66 72 6f 6d 20 6e 6f 72 6d 61 6c  inct from normal
1b6e0 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
1b6f0 20 6e 61 6d 65 73 2e 0a 20 20 20 20 2a 2a 20 54   names..    ** T
1b700 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61  he following sta
1b710 74 65 6d 65 6e 74 20 63 6f 6e 76 65 72 74 73 20  tement converts 
1b720 22 73 71 6c 69 74 65 33 5f 61 75 74 6f 69 6e 64  "sqlite3_autoind
1b730 65 78 2e 2e 2e 22 20 69 6e 74 6f 0a 20 20 20 20  ex..." into.    
1b740 2a 2a 20 22 73 71 6c 69 74 65 33 5f 62 75 74 6f  ** "sqlite3_buto
1b750 69 6e 64 65 78 2e 2e 2e 22 20 69 6e 20 6f 72 64  index..." in ord
1b760 65 72 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e  er to make the n
1b770 61 6d 65 73 20 64 69 73 74 69 6e 63 74 2e 0a 20  ames distinct.. 
1b780 20 20 20 2a 2a 20 54 68 65 20 22 76 74 61 62 5f     ** The "vtab_
1b790 65 72 72 2e 74 65 73 74 22 20 74 65 73 74 20 64  err.test" test d
1b7a0 65 6d 6f 6e 73 74 72 61 74 65 73 20 74 68 65 20  emonstrates the 
1b7b0 6e 65 65 64 20 6f 66 20 74 68 69 73 20 73 74 61  need of this sta
1b7c0 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69  tement. */.    i
1b7d0 66 28 20 49 4e 5f 53 50 45 43 49 41 4c 5f 50 41  f( IN_SPECIAL_PA
1b7e0 52 53 45 20 29 20 7a 4e 61 6d 65 5b 37 5d 2b 2b  RSE ) zName[7]++
1b7f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
1b800 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74  k for authorizat
1b810 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e  ion to create an
1b820 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66   index..  */.#if
1b830 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1b840 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
1b850 20 69 66 28 20 21 49 4e 5f 52 45 4e 41 4d 45 5f   if( !IN_RENAME_
1b860 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 63 6f  OBJECT ){.    co
1b870 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
1b880 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 3b 0a 20  pDb->zDbSName;. 
1b890 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
1b8a0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
1b8b0 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53  SQLITE_INSERT, S
1b8c0 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
1b8d0 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
1b8e0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1b8f0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
1b900 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f  .    i = SQLITE_
1b910 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20  CREATE_INDEX;.  
1b920 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
1b930 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69  DB && iDb==1 ) i
1b940 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
1b950 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _TEMP_INDEX;.   
1b960 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1b970 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c  Check(pParse, i,
1b980 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e   zName, pTab->zN
1b990 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  ame, zDb) ){.   
1b9a0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1b9b0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
1b9c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1b9d0 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69  * If pList==0, i
1b9e0 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75  t means this rou
1b9f0 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20  tine was called 
1ba00 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72  to make a primar
1ba10 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f  y.  ** key out o
1ba20 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  f the last colum
1ba30 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74  n added to the t
1ba40 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
1ba50 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f  ruction..  ** So
1ba60 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c   create a fake l
1ba70 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  ist to simulate 
1ba80 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  this..  */.  if(
1ba90 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
1baa0 20 54 6f 6b 65 6e 20 70 72 65 76 43 6f 6c 3b 0a   Token prevCol;.
1bab0 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c      Column *pCol
1bac0 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 70   = &pTab->aCol[p
1bad0 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20  Tab->nCol-1];.  
1bae0 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73    pCol->colFlags
1baf0 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 55 4e 49 51   |= COLFLAG_UNIQ
1bb00 55 45 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  UE;.    sqlite3T
1bb10 6f 6b 65 6e 49 6e 69 74 28 26 70 72 65 76 43 6f  okenInit(&prevCo
1bb20 6c 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  l, pCol->zName);
1bb30 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
1bb40 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
1bb50 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 0a 20 20  nd(pParse, 0,.  
1bb60 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1bb70 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
1bb80 20 54 4b 5f 49 44 2c 20 26 70 72 65 76 43 6f 6c   TK_ID, &prevCol
1bb90 2c 20 30 29 29 3b 0a 20 20 20 20 69 66 28 20 70  , 0));.    if( p
1bba0 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65  List==0 ) goto e
1bbb0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1bbc0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
1bbd0 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b  ist->nExpr==1 );
1bbe0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1bbf0 4c 69 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72  ListSetSortOrder
1bc00 28 70 4c 69 73 74 2c 20 73 6f 72 74 4f 72 64 65  (pList, sortOrde
1bc10 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
1bc20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1bc30 43 68 65 63 6b 4c 65 6e 67 74 68 28 70 50 61 72  CheckLength(pPar
1bc40 73 65 2c 20 70 4c 69 73 74 2c 20 22 69 6e 64 65  se, pList, "inde
1bc50 78 22 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  x");.    if( pPa
1bc60 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f  rse->nErr ) goto
1bc70 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1bc80 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  ex;.  }..  /* Fi
1bc90 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
1bca0 79 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  y bytes of space
1bcb0 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f   are required to
1bcc0 20 73 74 6f 72 65 20 65 78 70 6c 69 63 69 74 6c   store explicitl
1bcd0 79 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64  y.  ** specified
1bce0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1bcf0 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a  nce names..  */.
1bd00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
1bd10 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
1bd20 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
1bd30 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
1bd40 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
1bd50 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ( pExpr!=0 );.  
1bd60 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
1bd70 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20  =TK_COLLATE ){. 
1bd80 20 20 20 20 20 6e 45 78 74 72 61 20 2b 3d 20 28       nExtra += (
1bd90 31 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65  1 + sqlite3Strle
1bda0 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  n30(pExpr->u.zTo
1bdb0 6b 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ken));.    }.  }
1bdc0 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c  ..  /* .  ** All
1bdd0 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
1bde0 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f  structure. .  */
1bdf0 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  nName = sqlit
1be00 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
1be10 29 3b 0a 20 20 6e 45 78 74 72 61 43 6f 6c 20 3d  );.  nExtraCol =
1be20 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 6e 4b 65 79   pPk ? pPk->nKey
1be30 43 6f 6c 20 3a 20 31 3b 0a 20 20 61 73 73 65 72  Col : 1;.  asser
1be40 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  t( pList->nExpr 
1be50 2b 20 6e 45 78 74 72 61 43 6f 6c 20 3c 3d 20 33  + nExtraCol <= 3
1be60 32 37 36 37 20 2f 2a 20 46 69 74 73 20 69 6e 20  2767 /* Fits in 
1be70 69 31 36 20 2a 2f 20 29 3b 0a 20 20 70 49 6e 64  i16 */ );.  pInd
1be80 65 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f  ex = sqlite3Allo
1be90 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  cateIndexObject(
1bea0 64 62 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  db, pList->nExpr
1beb0 20 2b 20 6e 45 78 74 72 61 43 6f 6c 2c 0a 20 20   + nExtraCol,.  
1bec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bee0 20 20 20 20 6e 4e 61 6d 65 20 2b 20 6e 45 78 74      nName + nExt
1bef0 72 61 20 2b 20 31 2c 20 26 7a 45 78 74 72 61 29  ra + 1, &zExtra)
1bf00 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
1bf10 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
1bf20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1bf30 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73  _index;.  }.  as
1bf40 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
1bf50 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65  _ALIGNMENT(pInde
1bf60 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 29 20  x->aiRowLogEst) 
1bf70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
1bf80 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
1bf90 54 28 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  T(pIndex->azColl
1bfa0 29 20 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a  ) );.  pIndex->z
1bfb0 4e 61 6d 65 20 3d 20 7a 45 78 74 72 61 3b 0a 20  Name = zExtra;. 
1bfc0 20 7a 45 78 74 72 61 20 2b 3d 20 6e 4e 61 6d 65   zExtra += nName
1bfd0 20 2b 20 31 3b 0a 20 20 6d 65 6d 63 70 79 28 70   + 1;.  memcpy(p
1bfe0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  Index->zName, zN
1bff0 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20  ame, nName+1);. 
1c000 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20   pIndex->pTable 
1c010 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78  = pTab;.  pIndex
1c020 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38 29  ->onError = (u8)
1c030 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65  onError;.  pInde
1c040 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d  x->uniqNotNull =
1c050 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e   onError!=OE_Non
1c060 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 64 78  e;.  pIndex->idx
1c070 54 79 70 65 20 3d 20 69 64 78 54 79 70 65 3b 0a  Type = idxType;.
1c080 20 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d    pIndex->pSchem
1c090 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
1c0a0 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 49 6e 64  .pSchema;.  pInd
1c0b0 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 70 4c  ex->nKeyCol = pL
1c0c0 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66  ist->nExpr;.  if
1c0d0 28 20 70 50 49 57 68 65 72 65 20 29 7b 0a 20 20  ( pPIWhere ){.  
1c0e0 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
1c0f0 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50  SelfReference(pP
1c100 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f 50  arse, pTab, NC_P
1c110 61 72 74 49 64 78 2c 20 70 50 49 57 68 65 72 65  artIdx, pPIWhere
1c120 2c 20 30 29 3b 0a 20 20 20 20 70 49 6e 64 65 78  , 0);.    pIndex
1c130 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 20  ->pPartIdxWhere 
1c140 3d 20 70 50 49 57 68 65 72 65 3b 0a 20 20 20 20  = pPIWhere;.    
1c150 70 50 49 57 68 65 72 65 20 3d 20 30 3b 0a 20 20  pPIWhere = 0;.  
1c160 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  }.  assert( sqli
1c170 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
1c180 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
1c190 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
1c1a0 20 73 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c   see if we shoul
1c1b0 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71  d honor DESC req
1c1c0 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63  uests on index c
1c1d0 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66  olumns.  */.  if
1c1e0 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  ( pDb->pSchema->
1c1f0 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29  file_format>=4 )
1c200 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d  {.    sortOrderM
1c210 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48  ask = -1;   /* H
1c220 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d  onor DESC */.  }
1c230 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72  else{.    sortOr
1c240 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20  derMask = 0;    
1c250 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a  /* Ignore DESC *
1c260 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c  /.  }..  /* Anal
1c270 79 7a 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20  yze the list of 
1c280 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
1c290 20 66 6f 72 6d 20 74 68 65 20 74 65 72 6d 73 20   form the terms 
1c2a0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  of the index and
1c2b0 0a 20 20 2a 2a 20 72 65 70 6f 72 74 20 61 6e 79  .  ** report any
1c2c0 20 65 72 72 6f 72 73 2e 20 20 49 6e 20 74 68 65   errors.  In the
1c2d0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
1c2e0 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  re the expressio
1c2f0 6e 20 69 73 20 65 78 61 63 74 6c 79 0a 20 20 2a  n is exactly.  *
1c300 2a 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  * a table column
1c310 2c 20 73 74 6f 72 65 20 74 68 61 74 20 63 6f 6c  , store that col
1c320 75 6d 6e 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b  umn in aiColumn[
1c330 5d 2e 20 20 46 6f 72 20 67 65 6e 65 72 61 6c 20  ].  For general 
1c340 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 20 20 2a  expressions,.  *
1c350 2a 20 70 6f 70 75 6c 61 74 65 20 70 49 6e 64 65  * populate pInde
1c360 78 2d 3e 61 43 6f 6c 45 78 70 72 20 61 6e 64 20  x->aColExpr and 
1c370 73 74 6f 72 65 20 58 4e 5f 45 58 50 52 20 28 2d  store XN_EXPR (-
1c380 32 29 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d  2) in aiColumn[]
1c390 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f  ..  **.  ** TODO
1c3a0 3a 20 49 73 73 75 65 20 61 20 77 61 72 6e 69 6e  : Issue a warnin
1c3b0 67 20 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  g if two or more
1c3c0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
1c3d0 69 6e 64 65 78 20 61 72 65 20 69 64 65 6e 74 69  index are identi
1c3e0 63 61 6c 2e 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20  cal..  ** TODO: 
1c3f0 49 73 73 75 65 20 61 20 77 61 72 6e 69 6e 67 20  Issue a warning 
1c400 69 66 20 74 68 65 20 74 61 62 6c 65 20 70 72 69  if the table pri
1c410 6d 61 72 79 20 6b 65 79 20 69 73 20 75 73 65 64  mary key is used
1c420 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a   as part of the.
1c430 20 20 2a 2a 20 69 6e 64 65 78 20 6b 65 79 2e 0a    ** index key..
1c440 20 20 2a 2f 0a 20 20 70 4c 69 73 74 49 74 65 6d    */.  pListItem
1c450 20 3d 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 69   = pList->a;.  i
1c460 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
1c470 45 43 54 20 29 7b 0a 20 20 20 20 70 49 6e 64 65  ECT ){.    pInde
1c480 78 2d 3e 61 43 6f 6c 45 78 70 72 20 3d 20 70 4c  x->aColExpr = pL
1c490 69 73 74 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  ist;.    pList =
1c4a0 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   0;.  }.  for(i=
1c4b0 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65  0; i<pIndex->nKe
1c4c0 79 43 6f 6c 3b 20 69 2b 2b 2c 20 70 4c 69 73 74  yCol; i++, pList
1c4d0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
1c4e0 72 20 2a 70 43 45 78 70 72 3b 20 20 20 20 20 20  r *pCExpr;      
1c4f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c500 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20 65 78  he i-th index ex
1c510 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
1c520 69 6e 74 20 72 65 71 75 65 73 74 65 64 53 6f 72  int requestedSor
1c530 74 4f 72 64 65 72 3b 20 20 20 20 20 20 20 20 2f  tOrder;        /
1c540 2a 20 41 53 43 20 6f 72 20 44 45 53 43 20 6f 6e  * ASC or DESC on
1c550 20 74 68 65 20 69 2d 74 68 20 65 78 70 72 65 73   the i-th expres
1c560 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  sion */.    cons
1c570 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20  t char *zColl;  
1c580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1c590 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1c5a0 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 73 71   name */..    sq
1c5b0 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49 64 28  lite3StringToId(
1c5c0 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
1c5d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
1c5e0 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e  solveSelfReferen
1c5f0 63 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  ce(pParse, pTab,
1c600 20 4e 43 5f 49 64 78 45 78 70 72 2c 20 70 4c 69   NC_IdxExpr, pLi
1c610 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 30  stItem->pExpr, 0
1c620 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  );.    if( pPars
1c630 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65  e->nErr ) goto e
1c640 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1c650 3b 0a 20 20 20 20 70 43 45 78 70 72 20 3d 20 73  ;.    pCExpr = s
1c660 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
1c670 6c 6c 61 74 65 28 70 4c 69 73 74 49 74 65 6d 2d  llate(pListItem-
1c680 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  >pExpr);.    if(
1c690 20 70 43 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f   pCExpr->op!=TK_
1c6a0 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
1c6b0 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65  if( pTab==pParse
1c6c0 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20  ->pNewTable ){. 
1c6d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1c6e0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1c6f0 65 78 70 72 65 73 73 69 6f 6e 73 20 70 72 6f 68  expressions proh
1c700 69 62 69 74 65 64 20 69 6e 20 50 52 49 4d 41 52  ibited in PRIMAR
1c710 59 20 4b 45 59 20 61 6e 64 20 22 0a 20 20 20 20  Y KEY and ".    
1c720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c730 20 20 20 20 20 20 20 20 20 20 20 20 22 55 4e 49              "UNI
1c740 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 22  QUE constraints"
1c750 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
1c760 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1c770 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  x;.      }.     
1c780 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 43 6f   if( pIndex->aCo
1c790 6c 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20  lExpr==0 ){.    
1c7a0 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c      pIndex->aCol
1c7b0 45 78 70 72 20 3d 20 70 4c 69 73 74 3b 0a 20 20  Expr = pList;.  
1c7c0 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b        pList = 0;
1c7d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a  .      }.      j
1c7e0 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20   = XN_EXPR;.    
1c7f0 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
1c800 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 45 58 50 52 3b  mn[i] = XN_EXPR;
1c810 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 75  .      pIndex->u
1c820 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a  niqNotNull = 0;.
1c830 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c840 20 6a 20 3d 20 70 43 45 78 70 72 2d 3e 69 43 6f   j = pCExpr->iCo
1c850 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 61 73 73 65  lumn;.      asse
1c860 72 74 28 20 6a 3c 3d 30 78 37 66 66 66 20 29 3b  rt( j<=0x7fff );
1c870 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 30 20 29  .      if( j<0 )
1c880 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 54  {.        j = pT
1c890 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
1c8a0 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d   }else if( pTab-
1c8b0 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c  >aCol[j].notNull
1c8c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
1c8d0 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75  Index->uniqNotNu
1c8e0 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ll = 0;.      }.
1c8f0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69        pIndex->ai
1c900 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 28 69 31 36  Column[i] = (i16
1c910 29 6a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43  )j;.    }.    zC
1c920 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  oll = 0;.    if(
1c930 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
1c940 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  r->op==TK_COLLAT
1c950 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  E ){.      int n
1c960 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7a 43 6f 6c  Coll;.      zCol
1c970 6c 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  l = pListItem->p
1c980 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
1c990 20 20 20 20 20 20 6e 43 6f 6c 6c 20 3d 20 73 71        nColl = sq
1c9a0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43  lite3Strlen30(zC
1c9b0 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  oll) + 1;.      
1c9c0 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d  assert( nExtra>=
1c9d0 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 6d  nColl );.      m
1c9e0 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 7a 43  emcpy(zExtra, zC
1c9f0 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20  oll, nColl);.   
1ca00 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72     zColl = zExtr
1ca10 61 3b 0a 20 20 20 20 20 20 7a 45 78 74 72 61 20  a;.      zExtra 
1ca20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  += nColl;.      
1ca30 6e 45 78 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b  nExtra -= nColl;
1ca40 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6a  .    }else if( j
1ca50 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f  >=0 ){.      zCo
1ca60 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ll = pTab->aCol[
1ca70 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a  j].zColl;.    }.
1ca80 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29      if( !zColl )
1ca90 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   zColl = sqlite3
1caa0 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 69  StrBINARY;.    i
1cab0 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
1cac0 79 20 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63  y && !sqlite3Loc
1cad0 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
1cae0 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, zColl) ){.   
1caf0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1cb00 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
1cb10 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43  .    pIndex->azC
1cb20 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a  oll[i] = zColl;.
1cb30 20 20 20 20 72 65 71 75 65 73 74 65 64 53 6f 72      requestedSor
1cb40 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49 74  tOrder = pListIt
1cb50 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20  em->sortOrder & 
1cb60 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20  sortOrderMask;. 
1cb70 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74     pIndex->aSort
1cb80 4f 72 64 65 72 5b 69 5d 20 3d 20 28 75 38 29 72  Order[i] = (u8)r
1cb90 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65  equestedSortOrde
1cba0 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70  r;.  }..  /* App
1cbb0 65 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6b 65  end the table ke
1cbc0 79 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  y to the end of 
1cbd0 74 68 65 20 69 6e 64 65 78 2e 20 20 46 6f 72 20  the index.  For 
1cbe0 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20  WITHOUT ROWID.  
1cbf0 2a 2a 20 74 61 62 6c 65 73 20 28 77 68 65 6e 20  ** tables (when 
1cc00 70 50 6b 21 3d 30 29 20 74 68 69 73 20 77 69 6c  pPk!=0) this wil
1cc10 6c 20 62 65 20 74 68 65 20 64 65 63 6c 61 72 65  l be the declare
1cc20 64 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20  d PRIMARY KEY.  
1cc30 46 6f 72 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  For.  ** normal 
1cc40 74 61 62 6c 65 73 20 28 77 68 65 6e 20 70 50 6b  tables (when pPk
1cc50 3d 3d 30 29 20 74 68 69 73 20 77 69 6c 6c 20 62  ==0) this will b
1cc60 65 20 74 68 65 20 72 6f 77 69 64 2e 0a 20 20 2a  e the rowid..  *
1cc70 2f 0a 20 20 69 66 28 20 70 50 6b 20 29 7b 0a 20  /.  if( pPk ){. 
1cc80 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50     for(j=0; j<pP
1cc90 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29  k->nKeyCol; j++)
1cca0 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20  {.      int x = 
1ccb0 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  pPk->aiColumn[j]
1ccc0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ccd0 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  x>=0 );.      if
1cce0 28 20 69 73 44 75 70 43 6f 6c 75 6d 6e 28 70 49  ( isDupColumn(pI
1ccf0 6e 64 65 78 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b  ndex, pIndex->nK
1cd00 65 79 43 6f 6c 2c 20 70 50 6b 2c 20 6a 29 20 29  eyCol, pPk, j) )
1cd10 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  {.        pIndex
1cd20 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20 20  ->nColumn--; .  
1cd30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cd40 20 20 20 74 65 73 74 63 61 73 65 28 20 68 61 73     testcase( has
1cd50 43 6f 6c 75 6d 6e 28 70 49 6e 64 65 78 2d 3e 61  Column(pIndex->a
1cd60 69 43 6f 6c 75 6d 6e 2c 70 49 6e 64 65 78 2d 3e  iColumn,pIndex->
1cd70 6e 4b 65 79 43 6f 6c 2c 78 29 20 29 3b 0a 20 20  nKeyCol,x) );.  
1cd80 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69        pIndex->ai
1cd90 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 78 3b 0a 20  Column[i] = x;. 
1cda0 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61         pIndex->a
1cdb0 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50 6b 2d 3e  zColl[i] = pPk->
1cdc0 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  azColl[j];.     
1cdd0 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74     pIndex->aSort
1cde0 4f 72 64 65 72 5b 69 5d 20 3d 20 70 50 6b 2d 3e  Order[i] = pPk->
1cdf0 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20  aSortOrder[j];. 
1ce00 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
1ce10 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
1ce20 73 65 72 74 28 20 69 3d 3d 70 49 6e 64 65 78 2d  sert( i==pIndex-
1ce30 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 7d 65  >nColumn );.  }e
1ce40 6c 73 65 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d  lse{.    pIndex-
1ce50 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58  >aiColumn[i] = X
1ce60 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20 70 49 6e  N_ROWID;.    pIn
1ce70 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d  dex->azColl[i] =
1ce80 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
1ce90 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  Y;.  }.  sqlite3
1cea0 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49  DefaultRowEst(pI
1ceb0 6e 64 65 78 29 3b 0a 20 20 69 66 28 20 70 50 61  ndex);.  if( pPa
1cec0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d  rse->pNewTable==
1ced0 30 20 29 20 65 73 74 69 6d 61 74 65 49 6e 64 65  0 ) estimateInde
1cee0 78 57 69 64 74 68 28 70 49 6e 64 65 78 29 3b 0a  xWidth(pIndex);.
1cef0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e  .  /* If this in
1cf00 64 65 78 20 63 6f 6e 74 61 69 6e 73 20 65 76 65  dex contains eve
1cf10 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 74 73  ry column of its
1cf20 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 72   table, then mar
1cf30 6b 0a 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63  k.  ** it as a c
1cf40 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f  overing index */
1cf50 0a 20 20 61 73 73 65 72 74 28 20 48 61 73 52 6f  .  assert( HasRo
1cf60 77 69 64 28 70 54 61 62 29 20 0a 20 20 20 20 20  wid(pTab) .     
1cf70 20 7c 7c 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c   || pTab->iPKey<
1cf80 30 20 7c 7c 20 73 71 6c 69 74 65 33 43 6f 6c 75  0 || sqlite3Colu
1cf90 6d 6e 4f 66 49 6e 64 65 78 28 70 49 6e 64 65 78  mnOfIndex(pIndex
1cfa0 2c 20 70 54 61 62 2d 3e 69 50 4b 65 79 29 3e 3d  , pTab->iPKey)>=
1cfb0 30 20 29 3b 0a 20 20 72 65 63 6f 6d 70 75 74 65  0 );.  recompute
1cfc0 43 6f 6c 75 6d 6e 73 4e 6f 74 49 6e 64 65 78 65  ColumnsNotIndexe
1cfd0 64 28 70 49 6e 64 65 78 29 3b 0a 20 20 69 66 28  d(pIndex);.  if(
1cfe0 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 26 26 20   pTblName!=0 && 
1cff0 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e  pIndex->nColumn>
1d000 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  =pTab->nCol ){. 
1d010 20 20 20 70 49 6e 64 65 78 2d 3e 69 73 43 6f 76     pIndex->isCov
1d020 65 72 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 66  ering = 1;.    f
1d030 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
1d040 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
1d050 20 20 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69    if( j==pTab->i
1d060 50 4b 65 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b  PKey ) continue;
1d070 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1d080 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28  e3ColumnOfIndex(
1d090 70 49 6e 64 65 78 2c 6a 29 3e 3d 30 20 29 20 63  pIndex,j)>=0 ) c
1d0a0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
1d0b0 49 6e 64 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e  Index->isCoverin
1d0c0 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  g = 0;.      bre
1d0d0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
1d0e0 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73   if( pTab==pPars
1d0f0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a  e->pNewTable ){.
1d100 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74      /* This rout
1d110 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c  ine has been cal
1d120 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e  led to create an
1d130 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
1d140 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65 73   as a.    ** res
1d150 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52 59  ult of a PRIMARY
1d160 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63   KEY or UNIQUE c
1d170 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d  lause on a colum
1d180 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72  n definition, or
1d190 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41 52  .    ** a PRIMAR
1d1a0 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
1d1b0 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67  clause following
1d1c0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69   the column defi
1d1d0 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20  nitions..    ** 
1d1e0 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20  i.e. one of:.   
1d1f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41 54   **.    ** CREAT
1d200 45 20 54 41 42 4c 45 20 74 28 78 20 50 52 49 4d  E TABLE t(x PRIM
1d210 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20  ARY KEY, y);.   
1d220 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
1d230 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28   t(x, y, UNIQUE(
1d240 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20  x, y));.    **. 
1d250 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61 79     ** Either way
1d260 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  , check to see i
1d270 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65  f the table alre
1d280 61 64 79 20 68 61 73 20 73 75 63 68 20 61 6e 20  ady has such an 
1d290 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a  index. If.    **
1d2a0 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65   so, don't bothe
1d2b0 72 20 63 72 65 61 74 69 6e 67 20 74 68 69 73 20  r creating this 
1d2c0 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61  one. This only a
1d2d0 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a  pplies to.    **
1d2e0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
1d2f0 72 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e 20  reated indices. 
1d300 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73 20  Users can do as 
1d310 74 68 65 79 20 77 69 73 68 20 77 69 74 68 0a 20  they wish with. 
1d320 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 69     ** explicit i
1d330 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20  ndices..    **. 
1d340 20 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55 45     ** Two UNIQUE
1d350 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20   or PRIMARY KEY 
1d360 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
1d370 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 69 76  considered equiv
1d380 61 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61 6e  alent.    ** (an
1d390 64 20 74 68 75 73 20 73 75 70 70 72 65 73 73 69  d thus suppressi
1d3a0 6e 67 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 6e  ng the second on
1d3b0 65 29 20 65 76 65 6e 20 69 66 20 74 68 65 79 20  e) even if they 
1d3c0 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 20  have different. 
1d3d0 20 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72     ** sort order
1d3e0 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s..    **.    **
1d3f0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69   If there are di
1d400 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e  fferent collatin
1d410 67 20 73 65 71 75 65 6e 63 65 73 20 6f 72 20 69  g sequences or i
1d420 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  f the columns of
1d430 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 73  .    ** the cons
1d440 74 72 61 69 6e 74 20 6f 63 63 75 72 20 69 6e 20  traint occur in 
1d450 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 73  different orders
1d460 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74  , then the const
1d470 72 61 69 6e 74 73 20 61 72 65 0a 20 20 20 20 2a  raints are.    *
1d480 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 64 69 73  * considered dis
1d490 74 69 6e 63 74 20 61 6e 64 20 62 6f 74 68 20 72  tinct and both r
1d4a0 65 73 75 6c 74 20 69 6e 20 73 65 70 61 72 61 74  esult in separat
1d4b0 65 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a  e indices..    *
1d4c0 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  /.    Index *pId
1d4d0 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  x;.    for(pIdx=
1d4e0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
1d4f0 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
1d500 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
1d510 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   k;.      assert
1d520 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28  ( IsUniqueIndex(
1d530 70 49 64 78 29 20 29 3b 0a 20 20 20 20 20 20 61  pIdx) );.      a
1d540 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 64 78  ssert( pIdx->idx
1d550 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58  Type!=SQLITE_IDX
1d560 54 59 50 45 5f 41 50 50 44 45 46 20 29 3b 0a 20  TYPE_APPDEF );. 
1d570 20 20 20 20 20 61 73 73 65 72 74 28 20 49 73 55       assert( IsU
1d580 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65  niqueIndex(pInde
1d590 78 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  x) );..      if(
1d5a0 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 21 3d   pIdx->nKeyCol!=
1d5b0 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20  pIndex->nKeyCol 
1d5c0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1d5d0 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64    for(k=0; k<pId
1d5e0 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 2b 2b 29  x->nKeyCol; k++)
1d5f0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
1d600 63 68 61 72 20 2a 7a 31 3b 0a 20 20 20 20 20 20  char *z1;.      
1d610 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32    const char *z2
1d620 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1d630 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
1d640 5b 6b 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  [k]>=0 );.      
1d650 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
1d660 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d  lumn[k]!=pIndex-
1d670 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62  >aiColumn[k] ) b
1d680 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 31  reak;.        z1
1d690 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b   = pIdx->azColl[
1d6a0 6b 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d  k];.        z2 =
1d6b0 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
1d6c0 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  k];.        if( 
1d6d0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
1d6e0 31 2c 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a  1, z2) ) break;.
1d6f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1d700 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  ( k==pIdx->nKeyC
1d710 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ol ){.        if
1d720 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
1d730 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72  =pIndex->onError
1d740 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1d750 20 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   This constraint
1d760 20 63 72 65 61 74 65 73 20 74 68 65 20 73 61 6d   creates the sam
1d770 65 20 69 6e 64 65 78 20 61 73 20 61 20 70 72 65  e index as a pre
1d780 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20  vious.          
1d790 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70  ** constraint sp
1d7a0 65 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72  ecified somewher
1d7b0 65 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20  e in the CREATE 
1d7c0 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
1d7d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f  .          ** Ho
1d7e0 77 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e  wever the ON CON
1d7f0 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61 72  FLICT clauses ar
1d800 65 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20  e different. If 
1d810 62 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20 20  both this .     
1d820 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69       ** constrai
1d830 6e 74 20 61 6e 64 20 74 68 65 20 70 72 65 76 69  nt and the previ
1d840 6f 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63  ous equivalent c
1d850 6f 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20 65  onstraint have e
1d860 78 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20  xplicit.        
1d870 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54    ** ON CONFLICT
1d880 20 63 6c 61 75 73 65 73 20 74 68 69 73 20 69 73   clauses this is
1d890 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72   an error. Other
1d8a0 77 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20  wise, use the.  
1d8b0 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69          ** expli
1d8c0 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20  citly specified 
1d8d0 62 65 68 61 76 69 6f 72 20 66 6f 72 20 74 68 65  behavior for the
1d8e0 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
1d8f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
1d900 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72  f( !(pIdx->onErr
1d910 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c  or==OE_Default |
1d920 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  | pIndex->onErro
1d930 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29  r==OE_Default) )
1d940 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
1d950 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1d960 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
1d970 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74         "conflict
1d980 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  ing ON CONFLICT 
1d990 63 6c 61 75 73 65 73 20 73 70 65 63 69 66 69 65  clauses specifie
1d9a0 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  d", 0);.        
1d9b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
1d9c0 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  ( pIdx->onError=
1d9d0 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20  =OE_Default ){. 
1d9e0 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
1d9f0 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65  >onError = pInde
1da00 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20  x->onError;.    
1da10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1da20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 64  }.        if( id
1da30 78 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44  xType==SQLITE_ID
1da40 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59  XTYPE_PRIMARYKEY
1da50 20 29 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65   ) pIdx->idxType
1da60 20 3d 20 69 64 78 54 79 70 65 3b 0a 20 20 20 20   = idxType;.    
1da70 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d      if( IN_RENAM
1da80 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20  E_OBJECT ){.    
1da90 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e        pIndex->pN
1daa0 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  ext = pParse->pN
1dab0 65 77 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20  ewIndex;.       
1dac0 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 49     pParse->pNewI
1dad0 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20  ndex = pIndex;. 
1dae0 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 20           pIndex 
1daf0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
1db00 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
1db10 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1db20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1db30 0a 0a 20 20 69 66 28 20 21 49 4e 5f 52 45 4e 41  ..  if( !IN_RENA
1db40 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 0a 20 20  ME_OBJECT ){..  
1db50 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65    /* Link the ne
1db60 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  w Index structur
1db70 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61  e to its table a
1db80 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a  nd to the other.
1db90 20 20 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79      ** in-memory
1dba0 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
1dbb0 75 72 65 73 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  ures. .    */.  
1dbc0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1dbd0 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 20  ->nErr==0 );.   
1dbe0 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
1dbf0 73 79 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65  sy ){.      Inde
1dc00 78 20 2a 70 3b 0a 20 20 20 20 20 20 61 73 73 65  x *p;.      asse
1dc10 72 74 28 20 21 49 4e 5f 53 50 45 43 49 41 4c 5f  rt( !IN_SPECIAL_
1dc20 50 41 52 53 45 20 29 3b 0a 20 20 20 20 20 20 61  PARSE );.      a
1dc30 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
1dc40 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
1dc50 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63  , 0, pIndex->pSc
1dc60 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 69  hema) );.      i
1dc70 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  f( pTblName!=0 )
1dc80 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  {.        pIndex
1dc90 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69  ->tnum = db->ini
1dca0 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 20  t.newTnum;.     
1dcb0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e     if( sqlite3In
1dcc0 64 65 78 48 61 73 44 75 70 6c 69 63 61 74 65 52  dexHasDuplicateR
1dcd0 6f 6f 74 50 61 67 65 28 70 49 6e 64 65 78 29 20  ootPage(pIndex) 
1dce0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
1dcf0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1dd00 72 73 65 2c 20 22 69 6e 76 61 6c 69 64 20 72 6f  rse, "invalid ro
1dd10 6f 74 70 61 67 65 22 29 3b 0a 20 20 20 20 20 20  otpage");.      
1dd20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
1dd30 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1dd40 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
1dd50 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1dd60 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20  _index;.        
1dd70 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1dd80 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  p = sqlite3HashI
1dd90 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e 70  nsert(&pIndex->p
1dda0 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c  Schema->idxHash,
1ddb0 20 0a 20 20 20 20 20 20 20 20 20 20 70 49 6e 64   .          pInd
1ddc0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65  ex->zName, pInde
1ddd0 78 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 20  x);.      if( p 
1dde0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1ddf0 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20  t( p==pIndex ); 
1de00 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
1de10 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  have failed */. 
1de20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f         sqlite3Oo
1de30 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
1de40 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1de50 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1de60 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6d 44    }.      db->mD
1de70 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47  bFlags |= DBFLAG
1de80 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20  _SchemaChange;. 
1de90 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1dea0 74 68 69 73 20 69 73 20 74 68 65 20 69 6e 69 74  this is the init
1deb0 69 61 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58  ial CREATE INDEX
1dec0 20 73 74 61 74 65 6d 65 6e 74 20 28 6f 72 20 43   statement (or C
1ded0 52 45 41 54 45 20 54 41 42 4c 45 20 69 66 20 74  REATE TABLE if t
1dee0 68 65 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20  he.    ** index 
1def0 69 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 69 6e  is an implied in
1df00 64 65 78 20 66 6f 72 20 61 20 55 4e 49 51 55 45  dex for a UNIQUE
1df10 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20   or PRIMARY KEY 
1df20 63 6f 6e 73 74 72 61 69 6e 74 29 20 74 68 65 6e  constraint) then
1df30 0a 20 20 20 20 2a 2a 20 65 6d 69 74 20 63 6f 64  .    ** emit cod
1df40 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  e to allocate th
1df50 65 20 69 6e 64 65 78 20 72 6f 6f 74 70 61 67 65  e index rootpage
1df60 20 6f 6e 20 64 69 73 6b 20 61 6e 64 20 6d 61 6b   on disk and mak
1df70 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 0a 20  e an entry for. 
1df80 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20     ** the index 
1df90 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  in the sqlite_ma
1dfa0 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 70  ster table and p
1dfb0 6f 70 75 6c 61 74 65 20 74 68 65 20 69 6e 64 65  opulate the inde
1dfc0 78 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 63 6f  x with.    ** co
1dfd0 6e 74 65 6e 74 2e 20 20 42 75 74 2c 20 64 6f 20  ntent.  But, do 
1dfe0 6e 6f 74 20 64 6f 20 74 68 69 73 20 69 66 20 77  not do this if w
1dff0 65 20 61 72 65 20 73 69 6d 70 6c 79 20 72 65 61  e are simply rea
1e000 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
1e010 6d 61 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 61  master.    ** ta
1e020 62 6c 65 20 74 6f 20 70 61 72 73 65 20 74 68 65  ble to parse the
1e030 20 73 63 68 65 6d 61 2c 20 6f 72 20 69 66 20 74   schema, or if t
1e040 68 69 73 20 69 6e 64 65 78 20 69 73 20 74 68 65  his index is the
1e050 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
1e060 65 78 0a 20 20 20 20 2a 2a 20 6f 66 20 61 20 57  ex.    ** of a W
1e070 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
1e080 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
1e090 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30  * If pTblName==0
1e0a0 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69   it means this i
1e0b0 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61 74 65  ndex is generate
1e0c0 64 20 61 73 20 61 6e 20 69 6d 70 6c 69 65 64 20  d as an implied 
1e0d0 50 52 49 4d 41 52 59 20 4b 45 59 0a 20 20 20 20  PRIMARY KEY.    
1e0e0 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 69 6e 64  ** or UNIQUE ind
1e0f0 65 78 20 69 6e 20 61 20 43 52 45 41 54 45 20 54  ex in a CREATE T
1e100 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
1e110 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65   Since the table
1e120 0a 20 20 20 20 2a 2a 20 68 61 73 20 6a 75 73 74  .    ** has just
1e130 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69   been created, i
1e140 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61  t contains no da
1e150 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  ta and the index
1e160 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
1e170 20 20 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20      ** step can 
1e180 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20  be skipped..    
1e190 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  */.    else if( 
1e1a0 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c  HasRowid(pTab) |
1e1b0 7c 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  | pTblName!=0 ){
1e1c0 0a 20 20 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  .      Vdbe *v;.
1e1d0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d        char *zStm
1e1e0 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d 65  t;.      int iMe
1e1f0 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
1e200 65 6d 3b 0a 0a 20 20 20 20 20 20 76 20 3d 20 73  em;..      v = s
1e210 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1e220 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28  arse);.      if(
1e230 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69   v==0 ) goto exi
1e240 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1e250 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
1e260 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
1e270 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
1e280 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65  );..      /* Cre
1e290 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65  ate the rootpage
1e2a0 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 75   for the index u
1e2b0 73 69 6e 67 20 43 72 65 61 74 65 49 6e 64 65 78  sing CreateIndex
1e2c0 2e 20 42 75 74 20 62 65 66 6f 72 65 0a 20 20 20  . But before.   
1e2d0 20 20 20 2a 2a 20 64 6f 69 6e 67 20 73 6f 2c 20     ** doing so, 
1e2e0 63 6f 64 65 20 61 20 4e 6f 6f 70 20 69 6e 73 74  code a Noop inst
1e2f0 72 75 63 74 69 6f 6e 20 61 6e 64 20 73 74 6f 72  ruction and stor
1e300 65 20 69 74 73 20 61 64 64 72 65 73 73 20 69 6e  e its address in
1e310 20 0a 20 20 20 20 20 20 2a 2a 20 49 6e 64 65 78   .      ** Index
1e320 2e 74 6e 75 6d 2e 20 54 68 69 73 20 69 73 20 72  .tnum. This is r
1e330 65 71 75 69 72 65 64 20 69 6e 20 63 61 73 65 20  equired in case 
1e340 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 61 63  this index is ac
1e350 74 75 61 6c 6c 79 20 61 20 0a 20 20 20 20 20 20  tually a .      
1e360 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61  ** PRIMARY KEY a
1e370 6e 64 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  nd the table is 
1e380 61 63 74 75 61 6c 6c 79 20 61 20 57 49 54 48 4f  actually a WITHO
1e390 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20  UT ROWID table. 
1e3a0 49 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  In .      ** tha
1e3b0 74 20 63 61 73 65 20 74 68 65 20 63 6f 6e 76 65  t case the conve
1e3c0 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64  rtToWithoutRowid
1e3d0 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 20  Table() routine 
1e3e0 77 69 6c 6c 20 72 65 70 6c 61 63 65 0a 20 20 20  will replace.   
1e3f0 20 20 20 2a 2a 20 74 68 65 20 4e 6f 6f 70 20 77     ** the Noop w
1e400 69 74 68 20 61 20 47 6f 74 6f 20 74 6f 20 6a 75  ith a Goto to ju
1e410 6d 70 20 6f 76 65 72 20 74 68 65 20 56 44 42 45  mp over the VDBE
1e420 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
1e430 62 65 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20  below. */.      
1e440 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 73  pIndex->tnum = s
1e450 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
1e460 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20  (v, OP_Noop);.  
1e470 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e480 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 72 65 61  ddOp3(v, OP_Crea
1e490 74 65 42 74 72 65 65 2c 20 69 44 62 2c 20 69 4d  teBtree, iDb, iM
1e4a0 65 6d 2c 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45  em, BTREE_BLOBKE
1e4b0 59 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 61  Y);..      /* Ga
1e4c0 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74  ther the complet
1e4d0 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52  e text of the CR
1e4e0 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
1e4f0 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 20 20  ment into.      
1e500 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72  ** the zStmt var
1e510 69 61 62 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20  iable.      */. 
1e520 20 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20       if( pStart 
1e530 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
1e540 20 3d 20 28 69 6e 74 29 28 70 50 61 72 73 65 2d   = (int)(pParse-
1e550 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20  >sLastToken.z - 
1e560 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70 50 61 72  pName->z) + pPar
1e570 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e  se->sLastToken.n
1e580 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
1e590 61 6d 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27  ame->z[n-1]==';'
1e5a0 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 20 20   ) n--;.        
1e5b0 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78  /* A named index
1e5c0 20 77 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69   with an explici
1e5d0 74 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  t CREATE INDEX s
1e5e0 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
1e5f0 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69      zStmt = sqli
1e600 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
1e610 43 52 45 41 54 45 25 73 20 49 4e 44 45 58 20 25  CREATE%s INDEX %
1e620 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  .*s",.          
1e630 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f    onError==OE_No
1e640 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51  ne ? "" : " UNIQ
1e650 55 45 22 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a  UE", n, pName->z
1e660 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1e670 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75          /* An au
1e680 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72  tomatic index cr
1e690 65 61 74 65 64 20 62 79 20 61 20 50 52 49 4d 41  eated by a PRIMA
1e6a0 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
1e6b0 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
1e6c0 20 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20         /* zStmt 
1e6d0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
1e6e0 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20  (""); */.       
1e6f0 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20   zStmt = 0;.    
1e700 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 64    }..      /* Ad
1e710 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71  d an entry in sq
1e720 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20  lite_master for 
1e730 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20 20  this index.     
1e740 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1e750 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
1e760 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
1e770 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e  "INSERT INTO %Q.
1e780 25 73 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78  %s VALUES('index
1e790 27 2c 25 51 2c 25 51 2c 23 25 64 2c 25 51 29 3b  ',%Q,%Q,#%d,%Q);
1e7a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  ",.          db-
1e7b0 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
1e7c0 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c  me, MASTER_NAME,
1e7d0 0a 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65  .          pInde
1e7e0 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  x->zName,.      
1e7f0 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
1e800 0a 20 20 20 20 20 20 20 20 20 20 69 4d 65 6d 2c  .          iMem,
1e810 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74 6d 74  .          zStmt
1e820 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
1e830 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1e840 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20  e(db, zStmt);.. 
1e850 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65       /* Fill the
1e860 20 69 6e 64 65 78 20 77 69 74 68 20 64 61 74 61   index with data
1e870 20 61 6e 64 20 72 65 70 61 72 73 65 20 74 68 65   and reparse the
1e880 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e   schema. Code an
1e890 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20 20 20   OP_Expire.     
1e8a0 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74   ** to invalidat
1e8b0 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c  e all pre-compil
1e8c0 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
1e8d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1e8e0 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20  ( pTblName ){.  
1e8f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66        sqlite3Ref
1e900 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
1e910 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a   pIndex, iMem);.
1e920 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
1e930 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
1e940 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
1e950 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e960 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 70 50  ParseSchemaOp(pP
1e970 61 72 73 65 2c 20 69 44 62 2c 0a 20 20 20 20 20  arse, iDb,.     
1e980 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
1e990 72 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d  rintf(db, "name=
1e9a0 27 25 71 27 20 41 4e 44 20 74 79 70 65 3d 27 69  '%q' AND type='i
1e9b0 6e 64 65 78 27 22 2c 20 70 49 6e 64 65 78 2d 3e  ndex'", pIndex->
1e9c0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20  zName));.       
1e9d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e9e0 70 32 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c  p2(v, OP_Expire,
1e9f0 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 1);.      }.
1ea00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ea10 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49  beJumpHere(v, pI
1ea20 6e 64 65 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20  ndex->tnum);.   
1ea30 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65   }.  }..  /* Whe
1ea40 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65  n adding an inde
1ea50 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  x to the list of
1ea60 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74   indices for a t
1ea70 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20  able, make.  ** 
1ea80 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  sure all indices
1ea90 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c   labeled OE_Repl
1eaa0 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61  ace come after a
1eab0 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64  ll those labeled
1eac0 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e  .  ** OE_Ignore.
1ead0 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
1eae0 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72  ary for the corr
1eaf0 65 63 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  ect constraint c
1eb00 68 65 63 6b 0a 20 20 2a 2a 20 70 72 6f 63 65 73  heck.  ** proces
1eb10 73 69 6e 67 20 28 69 6e 20 73 71 6c 69 74 65 33  sing (in sqlite3
1eb20 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69  GenerateConstrai
1eb30 6e 74 43 68 65 63 6b 73 28 29 29 20 61 73 20 70  ntChecks()) as p
1eb40 61 72 74 20 6f 66 0a 20 20 2a 2a 20 55 50 44 41  art of.  ** UPDA
1eb50 54 45 20 61 6e 64 20 49 4e 53 45 52 54 20 73 74  TE and INSERT st
1eb60 61 74 65 6d 65 6e 74 73 2e 20 20 0a 20 20 2a 2f  atements.  .  */
1eb70 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
1eb80 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65  busy || pTblName
1eb90 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f  ==0 ){.    if( o
1eba0 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61  nError!=OE_Repla
1ebb0 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64  ce || pTab->pInd
1ebc0 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c  ex==0.         |
1ebd0 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e  | pTab->pIndex->
1ebe0 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c  onError==OE_Repl
1ebf0 61 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64  ace){.      pInd
1ec00 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62  ex->pNext = pTab
1ec10 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
1ec20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70  pTab->pIndex = p
1ec30 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65  Index;.    }else
1ec40 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
1ec50 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49  Other = pTab->pI
1ec60 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c  ndex;.      whil
1ec70 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74  e( pOther->pNext
1ec80 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78   && pOther->pNex
1ec90 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52  t->onError!=OE_R
1eca0 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20  eplace ){.      
1ecb0 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65    pOther = pOthe
1ecc0 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  r->pNext;.      
1ecd0 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  }.      pIndex->
1ece0 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e  pNext = pOther->
1ecf0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74  pNext;.      pOt
1ed00 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e  her->pNext = pIn
1ed10 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
1ed20 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20  Index = 0;.  }. 
1ed30 20 65 6c 73 65 20 69 66 28 20 49 4e 5f 52 45 4e   else if( IN_REN
1ed40 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20  AME_OBJECT ){.  
1ed50 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1ed60 2d 3e 70 4e 65 77 49 6e 64 65 78 3d 3d 30 20 29  ->pNewIndex==0 )
1ed70 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e  ;.    pParse->pN
1ed80 65 77 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  ewIndex = pIndex
1ed90 3b 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30  ;.    pIndex = 0
1eda0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61  ;.  }..  /* Clea
1edb0 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74  n up before exit
1edc0 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61  ing */.exit_crea
1edd0 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20  te_index:.  if( 
1ede0 70 49 6e 64 65 78 20 29 20 73 71 6c 69 74 65 33  pIndex ) sqlite3
1edf0 46 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49  FreeIndex(db, pI
1ee00 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  ndex);.  sqlite3
1ee10 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
1ee20 50 49 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69  PIWhere);.  sqli
1ee30 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
1ee40 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
1ee50 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
1ee60 6c 65 74 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d  lete(db, pTblNam
1ee70 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
1ee80 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
1ee90 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68  }../*.** Fill th
1eea0 65 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74  e Index.aiRowEst
1eeb0 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20 64 65  [] array with de
1eec0 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f  fault informatio
1eed0 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  n - information.
1eee0 2a 2a 20 74 6f 20 62 65 20 75 73 65 64 20 77 68  ** to be used wh
1eef0 65 6e 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72  en we have not r
1ef00 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63  un the ANALYZE c
1ef10 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69  ommand..**.** ai
1ef20 52 6f 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70  RowEst[0] is sup
1ef30 70 6f 73 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  posed to contain
1ef40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
1ef50 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69  lements in the i
1ef60 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77  ndex..** Since w
1ef70 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67  e do not know, g
1ef80 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20  uess 1 million. 
1ef90 20 61 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20   aiRowEst[1] is 
1efa0 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  an estimate of t
1efb0 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
1efc0 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
1efd0 65 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79  e that match any
1efe0 20 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75   particular valu
1eff0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73  e of the.** firs
1f000 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
1f010 69 6e 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74  index.  aiRowEst
1f020 5b 32 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61  [2] is an estima
1f030 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
1f040 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74  .** of rows that
1f050 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69   match any parti
1f060 63 75 6c 61 72 20 63 6f 6d 62 69 6e 61 74 69 6f  cular combinatio
1f070 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 32  n of the first 2
1f080 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74   columns.** of t
1f090 68 65 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73  he index.  And s
1f0a0 6f 20 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73  o forth.  It mus
1f0b0 74 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20  t always be the 
1f0c0 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20  case that.*.**  
1f0d0 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73           aiRowEs
1f0e0 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e  t[N]<=aiRowEst[N
1f0f0 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  -1].**          
1f100 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a   aiRowEst[N]>=1.
1f110 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d  **.** Apart from
1f120 20 74 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c   that, we have l
1f130 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62  ittle to go on b
1f140 65 73 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e  esides intuition
1f150 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69   as to.** how ai
1f160 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20  RowEst[] should 
1f170 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  be initialized. 
1f180 20 54 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e   The numbers gen
1f190 65 72 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61  erated here.** a
1f1a0 72 65 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69  re based on typi
1f1b0 63 61 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64  cal values found
1f1c0 20 69 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63   in actual indic
1f1d0 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
1f1e0 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74  te3DefaultRowEst
1f1f0 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20  (Index *pIdx){. 
1f200 20 2f 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   /*             
1f210 20 20 20 31 30 2c 20 20 39 2c 20 20 38 2c 20 20     10,  9,  8,  
1f220 37 2c 20 20 36 20 2a 2f 0a 20 20 4c 6f 67 45 73  7,  6 */.  LogEs
1f230 74 20 61 56 61 6c 5b 5d 20 3d 20 7b 20 33 33 2c  t aVal[] = { 33,
1f240 20 33 32 2c 20 33 30 2c 20 32 38 2c 20 32 36 20   32, 30, 28, 26 
1f250 7d 3b 0a 20 20 4c 6f 67 45 73 74 20 2a 61 20 3d  };.  LogEst *a =
1f260 20 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45   pIdx->aiRowLogE
1f270 73 74 3b 0a 20 20 69 6e 74 20 6e 43 6f 70 79 20  st;.  int nCopy 
1f280 3d 20 4d 49 4e 28 41 72 72 61 79 53 69 7a 65 28  = MIN(ArraySize(
1f290 61 56 61 6c 29 2c 20 70 49 64 78 2d 3e 6e 4b 65  aVal), pIdx->nKe
1f2a0 79 43 6f 6c 29 3b 0a 20 20 69 6e 74 20 69 3b 0a  yCol);.  int i;.
1f2b0 0a 20 20 2f 2a 20 49 6e 64 65 78 65 73 20 77 69  .  /* Indexes wi
1f2c0 74 68 20 64 65 66 61 75 6c 74 20 72 6f 77 20 65  th default row e
1f2d0 73 74 69 6d 61 74 65 73 20 73 68 6f 75 6c 64 20  stimates should 
1f2e0 6e 6f 74 20 68 61 76 65 20 73 74 61 74 31 20 64  not have stat1 d
1f2f0 61 74 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ata */.  assert(
1f300 20 21 70 49 64 78 2d 3e 68 61 73 53 74 61 74 31   !pIdx->hasStat1
1f310 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   );..  /* Set th
1f320 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 28 6e  e first entry (n
1f330 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
1f340 20 74 68 65 20 69 6e 64 65 78 29 20 74 6f 20 74   the index) to t
1f350 68 65 20 65 73 74 69 6d 61 74 65 64 20 0a 20 20  he estimated .  
1f360 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ** number of row
1f370 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20  s in the table, 
1f380 6f 72 20 68 61 6c 66 20 74 68 65 20 6e 75 6d 62  or half the numb
1f390 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
1f3a0 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 66 6f 72  e table.  ** for
1f3b0 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78   a partial index
1f3c0 2e 20 20 20 42 75 74 20 64 6f 20 6e 6f 74 20 6c  .   But do not l
1f3d0 65 74 20 74 68 65 20 65 73 74 69 6d 61 74 65 20  et the estimate 
1f3e0 64 72 6f 70 20 62 65 6c 6f 77 20 31 30 2e 20 2a  drop below 10. *
1f3f0 2f 0a 20 20 61 5b 30 5d 20 3d 20 70 49 64 78 2d  /.  a[0] = pIdx-
1f400 3e 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67  >pTable->nRowLog
1f410 45 73 74 3b 0a 20 20 69 66 28 20 70 49 64 78 2d  Est;.  if( pIdx-
1f420 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d  >pPartIdxWhere!=
1f430 30 20 29 20 61 5b 30 5d 20 2d 3d 20 31 30 3b 20  0 ) a[0] -= 10; 
1f440 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c   assert( 10==sql
1f450 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b  ite3LogEst(2) );
1f460 0a 20 20 69 66 28 20 61 5b 30 5d 3c 33 33 20 29  .  if( a[0]<33 )
1f470 20 61 5b 30 5d 20 3d 20 33 33 3b 20 20 20 20 20   a[0] = 33;     
1f480 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
1f490 65 72 74 28 20 33 33 3d 3d 73 71 6c 69 74 65 33  ert( 33==sqlite3
1f4a0 4c 6f 67 45 73 74 28 31 30 29 20 29 3b 0a 0a 20  LogEst(10) );.. 
1f4b0 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 61   /* Estimate tha
1f4c0 74 20 61 5b 31 5d 20 69 73 20 31 30 2c 20 61 5b  t a[1] is 10, a[
1f4d0 32 5d 20 69 73 20 39 2c 20 61 5b 33 5d 20 69 73  2] is 9, a[3] is
1f4e0 20 38 2c 20 61 5b 34 5d 20 69 73 20 37 2c 20 61   8, a[4] is 7, a
1f4f0 5b 35 5d 20 69 73 0a 20 20 2a 2a 20 36 20 61 6e  [5] is.  ** 6 an
1f500 64 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e  d each subsequen
1f510 74 20 76 61 6c 75 65 20 28 69 66 20 61 6e 79 29  t value (if any)
1f520 20 69 73 20 35 2e 20 20 2a 2f 0a 20 20 6d 65 6d   is 5.  */.  mem
1f530 63 70 79 28 26 61 5b 31 5d 2c 20 61 56 61 6c 2c  cpy(&a[1], aVal,
1f540 20 6e 43 6f 70 79 2a 73 69 7a 65 6f 66 28 4c 6f   nCopy*sizeof(Lo
1f550 67 45 73 74 29 29 3b 0a 20 20 66 6f 72 28 69 3d  gEst));.  for(i=
1f560 6e 43 6f 70 79 2b 31 3b 20 69 3c 3d 70 49 64 78  nCopy+1; i<=pIdx
1f570 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b  ->nKeyCol; i++){
1f580 0a 20 20 20 20 61 5b 69 5d 20 3d 20 32 33 3b 20  .    a[i] = 23; 
1f590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5a0 20 20 20 61 73 73 65 72 74 28 20 32 33 3d 3d 73     assert( 23==s
1f5b0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 35 29 20  qlite3LogEst(5) 
1f5c0 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
1f5d0 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  ( 0==sqlite3LogE
1f5e0 73 74 28 31 29 20 29 3b 0a 20 20 69 66 28 20 49  st(1) );.  if( I
1f5f0 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64  sUniqueIndex(pId
1f600 78 29 20 29 20 61 5b 70 49 64 78 2d 3e 6e 4b 65  x) ) a[pIdx->nKe
1f610 79 43 6f 6c 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  yCol] = 0;.}../*
1f620 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1f630 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78   will drop an ex
1f640 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64  isting named ind
1f650 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ex.  This routin
1f660 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20  e.** implements 
1f670 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73  the DROP INDEX s
1f680 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
1f690 64 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64  d sqlite3DropInd
1f6a0 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
1f6b0 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65  , SrcList *pName
1f6c0 2c 20 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b  , int ifExists){
1f6d0 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
1f6e0 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  ;.  Vdbe *v;.  s
1f6f0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1f700 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
1f710 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Db;..  assert( p
1f720 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
1f730 3b 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c  ;   /* Never cal
1f740 6c 65 64 20 77 69 74 68 20 70 72 69 6f 72 20 65  led with prior e
1f750 72 72 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20 64  rrors */.  if( d
1f760 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1f770 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
1f780 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
1f790 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65  .  assert( pName
1f7a0 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69  ->nSrc==1 );.  i
1f7b0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
1f7c0 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
1f7d0 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67  pParse) ){.    g
1f7e0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
1f7f0 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65  dex;.  }.  pInde
1f800 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  x = sqlite3FindI
1f810 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e  ndex(db, pName->
1f820 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d  a[0].zName, pNam
1f830 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
1f840 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  e);.  if( pIndex
1f850 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ==0 ){.    if( !
1f860 69 66 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20  ifExists ){.    
1f870 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1f880 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
1f890 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70  ch index: %S", p
1f8a0 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65  Name, 0);.    }e
1f8b0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
1f8c0 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65  e3CodeVerifyName
1f8d0 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  dSchema(pParse, 
1f8e0 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
1f8f0 61 62 61 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  abase);.    }.  
1f900 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
1f910 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67  chema = 1;.    g
1f920 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
1f930 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  dex;.  }.  if( p
1f940 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 21 3d  Index->idxType!=
1f950 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41  SQLITE_IDXTYPE_A
1f960 50 50 44 45 46 20 29 7b 0a 20 20 20 20 73 71 6c  PPDEF ){.    sql
1f970 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1f980 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f  rse, "index asso
1f990 63 69 61 74 65 64 20 77 69 74 68 20 55 4e 49 51  ciated with UNIQ
1f9a0 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50  UE ".      "or P
1f9b0 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
1f9c0 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  raint cannot be 
1f9d0 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20  dropped", 0);.  
1f9e0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
1f9f0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44  _index;.  }.  iD
1fa00 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
1fa10 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  aToIndex(db, pIn
1fa20 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  dex->pSchema);. 
1fa30 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 57 72   sqlite3SchemaWr
1fa40 69 74 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  itable(pParse, i
1fa50 44 62 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Db);.#ifndef SQL
1fa60 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
1fa70 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
1fa80 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45  nt code = SQLITE
1fa90 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _DROP_INDEX;.   
1faa0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
1fab0 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20  Index->pTable;. 
1fac0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1fad0 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
1fae0 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20  ].zDbSName;.    
1faf0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
1fb00 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28   = SCHEMA_TABLE(
1fb10 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71  iDb);.    if( sq
1fb20 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1fb30 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
1fb40 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a  LETE, zTab, 0, z
1fb50 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
1fb60 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1fb70 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
1fb80 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
1fb90 20 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51   iDb ) code = SQ
1fba0 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49  LITE_DROP_TEMP_I
1fbb0 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71  NDEX;.    if( sq
1fbc0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1fbd0 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e  Parse, code, pIn
1fbe0 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62  dex->zName, pTab
1fbf0 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b  ->zName, zDb) ){
1fc00 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
1fc10 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20  _drop_index;.   
1fc20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1fc30 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1fc40 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  e to remove the 
1fc50 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74  index and from t
1fc60 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
1fc70 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
1fc80 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1fc90 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
1fca0 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
1fcb0 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
1fcc0 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 1, iDb);.    
1fcd0 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
1fce0 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
1fcf0 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
1fd00 51 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d  Q.%s WHERE name=
1fd10 25 51 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64  %Q AND type='ind
1fd20 65 78 27 22 2c 0a 20 20 20 20 20 20 20 64 62 2d  ex'",.       db-
1fd30 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
1fd40 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c  me, MASTER_NAME,
1fd50 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20   pIndex->zName. 
1fd60 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
1fd70 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73  3ClearStatTables
1fd80 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69  (pParse, iDb, "i
1fd90 64 78 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  dx", pIndex->zNa
1fda0 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
1fdb0 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
1fdc0 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 64  rse, iDb);.    d
1fdd0 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
1fde0 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74  Parse, pIndex->t
1fdf0 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  num, iDb);.    s
1fe00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1fe10 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78  (v, OP_DropIndex
1fe20 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 49 6e  , iDb, 0, 0, pIn
1fe30 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  dex->zName, 0);.
1fe40 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69    }..exit_drop_i
1fe50 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53  ndex:.  sqlite3S
1fe60 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
1fe70 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pName);.}../*.*
1fe80 2a 20 70 41 72 72 61 79 20 69 73 20 61 20 70 6f  * pArray is a po
1fe90 69 6e 74 65 72 20 74 6f 20 61 6e 20 61 72 72 61  inter to an arra
1fea0 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 45 61  y of objects. Ea
1feb0 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  ch object in the
1fec0 0a 2a 2a 20 61 72 72 61 79 20 69 73 20 73 7a 45  .** array is szE
1fed0 6e 74 72 79 20 62 79 74 65 73 20 69 6e 20 73 69  ntry bytes in si
1fee0 7a 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ze. This routine
1fef0 20 75 73 65 73 20 73 71 6c 69 74 65 33 44 62 52   uses sqlite3DbR
1ff00 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20 74 6f 20 65  ealloc().** to e
1ff10 78 74 65 6e 64 20 74 68 65 20 61 72 72 61 79 20  xtend the array 
1ff20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 69 73  so that there is
1ff30 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77   space for a new
1ff40 20 6f 62 6a 65 63 74 20 61 74 20 74 68 65 20 65   object at the e
1ff50 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  nd..**.** When t
1ff60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1ff70 63 61 6c 6c 65 64 2c 20 2a 70 6e 45 6e 74 72 79  called, *pnEntry
1ff80 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 75   contains the cu
1ff90 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 2a 2a  rrent size of.**
1ffa0 20 74 68 65 20 61 72 72 61 79 20 28 69 6e 20 65   the array (in e
1ffb0 6e 74 72 69 65 73 20 2d 20 73 6f 20 74 68 65 20  ntries - so the 
1ffc0 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 28 28  allocation is ((
1ffd0 2a 70 6e 45 6e 74 72 79 29 20 2a 20 73 7a 45 6e  *pnEntry) * szEn
1ffe0 74 72 79 29 20 62 79 74 65 73 0a 2a 2a 20 69 6e  try) bytes.** in
1fff0 20 74 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49   total)..**.** I
20000 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20  f the realloc() 
20010 69 73 20 73 75 63 63 65 73 73 66 75 6c 20 28 69  is successful (i
20020 2e 65 2e 20 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f  .e. if no OOM co
20030 6e 64 69 74 69 6f 6e 20 6f 63 63 75 72 73 29 2c  ndition occurs),
20040 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 61 6c   the.** space al
20050 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
20060 6e 65 77 20 6f 62 6a 65 63 74 20 69 73 20 7a 65  new object is ze
20070 72 6f 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 75  roed, *pnEntry u
20080 70 64 61 74 65 64 20 74 6f 0a 2a 2a 20 72 65 66  pdated to.** ref
20090 6c 65 63 74 20 74 68 65 20 6e 65 77 20 73 69 7a  lect the new siz
200a0 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 61  e of the array a
200b0 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  nd a pointer to 
200c0 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69  the new allocati
200d0 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20  on.** returned. 
200e0 2a 70 49 64 78 20 69 73 20 73 65 74 20 74 6f 20  *pIdx is set to 
200f0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
20100 20 6e 65 77 20 61 72 72 61 79 20 65 6e 74 72 79   new array entry
20110 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
20120 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
20130 69 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29  if the realloc()
20140 20 66 61 69 6c 73 2c 20 2a 70 49 64 78 20 69 73   fails, *pIdx is
20150 20 73 65 74 20 74 6f 20 2d 31 2c 20 2a 70 6e 45   set to -1, *pnE
20160 6e 74 72 79 20 72 65 6d 61 69 6e 73 0a 2a 2a 20  ntry remains.** 
20170 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20  unchanged and a 
20180 63 6f 70 79 20 6f 66 20 70 41 72 72 61 79 20 72  copy of pArray r
20190 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64  eturned..*/.void
201a0 20 2a 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c   *sqlite3ArrayAl
201b0 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c 69 74 65  locate(.  sqlite
201c0 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 43  3 *db,      /* C
201d0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74  onnection to not
201e0 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61  ify of malloc fa
201f0 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64  ilures */.  void
20200 20 2a 70 41 72 72 61 79 2c 20 20 20 20 20 2f 2a   *pArray,     /*
20210 20 41 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74   Array of object
20220 73 2e 20 20 4d 69 67 68 74 20 62 65 20 72 65 61  s.  Might be rea
20230 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e  llocated */.  in
20240 74 20 73 7a 45 6e 74 72 79 2c 20 20 20 20 20 20  t szEntry,      
20250 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61 63 68 20  /* Size of each 
20260 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 61 72  object in the ar
20270 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ray */.  int *pn
20280 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75  Entry,     /* Nu
20290 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20  mber of objects 
202a0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
202b0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49 64 78 20   */.  int *pIdx 
202c0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
202d0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
202e0 6e 65 77 20 73 6c 6f 74 20 68 65 72 65 20 2a 2f  new slot here */
202f0 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  .){.  char *z;. 
20300 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
20310 20 3d 20 2a 70 49 64 78 20 3d 20 2a 70 6e 45 6e   = *pIdx = *pnEn
20320 74 72 79 3b 0a 20 20 69 66 28 20 28 6e 20 26 20  try;.  if( (n & 
20330 28 6e 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20  (n-1))==0 ){.   
20340 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
20350 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f 20 31 20 3a  z = (n==0) ? 1 :
20360 20 32 2a 6e 3b 0a 20 20 20 20 76 6f 69 64 20 2a   2*n;.    void *
20370 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
20380 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72  Realloc(db, pArr
20390 61 79 2c 20 73 7a 2a 73 7a 45 6e 74 72 79 29 3b  ay, sz*szEntry);
203a0 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
203b0 20 29 7b 0a 20 20 20 20 20 20 2a 70 49 64 78 20   ){.      *pIdx 
203c0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  = -1;.      retu
203d0 72 6e 20 70 41 72 72 61 79 3b 0a 20 20 20 20 7d  rn pArray;.    }
203e0 0a 20 20 20 20 70 41 72 72 61 79 20 3d 20 70 4e  .    pArray = pN
203f0 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63  ew;.  }.  z = (c
20400 68 61 72 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d  har*)pArray;.  m
20410 65 6d 73 65 74 28 26 7a 5b 6e 20 2a 20 73 7a 45  emset(&z[n * szE
20420 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72  ntry], 0, szEntr
20430 79 29 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79  y);.  ++*pnEntry
20440 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72 72 61  ;.  return pArra
20450 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  y;.}../*.** Appe
20460 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  nd a new element
20470 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64   to the given Id
20480 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20  List.  Create a 
20490 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a  new IdList if.**
204a0 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20   need be..**.** 
204b0 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20  A new IdList is 
204c0 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c  returned, or NUL
204d0 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61  L if malloc() fa
204e0 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a  ils..*/.IdList *
204f0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70  sqlite3IdListApp
20500 65 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73  end(Parse *pPars
20510 65 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  e, IdList *pList
20520 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
20530 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
20540 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
20550 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
20560 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
20570 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
20580 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
20590 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20  eof(IdList) );. 
205a0 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
205b0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
205c0 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c    pList->a = sql
205d0 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
205e0 65 28 0a 20 20 20 20 20 20 64 62 2c 0a 20 20 20  e(.      db,.   
205f0 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20     pList->a,.   
20600 20 20 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d     sizeof(pList-
20610 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20 26 70  >a[0]),.      &p
20620 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20 20  List->nId,.     
20630 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28 20 69   &i.  );.  if( i
20640 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
20650 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
20660 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65  , pList);.    re
20670 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c  turn 0;.  }.  pL
20680 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
20690 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
206a0 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65  mToken(db, pToke
206b0 6e 29 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e  n);.  if( IN_REN
206c0 41 4d 45 5f 4f 42 4a 45 43 54 20 26 26 20 70 4c  AME_OBJECT && pL
206d0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
206e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
206f0 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61  nameTokenMap(pPa
20700 72 73 65 2c 20 28 76 6f 69 64 2a 29 70 4c 69 73  rse, (void*)pLis
20710 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70  t->a[i].zName, p
20720 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65  Token);.  }.  re
20730 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
20740 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49  *.** Delete an I
20750 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dList..*/.void s
20760 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
20770 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
20780 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  IdList *pList){.
20790 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
207a0 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
207b0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
207c0 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
207d0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
207e0 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  ee(db, pList->a[
207f0 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  i].zName);.  }. 
20800 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
20810 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  b, pList->a);.  
20820 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
20830 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  db, pList);.}../
20840 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
20850 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f  index in pList o
20860 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  f the identifier
20870 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74   named zId.  Ret
20880 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74  urn -1.** if not
20890 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73   found..*/.int s
208a0 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
208b0 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  x(IdList *pList,
208c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
208d0 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
208e0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
208f0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28  eturn -1;.  for(
20900 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
20910 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  d; i++){.    if(
20920 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
20930 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
20940 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72  e, zName)==0 ) r
20950 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
20960 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
20970 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 69 7a 65 20  ** Maximum size 
20980 6f 66 20 61 20 53 72 63 4c 69 73 74 20 6f 62 6a  of a SrcList obj
20990 65 63 74 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c  ect..** The SrcL
209a0 69 73 74 20 6f 62 6a 65 63 74 20 69 73 20 75 73  ist object is us
209b0 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  ed to represent 
209c0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
209d0 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  of a.** SELECT s
209e0 74 61 74 65 6d 65 6e 74 2c 20 61 6e 64 20 74 68  tatement, and th
209f0 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20  e query planner 
20a00 63 61 6e 6e 6f 74 20 64 65 61 6c 20 77 69 74 68  cannot deal with
20a10 20 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e 20 36 34   more.** than 64
20a20 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69   tables in a joi
20a30 6e 2e 20 20 53 6f 20 61 6e 79 20 76 61 6c 75 65  n.  So any value
20a40 20 6c 61 72 67 65 72 20 74 68 61 6e 20 36 34 20   larger than 64 
20a50 68 65 72 65 0a 2a 2a 20 69 73 20 73 75 66 66 69  here.** is suffi
20a60 63 69 65 6e 74 20 66 6f 72 20 6d 6f 73 74 20 75  cient for most u
20a70 73 65 73 2e 20 20 53 6d 61 6c 6c 65 72 20 76 61  ses.  Smaller va
20a80 6c 75 65 73 2c 20 6c 69 6b 65 20 73 61 79 20 31  lues, like say 1
20a90 30 2c 20 61 72 65 0a 2a 2a 20 61 70 70 72 6f 70  0, are.** approp
20aa0 72 69 61 74 65 20 66 6f 72 20 73 6d 61 6c 6c 20  riate for small 
20ab0 61 6e 64 20 6d 65 6d 6f 72 79 2d 6c 69 6d 69 74  and memory-limit
20ac0 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 2e  ed applications.
20ad0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
20ae0 54 45 5f 4d 41 58 5f 53 52 43 4c 49 53 54 0a 23  TE_MAX_SRCLIST.#
20af0 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d   define SQLITE_M
20b00 41 58 5f 53 52 43 4c 49 53 54 20 32 30 30 0a 23  AX_SRCLIST 200.#
20b10 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70  endif../*.** Exp
20b20 61 6e 64 20 74 68 65 20 73 70 61 63 65 20 61 6c  and the space al
20b30 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
20b40 67 69 76 65 6e 20 53 72 63 4c 69 73 74 20 6f 62  given SrcList ob
20b50 6a 65 63 74 20 62 79 0a 2a 2a 20 63 72 65 61 74  ject by.** creat
20b60 69 6e 67 20 6e 45 78 74 72 61 20 6e 65 77 20 73  ing nExtra new s
20b70 6c 6f 74 73 20 62 65 67 69 6e 6e 69 6e 67 20 61  lots beginning a
20b80 74 20 69 53 74 61 72 74 2e 20 20 69 53 74 61 72  t iStart.  iStar
20b90 74 20 69 73 20 7a 65 72 6f 20 62 61 73 65 64 2e  t is zero based.
20ba0 0a 2a 2a 20 4e 65 77 20 73 6c 6f 74 73 20 61 72  .** New slots ar
20bb0 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20  e zeroed..**.** 
20bc0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73 75 70  For example, sup
20bd0 70 6f 73 65 20 61 20 53 72 63 4c 69 73 74 20 69  pose a SrcList i
20be0 6e 69 74 69 61 6c 6c 79 20 63 6f 6e 74 61 69 6e  nitially contain
20bf0 73 20 74 77 6f 20 65 6e 74 72 69 65 73 3a 20 41  s two entries: A
20c00 2c 42 2e 0a 2a 2a 20 54 6f 20 61 70 70 65 6e 64  ,B..** To append
20c10 20 33 20 6e 65 77 20 65 6e 74 72 69 65 73 20 6f   3 new entries o
20c20 6e 74 6f 20 74 68 65 20 65 6e 64 2c 20 64 6f 20  nto the end, do 
20c30 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73  this:.**.**    s
20c40 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
20c50 61 72 67 65 28 64 62 2c 20 70 53 72 63 6c 69 73  arge(db, pSrclis
20c60 74 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20  t, 3, 2);.**.** 
20c70 41 66 74 65 72 20 74 68 65 20 63 61 6c 6c 20 61  After the call a
20c80 62 6f 76 65 20 69 74 20 77 6f 75 6c 64 20 63 6f  bove it would co
20c90 6e 74 61 69 6e 3a 20 20 41 2c 20 42 2c 20 6e 69  ntain:  A, B, ni
20ca0 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20  l, nil, nil..** 
20cb0 49 66 20 74 68 65 20 69 53 74 61 72 74 20 61 72  If the iStart ar
20cc0 67 75 6d 65 6e 74 20 68 61 64 20 62 65 65 6e 20  gument had been 
20cd0 31 20 69 6e 73 74 65 61 64 20 6f 66 20 32 2c 20  1 instead of 2, 
20ce0 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 0a  then the result.
20cf0 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65  ** would have be
20d00 65 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c  en:  A, nil, nil
20d10 2c 20 6e 69 6c 2c 20 42 2e 20 20 54 6f 20 70 72  , nil, B.  To pr
20d20 65 70 65 6e 64 20 74 68 65 20 6e 65 77 20 73 6c  epend the new sl
20d30 6f 74 73 2c 0a 2a 2a 20 74 68 65 20 69 53 74 61  ots,.** the iSta
20d40 72 74 20 76 61 6c 75 65 20 77 6f 75 6c 64 20 62  rt value would b
20d50 65 20 30 2e 20 20 54 68 65 20 72 65 73 75 6c 74  e 0.  The result
20d60 20 74 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62   then would.** b
20d70 65 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c  e: nil, nil, nil
20d80 2c 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66  , A, B..**.** If
20d90 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
20da0 74 69 6f 6e 20 66 61 69 6c 73 20 6f 72 20 74 68  tion fails or th
20db0 65 20 53 72 63 4c 69 73 74 20 62 65 63 6f 6d 65  e SrcList become
20dc0 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 6c 65 61  s too large, lea
20dd0 76 65 0a 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e  ve.** the origin
20de0 61 6c 20 53 72 63 4c 69 73 74 20 75 6e 63 68 61  al SrcList uncha
20df0 6e 67 65 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c  nged, return NUL
20e00 4c 2c 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20  L, and leave an 
20e10 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
20e20 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 53   in pParse..*/.S
20e30 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
20e40 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 0a 20  rcListEnlarge(. 
20e50 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
20e60 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
20e70 6f 6e 74 65 78 74 20 69 6e 74 6f 20 77 68 69 63  ontext into whic
20e80 68 20 65 72 72 6f 72 73 20 61 72 65 20 72 65 70  h errors are rep
20e90 6f 72 74 65 64 20 2a 2f 0a 20 20 53 72 63 4c 69  orted */.  SrcLi
20ea0 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a  st *pSrc,     /*
20eb0 20 54 68 65 20 53 72 63 4c 69 73 74 20 74 6f 20   The SrcList to 
20ec0 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20  be enlarged */. 
20ed0 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20   int nExtra,    
20ee0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
20ef0 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20 61 64   new slots to ad
20f00 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d 20 2a  d to pSrc->a[] *
20f10 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 20 20  /.  int iStart  
20f20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
20f30 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20  in pSrc->a[] of 
20f40 66 69 72 73 74 20 6e 65 77 20 73 6c 6f 74 20 2a  first new slot *
20f50 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  /.){.  int i;.. 
20f60 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
20f70 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67 20 70  ing on calling p
20f80 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61  arameters */.  a
20f90 73 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d 30  ssert( iStart>=0
20fa0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45   );.  assert( nE
20fb0 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61 73 73  xtra>=1 );.  ass
20fc0 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a  ert( pSrc!=0 );.
20fd0 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74    assert( iStart
20fe0 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a  <=pSrc->nSrc );.
20ff0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
21000 64 64 69 74 69 6f 6e 61 6c 20 73 70 61 63 65 20  dditional space 
21010 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69  if needed */.  i
21020 66 28 20 28 75 33 32 29 70 53 72 63 2d 3e 6e 53  f( (u32)pSrc->nS
21030 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e  rc+nExtra>pSrc->
21040 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72  nAlloc ){.    Sr
21050 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20  cList *pNew;.   
21060 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
21070 41 6c 6c 6f 63 20 3d 20 32 2a 28 73 71 6c 69 74  Alloc = 2*(sqlit
21080 65 33 5f 69 6e 74 36 34 29 70 53 72 63 2d 3e 6e  e3_int64)pSrc->n
21090 53 72 63 2b 6e 45 78 74 72 61 3b 0a 20 20 20 20  Src+nExtra;.    
210a0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
210b0 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 20 20 69  arse->db;..    i
210c0 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45  f( pSrc->nSrc+nE
210d0 78 74 72 61 3e 3d 53 51 4c 49 54 45 5f 4d 41 58  xtra>=SQLITE_MAX
210e0 5f 53 52 43 4c 49 53 54 20 29 7b 0a 20 20 20 20  _SRCLIST ){.    
210f0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
21100 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
21110 61 6e 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  any FROM clause 
21120 74 65 72 6d 73 2c 20 6d 61 78 3a 20 25 64 22 2c  terms, max: %d",
21130 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21140 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4d 41         SQLITE_MA
21150 58 5f 53 52 43 4c 49 53 54 29 3b 0a 20 20 20 20  X_SRCLIST);.    
21160 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
21170 7d 0a 20 20 20 20 69 66 28 20 6e 41 6c 6c 6f 63  }.    if( nAlloc
21180 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 53 52 43 4c  >SQLITE_MAX_SRCL
21190 49 53 54 20 29 20 6e 41 6c 6c 6f 63 20 3d 20 53  IST ) nAlloc = S
211a0 51 4c 49 54 45 5f 4d 41 58 5f 53 52 43 4c 49 53  QLITE_MAX_SRCLIS
211b0 54 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  T;.    pNew = sq
211c0 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
211d0 62 2c 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20  b, pSrc,.       
211e0 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
211f0 70 53 72 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d  pSrc) + (nAlloc-
21200 31 29 2a 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e  1)*sizeof(pSrc->
21210 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  a[0]) );.    if(
21220 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
21230 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
21240 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
21250 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
21260 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d 20 70    }.    pSrc = p
21270 4e 65 77 3b 0a 20 20 20 20 70 53 72 63 2d 3e 6e  New;.    pSrc->n
21280 41 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63 3b 0a  Alloc = nAlloc;.
21290 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 65    }..  /* Move e
212a0 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74 68  xisting slots th
212b0 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74 68  at come after th
212c0 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65 64  e newly inserted
212d0 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74 20   slots.  ** out 
212e0 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20 20  of the way */.  
212f0 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63  for(i=pSrc->nSrc
21300 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20 69  -1; i>=iStart; i
21310 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61  --){.    pSrc->a
21320 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53 72  [i+nExtra] = pSr
21330 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70  c->a[i];.  }.  p
21340 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 6e 45 78  Src->nSrc += nEx
21350 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20  tra;..  /* Zero 
21360 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61  the newly alloca
21370 74 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d  ted slots */.  m
21380 65 6d 73 65 74 28 26 70 53 72 63 2d 3e 61 5b 69  emset(&pSrc->a[i
21390 53 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 6f  Start], 0, sizeo
213a0 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45  f(pSrc->a[0])*nE
213b0 78 74 72 61 29 3b 0a 20 20 66 6f 72 28 69 3d 69  xtra);.  for(i=i
213c0 53 74 61 72 74 3b 20 69 3c 69 53 74 61 72 74 2b  Start; i<iStart+
213d0 6e 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a 20 20  nExtra; i++){.  
213e0 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75    pSrc->a[i].iCu
213f0 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  rsor = -1;.  }..
21400 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f    /* Return a po
21410 69 6e 74 65 72 20 74 6f 20 74 68 65 20 65 6e 6c  inter to the enl
21420 61 72 67 65 64 20 53 72 63 4c 69 73 74 20 2a 2f  arged SrcList */
21430 0a 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a  .  return pSrc;.
21440 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  }.../*.** Append
21450 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d   a new table nam
21460 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53  e to the given S
21470 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  rcList.  Create 
21480 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66  a new SrcList if
21490 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20  .** need be.  A 
214a0 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65  new entry is cre
214b0 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c  ated in the SrcL
214c0 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 61 62  ist even if pTab
214d0 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  le is NULL..**.*
214e0 2a 20 41 20 53 72 63 4c 69 73 74 20 69 73 20 72  * A SrcList is r
214f0 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
21500 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
21510 4f 4f 4d 20 65 72 72 6f 72 20 6f 72 20 69 66 20  OOM error or if 
21520 74 68 65 0a 2a 2a 20 53 72 63 4c 69 73 74 20 67  the.** SrcList g
21530 72 6f 77 73 20 74 6f 20 6c 61 72 67 65 2e 20 20  rows to large.  
21540 54 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  The returned.** 
21550 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20 62 65  SrcList might be
21560 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
21570 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 77 61   SrcList that wa
21580 73 20 69 6e 70 75 74 20 6f 72 20 69 74 20 6d 69  s input or it mi
21590 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e 65 77 20  ght be.** a new 
215a0 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f 4f 4d 20  one.  If an OOM 
215b0 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72  error does occur
215c0 73 2c 20 74 68 65 6e 20 74 68 65 20 70 72 69 6f  s, then the prio
215d0 72 20 76 61 6c 75 65 20 6f 66 20 70 4c 69 73 74  r value of pList
215e0 0a 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 70 75  .** that is inpu
215f0 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  t to this routin
21600 65 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  e is automatical
21610 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ly freed..**.** 
21620 49 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20  If pDatabase is 
21630 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61  not null, it mea
21640 6e 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  ns that the tabl
21650 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61  e has an optiona
21660 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61  l.** database na
21670 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65  me prefix.  Like
21680 20 74 68 69 73 3a 20 20 22 64 61 74 61 62 61 73   this:  "databas
21690 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70  e.table".  The p
216a0 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e  Database.** poin
216b0 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ts to the table 
216c0 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61  name and the pTa
216d0 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ble points to th
216e0 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e  e database name.
216f0 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e  .** The SrcList.
21700 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20  a[].zName field 
21710 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  is filled with t
21720 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68  he table name wh
21730 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d  ich might.** com
21740 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69  e from pTable (i
21750 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e  f pDatabase is N
21760 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61  ULL) or from pDa
21770 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63  tabase.  .** Src
21780 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61  List.a[].zDataba
21790 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  se is filled wit
217a0 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  h the database n
217b0 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c  ame from pTable,
217c0 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c  .** or with NULL
217d0 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20   if no database 
217e0 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a  is specified..**
217f0 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  .** In other wor
21800 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65  ds, if call like
21810 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
21820 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
21830 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c  istAppend(D,A,B,
21840 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42  0);.**.** Then B
21850 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65   is a table name
21860 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
21870 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63  e name is unspec
21880 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65  ified.  If calle
21890 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a  d.** like this:.
218a0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
218b0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
218c0 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a  nd(D,A,B,C);.**.
218d0 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68 65  ** Then C is the
218e0 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
218f0 42 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73  B is the databas
21900 65 20 6e 61 6d 65 2e 20 20 49 66 20 43 20 69 73  e name.  If C is
21910 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74 68 65 6e   defined.** then
21920 20 73 6f 20 69 73 20 42 2e 20 20 49 6e 20 6f 74   so is B.  In ot
21930 68 65 72 20 77 6f 72 64 73 2c 20 77 65 20 6e 65  her words, we ne
21940 76 65 72 20 68 61 76 65 20 61 20 63 61 73 65 20  ver have a case 
21950 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  where:.**.**    
21960 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
21970 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 30 2c  istAppend(D,A,0,
21980 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70  C);.**.** Both p
21990 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62  Table and pDatab
219a0 61 73 65 20 61 72 65 20 61 73 73 75 6d 65 64 20  ase are assumed 
219b0 74 6f 20 62 65 20 71 75 6f 74 65 64 2e 20 20 54  to be quoted.  T
219c0 68 65 79 20 61 72 65 20 64 65 71 75 6f 74 65 64  hey are dequoted
219d0 0a 2a 2a 20 62 65 66 6f 72 65 20 62 65 69 6e 67  .** before being
219e0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 53 72   added to the Sr
219f0 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73  cList..*/.SrcLis
21a00 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
21a10 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65  tAppend(.  Parse
21a20 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
21a30 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
21a40 74 2c 20 69 6e 20 77 68 69 63 68 20 65 72 72 6f  t, in which erro
21a50 72 73 20 61 72 65 20 72 65 70 6f 72 74 65 64 20  rs are reported 
21a60 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4c  */.  SrcList *pL
21a70 69 73 74 2c 20 20 20 20 20 2f 2a 20 41 70 70 65  ist,     /* Appe
21a80 6e 64 20 74 6f 20 74 68 69 73 20 53 72 63 4c 69  nd to this SrcLi
21a90 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61 74 65 73  st. NULL creates
21aa0 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 2a   a new SrcList *
21ab0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  /.  Token *pTabl
21ac0 65 2c 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  e,      /* Table
21ad0 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20   to append */.  
21ae0 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65  Token *pDatabase
21af0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
21b00 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  of the table */.
21b10 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  ){.  struct SrcL
21b20 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
21b30 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
21b40 20 20 61 73 73 65 72 74 28 20 70 44 61 74 61 62    assert( pDatab
21b50 61 73 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65  ase==0 || pTable
21b60 21 3d 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f  !=0 );  /* Canno
21b70 74 20 68 61 76 65 20 43 20 77 69 74 68 6f 75 74  t have C without
21b80 20 42 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   B */.  assert( 
21b90 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61  pParse!=0 );.  a
21ba0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
21bb0 62 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  b!=0 );.  db = p
21bc0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
21bd0 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
21be0 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
21bf0 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 70 50  DbMallocRawNN(pP
21c00 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66  arse->db, sizeof
21c10 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20  (SrcList) );.   
21c20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
21c30 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c  return 0;.    pL
21c40 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b  ist->nAlloc = 1;
21c50 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63  .    pList->nSrc
21c60 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74   = 1;.    memset
21c70 28 26 70 4c 69 73 74 2d 3e 61 5b 30 5d 2c 20 30  (&pList->a[0], 0
21c80 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  , sizeof(pList->
21c90 61 5b 30 5d 29 29 3b 0a 20 20 20 20 70 4c 69 73  a[0]));.    pLis
21ca0 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20  t->a[0].iCursor 
21cb0 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = -1;.  }else{. 
21cc0 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77     SrcList *pNew
21cd0 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
21ce0 74 45 6e 6c 61 72 67 65 28 70 50 61 72 73 65 2c  tEnlarge(pParse,
21cf0 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c 69 73 74   pList, 1, pList
21d00 2d 3e 6e 53 72 63 29 3b 0a 20 20 20 20 69 66 28  ->nSrc);.    if(
21d10 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
21d20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
21d30 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
21d40 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
21d50 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
21d60 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77      pList = pNew
21d70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49  ;.    }.  }.  pI
21d80 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
21d90 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 3b 0a  pList->nSrc-1];.
21da0 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
21db0 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d  && pDatabase->z=
21dc0 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62  =0 ){.    pDatab
21dd0 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ase = 0;.  }.  i
21de0 66 28 20 70 44 61 74 61 62 61 73 65 20 29 7b 0a  f( pDatabase ){.
21df0 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65      pItem->zName
21e00 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
21e10 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 44 61 74  omToken(db, pDat
21e20 61 62 61 73 65 29 3b 0a 20 20 20 20 70 49 74 65  abase);.    pIte
21e30 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  m->zDatabase = s
21e40 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
21e50 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  ken(db, pTable);
21e60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
21e70 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
21e80 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
21e90 6e 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20  n(db, pTable);. 
21ea0 20 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62     pItem->zDatab
21eb0 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ase = 0;.  }.  r
21ec0 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
21ed0 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 56 64 62  /*.** Assign Vdb
21ee0 65 43 75 72 73 6f 72 20 69 6e 64 65 78 20 6e 75  eCursor index nu
21ef0 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20 74 61 62  mbers to all tab
21f00 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74  les in a SrcList
21f10 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21f20 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
21f30 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61 72  sors(Parse *pPar
21f40 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69  se, SrcList *pLi
21f50 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
21f60 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
21f70 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73  tem *pItem;.  as
21f80 73 65 72 74 28 70 4c 69 73 74 20 7c 7c 20 70 50  sert(pList || pP
21f90 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
21fa0 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
21fb0 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  pList ){.    for
21fc0 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (i=0, pItem=pLis
21fd0 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  t->a; i<pList->n
21fe0 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
21ff0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49  +){.      if( pI
22000 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20  tem->iCursor>=0 
22010 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70  ) break;.      p
22020 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20  Item->iCursor = 
22030 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
22040 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
22050 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
22060 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
22070 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
22080 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
22090 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20  Select->pSrc);. 
220a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
220b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
220c0 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69   an entire SrcLi
220d0 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c  st including all
220e0 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72   its substructur
220f0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
22100 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
22110 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63  sqlite3 *db, Src
22120 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
22130 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
22140 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
22150 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  tem;.  if( pList
22160 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
22170 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
22180 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74  >a, i=0; i<pList
22190 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
221a0 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  em++){.    sqlit
221b0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
221c0 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
221d0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
221e0 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  e(db, pItem->zNa
221f0 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
22200 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
22210 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69  ->zAlias);.    i
22220 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49  f( pItem->fg.isI
22230 6e 64 65 78 65 64 42 79 20 29 20 73 71 6c 69 74  ndexedBy ) sqlit
22240 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
22250 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42  em->u1.zIndexedB
22260 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  y);.    if( pIte
22270 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20  m->fg.isTabFunc 
22280 29 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  ) sqlite3ExprLis
22290 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  tDelete(db, pIte
222a0 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 29 3b  m->u1.pFuncArg);
222b0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
222c0 74 65 54 61 62 6c 65 28 64 62 2c 20 70 49 74 65  teTable(db, pIte
222d0 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71  m->pTab);.    sq
222e0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
222f0 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65  e(db, pItem->pSe
22300 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  lect);.    sqlit
22310 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
22320 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20   pItem->pOn);.  
22330 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
22340 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
22350 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20  >pUsing);.  }.  
22360 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
22370 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  db, pList);.}../
22380 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
22390 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
223a0 68 65 20 70 61 72 73 65 72 20 74 6f 20 61 64 64  he parser to add
223b0 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74   a new term to t
223c0 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20 67  he.** end of a g
223d0 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c 61 75  rowing FROM clau
223e0 73 65 2e 20 20 54 68 65 20 22 70 22 20 70 61 72  se.  The "p" par
223f0 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 70 61  ameter is the pa
22400 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46 52 4f  rt of.** the FRO
22410 4d 20 63 6c 61 75 73 65 20 74 68 61 74 20 68 61  M clause that ha
22420 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
22430 6f 6e 73 74 72 75 63 74 65 64 2e 20 20 22 70 22  onstructed.  "p"
22440 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74   is NULL.** if t
22450 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
22460 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f   term of the FRO
22470 4d 20 63 6c 61 75 73 65 2e 20 20 70 54 61 62 6c  M clause.  pTabl
22480 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 0a  e and pDatabase.
22490 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d 65 20  ** are the name 
224a0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  of the table and
224b0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20   database named 
224c0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
224d0 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44 61 74  se term..** pDat
224e0 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 20 69 66  abase is NULL if
224f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
22500 6d 65 20 71 75 61 6c 69 66 69 65 72 20 69 73 20  me qualifier is 
22510 6d 69 73 73 69 6e 67 20 2d 20 74 68 65 0a 2a 2a  missing - the.**
22520 20 75 73 75 61 6c 20 63 61 73 65 2e 20 20 49 66   usual case.  If
22530 20 74 68 65 20 74 65 72 6d 20 68 61 73 20 61 6e   the term has an
22540 20 61 6c 69 61 73 2c 20 74 68 65 6e 20 70 41 6c   alias, then pAl
22550 69 61 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ias points to th
22560 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65 6e  e.** alias token
22570 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 69  .  If the term i
22580 73 20 61 20 73 75 62 71 75 65 72 79 2c 20 74 68  s a subquery, th
22590 65 6e 20 70 53 75 62 71 75 65 72 79 20 69 73 20  en pSubquery is 
225a0 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  the.** SELECT st
225b0 61 74 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65  atement that the
225c0 20 73 75 62 71 75 65 72 79 20 65 6e 63 6f 64 65   subquery encode
225d0 73 2e 20 20 54 68 65 20 70 54 61 62 6c 65 20 61  s.  The pTable a
225e0 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20  nd.** pDatabase 
225f0 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 4e  parameters are N
22600 55 4c 4c 20 66 6f 72 20 73 75 62 71 75 65 72 69  ULL for subqueri
22610 65 73 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e 64  es.  The pOn and
22620 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d   pUsing.** param
22630 65 74 65 72 73 20 61 72 65 20 74 68 65 20 63 6f  eters are the co
22640 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e 20  ntent of the ON 
22650 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
22660 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
22670 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 77 68  a new SrcList wh
22680 69 63 68 20 65 6e 63 6f 64 65 73 20 69 73 20 74  ich encodes is t
22690 68 65 20 46 52 4f 4d 20 77 69 74 68 20 74 68 65  he FROM with the
226a0 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64 64   new.** term add
226b0 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a  ed..*/.SrcList *
226c0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
226d0 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20 20  pendFromTerm(.  
226e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
226f0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
22700 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
22710 53 72 63 4c 69 73 74 20 2a 70 2c 20 20 20 20 20  SrcList *p,     
22720 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
22730 65 66 74 20 70 61 72 74 20 6f 66 20 74 68 65 20  eft part of the 
22740 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72 65  FROM clause alre
22750 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54 6f  ady seen */.  To
22760 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20  ken *pTable,    
22770 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
22780 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 61 64   the table to ad
22790 64 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 63 6c  d to the FROM cl
227a0 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ause */.  Token 
227b0 2a 70 44 61 74 61 62 61 73 65 2c 20 20 20 20 20  *pDatabase,     
227c0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
227d0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
227e0 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a 20  ning pTable */. 
227f0 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c 20   Token *pAlias, 
22800 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
22810 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
22820 6f 66 20 74 68 65 20 41 53 20 73 75 62 65 78 70  of the AS subexp
22830 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  ression */.  Sel
22840 65 63 74 20 2a 70 53 75 62 71 75 65 72 79 2c 20  ect *pSubquery, 
22850 20 20 20 20 20 2f 2a 20 41 20 73 75 62 71 75 65       /* A subque
22860 72 79 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65  ry used in place
22870 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65   of a table name
22880 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e 2c   */.  Expr *pOn,
22890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
228a0 20 54 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f   The ON clause o
228b0 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64  f a join */.  Id
228c0 4c 69 73 74 20 2a 70 55 73 69 6e 67 20 20 20 20  List *pUsing    
228d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 53 49        /* The USI
228e0 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a  NG clause of a j
228f0 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  oin */.){.  stru
22900 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
22910 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65  *pItem;.  sqlite
22920 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
22930 64 62 3b 0a 20 20 69 66 28 20 21 70 20 26 26 20  db;.  if( !p && 
22940 28 70 4f 6e 20 7c 7c 20 70 55 73 69 6e 67 29 20  (pOn || pUsing) 
22950 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
22960 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
22970 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65 20 69 73  a JOIN clause is
22980 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65   required before
22990 20 25 73 22 2c 20 0a 20 20 20 20 20 20 28 70 4f   %s", .      (pO
229a0 6e 20 3f 20 22 4f 4e 22 20 3a 20 22 55 53 49 4e  n ? "ON" : "USIN
229b0 47 22 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 67  G").    );.    g
229c0 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f  oto append_from_
229d0 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 20 3d  error;.  }.  p =
229e0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
229f0 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 2c  ppend(pParse, p,
22a00 20 70 54 61 62 6c 65 2c 20 70 44 61 74 61 62 61   pTable, pDataba
22a10 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  se);.  if( p==0 
22a20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65  ){.    goto appe
22a30 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20  nd_from_error;. 
22a40 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
22a50 6e 53 72 63 3e 30 20 29 3b 0a 20 20 70 49 74 65  nSrc>0 );.  pIte
22a60 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72  m = &p->a[p->nSr
22a70 63 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  c-1];.  assert( 
22a80 28 70 54 61 62 6c 65 3d 3d 30 29 3d 3d 28 70 44  (pTable==0)==(pD
22a90 61 74 61 62 61 73 65 3d 3d 30 29 20 29 3b 0a 20  atabase==0) );. 
22aa0 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
22ab0 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 70 44 61 74  zName==0 || pDat
22ac0 61 62 61 73 65 21 3d 30 20 29 3b 0a 20 20 69 66  abase!=0 );.  if
22ad0 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  ( IN_RENAME_OBJE
22ae0 43 54 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61  CT && pItem->zNa
22af0 6d 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20  me ){.    Token 
22b00 2a 70 54 6f 6b 65 6e 20 3d 20 28 41 4c 57 41 59  *pToken = (ALWAY
22b10 53 28 70 44 61 74 61 62 61 73 65 29 20 26 26 20  S(pDatabase) && 
22b20 70 44 61 74 61 62 61 73 65 2d 3e 7a 29 20 3f 20  pDatabase->z) ? 
22b30 70 44 61 74 61 62 61 73 65 20 3a 20 70 54 61 62  pDatabase : pTab
22b40 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  le;.    sqlite3R
22b50 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50  enameTokenMap(pP
22b60 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  arse, pItem->zNa
22b70 6d 65 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d  me, pToken);.  }
22b80 0a 20 20 61 73 73 65 72 74 28 20 70 41 6c 69 61  .  assert( pAlia
22b90 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 41  s!=0 );.  if( pA
22ba0 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70  lias->n ){.    p
22bb0 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73  Item->zAlias = s
22bc0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
22bd0 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b  ken(db, pAlias);
22be0 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53  .  }.  pItem->pS
22bf0 65 6c 65 63 74 20 3d 20 70 53 75 62 71 75 65 72  elect = pSubquer
22c00 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20  y;.  pItem->pOn 
22c10 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e  = pOn;.  pItem->
22c20 70 55 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b  pUsing = pUsing;
22c30 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61  .  return p;.. a
22c40 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72  ppend_from_error
22c50 3a 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  :.  assert( p==0
22c60 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
22c70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29  rDelete(db, pOn)
22c80 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73  ;.  sqlite3IdLis
22c90 74 44 65 6c 65 74 65 28 64 62 2c 20 70 55 73 69  tDelete(db, pUsi
22ca0 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ng);.  sqlite3Se
22cb0 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
22cc0 53 75 62 71 75 65 72 79 29 3b 0a 20 20 72 65 74  Subquery);.  ret
22cd0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
22ce0 41 64 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42  Add an INDEXED B
22cf0 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44  Y or NOT INDEXED
22d00 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d   clause to the m
22d10 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
22d20 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f  ed .** element o
22d30 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73  f the source-lis
22d40 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
22d50 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
22d60 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22d70 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79  SrcListIndexedBy
22d80 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
22d90 53 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65  SrcList *p, Toke
22da0 6e 20 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a  n *pIndexedBy){.
22db0 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
22dc0 65 64 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28  edBy!=0 );.  if(
22dd0 20 70 20 26 26 20 70 49 6e 64 65 78 65 64 42 79   p && pIndexedBy
22de0 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 73 74 72  ->n>0 ){.    str
22df0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
22e00 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73   *pItem;.    ass
22e10 65 72 74 28 20 70 2d 3e 6e 53 72 63 3e 30 20 29  ert( p->nSrc>0 )
22e20 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70  ;.    pItem = &p
22e30 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a  ->a[p->nSrc-1];.
22e40 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
22e50 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64  m->fg.notIndexed
22e60 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
22e70 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49  t( pItem->fg.isI
22e80 6e 64 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20  ndexedBy==0 );. 
22e90 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
22ea0 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d  ->fg.isTabFunc==
22eb0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  0 );.    if( pIn
22ec0 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26  dexedBy->n==1 &&
22ed0 20 21 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20   !pIndexedBy->z 
22ee0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 4e  ){.      /* A "N
22ef0 4f 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75  OT INDEXED" clau
22f00 73 65 20 77 61 73 20 73 75 70 70 6c 69 65 64 2e  se was supplied.
22f10 20 53 65 65 20 70 61 72 73 65 2e 79 20 0a 20 20   See parse.y .  
22f20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74      ** construct
22f30 20 22 69 6e 64 65 78 65 64 5f 6f 70 74 22 20 66   "indexed_opt" f
22f40 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20  or details. */. 
22f50 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 6e       pItem->fg.n
22f60 6f 74 49 6e 64 65 78 65 64 20 3d 20 31 3b 0a 20  otIndexed = 1;. 
22f70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22f80 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  pItem->u1.zIndex
22f90 65 64 42 79 20 3d 20 73 71 6c 69 74 65 33 4e 61  edBy = sqlite3Na
22fa0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
22fb0 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78 65 64  se->db, pIndexed
22fc0 42 79 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  By);.      pItem
22fd0 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79  ->fg.isIndexedBy
22fe0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
22ff0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65  }../*.** Add the
23000 20 6c 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f   list of functio
23010 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  n arguments to t
23020 68 65 20 53 72 63 4c 69 73 74 20 65 6e 74 72 79  he SrcList entry
23030 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 2d   for a.** table-
23040 76 61 6c 75 65 64 2d 66 75 6e 63 74 69 6f 6e 2e  valued-function.
23050 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23060 53 72 63 4c 69 73 74 46 75 6e 63 41 72 67 73 28  SrcListFuncArgs(
23070 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
23080 72 63 4c 69 73 74 20 2a 70 2c 20 45 78 70 72 4c  rcList *p, ExprL
23090 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
230a0 66 28 20 70 20 29 7b 0a 20 20 20 20 73 74 72 75  f( p ){.    stru
230b0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
230c0 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70  *pItem = &p->a[p
230d0 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61  ->nSrc-1];.    a
230e0 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
230f0 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29  .notIndexed==0 )
23100 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
23110 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65  tem->fg.isIndexe
23120 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  dBy==0 );.    as
23130 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e  sert( pItem->fg.
23140 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a  isTabFunc==0 );.
23150 20 20 20 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46      pItem->u1.pF
23160 75 6e 63 41 72 67 20 3d 20 70 4c 69 73 74 3b 0a  uncArg = pList;.
23170 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73      pItem->fg.is
23180 54 61 62 46 75 6e 63 20 3d 20 31 3b 0a 20 20 7d  TabFunc = 1;.  }
23190 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
231a0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
231b0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73  pParse->db, pLis
231c0 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
231d0 20 57 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 75   When building u
231e0 70 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  p a FROM clause 
231f0 69 6e 20 74 68 65 20 70 61 72 73 65 72 2c 20 74  in the parser, t
23200 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
23210 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  .** is initially
23220 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
23230 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 2e 20 20   left operand.  
23240 42 75 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e  But the code gen
23250 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74  erator.** expect
23260 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  s the join opera
23270 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20 74 68 65  tor to be on the
23280 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e 20   right operand. 
23290 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
232a0 20 53 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e   Shifts all join
232b0 20 6f 70 65 72 61 74 6f 72 73 20 66 72 6f 6d 20   operators from 
232c0 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 66 6f  left to right fo
232d0 72 20 61 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d  r an entire FROM
232e0 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  .** clause..**.*
232f0 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f  * Example: Suppo
23300 73 65 20 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c  se the join is l
23310 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
23320 20 20 20 20 20 20 20 20 20 20 41 20 6e 61 74 75            A natu
23330 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42  ral cross join B
23340 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61  .**.** The opera
23350 74 6f 72 20 69 73 20 22 6e 61 74 75 72 61 6c 20  tor is "natural 
23360 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68  cross join".  Th
23370 65 20 41 20 61 6e 64 20 42 20 6f 70 65 72 61 6e  e A and B operan
23380 64 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a  ds are stored.**
23390 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20   in p->a[0] and 
233a0 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63 74  p->a[1], respect
233b0 69 76 65 6c 79 2e 20 20 54 68 65 20 70 61 72 73  ively.  The pars
233c0 65 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f  er initially sto
233d0 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61  res the.** opera
233e0 74 6f 72 20 77 69 74 68 20 41 2e 20 20 54 68 69  tor with A.  Thi
233f0 73 20 72 6f 75 74 69 6e 65 20 73 68 69 66 74 73  s routine shifts
23400 20 74 68 61 74 20 6f 70 65 72 61 74 6f 72 20 6f   that operator o
23410 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69  ver to B..*/.voi
23420 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
23430 53 68 69 66 74 4a 6f 69 6e 54 79 70 65 28 53 72  ShiftJoinType(Sr
23440 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 69 66 28  cList *p){.  if(
23450 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b   p ){.    int i;
23460 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53  .    for(i=p->nS
23470 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  rc-1; i>0; i--){
23480 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 66  .      p->a[i].f
23490 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d 3e  g.jointype = p->
234a0 61 5b 69 2d 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79  a[i-1].fg.jointy
234b0 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  pe;.    }.    p-
234c0 3e 61 5b 30 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70  >a[0].fg.jointyp
234d0 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  e = 0;.  }.}../*
234e0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
234f0 45 20 63 6f 64 65 20 66 6f 72 20 61 20 42 45 47  E code for a BEG
23500 49 4e 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  IN statement..*/
23510 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67  .void sqlite3Beg
23520 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  inTransaction(Pa
23530 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
23540 20 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65   type){.  sqlite
23550 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
23560 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73  ;.  int i;..  as
23570 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20  sert( pParse!=0 
23580 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  );.  db = pParse
23590 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
235a0 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  db!=0 );.  if( s
235b0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
235c0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
235d0 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47  RANSACTION, "BEG
235e0 49 4e 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  IN", 0, 0) ){.  
235f0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
23600 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
23610 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
23620 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( !v ) return;. 
23630 20 69 66 28 20 74 79 70 65 21 3d 54 4b 5f 44 45   if( type!=TK_DE
23640 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20 66 6f  FERRED ){.    fo
23650 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
23660 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
23670 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
23680 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  v, OP_Transactio
23690 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f  n, i, (type==TK_
236a0 45 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20  EXCLUSIVE)+1);. 
236b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
236c0 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 29 3b  UsesBtree(v, i);
236d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
236e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
236f0 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 29  , OP_AutoCommit)
23700 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
23710 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 66 6f  ate VDBE code fo
23720 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f  r a COMMIT or RO
23730 4c 4c 42 41 43 4b 20 73 74 61 74 65 6d 65 6e 74  LLBACK statement
23740 2e 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 52 4f  ..** Code for RO
23750 4c 4c 42 41 43 4b 20 69 73 20 67 65 6e 65 72 61  LLBACK is genera
23760 74 65 64 20 69 66 20 65 54 79 70 65 3d 3d 54 4b  ted if eType==TK
23770 5f 52 4f 4c 4c 42 41 43 4b 2e 20 20 4f 74 68 65  _ROLLBACK.  Othe
23780 72 77 69 73 65 0a 2a 2a 20 63 6f 64 65 20 69 73  rwise.** code is
23790 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 61   generated for a
237a0 20 43 4f 4d 4d 49 54 2e 0a 2a 2f 0a 76 6f 69 64   COMMIT..*/.void
237b0 20 73 71 6c 69 74 65 33 45 6e 64 54 72 61 6e 73   sqlite3EndTrans
237c0 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
237d0 61 72 73 65 2c 20 69 6e 74 20 65 54 79 70 65 29  arse, int eType)
237e0 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  {.  Vdbe *v;.  i
237f0 6e 74 20 69 73 52 6f 6c 6c 62 61 63 6b 3b 0a 0a  nt isRollback;..
23800 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
23810 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
23820 20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20 29   pParse->db!=0 )
23830 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  ;.  assert( eTyp
23840 65 3d 3d 54 4b 5f 43 4f 4d 4d 49 54 20 7c 7c 20  e==TK_COMMIT || 
23850 65 54 79 70 65 3d 3d 54 4b 5f 45 4e 44 20 7c 7c  eType==TK_END ||
23860 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c 42   eType==TK_ROLLB
23870 41 43 4b 20 29 3b 0a 20 20 69 73 52 6f 6c 6c 62  ACK );.  isRollb
23880 61 63 6b 20 3d 20 65 54 79 70 65 3d 3d 54 4b 5f  ack = eType==TK_
23890 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 69 66 28 20  ROLLBACK;.  if( 
238a0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
238b0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
238c0 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 0a 20 20  TRANSACTION, .  
238d0 20 20 20 20 20 69 73 52 6f 6c 6c 62 61 63 6b 20       isRollback 
238e0 3f 20 22 52 4f 4c 4c 42 41 43 4b 22 20 3a 20 22  ? "ROLLBACK" : "
238f0 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29  COMMIT", 0, 0) )
23900 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
23910 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  }.  v = sqlite3G
23920 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
23930 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
23940 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
23950 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  (v, OP_AutoCommi
23960 74 2c 20 31 2c 20 69 73 52 6f 6c 6c 62 61 63 6b  t, 1, isRollback
23970 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
23980 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
23990 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
239a0 61 72 73 65 72 20 77 68 65 6e 20 69 74 20 70 61  arser when it pa
239b0 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e 64 20 74  rses a command t
239c0 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20 72 65 6c  o create,.** rel
239d0 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
239e0 20 61 6e 20 53 51 4c 20 73 61 76 65 70 6f 69 6e   an SQL savepoin
239f0 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  t. .*/.void sqli
23a00 74 65 33 53 61 76 65 70 6f 69 6e 74 28 50 61 72  te3Savepoint(Par
23a10 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
23a20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  op, Token *pName
23a30 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  ){.  char *zName
23a40 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
23a50 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
23a60 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  db, pName);.  if
23a70 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 56  ( zName ){.    V
23a80 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
23a90 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
23aa0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
23ab0 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
23ac0 4f 4e 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  ON.    static co
23ad0 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  nst char * const
23ae0 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45 47 49 4e   az[] = { "BEGIN
23af0 22 2c 20 22 52 45 4c 45 41 53 45 22 2c 20 22 52  ", "RELEASE", "R
23b00 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20 20 20 20  OLLBACK" };.    
23b10 61 73 73 65 72 74 28 20 21 53 41 56 45 50 4f 49  assert( !SAVEPOI
23b20 4e 54 5f 42 45 47 49 4e 20 26 26 20 53 41 56 45  NT_BEGIN && SAVE
23b30 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3d 3d 31  POINT_RELEASE==1
23b40 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f   && SAVEPOINT_RO
23b50 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e  LLBACK==2 );.#en
23b60 64 69 66 0a 20 20 20 20 69 66 28 20 21 76 20 7c  dif.    if( !v |
23b70 7c 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  | sqlite3AuthChe
23b80 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
23b90 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20 61 7a 5b  E_SAVEPOINT, az[
23ba0 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29 20 29  op], zName, 0) )
23bb0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
23bc0 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
23bd0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
23be0 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
23bf0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23c00 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76 65 70 6f  Op4(v, OP_Savepo
23c10 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 7a  int, op, 0, 0, z
23c20 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43  Name, P4_DYNAMIC
23c30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
23c40 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 54 45  Make sure the TE
23c50 4d 50 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  MP database is o
23c60 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62 6c  pen and availabl
23c70 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74 75  e for use.  Retu
23c80 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
23c90 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65 61   of errors.  Lea
23ca0 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  ve any error mes
23cb0 73 61 67 65 73 20 69 6e 20 74 68 65 20 70 50 61  sages in the pPa
23cc0 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
23cd0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65  /.int sqlite3Ope
23ce0 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50 61  nTempDatabase(Pa
23cf0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
23d00 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
23d10 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
23d20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d  db->aDb[1].pBt==
23d30 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78  0 && !pParse->ex
23d40 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74  plain ){.    int
23d50 20 72 63 3b 0a 20 20 20 20 42 74 72 65 65 20 2a   rc;.    Btree *
23d60 70 42 74 3b 0a 20 20 20 20 73 74 61 74 69 63 20  pBt;.    static 
23d70 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
23d80 3d 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  = .          SQL
23d90 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
23da0 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  TE |.          S
23db0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
23dc0 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  E |.          SQ
23dd0 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
23de0 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  IVE |.          
23df0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
23e00 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20  TEONCLOSE |.    
23e10 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
23e20 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20 20  N_TEMP_DB;..    
23e30 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
23e40 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20  eOpen(db->pVfs, 
23e50 30 2c 20 64 62 2c 20 26 70 42 74 2c 20 30 2c 20  0, db, &pBt, 0, 
23e60 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  flags);.    if( 
23e70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23e80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
23e90 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
23ea0 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61  unable to open a
23eb0 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
23ec0 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22 66  ase ".        "f
23ed0 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ile for storing 
23ee0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
23ef0 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ");.      pParse
23f00 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
23f10 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
23f20 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  .    db->aDb[1].
23f30 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 61  pBt = pBt;.    a
23f40 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 31  ssert( db->aDb[1
23f50 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ].pSchema );.   
23f60 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   if( SQLITE_NOME
23f70 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 53  M==sqlite3BtreeS
23f80 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 2c 20  etPageSize(pBt, 
23f90 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65  db->nextPagesize
23fa0 2c 20 2d 31 2c 20 30 29 20 29 7b 0a 20 20 20 20  , -1, 0) ){.    
23fb0 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
23fc0 74 28 64 62 29 3b 0a 20 20 20 20 20 20 72 65 74  t(db);.      ret
23fd0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
23fe0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
23ff0 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65  /*.** Record the
24000 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 73   fact that the s
24010 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 77 69 6c  chema cookie wil
24020 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 76 65 72  l need to be ver
24030 69 66 69 65 64 0a 2a 2a 20 66 6f 72 20 64 61 74  ified.** for dat
24040 61 62 61 73 65 20 69 44 62 2e 20 20 54 68 65 20  abase iDb.  The 
24050 63 6f 64 65 20 74 6f 20 61 63 74 75 61 6c 6c 79  code to actually
24060 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65   verify the sche
24070 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a 20 77 69 6c  ma cookie.** wil
24080 6c 20 6f 63 63 75 72 20 61 74 20 74 68 65 20 65  l occur at the e
24090 6e 64 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65  nd of the top-le
240a0 76 65 6c 20 56 44 42 45 20 61 6e 64 20 77 69 6c  vel VDBE and wil
240b0 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  l be generated.*
240c0 2a 20 6c 61 74 65 72 2c 20 62 79 20 73 71 6c 69  * later, by sqli
240d0 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28  te3FinishCoding(
240e0 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
240f0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
24100 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
24110 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61  , int iDb){.  Pa
24120 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
24130 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
24140 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a  level(pParse);..
24150 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
24160 20 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d 3e   && iDb<pParse->
24170 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
24180 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
24190 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30  >aDb[iDb].pBt!=0
241a0 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20   || iDb==1 );.  
241b0 61 73 73 65 72 74 28 20 69 44 62 3c 53 51 4c 49  assert( iDb<SQLI
241c0 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2b  TE_MAX_ATTACHED+
241d0 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  2 );.  assert( s
241e0 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
241f0 78 48 65 6c 64 28 70 50 61 72 73 65 2d 3e 64 62  xHeld(pParse->db
24200 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 69  , iDb, 0) );.  i
24210 66 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 54  f( DbMaskTest(pT
24220 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d  oplevel->cookieM
24230 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20 29 7b 0a  ask, iDb)==0 ){.
24240 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70 54      DbMaskSet(pT
24250 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d  oplevel->cookieM
24260 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 20 20 69  ask, iDb);.    i
24270 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
24280 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
24290 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65     sqlite3OpenTe
242a0 6d 70 44 61 74 61 62 61 73 65 28 70 54 6f 70 6c  mpDatabase(pTopl
242b0 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  evel);.    }.  }
242c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72 67  .}../*.** If arg
242d0 75 6d 65 6e 74 20 7a 44 62 20 69 73 20 4e 55 4c  ument zDb is NUL
242e0 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20 73 71 6c  L, then call sql
242f0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
24300 68 65 6d 61 28 29 20 66 6f 72 20 65 61 63 68 20  hema() for each 
24310 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74  .** attached dat
24320 61 62 61 73 65 2e 20 4f 74 68 65 72 77 69 73 65  abase. Otherwise
24330 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66 6f 72 20  , invoke it for 
24340 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
24350 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ed zDb only..*/.
24360 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65  void sqlite3Code
24370 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d  VerifyNamedSchem
24380 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  a(Parse *pParse,
24390 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
243a0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
243b0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
243c0 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
243d0 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
243e0 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20  +){.    Db *pDb 
243f0 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
24400 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20     if( pDb->pBt 
24410 26 26 20 28 21 7a 44 62 20 7c 7c 20 30 3d 3d 73  && (!zDb || 0==s
24420 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44  qlite3StrICmp(zD
24430 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65  b, pDb->zDbSName
24440 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  )) ){.      sqli
24450 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
24460 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a  ema(pParse, i);.
24470 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
24480 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
24490 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61   code that prepa
244a0 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e  res for doing an
244b0 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a   operation that.
244c0 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ** might change 
244d0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
244e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
244f0 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72   starts a new tr
24500 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20  ansaction if we 
24510 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  are not already 
24520 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e  within.** a tran
24530 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20  saction.  If we 
24540 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68  are already with
24550 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
24560 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f  , then a checkpo
24570 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66  int.** is set if
24580 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e   the setStatemen
24590 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
245a0 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69  rue.  A checkpoi
245b0 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nt should.** be 
245c0 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f  set for operatio
245d0 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61  ns that might fa
245e0 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e  il (due to a con
245f0 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66  straint) part of
24600 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f  .** the way thro
24610 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69  ugh and which wi
24620 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20  ll need to undo 
24630 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68  some writes with
24640 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a  out having to.**
24650 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68   rollback the wh
24660 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ole transaction.
24670 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73    For operations
24680 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74   where all const
24690 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65  raints.** can be
246a0 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20   checked before 
246b0 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20  any changes are 
246c0 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
246d0 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65  base, it is neve
246e0 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74  r.** necessary t
246f0 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61  o undo a write a
24700 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  nd the checkpoin
24710 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
24720 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
24730 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
24740 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  eration(Parse *p
24750 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74  Parse, int setSt
24760 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62  atement, int iDb
24770 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70  ){.  Parse *pTop
24780 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
24790 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
247a0 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  rse);.  sqlite3C
247b0 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
247c0 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
247d0 44 62 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c 65  DbMaskSet(pTople
247e0 76 65 6c 2d 3e 77 72 69 74 65 4d 61 73 6b 2c 20  vel->writeMask, 
247f0 69 44 62 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  iDb);.  pTopleve
24800 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20  l->isMultiWrite 
24810 7c 3d 20 73 65 74 53 74 61 74 65 6d 65 6e 74 3b  |= setStatement;
24820 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61  .}../*.** Indica
24830 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74  te that the stat
24840 65 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20  ement currently 
24850 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
24860 6f 6e 20 6d 69 67 68 74 20 77 72 69 74 65 0a 2a  on might write.*
24870 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  * more than one 
24880 65 6e 74 72 79 20 28 65 78 61 6d 70 6c 65 3a 20  entry (example: 
24890 64 65 6c 65 74 69 6e 67 20 6f 6e 65 20 72 6f 77  deleting one row
248a0 20 74 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20   then inserting 
248b0 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e 73 65  another,.** inse
248c0 72 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 72  rting multiple r
248d0 6f 77 73 20 69 6e 20 61 20 74 61 62 6c 65 2c 20  ows in a table, 
248e0 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 61 20 72  or inserting a r
248f0 6f 77 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74  ow and index ent
24900 72 69 65 73 2e 29 0a 2a 2a 20 49 66 20 61 6e 20  ries.).** If an 
24910 61 62 6f 72 74 20 6f 63 63 75 72 73 20 61 66 74  abort occurs aft
24920 65 72 20 73 6f 6d 65 20 6f 66 20 74 68 65 73 65  er some of these
24930 20 77 72 69 74 65 73 20 68 61 76 65 20 63 6f 6d   writes have com
24940 70 6c 65 74 65 64 2c 20 74 68 65 6e 20 69 74 20  pleted, then it 
24950 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63 65 73  will.** be neces
24960 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 74 68 65  sary to undo the
24970 20 63 6f 6d 70 6c 65 74 65 64 20 77 72 69 74 65   completed write
24980 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
24990 65 33 4d 75 6c 74 69 57 72 69 74 65 28 50 61 72  e3MultiWrite(Par
249a0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50  se *pParse){.  P
249b0 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
249c0 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
249d0 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
249e0 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d    pToplevel->isM
249f0 75 6c 74 69 57 72 69 74 65 20 3d 20 31 3b 0a 7d  ultiWrite = 1;.}
24a00 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 64  ../* .** The cod
24a10 65 20 67 65 6e 65 72 61 74 6f 72 20 63 61 6c 6c  e generator call
24a20 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  s this routine i
24a30 66 20 69 73 20 64 69 73 63 6f 76 65 72 73 20 74  f is discovers t
24a40 68 61 74 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73  hat it is.** pos
24a50 73 69 62 6c 65 20 74 6f 20 61 62 6f 72 74 20 61  sible to abort a
24a60 20 73 74 61 74 65 6d 65 6e 74 20 70 72 69 6f 72   statement prior
24a70 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20   to completion. 
24a80 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 0a 2a 2a   In order to .**
24a90 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 61 62   perform this ab
24aa0 6f 72 74 20 77 69 74 68 6f 75 74 20 63 6f 72 72  ort without corr
24ab0 75 70 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  upting the datab
24ac0 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  ase, we need to 
24ad0 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 74 68 61  make.** sure tha
24ae0 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
24af0 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79 20  is protected by 
24b00 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
24b10 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  saction..**.** T
24b20 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6f  echnically, we o
24b30 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 65 74 20  nly need to set 
24b40 74 68 65 20 6d 61 79 41 62 6f 72 74 20 66 6c 61  the mayAbort fla
24b50 67 20 69 66 20 74 68 65 0a 2a 2a 20 69 73 4d 75  g if the.** isMu
24b60 6c 74 69 57 72 69 74 65 20 66 6c 61 67 20 77 61  ltiWrite flag wa
24b70 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74  s previously set
24b80 2e 20 20 54 68 65 72 65 20 69 73 20 61 20 74 69  .  There is a ti
24b90 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a  me dependency.**
24ba0 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 61   such that the a
24bb0 62 6f 72 74 20 6d 75 73 74 20 6f 63 63 75 72 20  bort must occur 
24bc0 61 66 74 65 72 20 74 68 65 20 6d 75 6c 74 69 77  after the multiw
24bd0 72 69 74 65 2e 20 20 54 68 69 73 20 6d 61 6b 65  rite.  This make
24be0 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 61 74 65 6d  s.** some statem
24bf0 65 6e 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 74  ents involving t
24c00 68 65 20 52 45 50 4c 41 43 45 20 63 6f 6e 66 6c  he REPLACE confl
24c10 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
24c20 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f 20 61  lgorithm.** go a
24c30 20 6c 69 74 74 6c 65 20 66 61 73 74 65 72 2e 20   little faster. 
24c40 20 42 75 74 20 74 61 6b 69 6e 67 20 61 64 76 61   But taking adva
24c50 6e 74 61 67 65 20 6f 66 20 74 68 69 73 20 74 69  ntage of this ti
24c60 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a  me dependency.**
24c70 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72 65 20 64   makes it more d
24c80 69 66 66 69 63 75 6c 74 20 74 6f 20 70 72 6f 76  ifficult to prov
24c90 65 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20  e that the code 
24ca0 69 73 20 63 6f 72 72 65 63 74 20 28 69 6e 20 0a  is correct (in .
24cb0 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 2c 20 69  ** particular, i
24cc0 74 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72  t prevents us fr
24cd0 6f 6d 20 77 72 69 74 69 6e 67 20 61 6e 20 65 66  om writing an ef
24ce0 66 65 63 74 69 76 65 0a 2a 2a 20 69 6d 70 6c 65  fective.** imple
24cf0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71 6c  mentation of sql
24d00 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
24d10 72 74 28 29 29 20 61 6e 64 20 73 6f 20 77 65 20  rt()) and so we 
24d20 68 61 76 65 20 63 68 6f 73 65 6e 0a 2a 2a 20 74  have chosen.** t
24d30 6f 20 74 61 6b 65 20 74 68 65 20 73 61 66 65 20  o take the safe 
24d40 72 6f 75 74 65 20 61 6e 64 20 73 6b 69 70 20 74  route and skip t
24d50 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  he optimization.
24d60 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
24d70 4d 61 79 41 62 6f 72 74 28 50 61 72 73 65 20 2a  MayAbort(Parse *
24d80 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65  pParse){.  Parse
24d90 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
24da0 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
24db0 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54  el(pParse);.  pT
24dc0 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41 62 6f 72  oplevel->mayAbor
24dd0 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 1;.}../*.** 
24de0 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20  Code an OP_Halt 
24df0 74 68 61 74 20 63 61 75 73 65 73 20 74 68 65 20  that causes the 
24e00 76 64 62 65 20 74 6f 20 72 65 74 75 72 6e 20 61  vdbe to return a
24e10 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
24e20 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e 20 54 68  INT.** error. Th
24e30 65 20 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d 65  e onError parame
24e40 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ter determines w
24e50 68 69 63 68 20 28 69 66 20 61 6e 79 29 20 6f 66  hich (if any) of
24e60 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   the statement.*
24e70 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72 65 6e 74  * and/or current
24e80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
24e90 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a  rolled back..*/.
24ea0 76 6f 69 64 20 73 71 6c 69 74 65 33 48 61 6c 74  void sqlite3Halt
24eb0 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61  Constraint(.  Pa
24ec0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
24ed0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
24ee0 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43  xt */.  int errC
24ef0 6f 64 65 2c 20 20 20 20 20 20 2f 2a 20 65 78 74  ode,      /* ext
24f00 65 6e 64 65 64 20 65 72 72 6f 72 20 63 6f 64 65  ended error code
24f10 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
24f20 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74  r,      /* Const
24f30 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20  raint type */.  
24f40 63 68 61 72 20 2a 70 34 2c 20 20 20 20 20 20 20  char *p4,       
24f50 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61    /* Error messa
24f60 67 65 20 2a 2f 0a 20 20 69 38 20 70 34 74 79 70  ge */.  i8 p4typ
24f70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 34 5f  e,        /* P4_
24f80 53 54 41 54 49 43 20 6f 72 20 50 34 5f 54 52 41  STATIC or P4_TRA
24f90 4e 53 49 45 4e 54 20 2a 2f 0a 20 20 75 38 20 70  NSIENT */.  u8 p
24fa0 35 45 72 72 6d 73 67 20 20 20 20 20 20 20 2f 2a  5Errmsg       /*
24fb0 20 50 35 5f 45 72 72 4d 73 67 20 74 79 70 65 20   P5_ErrMsg type 
24fc0 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
24fd0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
24fe0 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
24ff0 72 74 28 20 28 65 72 72 43 6f 64 65 26 30 78 66  rt( (errCode&0xf
25000 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  f)==SQLITE_CONST
25010 52 41 49 4e 54 20 29 3b 0a 20 20 69 66 28 20 6f  RAINT );.  if( o
25020 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74  nError==OE_Abort
25030 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d   ){.    sqlite3M
25040 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
25050 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
25060 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48  beAddOp4(v, OP_H
25070 61 6c 74 2c 20 65 72 72 43 6f 64 65 2c 20 6f 6e  alt, errCode, on
25080 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70 34  Error, 0, p4, p4
25090 74 79 70 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  type);.  sqlite3
250a0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
250b0 70 35 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a  p5Errmsg);.}../*
250c0 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48  .** Code an OP_H
250d0 61 6c 74 20 64 75 65 20 74 6f 20 55 4e 49 51 55  alt due to UNIQU
250e0 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59  E or PRIMARY KEY
250f0 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c   constraint viol
25100 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
25110 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73  qlite3UniqueCons
25120 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20  traint(.  Parse 
25130 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
25140 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
25150 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
25160 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61        /* Constra
25170 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20 49 6e  int type */.  In
25180 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
25190 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68 61  /* The index tha
251a0 74 20 74 72 69 67 67 65 72 73 20 74 68 65 20 63  t triggers the c
251b0 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a  onstraint */.){.
251c0 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20    char *zErr;.  
251d0 69 6e 74 20 6a 3b 0a 20 20 53 74 72 41 63 63 75  int j;.  StrAccu
251e0 6d 20 65 72 72 4d 73 67 3b 0a 20 20 54 61 62 6c  m errMsg;.  Tabl
251f0 65 20 2a 70 54 61 62 20 3d 20 70 49 64 78 2d 3e  e *pTab = pIdx->
25200 70 54 61 62 6c 65 3b 0a 0a 20 20 73 71 6c 69 74  pTable;..  sqlit
25210 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26  e3StrAccumInit(&
25220 65 72 72 4d 73 67 2c 20 70 50 61 72 73 65 2d 3e  errMsg, pParse->
25230 64 62 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20 20  db, 0, 0, .     
25240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25250 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69   pParse->db->aLi
25260 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
25270 5f 4c 45 4e 47 54 48 5d 29 3b 0a 20 20 69 66 28  _LENGTH]);.  if(
25280 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20   pIdx->aColExpr 
25290 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
252a0 74 72 5f 61 70 70 65 6e 64 66 28 26 65 72 72 4d  tr_appendf(&errM
252b0 73 67 2c 20 22 69 6e 64 65 78 20 27 25 71 27 22  sg, "index '%q'"
252c0 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pIdx->zName);.
252d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
252e0 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b  (j=0; j<pIdx->nK
252f0 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  eyCol; j++){.   
25300 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20     char *zCol;. 
25310 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
25320 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d  x->aiColumn[j]>=
25330 30 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 20  0 );.      zCol 
25340 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 64  = pTab->aCol[pId
25350 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e  x->aiColumn[j]].
25360 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28  zName;.      if(
25370 20 6a 20 29 20 73 71 6c 69 74 65 33 5f 73 74 72   j ) sqlite3_str
25380 5f 61 70 70 65 6e 64 28 26 65 72 72 4d 73 67 2c  _append(&errMsg,
25390 20 22 2c 20 22 2c 20 32 29 3b 0a 20 20 20 20 20   ", ", 2);.     
253a0 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
253b0 65 6e 64 61 6c 6c 28 26 65 72 72 4d 73 67 2c 20  endall(&errMsg, 
253c0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
253d0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
253e0 61 70 70 65 6e 64 28 26 65 72 72 4d 73 67 2c 20  append(&errMsg, 
253f0 22 2e 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  ".", 1);.      s
25400 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
25410 64 61 6c 6c 28 26 65 72 72 4d 73 67 2c 20 7a 43  dall(&errMsg, zC
25420 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ol);.    }.  }. 
25430 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 53   zErr = sqlite3S
25440 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 65  trAccumFinish(&e
25450 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
25460 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
25470 70 50 61 72 73 65 2c 20 0a 20 20 20 20 49 73 50  pParse, .    IsP
25480 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
25490 49 64 78 29 20 3f 20 53 51 4c 49 54 45 5f 43 4f  Idx) ? SQLITE_CO
254a0 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59  NSTRAINT_PRIMARY
254b0 4b 45 59 20 0a 20 20 20 20 20 20 20 20 20 20 20  KEY .           
254c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254d0 20 3a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   : SQLITE_CONSTR
254e0 41 49 4e 54 5f 55 4e 49 51 55 45 2c 0a 20 20 20  AINT_UNIQUE,.   
254f0 20 6f 6e 45 72 72 6f 72 2c 20 7a 45 72 72 2c 20   onError, zErr, 
25500 50 34 5f 44 59 4e 41 4d 49 43 2c 20 50 35 5f 43  P4_DYNAMIC, P5_C
25510 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71 75 65 29  onstraintUnique)
25520 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  ;.}.../*.** Code
25530 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65 20   an OP_Halt due 
25540 74 6f 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f  to non-unique ro
25550 77 69 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wid..*/.void sql
25560 69 74 65 33 52 6f 77 69 64 43 6f 6e 73 74 72 61  ite3RowidConstra
25570 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  int(.  Parse *pP
25580 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
25590 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
255a0 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
255b0 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72     /* Conflict r
255c0 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
255d0 74 68 6d 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  thm */.  Table *
255e0 70 54 61 62 20 20 20 20 20 20 20 2f 2a 20 54 68  pTab       /* Th
255f0 65 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  e table with the
25600 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69   non-unique rowi
25610 64 20 2a 2f 20 0a 29 7b 0a 20 20 63 68 61 72 20  d */ .){.  char 
25620 2a 7a 4d 73 67 3b 0a 20 20 69 6e 74 20 72 63 3b  *zMsg;.  int rc;
25630 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b  .  if( pTab->iPK
25640 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 7a 4d 73  ey>=0 ){.    zMs
25650 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
25660 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
25670 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  %s.%s", pTab->zN
25680 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
25690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
256a0 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e  Tab->aCol[pTab->
256b0 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  iPKey].zName);. 
256c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
256d0 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52  ONSTRAINT_PRIMAR
256e0 59 4b 45 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  YKEY;.  }else{. 
256f0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
25700 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
25710 3e 64 62 2c 20 22 25 73 2e 72 6f 77 69 64 22 2c  >db, "%s.rowid",
25720 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
25730 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
25740 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 3b  ONSTRAINT_ROWID;
25750 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61  .  }.  sqlite3Ha
25760 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  ltConstraint(pPa
25770 72 73 65 2c 20 72 63 2c 20 6f 6e 45 72 72 6f 72  rse, rc, onError
25780 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
25790 49 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  IC,.            
257a0 20 20 20 20 20 20 20 20 20 20 20 20 50 35 5f 43              P5_C
257b0 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71 75 65 29  onstraintUnique)
257c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
257d0 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e 64 65   to see if pInde
257e0 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61  x uses the colla
257f0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43  ting sequence pC
25800 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  oll.  Return.** 
25810 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 20  true if it does 
25820 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69 74 20  and false if it 
25830 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66  does not..*/.#if
25840 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
25850 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20  _REINDEX.static 
25860 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74  int collationMat
25870 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ch(const char *z
25880 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e  Coll, Index *pIn
25890 64 65 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  dex){.  int i;. 
258a0 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d   assert( zColl!=
258b0 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0 );.  for(i=0; 
258c0 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  i<pIndex->nColum
258d0 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  n; i++){.    con
258e0 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e  st char *z = pIn
258f0 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  dex->azColl[i];.
25900 20 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30      assert( z!=0
25910 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f   || pIndex->aiCo
25920 6c 75 6d 6e 5b 69 5d 3c 30 20 29 3b 0a 20 20 20  lumn[i]<0 );.   
25930 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 69 43   if( pIndex->aiC
25940 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 26 26 20 30  olumn[i]>=0 && 0
25950 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
25960 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  (z, zColl) ){.  
25970 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
25980 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
25990 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
259a0 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c  .** Recompute al
259b0 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61  l indices of pTa
259c0 62 20 74 68 61 74 20 75 73 65 20 74 68 65 20 63  b that use the c
259d0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
259e0 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70  e pColl..** If p
259f0 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63  Coll==0 then rec
25a00 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
25a10 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23  es of pTab..*/.#
25a20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
25a30 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69  IT_REINDEX.stati
25a40 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61  c void reindexTa
25a50 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
25a60 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
25a70 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
25a80 6c 29 7b 0a 20 20 69 66 28 20 21 49 73 56 69 72  l){.  if( !IsVir
25a90 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
25aa0 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
25ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25ac0 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69   An index associ
25ad0 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a  ated with pTab *
25ae0 2f 0a 0a 20 20 20 20 66 6f 72 28 70 49 6e 64 65  /..    for(pInde
25af0 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
25b00 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70  pIndex; pIndex=p
25b10 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  Index->pNext){. 
25b20 20 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d       if( zColl==
25b30 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61  0 || collationMa
25b40 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65  tch(zColl, pInde
25b50 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  x) ){.        in
25b60 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
25b70 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
25b80 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
25b90 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
25ba0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
25bb0 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
25bc0 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20  se, 0, iDb);.   
25bd0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69       sqlite3Refi
25be0 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
25bf0 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20  pIndex, -1);.   
25c00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
25c10 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
25c20 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
25c30 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c  ices of all tabl
25c40 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61  es in all databa
25c50 73 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a  ses where the.**
25c60 20 69 6e 64 69 63 65 73 20 75 73 65 20 74 68 65   indices use the
25c70 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
25c80 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70  nce pColl.  If p
25c90 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63  Coll==0 then rec
25ca0 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e  ompute.** all in
25cb0 64 69 63 65 73 20 65 76 65 72 79 77 68 65 72 65  dices everywhere
25cc0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
25cd0 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
25ce0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69  .static void rei
25cf0 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 50 61  ndexDatabases(Pa
25d00 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61  rse *pParse, cha
25d10 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b  r const *zColl){
25d20 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20  .  Db *pDb;     
25d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25d40 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62  * A single datab
25d50 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ase */.  int iDb
25d60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25d70 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
25d80 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65  base index numbe
25d90 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  r */.  sqlite3 *
25da0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
25db0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
25dc0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
25dd0 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20  .  HashElem *k; 
25de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25df0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
25e00 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62  er tables in pDb
25e10 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
25e20 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
25e30 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20    /* A table in 
25e40 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
25e50 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
25e60 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d  e3BtreeHoldsAllM
25e70 75 74 65 78 65 73 28 64 62 29 20 29 3b 20 20 2f  utexes(db) );  /
25e80 2a 20 4e 65 65 64 65 64 20 66 6f 72 20 73 63 68  * Needed for sch
25e90 65 6d 61 20 61 63 63 65 73 73 20 2a 2f 0a 20 20  ema access */.  
25ea0 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64  for(iDb=0, pDb=d
25eb0 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e  b->aDb; iDb<db->
25ec0 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b  nDb; iDb++, pDb+
25ed0 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
25ee0 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f  pDb!=0 );.    fo
25ef0 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(k=sqliteHashFi
25f00 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  rst(&pDb->pSchem
25f10 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b  a->tblHash);  k;
25f20 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   k=sqliteHashNex
25f30 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61  t(k)){.      pTa
25f40 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69  b = (Table*)sqli
25f50 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20  teHashData(k);. 
25f60 20 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c       reindexTabl
25f70 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
25f80 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  zColl);.    }.  
25f90 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
25fa0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
25fb0 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58 20  for the REINDEX 
25fc0 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20  command..**.**  
25fd0 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 20        REINDEX   
25fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ff0 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a           -- 1.**
26000 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
26010 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20   <collation>    
26020 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a             -- 2.
26030 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
26040 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f  X  ?<database>.?
26050 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20  <tablename>  -- 
26060 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  3.**        REIN
26070 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e  DEX  ?<database>
26080 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d  .?<indexname>  -
26090 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31  - 4.**.** Form 1
260a0 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69   causes all indi
260b0 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63  ces in all attac
260c0 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f  hed databases to
260d0 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20   be rebuilt..** 
260e0 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20  Form 2 rebuilds 
260f0 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61  all indices in a
26100 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74 68 61  ll databases tha
26110 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a  t use the named.
26120 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  ** collating fun
26130 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20  ction.  Forms 3 
26140 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74 68  and 4 rebuild th
26150 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72  e named index or
26160 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20   all.** indices 
26170 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
26180 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e  the named table.
26190 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
261a0 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
261b0 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e  void sqlite3Rein
261c0 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
261d0 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  e, Token *pName1
261e0 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29  , Token *pName2)
261f0 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
26200 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
26210 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
26220 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e  uence to be rein
26230 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a  dexed, or NULL *
26240 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  /.  char *z;    
26250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26260 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62  /* Name of a tab
26270 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20  le or index */. 
26280 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
26290 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
262a0 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
262b0 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  base */.  Table 
262c0 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
262d0 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65        /* A table
262e0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
262f0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
26300 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
26310 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73    /* An index as
26320 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
26330 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  ab */.  int iDb;
26340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26350 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
26360 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ase index number
26370 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
26380 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
26390 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
263a0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
263b0 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d    Token *pObjNam
263c0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
263d0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
263e0 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62  le or index to b
263f0 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a  e reindexed */..
26400 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61    /* Read the da
26410 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
26420 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
26430 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
26440 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61  r message.  ** a
26450 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73  nd code in pPars
26460 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  e and return NUL
26470 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  L. */.  if( SQLI
26480 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
26490 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
264a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
264b0 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65    }..  if( pName
264c0 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e  1==0 ){.    rein
264d0 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61  dexDatabases(pPa
264e0 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rse, 0);.    ret
264f0 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  urn;.  }else if(
26500 20 4e 45 56 45 52 28 70 4e 61 6d 65 32 3d 3d 30   NEVER(pName2==0
26510 29 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d  ) || pName2->z==
26520 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
26530 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72 74  Coll;.    assert
26540 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20  ( pName1->z );. 
26550 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     zColl = sqlit
26560 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
26570 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d  pParse->db, pNam
26580 65 31 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 43  e1);.    if( !zC
26590 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  oll ) return;.  
265a0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
265b0 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
265c0 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c   ENC(db), zColl,
265d0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f   0);.    if( pCo
265e0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 69 6e  ll ){.      rein
265f0 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61  dexDatabases(pPa
26600 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  rse, zColl);.   
26610 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
26620 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  (db, zColl);.   
26630 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
26640 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
26650 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  ee(db, zColl);. 
26660 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
26670 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
26680 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
26690 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29  ame2, &pObjName)
266a0 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20  ;.  if( iDb<0 ) 
266b0 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71  return;.  z = sq
266c0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
266d0 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29  en(db, pObjName)
266e0 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
266f0 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64  eturn;.  zDb = d
26700 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
26710 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73  Name;.  pTab = s
26720 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
26730 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69  db, z, zDb);.  i
26740 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72  f( pTab ){.    r
26750 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72  eindexTable(pPar
26760 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20  se, pTab, 0);.  
26770 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
26780 64 62 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74 75  db, z);.    retu
26790 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78  rn;.  }.  pIndex
267a0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
267b0 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b  dex(db, z, zDb);
267c0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
267d0 28 64 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70  (db, z);.  if( p
267e0 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c  Index ){.    sql
267f0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
26800 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
26810 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  0, iDb);.    sql
26820 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
26830 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20  pParse, pIndex, 
26840 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  -1);.    return;
26850 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72  .  }.  sqlite3Er
26860 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
26870 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69  unable to identi
26880 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f  fy the object to
26890 20 62 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b   be reindexed");
268a0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
268b0 20 52 65 74 75 72 6e 20 61 20 4b 65 79 49 6e 66   Return a KeyInf
268c0 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
268d0 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
268e0 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 49 6e  for the given In
268f0 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  dex..**.** The c
26900 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 69 6e 76  aller should inv
26910 6f 6b 65 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  oke sqlite3KeyIn
26920 66 6f 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65  foUnref() on the
26930 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74   returned object
26940 0a 2a 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20  .** when it has 
26950 66 69 6e 69 73 68 65 64 20 75 73 69 6e 67 20 69  finished using i
26960 74 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73  t..*/.KeyInfo *s
26970 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49  qlite3KeyInfoOfI
26980 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
26990 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29  se, Index *pIdx)
269a0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
269b0 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43   nCol = pIdx->nC
269c0 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e 4b 65  olumn;.  int nKe
269d0 79 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  y = pIdx->nKeyCo
269e0 6c 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  l;.  KeyInfo *pK
269f0 65 79 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  ey;.  if( pParse
26a00 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20  ->nErr ) return 
26a10 30 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 75  0;.  if( pIdx->u
26a20 6e 69 71 4e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20  niqNotNull ){.  
26a30 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
26a40 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61  KeyInfoAlloc(pPa
26a50 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 2c 20 6e  rse->db, nKey, n
26a60 43 6f 6c 2d 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c  Col-nKey);.  }el
26a70 73 65 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73  se{.    pKey = s
26a80 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
26a90 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e  oc(pParse->db, n
26aa0 43 6f 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  Col, 0);.  }.  i
26ab0 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  f( pKey ){.    a
26ac0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
26ad0 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
26ae0 28 70 4b 65 79 29 20 29 3b 0a 20 20 20 20 66 6f  (pKey) );.    fo
26af0 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
26b00 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ++){.      const
26b10 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
26b20 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  Idx->azColl[i];.
26b30 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c        pKey->aCol
26b40 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3d 3d 73 71  l[i] = zColl==sq
26b50 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 20 3f  lite3StrBINARY ?
26b60 20 30 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20   0 :.           
26b70 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
26b80 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
26b90 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29  q(pParse, zColl)
26ba0 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 53  ;.      pKey->aS
26bb0 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49  ortOrder[i] = pI
26bc0 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  dx->aSortOrder[i
26bd0 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  ];.    }.    if(
26be0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b   pParse->nErr ){
26bf0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
26c00 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54  Parse->rc==SQLIT
26c10 45 5f 45 52 52 4f 52 5f 4d 49 53 53 49 4e 47 5f  E_ERROR_MISSING_
26c20 43 4f 4c 4c 53 45 51 20 29 3b 0a 20 20 20 20 20  COLLSEQ );.     
26c30 20 69 66 28 20 70 49 64 78 2d 3e 62 4e 6f 51 75   if( pIdx->bNoQu
26c40 65 72 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ery==0 ){.      
26c50 20 20 2f 2a 20 44 65 61 63 74 69 76 61 74 65 20    /* Deactivate 
26c60 74 68 65 20 69 6e 64 65 78 20 62 65 63 61 75 73  the index becaus
26c70 65 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e  e it contains an
26c80 20 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 6c 61 74 69   unknown collati
26c90 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  ng.        ** se
26ca0 71 75 65 6e 63 65 2e 20 20 54 68 65 20 6f 6e 6c  quence.  The onl
26cb0 79 20 77 61 79 20 74 6f 20 72 65 61 63 74 69 76  y way to reactiv
26cc0 65 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74  e the index is t
26cd0 6f 20 72 65 6c 6f 61 64 20 74 68 65 0a 20 20 20  o reload the.   
26ce0 20 20 20 20 20 2a 2a 20 73 63 68 65 6d 61 2e 20       ** schema. 
26cf0 20 41 64 64 69 6e 67 20 74 68 65 20 6d 69 73 73   Adding the miss
26d00 69 6e 67 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ing collating se
26d10 71 75 65 6e 63 65 20 6c 61 74 65 72 20 64 6f 65  quence later doe
26d20 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a  s not.        **
26d30 20 72 65 61 63 74 69 76 65 20 74 68 65 20 69 6e   reactive the in
26d40 64 65 78 2e 20 20 54 68 65 20 61 70 70 6c 69 63  dex.  The applic
26d50 61 74 69 6f 6e 20 68 61 64 20 74 68 65 20 63 68  ation had the ch
26d60 61 6e 63 65 20 74 6f 20 72 65 67 69 73 74 65 72  ance to register
26d70 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
26d80 6d 69 73 73 69 6e 67 20 69 6e 64 65 78 20 75 73  missing index us
26d90 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ing the collatio
26da0 6e 2d 6e 65 65 64 65 64 20 63 61 6c 6c 62 61 63  n-needed callbac
26db0 6b 2e 20 20 46 6f 72 0a 20 20 20 20 20 20 20 20  k.  For.        
26dc0 2a 2a 20 73 69 6d 70 6c 69 63 69 74 79 2c 20 53  ** simplicity, S
26dd0 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 67  QLite will not g
26de0 69 76 65 20 74 68 65 20 61 70 70 6c 69 63 61 74  ive the applicat
26df0 69 6f 6e 20 61 20 73 65 63 6f 6e 64 20 63 68 61  ion a second cha
26e00 6e 63 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  nce..        */.
26e10 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 62 4e          pIdx->bN
26e20 6f 51 75 65 72 79 20 3d 20 31 3b 0a 20 20 20 20  oQuery = 1;.    
26e30 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
26e40 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 5f 52 45   SQLITE_ERROR_RE
26e50 54 52 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  TRY;.      }.   
26e60 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66     sqlite3KeyInf
26e70 6f 55 6e 72 65 66 28 70 4b 65 79 29 3b 0a 20 20  oUnref(pKey);.  
26e80 20 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20      pKey = 0;.  
26e90 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
26ea0 20 70 4b 65 79 3b 0a 7d 0a 0a 23 69 66 6e 64 65   pKey;.}..#ifnde
26eb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
26ec0 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  E./* .** This ro
26ed0 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
26ee0 20 6f 6e 63 65 20 70 65 72 20 43 54 45 20 62 79   once per CTE by
26ef0 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
26f00 65 20 70 61 72 73 69 6e 67 20 61 20 0a 2a 2a 20  e parsing a .** 
26f10 57 49 54 48 20 63 6c 61 75 73 65 2e 20 0a 2a 2f  WITH clause. .*/
26f20 0a 57 69 74 68 20 2a 73 71 6c 69 74 65 33 57 69  .With *sqlite3Wi
26f30 74 68 41 64 64 28 0a 20 20 50 61 72 73 65 20 2a  thAdd(.  Parse *
26f40 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
26f50 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
26f60 65 78 74 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70  ext */.  With *p
26f70 57 69 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  With,           
26f80 20 2f 2a 20 45 78 69 73 74 69 6e 67 20 57 49 54   /* Existing WIT
26f90 48 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c  H clause, or NUL
26fa0 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  L */.  Token *pN
26fb0 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ame,           /
26fc0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
26fd0 6d 6d 6f 6e 2d 74 61 62 6c 65 20 2a 2f 0a 20 20  mmon-table */.  
26fe0 45 78 70 72 4c 69 73 74 20 2a 70 41 72 67 6c 69  ExprList *pArgli
26ff0 73 74 2c 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f  st,     /* Optio
27000 6e 61 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  nal column name 
27010 6c 69 73 74 20 66 6f 72 20 74 68 65 20 74 61 62  list for the tab
27020 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  le */.  Select *
27030 70 51 75 65 72 79 20 20 20 20 20 20 20 20 20 20  pQuery          
27040 2f 2a 20 51 75 65 72 79 20 75 73 65 64 20 74 6f  /* Query used to
27050 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
27060 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 71  table */.){.  sq
27070 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
27080 73 65 2d 3e 64 62 3b 0a 20 20 57 69 74 68 20 2a  se->db;.  With *
27090 70 4e 65 77 3b 0a 20 20 63 68 61 72 20 2a 7a 4e  pNew;.  char *zN
270a0 61 6d 65 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ame;..  /* Check
270b0 20 74 68 61 74 20 74 68 65 20 43 54 45 20 6e 61   that the CTE na
270c0 6d 65 20 69 73 20 75 6e 69 71 75 65 20 77 69 74  me is unique wit
270d0 68 69 6e 20 74 68 69 73 20 57 49 54 48 20 63 6c  hin this WITH cl
270e0 61 75 73 65 2e 20 49 66 0a 20 20 2a 2a 20 6e 6f  ause. If.  ** no
270f0 74 2c 20 73 74 6f 72 65 20 61 6e 20 65 72 72 6f  t, store an erro
27100 72 20 69 6e 20 74 68 65 20 50 61 72 73 65 20 73  r in the Parse s
27110 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 7a  tructure. */.  z
27120 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
27130 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
27140 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  se->db, pName);.
27150 20 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 20 70    if( zName && p
27160 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20  With ){.    int 
27170 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
27180 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69  i<pWith->nCte; i
27190 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
271a0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e  qlite3StrICmp(zN
271b0 61 6d 65 2c 20 70 57 69 74 68 2d 3e 61 5b 69 5d  ame, pWith->a[i]
271c0 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
271d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
271e0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64  orMsg(pParse, "d
271f0 75 70 6c 69 63 61 74 65 20 57 49 54 48 20 74 61  uplicate WITH ta
27200 62 6c 65 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a  ble name: %s", z
27210 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
27220 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
27230 70 57 69 74 68 20 29 7b 0a 20 20 20 20 73 71 6c  pWith ){.    sql
27240 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65  ite3_int64 nByte
27250 20 3d 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68   = sizeof(*pWith
27260 29 20 2b 20 28 73 69 7a 65 6f 66 28 70 57 69 74  ) + (sizeof(pWit
27270 68 2d 3e 61 5b 31 5d 29 20 2a 20 70 57 69 74 68  h->a[1]) * pWith
27280 2d 3e 6e 43 74 65 29 3b 0a 20 20 20 20 70 4e 65  ->nCte);.    pNe
27290 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
272a0 6c 6c 6f 63 28 64 62 2c 20 70 57 69 74 68 2c 20  lloc(db, pWith, 
272b0 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  nByte);.  }else{
272c0 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
272d0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
272e0 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 57 69 74  db, sizeof(*pWit
272f0 68 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  h));.  }.  asser
27300 74 28 20 28 70 4e 65 77 21 3d 30 20 26 26 20 7a  t( (pNew!=0 && z
27310 4e 61 6d 65 21 3d 30 29 20 7c 7c 20 64 62 2d 3e  Name!=0) || db->
27320 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
27330 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
27340 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
27350 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
27360 6c 65 74 65 28 64 62 2c 20 70 41 72 67 6c 69 73  lete(db, pArglis
27370 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  t);.    sqlite3S
27380 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
27390 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c  pQuery);.    sql
273a0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
273b0 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 20  Name);.    pNew 
273c0 3d 20 70 57 69 74 68 3b 0a 20 20 7d 65 6c 73 65  = pWith;.  }else
273d0 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e  {.    pNew->a[pN
273e0 65 77 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c 65 63  ew->nCte].pSelec
273f0 74 20 3d 20 70 51 75 65 72 79 3b 0a 20 20 20 20  t = pQuery;.    
27400 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43  pNew->a[pNew->nC
27410 74 65 5d 2e 70 43 6f 6c 73 20 3d 20 70 41 72 67  te].pCols = pArg
27420 6c 69 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  list;.    pNew->
27430 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 4e  a[pNew->nCte].zN
27440 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
27450 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
27460 43 74 65 5d 2e 7a 43 74 65 45 72 72 20 3d 20 30  Cte].zCteErr = 0
27470 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 43 74 65  ;.    pNew->nCte
27480 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ++;.  }..  retur
27490 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
274a0 20 46 72 65 65 20 74 68 65 20 63 6f 6e 74 65 6e   Free the conten
274b0 74 73 20 6f 66 20 74 68 65 20 57 69 74 68 20 6f  ts of the With o
274c0 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
274d0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
274e0 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
274f0 69 74 65 33 57 69 74 68 44 65 6c 65 74 65 28 73  ite3WithDelete(s
27500 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74 68  qlite3 *db, With
27510 20 2a 70 57 69 74 68 29 7b 0a 20 20 69 66 28 20   *pWith){.  if( 
27520 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74  pWith ){.    int
27530 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
27540 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20   i<pWith->nCte; 
27550 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
27560 63 74 20 43 74 65 20 2a 70 43 74 65 20 3d 20 26  ct Cte *pCte = &
27570 70 57 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20  pWith->a[i];.   
27580 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
27590 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74  stDelete(db, pCt
275a0 65 2d 3e 70 43 6f 6c 73 29 3b 0a 20 20 20 20 20  e->pCols);.     
275b0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
275c0 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70  lete(db, pCte->p
275d0 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73  Select);.      s
275e0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
275f0 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCte->zName);. 
27600 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
27610 44 62 46 72 65 65 28 64 62 2c 20 70 57 69 74 68  DbFree(db, pWith
27620 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
27630 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
27640 54 45 5f 4f 4d 49 54 5f 43 54 45 29 20 2a 2f 0a  TE_OMIT_CTE) */.