/ Hex Artifact Content
Login

Artifact 5db330027edad02d2b95d9dc7e3c3a49da275ef18892244fe2bb0097cbbee286:


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 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
2200: 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64    pParse->nested
2210: 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76  ++;.  memcpy(sav
2220: 65 42 75 66 2c 20 50 41 52 53 45 5f 54 41 49 4c  eBuf, PARSE_TAIL
2230: 28 70 50 61 72 73 65 29 2c 20 50 41 52 53 45 5f  (pParse), PARSE_
2240: 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73  TAIL_SZ);.  mems
2250: 65 74 28 50 41 52 53 45 5f 54 41 49 4c 28 70 50  et(PARSE_TAIL(pP
2260: 61 72 73 65 29 2c 20 30 2c 20 50 41 52 53 45 5f  arse), 0, PARSE_
2270: 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 73 71 6c 69  TAIL_SZ);.  sqli
2280: 74 65 33 52 75 6e 50 61 72 73 65 72 28 70 50 61  te3RunParser(pPa
2290: 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72  rse, zSql, &zErr
22a0: 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Msg);.  sqlite3D
22b0: 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73  bFree(db, zErrMs
22c0: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
22d0: 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20  ree(db, zSql);. 
22e0: 20 6d 65 6d 63 70 79 28 50 41 52 53 45 5f 54 41   memcpy(PARSE_TA
22f0: 49 4c 28 70 50 61 72 73 65 29 2c 20 73 61 76 65  IL(pParse), save
2300: 42 75 66 2c 20 50 41 52 53 45 5f 54 41 49 4c 5f  Buf, PARSE_TAIL_
2310: 53 5a 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  SZ);.  pParse->n
2320: 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 23 69 66 20  ested--;.}..#if 
2330: 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
2340: 45 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a  ENTICATION./*.**
2350: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
2360: 7a 54 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61  zTable is the na
2370: 6d 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d  me of the system
2380: 20 74 61 62 6c 65 20 74 68 61 74 20 73 74 6f 72   table that stor
2390: 65 73 20 74 68 65 0a 2a 2a 20 6c 69 73 74 20 6f  es the.** list o
23a0: 66 20 75 73 65 72 73 20 61 6e 64 20 74 68 65 69  f users and thei
23b0: 72 20 61 63 63 65 73 73 20 63 72 65 64 65 6e 74  r access credent
23c0: 69 61 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ials..*/.int sql
23d0: 69 74 65 33 55 73 65 72 41 75 74 68 54 61 62 6c  ite3UserAuthTabl
23e0: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  e(const char *zT
23f0: 61 62 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  able){.  return 
2400: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
2410: 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f  zTable, "sqlite_
2420: 75 73 65 72 22 29 3d 3d 30 3b 0a 7d 0a 23 65 6e  user")==0;.}.#en
2430: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
2440: 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
2450: 65 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  ection was opene
2460: 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  d with the SQLIT
2470: 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 5f 53 43  E_OPEN_SHARED_SC
2480: 48 45 4d 41 0a 2a 2a 20 66 6c 61 67 20 73 70 65  HEMA.** flag spe
2490: 63 69 66 69 65 64 2c 20 74 68 65 6e 20 65 6e 73  cified, then ens
24a0: 75 72 65 20 74 68 61 74 20 74 68 65 20 64 61 74  ure that the dat
24b0: 61 62 61 73 65 20 73 63 68 65 6d 61 20 66 6f 72  abase schema for
24c0: 20 64 61 74 61 62 61 73 65 20 69 44 62 0a 2a 2a   database iDb.**
24d0: 20 69 73 20 6c 6f 61 64 65 64 2e 20 45 69 74 68   is loaded. Eith
24e0: 65 72 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  er by obtaining 
24f0: 61 20 53 63 68 65 6d 61 20 6f 62 6a 65 63 74 20  a Schema object 
2500: 66 72 6f 6d 20 74 68 65 20 73 63 68 65 6d 61 2d  from the schema-
2510: 70 6f 6f 6c 2c 20 6f 72 0a 2a 2a 20 62 79 20 72  pool, or.** by r
2520: 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  eading the conte
2530: 6e 74 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74  nts of the sqlit
2540: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a  e_master table..
2550: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
2560: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73  abase handle was
2570: 20 6e 6f 74 20 6f 70 65 6e 65 64 20 77 69 74 68   not opened with
2580: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
2590: 52 45 44 5f 53 43 48 45 4d 41 2c 20 6f 72 0a 2a  RED_SCHEMA, or.*
25a0: 2a 20 69 66 20 74 68 65 20 73 63 68 65 6d 61 20  * if the schema 
25b0: 66 6f 72 20 64 61 74 61 62 61 73 65 20 69 44 62  for database iDb
25c0: 20 69 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64   is already load
25d0: 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
25e0: 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
25f0: 0a 2a 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69 73 20  .** Non-zero is 
2600: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 73 63  returned if a sc
2610: 68 65 6d 61 20 69 73 20 6c 6f 61 64 65 64 2c 20  hema is loaded, 
2620: 6f 72 20 7a 65 72 6f 20 69 66 20 69 74 20 77 61  or zero if it wa
2630: 73 20 61 6c 72 65 61 64 79 20 0a 2a 2a 20 6c 6f  s already .** lo
2640: 61 64 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  aded when this f
2650: 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
2660: 65 64 2e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ed...*/.int sqli
2670: 74 65 33 53 63 68 65 6d 61 4c 6f 61 64 28 73 71  te3SchemaLoad(sq
2680: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
2690: 44 62 2c 20 69 6e 74 20 2a 70 62 55 6e 6c 6f 61  Db, int *pbUnloa
26a0: 64 2c 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 29  d, char **pzErr)
26b0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
26c0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 49 73  ITE_OK;.  if( Is
26d0: 52 65 75 73 65 53 63 68 65 6d 61 28 64 62 29 20  ReuseSchema(db) 
26e0: 0a 20 20 20 20 20 20 26 26 20 44 62 48 61 73 50  .      && DbHasP
26f0: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c  roperty(db, iDb,
2700: 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64   DB_SchemaLoaded
2710: 29 3d 3d 30 20 0a 20 20 20 20 20 20 26 26 20 28  )==0 .      && (
2720: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
2730: 20 7c 7c 20 28 69 44 62 21 3d 31 20 26 26 20 64   || (iDb!=1 && d
2740: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 29 29  b->init.iDb==1))
2750: 0a 20 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  .  ){.    struct
2760: 20 73 71 6c 69 74 65 33 49 6e 69 74 49 6e 66 6f   sqlite3InitInfo
2770: 20 73 76 20 3d 20 64 62 2d 3e 69 6e 69 74 3b 0a   sv = db->init;.
2780: 20 20 20 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e      memset(&db->
2790: 69 6e 69 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  init, 0, sizeof(
27a0: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 49 6e  struct sqlite3In
27b0: 69 74 49 6e 66 6f 29 29 3b 0a 20 20 20 20 72 63  itInfo));.    rc
27c0: 20 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 4f 6e   = sqlite3InitOn
27d0: 65 28 64 62 2c 20 69 44 62 2c 20 70 7a 45 72 72  e(db, iDb, pzErr
27e0: 2c 20 30 29 3b 0a 20 20 20 20 64 62 2d 3e 69 6e  , 0);.    db->in
27f0: 69 74 20 3d 20 73 76 3b 0a 20 20 20 20 69 66 28  it = sv;.    if(
2800: 20 70 62 55 6e 6c 6f 61 64 20 29 20 2a 70 62 55   pbUnload ) *pbU
2810: 6e 6c 6f 61 64 20 3d 20 28 72 63 3d 3d 53 51 4c  nload = (rc==SQL
2820: 49 54 45 5f 4f 4b 20 26 26 20 28 69 44 62 21 3d  ITE_OK && (iDb!=
2830: 31 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  1));.  }.  retur
2840: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
2850: 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ocate the in-mem
2860: 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68  ory structure th
2870: 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70  at describes a p
2880: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
2890: 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65  se.** table give
28a0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
28b0: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
28c0: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
28d0: 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  me of the.** dat
28e0: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
28f0: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
2900: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
2910: 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  found..**.** If 
2920: 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20  zDatabase is 0, 
2930: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72  all databases ar
2940: 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
2950: 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  he table and the
2960: 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69  .** first matchi
2970: 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75  ng table is retu
2980: 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b  rned.  (No check
2990: 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ing for duplicat
29a0: 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73  e table.** names
29b0: 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20   is done.)  The 
29c0: 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 20  search order is 
29d0: 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e  TEMP first, then
29e0: 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a   MAIN, then any.
29f0: 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ** auxiliary dat
2a00: 61 62 61 73 65 73 20 61 64 64 65 64 20 75 73 69  abases added usi
2a10: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
2a20: 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  mmand..**.** See
2a30: 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63   also sqlite3Loc
2a40: 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54  ateTable()..*/.T
2a50: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e  able *sqlite3Fin
2a60: 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a  dTable(sqlite3 *
2a70: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
2a80: 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  zName, const cha
2a90: 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20  r *zDatabase){. 
2aa0: 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20   Table *p = 0;. 
2ab0: 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41 6c   int i;..  /* Al
2ac0: 6c 20 6d 75 74 65 78 65 73 20 61 72 65 20 72 65  l mutexes are re
2ad0: 71 75 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d  quired for schem
2ae0: 61 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20  a access.  Make 
2af0: 73 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65  sure we hold the
2b00: 6d 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  m. */.  assert( 
2b10: 7a 44 61 74 61 62 61 73 65 21 3d 30 20 7c 7c 20  zDatabase!=0 || 
2b20: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2b30: 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20  sAllMutexes(db) 
2b40: 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53  );.#if SQLITE_US
2b50: 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ER_AUTHENTICATIO
2b60: 4e 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20  N.  /* Only the 
2b70: 61 64 6d 69 6e 20 75 73 65 72 20 69 73 20 61 6c  admin user is al
2b80: 6c 6f 77 65 64 20 74 6f 20 6b 6e 6f 77 20 74 68  lowed to know th
2b90: 61 74 20 74 68 65 20 73 71 6c 69 74 65 5f 75 73  at the sqlite_us
2ba0: 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 65 78  er table.  ** ex
2bb0: 69 73 74 73 20 2a 2f 0a 20 20 69 66 28 20 64 62  ists */.  if( db
2bc0: 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c  ->auth.authLevel
2bd0: 3c 55 41 55 54 48 5f 41 64 6d 69 6e 20 26 26 20  <UAUTH_Admin && 
2be0: 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54  sqlite3UserAuthT
2bf0: 61 62 6c 65 28 7a 4e 61 6d 65 29 21 3d 30 20 29  able(zName)!=0 )
2c00: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
2c10: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68 69    }.#endif.  whi
2c20: 6c 65 28 31 29 7b 0a 20 20 20 20 66 6f 72 28 69  le(1){.    for(i
2c30: 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c  =OMIT_TEMPDB; i<
2c40: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
2c50: 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c       int j = (i<
2c60: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20  2) ? i^1 : i;   
2c70: 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62  /* Search TEMP b
2c80: 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20  efore MAIN */.  
2c90: 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61 73      if( zDatabas
2ca0: 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53  e==0 || sqlite3S
2cb0: 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65  trICmp(zDatabase
2cc0: 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62  , db->aDb[j].zDb
2cd0: 53 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  SName)==0 ){.   
2ce0: 20 20 20 20 20 69 6e 74 20 62 55 6e 6c 6f 61 64       int bUnload
2cf0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 73   = 0;.        as
2d00: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
2d10: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
2d20: 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20   j, 0) );.      
2d30: 20 20 69 66 28 20 49 73 52 65 75 73 65 53 63 68    if( IsReuseSch
2d40: 65 6d 61 28 64 62 29 20 29 7b 0a 20 20 20 20 20  ema(db) ){.     
2d50: 20 20 20 20 20 50 61 72 73 65 20 2a 70 50 61 72       Parse *pPar
2d60: 73 65 20 3d 20 64 62 2d 3e 70 50 61 72 73 65 3b  se = db->pParse;
2d70: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2d80: 50 61 72 73 65 20 26 26 20 70 50 61 72 73 65 2d  Parse && pParse-
2d90: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
2da0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
2db0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  rc = sqlite3Sche
2dc0: 6d 61 4c 6f 61 64 28 64 62 2c 20 6a 2c 20 26 62  maLoad(db, j, &b
2dd0: 55 6e 6c 6f 61 64 2c 20 26 70 50 61 72 73 65 2d  Unload, &pParse-
2de0: 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  >zErrMsg);.     
2df0: 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73         if( pPars
2e00: 65 2d 3e 72 63 20 29 20 70 50 61 72 73 65 2d 3e  e->rc ) pParse->
2e10: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
2e20: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2e30: 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65        p = sqlite
2e40: 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
2e50: 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74  Db[j].pSchema->t
2e60: 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a  blHash, zName);.
2e70: 20 20 20 20 20 20 20 20 69 66 28 20 70 20 29 20          if( p ) 
2e80: 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20 20 20  return p;.      
2e90: 20 20 69 66 28 20 62 55 6e 6c 6f 61 64 20 29 7b    if( bUnload ){
2ea0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2eb0: 65 33 53 63 68 65 6d 61 52 65 6c 65 61 73 65 28  e3SchemaRelease(
2ec0: 64 62 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20 20  db, j);.        
2ed0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2ee0: 20 20 20 20 2f 2a 20 4e 6f 74 20 66 6f 75 6e 64      /* Not found
2ef0: 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20 77  .  If the name w
2f00: 65 20 77 65 72 65 20 6c 6f 6f 6b 69 6e 67 20 66  e were looking f
2f10: 6f 72 20 77 61 73 20 74 65 6d 70 2e 73 71 6c 69  or was temp.sqli
2f20: 74 65 5f 6d 61 73 74 65 72 0a 20 20 20 20 2a 2a  te_master.    **
2f30: 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65   then change the
2f40: 20 6e 61 6d 65 20 74 6f 20 73 71 6c 69 74 65 5f   name to sqlite_
2f50: 74 65 6d 70 5f 6d 61 73 74 65 72 20 61 6e 64 20  temp_master and 
2f60: 74 72 79 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20  try again. */.  
2f70: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
2f80: 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 4d 41 53 54  ICmp(zName, MAST
2f90: 45 52 5f 4e 41 4d 45 29 21 3d 30 20 29 20 62 72  ER_NAME)!=0 ) br
2fa0: 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  eak;.    if( sql
2fb0: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 44 61  ite3_stricmp(zDa
2fc0: 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62 5b  tabase, db->aDb[
2fd0: 31 5d 2e 7a 44 62 53 4e 61 6d 65 29 21 3d 30 20  1].zDbSName)!=0 
2fe0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7a 4e 61  ) break;.    zNa
2ff0: 6d 65 20 3d 20 54 45 4d 50 5f 4d 41 53 54 45 52  me = TEMP_MASTER
3000: 5f 4e 41 4d 45 3b 0a 20 20 7d 0a 20 20 72 65 74  _NAME;.  }.  ret
3010: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
3020: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
3030: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
3040: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20  hat describes a 
3050: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
3060: 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76  ase.** table giv
3070: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  en the name of t
3080: 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f  hat table and (o
3090: 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e  ptionally) the n
30a0: 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ame of the.** da
30b0: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
30c0: 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  g the table.  Re
30d0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
30e0: 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c 65   found.  Also le
30f0: 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20  ave an.** error 
3100: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
3110: 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a  e->zErrMsg..**.*
3120: 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
3130: 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f   between this ro
3140: 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74 65  utine and sqlite
3150: 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73 20  3FindTable() is 
3160: 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f 75  that this.** rou
3170: 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20 65  tine leaves an e
3180: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
3190: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20  pParse->zErrMsg 
31a0: 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65 33  where.** sqlite3
31b0: 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65 73  FindTable() does
31c0: 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a   not..*/.Table *
31d0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
31e0: 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
31f0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
3200: 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69 63 68  context in which
3210: 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f 72   to report error
3220: 73 20 2a 2f 0a 20 20 75 33 32 20 66 6c 61 67 73  s */.  u32 flags
3230: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
3240: 20 4c 4f 43 41 54 45 5f 56 49 45 57 20 6f 72 20   LOCATE_VIEW or 
3250: 4c 4f 43 41 54 45 5f 4e 4f 45 52 52 20 2a 2f 0a  LOCATE_NOERR */.
3260: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
3270: 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame,     /* Name
3280: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65   of the table we
3290: 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72   are looking for
32a0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
32b0: 20 2a 7a 44 62 61 73 65 20 20 20 20 20 2f 2a 20   *zDbase     /* 
32c0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
32d0: 62 61 73 65 2e 20 20 4d 69 67 68 74 20 62 65 20  base.  Might be 
32e0: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  NULL */.){.  Tab
32f0: 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33  le *p;.  sqlite3
3300: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
3310: 62 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  b;..  /* Read th
3320: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
3330: 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  a. If an error o
3340: 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20  ccurs, leave an 
3350: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20  error message.  
3360: 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70  ** and code in p
3370: 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
3380: 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20   NULL. */.  if( 
3390: 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 20  (db->mDbFlags & 
33a0: 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 4b 6e 6f  DBFLAG_SchemaKno
33b0: 77 6e 4f 6b 29 3d 3d 30 20 0a 20 20 20 26 26 20  wnOk)==0 .   && 
33c0: 21 49 73 52 65 75 73 65 53 63 68 65 6d 61 28 64  !IsReuseSchema(d
33d0: 62 29 0a 20 20 20 26 26 20 53 51 4c 49 54 45 5f  b).   && SQLITE_
33e0: 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
33f0: 63 68 65 6d 61 28 70 50 61 72 73 65 29 0a 20 20  chema(pParse).  
3400: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
3410: 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69  .  }..  p = sqli
3420: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
3430: 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b   zName, zDbase);
3440: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 23  .  if( p==0 ){.#
3450: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3460: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
3470: 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20      /* If zName 
3480: 69 73 20 74 68 65 20 6e 6f 74 20 74 68 65 20 6e  is the not the n
3490: 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 69  ame of a table i
34a0: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 63 72 65  n the schema cre
34b0: 61 74 65 64 20 75 73 69 6e 67 0a 20 20 20 20 2a  ated using.    *
34c0: 2a 20 43 52 45 41 54 45 2c 20 74 68 65 6e 20 63  * CREATE, then c
34d0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
34e0: 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  t is the name of
34f0: 20 61 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c   an virtual tabl
3500: 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 61  e that.    ** ca
3510: 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79 6d 6f 75  n be an eponymou
3520: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  s virtual table.
3530: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 72   */.    if( pPar
3540: 73 65 2d 3e 64 69 73 61 62 6c 65 56 74 61 62 3d  se->disableVtab=
3550: 3d 30 20 29 7b 0a 20 20 20 20 20 20 4d 6f 64 75  =0 ){.      Modu
3560: 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75  le *pMod = (Modu
3570: 6c 65 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46  le*)sqlite3HashF
3580: 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65  ind(&db->aModule
3590: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
35a0: 69 66 28 20 70 4d 6f 64 3d 3d 30 20 26 26 20 73  if( pMod==0 && s
35b0: 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
35c0: 7a 4e 61 6d 65 2c 20 22 70 72 61 67 6d 61 5f 22  zName, "pragma_"
35d0: 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 7)==0 ){.     
35e0: 20 20 20 70 4d 6f 64 20 3d 20 73 71 6c 69 74 65     pMod = sqlite
35f0: 33 50 72 61 67 6d 61 56 74 61 62 52 65 67 69 73  3PragmaVtabRegis
3600: 74 65 72 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ter(db, zName);.
3610: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
3620: 28 20 70 4d 6f 64 20 29 7b 0a 20 20 20 20 20 20  ( pMod ){.      
3630: 20 20 69 66 28 20 49 73 52 65 75 73 65 53 63 68    if( IsReuseSch
3640: 65 6d 61 28 64 62 29 20 26 26 20 70 50 61 72 73  ema(db) && pPars
3650: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
3660: 20 20 20 20 20 20 20 20 69 6e 74 20 62 44 75 6d          int bDum
3670: 6d 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  my = 0;.        
3680: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 73    pParse->rc = s
3690: 71 6c 69 74 65 33 53 63 68 65 6d 61 4c 6f 61 64  qlite3SchemaLoad
36a0: 28 64 62 2c 20 30 2c 20 26 62 44 75 6d 6d 79 2c  (db, 0, &bDummy,
36b0: 20 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73   &pParse->zErrMs
36c0: 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  g);.          if
36d0: 28 20 70 50 61 72 73 65 2d 3e 72 63 20 29 20 70  ( pParse->rc ) p
36e0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
36f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3700: 20 69 66 28 20 73 71 6c 69 74 65 33 56 74 61 62   if( sqlite3Vtab
3710: 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 49 6e  EponymousTableIn
3720: 69 74 28 70 50 61 72 73 65 2c 20 70 4d 6f 64 29  it(pParse, pMod)
3730: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61   ){.          Ta
3740: 62 6c 65 20 2a 70 45 70 6f 54 61 62 20 3d 20 70  ble *pEpoTab = p
3750: 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 3b 0a 20 20  Mod->pEpoTab;.  
3760: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
3770: 49 73 52 65 75 73 65 53 63 68 65 6d 61 28 64 62  IsReuseSchema(db
3780: 29 20 7c 7c 20 70 45 70 6f 54 61 62 2d 3e 70 53  ) || pEpoTab->pS
3790: 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 30  chema==db->aDb[0
37a0: 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ].pSchema );.   
37b0: 20 20 20 20 20 20 20 70 45 70 6f 54 61 62 2d 3e         pEpoTab->
37c0: 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  pSchema = db->aD
37d0: 62 5b 30 5d 2e 70 53 63 68 65 6d 61 3b 20 20 2f  b[0].pSchema;  /
37e0: 2a 20 46 6f 72 20 53 48 41 52 45 44 5f 53 43 48  * For SHARED_SCH
37f0: 45 4d 41 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20  EMA mode */.    
3800: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45 70        return pEp
3810: 6f 54 61 62 3b 0a 20 20 20 20 20 20 20 20 7d 0a  oTab;.        }.
3820: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
3830: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 66 6c 61  ndif.    if( fla
3840: 67 73 20 26 20 4c 4f 43 41 54 45 5f 4e 4f 45 52  gs & LOCATE_NOER
3850: 52 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  R ) return 0;.  
3860: 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
3870: 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 65 6c  chema = 1;.  }el
3880: 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  se if( IsVirtual
3890: 28 70 29 20 26 26 20 70 50 61 72 73 65 2d 3e 64  (p) && pParse->d
38a0: 69 73 61 62 6c 65 56 74 61 62 20 29 7b 0a 20 20  isableVtab ){.  
38b0: 20 20 70 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20    p = 0;.  }..  
38c0: 69 66 28 20 70 3d 3d 30 20 26 26 20 70 50 61 72  if( p==0 && pPar
38d0: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
38e0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
38f0: 4d 73 67 20 3d 20 66 6c 61 67 73 20 26 20 4c 4f  Msg = flags & LO
3900: 43 41 54 45 5f 56 49 45 57 20 3f 20 22 6e 6f 20  CATE_VIEW ? "no 
3910: 73 75 63 68 20 76 69 65 77 22 20 3a 20 22 6e 6f  such view" : "no
3920: 20 73 75 63 68 20 74 61 62 6c 65 22 3b 0a 20 20   such table";.  
3930: 20 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b 0a    if( zDbase ){.
3940: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
3950: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
3960: 73 3a 20 25 73 2e 25 73 22 2c 20 7a 4d 73 67 2c  s: %s.%s", zMsg,
3970: 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b   zDbase, zName);
3980: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3990: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
39a0: 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25  g(pParse, "%s: %
39b0: 73 22 2c 20 7a 4d 73 67 2c 20 7a 4e 61 6d 65 29  s", zMsg, zName)
39c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
39d0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
39e0: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62  * Locate the tab
39f0: 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  le identified by
3a00: 20 2a 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   *p..**.** This 
3a10: 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f  is a wrapper aro
3a20: 75 6e 64 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  und sqlite3Locat
3a30: 65 54 61 62 6c 65 28 29 2e 20 54 68 65 20 64 69  eTable(). The di
3a40: 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
3a50: 0a 2a 2a 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  .** sqlite3Locat
3a60: 65 54 61 62 6c 65 28 29 20 61 6e 64 20 74 68 69  eTable() and thi
3a70: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68  s function is th
3a80: 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  at this function
3a90: 20 72 65 73 74 72 69 63 74 73 0a 2a 2a 20 74 68   restricts.** th
3aa0: 65 20 73 65 61 72 63 68 20 74 6f 20 73 63 68 65  e search to sche
3ab0: 6d 61 20 28 70 2d 3e 70 53 63 68 65 6d 61 29 20  ma (p->pSchema) 
3ac0: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c  if it is not NUL
3ad0: 4c 2e 20 70 2d 3e 70 53 63 68 65 6d 61 20 6d 61  L. p->pSchema ma
3ae0: 79 20 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c  y be.** non-NULL
3af0: 20 69 66 20 69 74 20 69 73 20 70 61 72 74 20 6f   if it is part o
3b00: 66 20 61 20 76 69 65 77 20 6f 72 20 74 72 69 67  f a view or trig
3b10: 67 65 72 20 70 72 6f 67 72 61 6d 20 64 65 66 69  ger program defi
3b20: 6e 69 74 69 6f 6e 2e 20 53 65 65 0a 2a 2a 20 73  nition. See.** s
3b30: 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74  qlite3FixSrcList
3b40: 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  () for details..
3b50: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
3b60: 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d  3LocateTableItem
3b70: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
3b80: 65 2c 20 0a 20 20 75 33 32 20 66 6c 61 67 73 2c  e, .  u32 flags,
3b90: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
3ba0: 74 5f 69 74 65 6d 20 2a 70 0a 29 7b 0a 20 20 63  t_item *p.){.  c
3bb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a  onst char *zDb;.
3bc0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 63    assert( p->pSc
3bd0: 68 65 6d 61 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44  hema==0 || p->zD
3be0: 61 74 61 62 61 73 65 3d 3d 30 20 29 3b 0a 20 20  atabase==0 );.  
3bf0: 69 66 28 20 70 2d 3e 70 53 63 68 65 6d 61 20 29  if( p->pSchema )
3c00: 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20  {.    int iDb = 
3c10: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
3c20: 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
3c30: 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20   p->pSchema);.  
3c40: 20 20 7a 44 62 20 3d 20 70 50 61 72 73 65 2d 3e    zDb = pParse->
3c50: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
3c60: 53 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  SName;.  }else{.
3c70: 20 20 20 20 7a 44 62 20 3d 20 70 2d 3e 7a 44 61      zDb = p->zDa
3c80: 74 61 62 61 73 65 3b 0a 20 20 7d 0a 20 20 72 65  tabase;.  }.  re
3c90: 74 75 72 6e 20 73 71 6c 69 74 65 33 4c 6f 63 61  turn sqlite3Loca
3ca0: 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
3cb0: 66 6c 61 67 73 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  flags, p->zName,
3cc0: 20 7a 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   zDb);.}../*.** 
3cd0: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
3ce0: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
3cf0: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a  hat describes .*
3d00: 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69  * a particular i
3d10: 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e  ndex given the n
3d20: 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65  ame of that inde
3d30: 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d  x.** and the nam
3d40: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
3d50: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
3d60: 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65  the index..** Re
3d70: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
3d80: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   found..**.** If
3d90: 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c   zDatabase is 0,
3da0: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61   all databases a
3db0: 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  re searched for 
3dc0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64  the.** table and
3dd0: 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
3de0: 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65 74  ing index is ret
3df0: 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63  urned.  (No chec
3e00: 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c  king.** for dupl
3e10: 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65  icate index name
3e20: 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65  s is done.)  The
3e30: 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73   search order is
3e40: 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20  .** TEMP first, 
3e50: 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20  then MAIN, then 
3e60: 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64 61  any auxiliary da
3e70: 74 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a  tabases added.**
3e80: 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43   using the ATTAC
3e90: 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e  H command..*/.In
3ea0: 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  dex *sqlite3Find
3eb0: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64  Index(sqlite3 *d
3ec0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
3ed0: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
3ee0: 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20   *zDb){.  Index 
3ef0: 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  *p = 0;.  int i;
3f00: 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65 78 65  .  /* All mutexe
3f10: 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20 66  s are required f
3f20: 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65 73 73  or schema access
3f30: 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  .  Make sure we 
3f40: 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a 20 20  hold them. */.  
3f50: 61 73 73 65 72 74 28 20 7a 44 62 21 3d 30 20 7c  assert( zDb!=0 |
3f60: 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  | sqlite3BtreeHo
3f70: 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62  ldsAllMutexes(db
3f80: 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49  ) );.  for(i=OMI
3f90: 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e  T_TEMPDB; i<db->
3fa0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
3fb0: 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69  nt j = (i<2) ? i
3fc0: 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72  ^1 : i;  /* Sear
3fd0: 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d  ch TEMP before M
3fe0: 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d  AIN */.    Schem
3ff0: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  a *pSchema = db-
4000: 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b  >aDb[j].pSchema;
4010: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 63  .    assert( pSc
4020: 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20  hema );.    if( 
4030: 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33 53 74  zDb && sqlite3St
4040: 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61  rICmp(zDb, db->a
4050: 44 62 5b 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29 20  Db[j].zDbSName) 
4060: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
4070: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
4080: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
4090: 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20  b, j, 0) );.    
40a0: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  p = sqlite3HashF
40b0: 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64  ind(&pSchema->id
40c0: 78 48 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20  xHash, zName);. 
40d0: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
40e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
40f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61  ;.}../*.** Recla
4100: 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73  im the memory us
4110: 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a  ed by an index.*
4120: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 72  /.void sqlite3Fr
4130: 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  eeIndex(sqlite3 
4140: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a  *db, Index *p){.
4150: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4160: 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71  MIT_ANALYZE.  sq
4170: 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78  lite3DeleteIndex
4180: 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a  Samples(db, p);.
4190: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
41a0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
41b0: 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 29  ->pPartIdxWhere)
41c0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
41d0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
41e0: 3e 61 43 6f 6c 45 78 70 72 29 3b 0a 20 20 73 71  >aColExpr);.  sq
41f0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4200: 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 69  p->zColAff);.  i
4210: 66 28 20 70 2d 3e 69 73 52 65 73 69 7a 65 64 20  f( p->isResized 
4220: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
4230: 64 62 2c 20 28 76 6f 69 64 20 2a 29 70 2d 3e 61  db, (void *)p->a
4240: 7a 43 6f 6c 6c 29 3b 0a 23 69 66 64 65 66 20 53  zColl);.#ifdef S
4250: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
4260: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 73 71  T3_OR_STAT4.  sq
4270: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 69  lite3_free(p->ai
4280: 52 6f 77 45 73 74 29 3b 0a 23 65 6e 64 69 66 0a  RowEst);.#endif.
4290: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
42a0: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
42b0: 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63   For the index c
42c0: 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77  alled zIdxName w
42d0: 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e  hich is found in
42e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 44   the database iD
42f0: 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61  b,.** unlike tha
4300: 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73  t index from its
4310: 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f   Table then remo
4320: 76 65 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f  ve the index fro
4330: 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68  m.** the index h
4340: 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72  ash table and fr
4350: 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74  ee all memory st
4360: 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61  ructures associa
4370: 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ted.** with the 
4380: 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73  index..*/.void s
4390: 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
43a0: 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74  eleteIndex(sqlit
43b0: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
43c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
43d0: 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20  xName){.  Index 
43e0: 2a 70 49 6e 64 65 78 3b 0a 20 20 48 61 73 68 20  *pIndex;.  Hash 
43f0: 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73 73 65 72  *pHash;..  asser
4400: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
4410: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
4420: 62 2c 20 30 29 20 29 3b 0a 20 20 70 48 61 73 68  b, 0) );.  pHash
4430: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
4440: 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  .pSchema->idxHas
4450: 68 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  h;.  pIndex = sq
4460: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
4470: 70 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c  pHash, zIdxName,
4480: 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59   0);.  if( ALWAY
4490: 53 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20  S(pIndex) ){.   
44a0: 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61   if( pIndex->pTa
44b0: 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e  ble->pIndex==pIn
44c0: 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  dex ){.      pIn
44d0: 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e  dex->pTable->pIn
44e0: 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  dex = pIndex->pN
44f0: 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
4500: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a        Index *p;.
4510: 20 20 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69        /* Justifi
4520: 63 61 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53  cation of ALWAYS
4530: 28 29 3b 20 20 54 68 65 20 69 6e 64 65 78 20 6d  ();  The index m
4540: 75 73 74 20 62 65 20 6f 6e 20 74 68 65 20 6c 69  ust be on the li
4550: 73 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 69  st of.      ** i
4560: 6e 64 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20 20  ndices. */.     
4570: 20 70 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61   p = pIndex->pTa
4580: 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  ble->pIndex;.   
4590: 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
45a0: 28 70 29 20 26 26 20 70 2d 3e 70 4e 65 78 74 21  (p) && p->pNext!
45b0: 3d 70 49 6e 64 65 78 20 29 7b 20 70 20 3d 20 70  =pIndex ){ p = p
45c0: 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 20  ->pNext; }.     
45d0: 20 69 66 28 20 41 4c 57 41 59 53 28 70 20 26 26   if( ALWAYS(p &&
45e0: 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65   p->pNext==pInde
45f0: 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  x) ){.        p-
4600: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d  >pNext = pIndex-
4610: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
4620: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
4630: 33 46 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70  3FreeIndex(db, p
4640: 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62  Index);.  }.  db
4650: 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42  ->mDbFlags |= DB
4660: 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67  FLAG_SchemaChang
4670: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b  e;.}../*.** Look
4680: 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 69 73   through the lis
4690: 74 20 6f 66 20 6f 70 65 6e 20 64 61 74 61 62 61  t of open databa
46a0: 73 65 20 66 69 6c 65 73 20 69 6e 20 64 62 2d 3e  se files in db->
46b0: 61 44 62 5b 5d 20 61 6e 64 20 69 66 0a 2a 2a 20  aDb[] and if.** 
46c0: 61 6e 79 20 68 61 76 65 20 62 65 65 6e 20 63 6c  any have been cl
46d0: 6f 73 65 64 2c 20 72 65 6d 6f 76 65 20 74 68 65  osed, remove the
46e0: 6d 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 2e  m from the list.
46f0: 20 20 52 65 61 6c 6c 6f 63 61 74 65 20 74 68 65    Reallocate the
4700: 0a 2a 2a 20 64 62 2d 3e 61 44 62 5b 5d 20 73 74  .** db->aDb[] st
4710: 72 75 63 74 75 72 65 20 74 6f 20 61 20 73 6d 61  ructure to a sma
4720: 6c 6c 65 72 20 73 69 7a 65 2c 20 69 66 20 70 6f  ller size, if po
4730: 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45 6e  ssible..**.** En
4740: 74 72 79 20 30 20 28 74 68 65 20 22 6d 61 69 6e  try 0 (the "main
4750: 22 20 64 61 74 61 62 61 73 65 29 20 61 6e 64 20  " database) and 
4760: 65 6e 74 72 79 20 31 20 28 74 68 65 20 22 74 65  entry 1 (the "te
4770: 6d 70 22 20 64 61 74 61 62 61 73 65 29 0a 2a 2a  mp" database).**
4780: 20 61 72 65 20 6e 65 76 65 72 20 63 61 6e 64 69   are never candi
4790: 64 61 74 65 73 20 66 6f 72 20 62 65 69 6e 67 20  dates for being 
47a0: 63 6f 6c 6c 61 70 73 65 64 2e 0a 2a 2f 0a 76 6f  collapsed..*/.vo
47b0: 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70  id sqlite3Collap
47c0: 73 65 44 61 74 61 62 61 73 65 41 72 72 61 79 28  seDatabaseArray(
47d0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
47e0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28  int i, j;.  for(
47f0: 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62  i=j=2; i<db->nDb
4800: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
4810: 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  ct Db *pDb = &db
4820: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
4830: 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b  ( pDb->pBt==0 ){
4840: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
4850: 46 72 65 65 28 64 62 2c 20 70 44 62 2d 3e 7a 44  Free(db, pDb->zD
4860: 62 53 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  bSName);.      p
4870: 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 20 3d 20 30  Db->zDbSName = 0
4880: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
4890: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
48a0: 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  j<i ){.      db-
48b0: 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44  >aDb[j] = db->aD
48c0: 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  b[i];.    }.    
48d0: 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e  j++;.  }.  db->n
48e0: 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62  Db = j;.  if( db
48f0: 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e  ->nDb<=2 && db->
4900: 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61 74  aDb!=db->aDbStat
4910: 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  ic ){.    memcpy
4920: 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c 20  (db->aDbStatic, 
4930: 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f  db->aDb, 2*sizeo
4940: 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a  f(db->aDb[0]));.
4950: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4960: 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 29 3b 0a  e(db, db->aDb);.
4970: 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62      db->aDb = db
4980: 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20 7d  ->aDbStatic;.  }
4990: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20  .}../*.** Reset 
49a0: 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74  the schema for t
49b0: 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20 69  he database at i
49c0: 6e 64 65 78 20 69 44 62 2e 20 20 41 6c 73 6f 20  ndex iDb.  Also 
49d0: 72 65 73 65 74 20 74 68 65 0a 2a 2a 20 54 45 4d  reset the.** TEM
49e0: 50 20 73 63 68 65 6d 61 2e 20 20 54 68 65 20 72  P schema.  The r
49f0: 65 73 65 74 20 69 73 20 64 65 66 65 72 72 65 64  eset is deferred
4a00: 20 69 66 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c   if db->nSchemaL
4a10: 6f 63 6b 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2e  ock is not zero.
4a20: 0a 2a 2a 20 44 65 66 65 72 72 65 64 20 72 65 73  .** Deferred res
4a30: 65 74 73 20 6d 61 79 20 62 65 20 72 75 6e 20 62  ets may be run b
4a40: 79 20 63 61 6c 6c 69 6e 67 20 77 69 74 68 20 69  y calling with i
4a50: 44 62 3c 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  Db<0..*/.void sq
4a60: 6c 69 74 65 33 52 65 73 65 74 4f 6e 65 53 63 68  lite3ResetOneSch
4a70: 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ema(sqlite3 *db,
4a80: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e 74   int iDb){.  int
4a90: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44   i;.  assert( iD
4aa0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20  b<db->nDb );..  
4ab0: 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20  if( iDb>=0 ){.  
4ac0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
4ad0: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
4ae0: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
4af0: 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72 74      DbSetPropert
4b00: 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 52 65  y(db, iDb, DB_Re
4b10: 73 65 74 57 61 6e 74 65 64 29 3b 0a 20 20 20 20  setWanted);.    
4b20: 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 64 62  DbSetProperty(db
4b30: 2c 20 31 2c 20 44 42 5f 52 65 73 65 74 57 61 6e  , 1, DB_ResetWan
4b40: 74 65 64 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 44  ted);.    db->mD
4b50: 62 46 6c 61 67 73 20 26 3d 20 7e 44 42 46 4c 41  bFlags &= ~DBFLA
4b60: 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 3b  G_SchemaKnownOk;
4b70: 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6e  .  }.  if( db->n
4b80: 53 63 68 65 6d 61 4c 6f 63 6b 3d 3d 30 20 29 7b  SchemaLock==0 ){
4b90: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4ba0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
4bb0: 20 20 20 20 20 69 66 28 20 44 62 48 61 73 50 72       if( DbHasPr
4bc0: 6f 70 65 72 74 79 28 64 62 2c 20 69 2c 20 44 42  operty(db, i, DB
4bd0: 5f 52 65 73 65 74 57 61 6e 74 65 64 29 20 29 7b  _ResetWanted) ){
4be0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4bf0: 53 63 68 65 6d 61 43 6c 65 61 72 4f 72 44 69 73  SchemaClearOrDis
4c00: 63 6f 6e 6e 65 63 74 28 64 62 2c 20 69 29 3b 0a  connect(db, i);.
4c10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4c20: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  }.}../*.** Erase
4c30: 20 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f   all schema info
4c40: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 6c 6c  rmation from all
4c50: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
4c60: 73 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 0a 2a  ses (including.*
4c70: 2a 20 22 6d 61 69 6e 22 20 61 6e 64 20 22 74 65  * "main" and "te
4c80: 6d 70 22 29 20 66 6f 72 20 61 20 73 69 6e 67 6c  mp") for a singl
4c90: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
4ca0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
4cb0: 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63  qlite3ResetAllSc
4cc0: 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f  hemasOfConnectio
4cd0: 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  n(sqlite3 *db){.
4ce0: 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
4cf0: 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
4d00: 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  db);.  for(i=0; 
4d10: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 3d 28 69 3f  i<db->nDb; i=(i?
4d20: 69 2b 31 3a 32 29 29 7b 0a 20 20 20 20 44 62 20  i+1:2)){.    Db 
4d30: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
4d40: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  i];.    if( pDb-
4d50: 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
4d60: 20 20 69 66 28 20 64 62 2d 3e 6e 53 63 68 65 6d    if( db->nSchem
4d70: 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  aLock==0 ){.    
4d80: 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d      sqlite3Schem
4d90: 61 43 6c 65 61 72 4f 72 44 69 73 63 6f 6e 6e 65  aClearOrDisconne
4da0: 63 74 28 64 62 2c 20 69 29 3b 0a 20 20 20 20 20  ct(db, i);.     
4db0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4dc0: 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 64 62  DbSetProperty(db
4dd0: 2c 20 69 2c 20 44 42 5f 52 65 73 65 74 57 61 6e  , i, DB_ResetWan
4de0: 74 65 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ted);.      }.  
4df0: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
4e00: 33 53 63 68 65 6d 61 43 6c 65 61 72 28 64 62 2d  3SchemaClear(db-
4e10: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29  >aDb[1].pSchema)
4e20: 3b 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73  ;.  db->mDbFlags
4e30: 20 26 3d 20 7e 28 44 42 46 4c 41 47 5f 53 63 68   &= ~(DBFLAG_Sch
4e40: 65 6d 61 43 68 61 6e 67 65 7c 44 42 46 4c 41 47  emaChange|DBFLAG
4e50: 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 29 3b  _SchemaKnownOk);
4e60: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e  .  sqlite3VtabUn
4e70: 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20 20  lockList(db);.  
4e80: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
4e90: 65 41 6c 6c 28 64 62 29 3b 0a 20 20 69 66 28 20  eAll(db);.  if( 
4ea0: 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 3d  db->nSchemaLock=
4eb0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
4ec0: 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73  3CollapseDatabas
4ed0: 65 41 72 72 61 79 28 64 62 29 3b 0a 20 20 7d 0a  eArray(db);.  }.
4ee0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
4ef0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
4f00: 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63  when a commit oc
4f10: 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  curs..*/.void sq
4f20: 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72  lite3CommitInter
4f30: 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74  nalChanges(sqlit
4f40: 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 6d  e3 *db){.  db->m
4f50: 44 62 46 6c 61 67 73 20 26 3d 20 7e 44 42 46 4c  DbFlags &= ~DBFL
4f60: 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b  AG_SchemaChange;
4f70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
4f80: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65   memory allocate
4f90: 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  d for the column
4fa0: 20 6e 61 6d 65 73 20 6f 66 20 61 20 74 61 62 6c   names of a tabl
4fb0: 65 20 6f 72 20 76 69 65 77 20 28 74 68 65 0a 2a  e or view (the.*
4fc0: 2a 20 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20 61  * Table.aCol[] a
4fd0: 72 72 61 79 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rray)..*/.void s
4fe0: 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75  qlite3DeleteColu
4ff0: 6d 6e 4e 61 6d 65 73 28 73 71 6c 69 74 65 33 20  mnNames(sqlite3 
5000: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  *db, Table *pTab
5010: 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  le){.  int i;.  
5020: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
5030: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d  assert( pTable!=
5040: 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c  0 );.  if( (pCol
5050: 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29   = pTable->aCol)
5060: 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  !=0 ){.    for(i
5070: 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43  =0; i<pTable->nC
5080: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
5090: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
50a0: 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  bFree(db, pCol->
50b0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  zName);.      sq
50c0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
50d0: 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29  db, pCol->pDflt)
50e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
50f0: 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  bFree(db, pCol->
5100: 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  zColl);.    }.  
5110: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5120: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  db, pTable->aCol
5130: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
5140: 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72  Remove the memor
5150: 79 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  y data structure
5160: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
5170: 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54  h the given.** T
5180: 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65  able.  No change
5190: 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69  s are made to di
51a0: 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  sk by this routi
51b0: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ne..**.** This r
51c0: 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65  outine just dele
51d0: 74 65 73 20 74 68 65 20 64 61 74 61 20 73 74 72  tes the data str
51e0: 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73  ucture.  It does
51f0: 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74   not unlink.** t
5200: 68 65 20 74 61 62 6c 65 20 64 61 74 61 20 73 74  he table data st
5210: 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
5220: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75   hash table.  Bu
5230: 74 20 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f  t it does destro
5240: 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75  y.** memory stru
5250: 63 74 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e  ctures of the in
5260: 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67  dices and foreig
5270: 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65  n keys associate
5280: 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74  d with .** the t
5290: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able..**.** The 
52a0: 64 62 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  db parameter is 
52b0: 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 74 20 69 73  optional.  It is
52c0: 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 54   needed if the T
52d0: 61 62 6c 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20  able object .** 
52e0: 63 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61 73 69  contains lookasi
52f0: 64 65 20 6d 65 6d 6f 72 79 2e 20 20 28 54 61 62  de memory.  (Tab
5300: 6c 65 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68  le objects in th
5310: 65 20 73 63 68 65 6d 61 20 64 6f 20 6e 6f 74 20  e schema do not 
5320: 75 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65  use.** lookaside
5330: 20 6d 65 6d 6f 72 79 2c 20 62 75 74 20 73 6f 6d   memory, but som
5340: 65 20 65 70 68 65 6d 65 72 61 6c 20 54 61 62 6c  e ephemeral Tabl
5350: 65 20 6f 62 6a 65 63 74 73 20 64 6f 2e 29 20 20  e objects do.)  
5360: 4f 72 20 74 68 65 0a 2a 2a 20 64 62 20 70 61 72  Or the.** db par
5370: 61 6d 65 74 65 72 20 63 61 6e 20 62 65 20 75 73  ameter can be us
5380: 65 64 20 77 69 74 68 20 64 62 2d 3e 70 6e 42 79  ed with db->pnBy
5390: 74 65 73 46 72 65 65 64 20 74 6f 20 6d 65 61 73  tesFreed to meas
53a0: 75 72 65 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a  ure the memory.*
53b0: 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 54 61  * used by the Ta
53c0: 62 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  ble object..*/.s
53d0: 74 61 74 69 63 20 76 6f 69 64 20 53 51 4c 49 54  tatic void SQLIT
53e0: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 64 65 6c 65 74  E_NOINLINE delet
53f0: 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a  eTable(sqlite3 *
5400: 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  db, Table *pTabl
5410: 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  e){.  Index *pIn
5420: 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 0a 23 69  dex, *pNext;..#i
5430: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
5440: 47 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68  G.  /* Record th
5450: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73  e number of outs
5460: 74 61 6e 64 69 6e 67 20 6c 6f 6f 6b 61 73 69 64  tanding lookasid
5470: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 69 6e  e allocations in
5480: 20 73 63 68 65 6d 61 20 54 61 62 6c 65 73 0a 20   schema Tables. 
5490: 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 64 6f 69   ** prior to doi
54a0: 6e 67 20 61 6e 79 20 66 72 65 65 28 29 20 6f 70  ng any free() op
54b0: 65 72 61 74 69 6f 6e 73 2e 20 20 53 69 6e 63 65  erations.  Since
54c0: 20 73 63 68 65 6d 61 20 54 61 62 6c 65 73 20 64   schema Tables d
54d0: 6f 20 6e 6f 74 20 75 73 65 0a 20 20 2a 2a 20 6c  o not use.  ** l
54e0: 6f 6f 6b 61 73 69 64 65 2c 20 74 68 69 73 20 6e  ookaside, this n
54f0: 75 6d 62 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74  umber should not
5500: 20 63 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 69 6e   change. */.  in
5510: 74 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 30  t nLookaside = 0
5520: 3b 0a 20 20 69 66 28 20 64 62 20 26 26 20 28 70  ;.  if( db && (p
5530: 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61 67 73 20  Table->tabFlags 
5540: 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d  & TF_Ephemeral)=
5550: 3d 30 20 29 7b 0a 20 20 20 20 6e 4c 6f 6f 6b 61  =0 ){.    nLooka
5560: 73 69 64 65 20 3d 20 73 71 6c 69 74 65 33 4c 6f  side = sqlite3Lo
5570: 6f 6b 61 73 69 64 65 55 73 65 64 28 64 62 2c 20  okasideUsed(db, 
5580: 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
5590: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20    /* Delete all 
55a0: 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
55b0: 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62  ed with this tab
55c0: 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e  le. */.  for(pIn
55d0: 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49  dex = pTable->pI
55e0: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
55f0: 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20  ndex=pNext){.   
5600: 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d   pNext = pIndex-
5610: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65  >pNext;.    asse
5620: 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  rt( pIndex->pSch
5630: 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63  ema==pTable->pSc
5640: 68 65 6d 61 0a 20 20 20 20 20 20 20 20 20 7c 7c  hema.         ||
5650: 20 28 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   (IsVirtual(pTab
5660: 6c 65 29 20 26 26 20 70 49 6e 64 65 78 2d 3e 69  le) && pIndex->i
5670: 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49  dxType!=SQLITE_I
5680: 44 58 54 59 50 45 5f 41 50 50 44 45 46 29 20 29  DXTYPE_APPDEF) )
5690: 3b 0a 20 20 20 20 69 66 28 20 28 64 62 3d 3d 30  ;.    if( (db==0
56a0: 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46   || db->pnBytesF
56b0: 72 65 65 64 3d 3d 30 29 20 26 26 20 21 49 73 56  reed==0) && !IsV
56c0: 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29  irtual(pTable) )
56d0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  {.      char *zN
56e0: 61 6d 65 20 3d 20 70 49 6e 64 65 78 2d 3e 7a 4e  ame = pIndex->zN
56f0: 61 6d 65 3b 20 0a 20 20 20 20 20 20 54 45 53 54  ame; .      TEST
5700: 4f 4e 4c 59 20 28 20 49 6e 64 65 78 20 2a 70 4f  ONLY ( Index *pO
5710: 6c 64 20 3d 20 29 20 73 71 6c 69 74 65 33 48 61  ld = ) sqlite3Ha
5720: 73 68 49 6e 73 65 72 74 28 0a 20 20 20 20 20 20  shInsert(.      
5730: 20 20 20 26 70 49 6e 64 65 78 2d 3e 70 53 63 68     &pIndex->pSch
5740: 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e  ema->idxHash, zN
5750: 61 6d 65 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a  ame, 0.      );.
5760: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
5770: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 63  ==0 || sqlite3Sc
5780: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
5790: 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63  , 0, pIndex->pSc
57a0: 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 61  hema) );.      a
57b0: 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 49 6e  ssert( pOld==pIn
57c0: 64 65 78 20 7c 7c 20 70 4f 6c 64 3d 3d 30 20 29  dex || pOld==0 )
57d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
57e0: 74 65 33 46 72 65 65 49 6e 64 65 78 28 64 62 2c  te3FreeIndex(db,
57f0: 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20   pIndex);.  }.. 
5800: 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 66   /* Delete any f
5810: 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 74 74 61  oreign keys atta
5820: 63 68 65 64 20 74 6f 20 74 68 69 73 20 74 61 62  ched to this tab
5830: 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  le. */.  sqlite3
5840: 46 6b 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61  FkDelete(db, pTa
5850: 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  ble);..  /* Dele
5860: 74 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  te the Table str
5870: 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20  ucture itself.. 
5880: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 65 6c   */.  sqlite3Del
5890: 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64  eteColumnNames(d
58a0: 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 73 71  b, pTable);.  sq
58b0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
58c0: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
58d0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
58e0: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c  db, pTable->zCol
58f0: 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  Aff);.  sqlite3S
5900: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
5910: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29  pTable->pSelect)
5920: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
5930: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54  istDelete(db, pT
5940: 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 23  able->pCheck);.#
5950: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5960: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
5970: 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65    sqlite3VtabCle
5980: 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  ar(db, pTable);.
5990: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
59a0: 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c  DbFree(db, pTabl
59b0: 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79  e);..  /* Verify
59c0: 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61 73 69   that no lookasi
59d0: 64 65 20 6d 65 6d 6f 72 79 20 77 61 73 20 75 73  de memory was us
59e0: 65 64 20 62 79 20 73 63 68 65 6d 61 20 74 61 62  ed by schema tab
59f0: 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  les */.  assert(
5a00: 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30 20 7c   nLookaside==0 |
5a10: 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 73 71  | nLookaside==sq
5a20: 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55 73  lite3LookasideUs
5a30: 65 64 28 64 62 2c 30 29 20 29 3b 0a 7d 0a 76 6f  ed(db,0) );.}.vo
5a40: 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  id sqlite3Delete
5a50: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
5a60: 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  b, Table *pTable
5a70: 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64  ){.  /* Do not d
5a80: 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c 65 20  elete the table 
5a90: 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65 72 65  until the refere
5aa0: 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65  nce count reache
5ab0: 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 28  s zero. */.  if(
5ac0: 20 21 70 54 61 62 6c 65 20 29 20 72 65 74 75 72   !pTable ) retur
5ad0: 6e 3b 0a 20 20 69 66 28 20 28 28 21 64 62 20 7c  n;.  if( ((!db |
5ae0: 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  | db->pnBytesFre
5af0: 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d 70 54 61  ed==0) && (--pTa
5b00: 62 6c 65 2d 3e 6e 54 61 62 52 65 66 29 3e 30 29  ble->nTabRef)>0)
5b10: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 65 6c   ) return;.  del
5b20: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61  eteTable(db, pTa
5b30: 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ble);.}.../*.** 
5b40: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
5b50: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
5b60: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
5b70: 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a  the delete the.*
5b80: 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  * table structur
5b90: 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69  e with all its i
5ba0: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
5bb0: 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64  gn keys..*/.void
5bc0: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
5bd0: 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  dDeleteTable(sql
5be0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
5bf0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
5c00: 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c  TabName){.  Tabl
5c10: 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b  e *p;.  Db *pDb;
5c20: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
5c30: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
5c40: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
5c50: 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
5c60: 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20  ( zTabName );.  
5c70: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
5c80: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
5c90: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
5ca0: 74 65 73 74 63 61 73 65 28 20 7a 54 61 62 4e 61  testcase( zTabNa
5cb0: 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20  me[0]==0 );  /* 
5cc0: 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c  Zero-length tabl
5cd0: 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f  e names are allo
5ce0: 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26  wed */.  pDb = &
5cf0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
5d00: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  p = sqlite3HashI
5d10: 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68  nsert(&pDb->pSch
5d20: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54  ema->tblHash, zT
5d30: 61 62 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71  abName, 0);.  sq
5d40: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
5d50: 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d 3e 6d  (db, p);.  db->m
5d60: 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41  DbFlags |= DBFLA
5d70: 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a  G_SchemaChange;.
5d80: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
5d90: 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61   token, return a
5da0: 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e   string that con
5db0: 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65 78  sists of the tex
5dc0: 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b  t of that.** tok
5dd0: 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  en.  Space to ho
5de0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
5df0: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74  string.** is obt
5e00: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
5e10: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
5e20: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
5e30: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
5e40: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e  nction..**.** An
5e50: 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b  y quotation mark
5e60: 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c 20  s (ex:  "name", 
5e70: 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20  'name', [name], 
5e80: 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61 74 0a  or `name`) that.
5e90: 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68 65 20  ** surround the 
5ea0: 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f 6b 65  body of the toke
5eb0: 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a  n are removed..*
5ec0: 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20  *.** Tokens are 
5ed0: 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74  often just point
5ee0: 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ers into the ori
5ef0: 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61  ginal SQL text a
5f00: 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74  nd so.** are not
5f10: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
5f20: 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72   and are not per
5f30: 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65  sistent.  The re
5f40: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a  turned string.**
5f50: 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61   is \000 termina
5f60: 74 65 64 20 61 6e 64 20 69 73 20 70 65 72 73 69  ted and is persi
5f70: 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a  stent..*/.char *
5f80: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
5f90: 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  oken(sqlite3 *db
5fa0: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
5fb0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
5fc0: 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
5fd0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
5fe0: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
5ff0: 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c  (char*)pName->z,
6000: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
6010: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
6020: 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Name);.  }else{.
6030: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20      zName = 0;. 
6040: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d   }.  return zNam
6050: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  e;.}../*.** Open
6060: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
6070: 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20  er table stored 
6080: 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62  in database numb
6090: 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72  er iDb for.** wr
60a0: 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65  iting. The table
60b0: 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67   is opened using
60c0: 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f   cursor 0..*/.vo
60d0: 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61  id sqlite3OpenMa
60e0: 73 74 65 72 54 61 62 6c 65 28 50 61 72 73 65 20  sterTable(Parse 
60f0: 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  *p, int iDb){.  
6100: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
6110: 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73  3GetVdbe(p);.  s
6120: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
6130: 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52  p, iDb, MASTER_R
6140: 4f 4f 54 2c 20 31 2c 20 4d 41 53 54 45 52 5f 4e  OOT, 1, MASTER_N
6150: 41 4d 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  AME);.  sqlite3V
6160: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
6170: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c  OP_OpenWrite, 0,
6180: 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 69 44   MASTER_ROOT, iD
6190: 62 2c 20 35 29 3b 0a 20 20 69 66 28 20 70 2d 3e  b, 5);.  if( p->
61a0: 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 70  nTab==0 ){.    p
61b0: 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 7d 0a  ->nTab = 1;.  }.
61c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
61d0: 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73 20  er zName points 
61e0: 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  to a nul-termina
61f0: 74 65 64 20 62 75 66 66 65 72 20 63 6f 6e 74 61  ted buffer conta
6200: 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 0a 2a  ining the name.*
6210: 2a 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  * of a database 
6220: 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20  ("main", "temp" 
6230: 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  or the name of a
6240: 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e 20  n attached db). 
6250: 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
6260: 20 72 65 74 75 72 6e 73 20 74 68 65 20 69 6e 64   returns the ind
6270: 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20  ex of the named 
6280: 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e  database in db->
6290: 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d 31 20  aDb[], or.** -1 
62a0: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20  if the named db 
62b0: 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
62c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
62d0: 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69 74 65  indDbName(sqlite
62e0: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
62f0: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
6300: 20 69 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20   i = -1;        
6310: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
6320: 62 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a 4e 61  ber */.  if( zNa
6330: 6d 65 20 29 7b 0a 20 20 20 20 44 62 20 2a 70 44  me ){.    Db *pD
6340: 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 64 62  b;.    for(i=(db
6350: 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26 64  ->nDb-1), pDb=&d
6360: 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b  b->aDb[i]; i>=0;
6370: 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20   i--, pDb--){.  
6380: 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
6390: 65 33 5f 73 74 72 69 63 6d 70 28 70 44 62 2d 3e  e3_stricmp(pDb->
63a0: 7a 44 62 53 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  zDbSName, zName)
63b0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
63c0: 2f 2a 20 22 6d 61 69 6e 22 20 69 73 20 61 6c 77  /* "main" is alw
63d0: 61 79 73 20 61 6e 20 61 63 63 65 70 74 61 62 6c  ays an acceptabl
63e0: 65 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20  e alias for the 
63f0: 70 72 69 6d 61 72 79 20 64 61 74 61 62 61 73 65  primary database
6400: 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 69  .      ** even i
6410: 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 72 65  f it has been re
6420: 6e 61 6d 65 64 20 75 73 69 6e 67 20 53 51 4c 49  named using SQLI
6430: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4d 41 49 4e  TE_DBCONFIG_MAIN
6440: 44 42 4e 41 4d 45 2e 20 2a 2f 0a 20 20 20 20 20  DBNAME. */.     
6450: 20 69 66 28 20 69 3d 3d 30 20 26 26 20 30 3d 3d   if( i==0 && 0==
6460: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
6470: 22 6d 61 69 6e 22 2c 20 7a 4e 61 6d 65 29 20 29  "main", zName) )
6480: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6490: 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  }.  return i;.}.
64a0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e  ./*.** The token
64b0: 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73   *pName contains
64c0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64   the name of a d
64d0: 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72 20  atabase (either 
64e0: 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65  "main" or.** "te
64f0: 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20  mp" or the name 
6500: 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  of an attached d
6510: 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  b). This routine
6520: 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20   returns the.** 
6530: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d  index of the nam
6540: 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64  ed database in d
6550: 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20  b->aDb[], or -1 
6560: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20  if the named db 
6570: 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  .** does not exi
6580: 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  st..*/.int sqlit
6590: 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74 65 33  e3FindDb(sqlite3
65a0: 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61   *db, Token *pNa
65b0: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  me){.  int i;   
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
65e0: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a  atabase number *
65f0: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  /.  char *zName;
6600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6610: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
6620: 20 77 65 20 61 72 65 20 73 65 61 72 63 68 69 6e   we are searchin
6630: 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65  g for */.  zName
6640: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
6650: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d  omToken(db, pNam
6660: 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74 65  e);.  i = sqlite
6670: 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
6680: 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
6690: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
66a0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  e);.  return i;.
66b0: 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  }../* The table 
66c0: 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69 67 67  or view or trigg
66d0: 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65  er name is passe
66e0: 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  d to this routin
66f0: 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20  e via tokens.** 
6700: 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65  pName1 and pName
6710: 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  2. If the table 
6720: 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71  name was fully q
6730: 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78  ualified, for ex
6740: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45  ample:.**.** CRE
6750: 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79  ATE TABLE xxx.yy
6760: 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20  y (...);.** .** 
6770: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
6780: 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20  et to "xxx" and 
6790: 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e  pName2 "yyy". On
67a0: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20   the other hand 
67b0: 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  if.** the table 
67c0: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c  name is not full
67d0: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65  y qualified, i.e
67e0: 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20  .:.**.** CREATE 
67f0: 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a  TABLE yyy(...);.
6800: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  **.** Then pName
6810: 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79  1 is set to "yyy
6820: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20  " and pName2 is 
6830: 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ""..**.** This r
6840: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
6850: 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65  *ppUnqual pointe
6860: 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  r to point at th
6870: 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20  e token (pName1 
6880: 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68  or.** pName2) th
6890: 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e  at stores the un
68a0: 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20  qualified table 
68b0: 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78  name.  The index
68c0: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
68d0: 61 73 65 20 22 78 78 78 22 20 69 73 20 72 65 74  ase "xxx" is ret
68e0: 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
68f0: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
6900: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
6910: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  e,      /* Parsi
6920: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
6930: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
6940: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
6950: 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  1,      /* The "
6960: 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  xxx" in the name
6970: 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78   "xxx.yyy" or "x
6980: 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  xx" */.  Token *
6990: 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20  pName2,      /* 
69a0: 54 68 65 20 22 79 79 79 22 20 69 6e 20 74 68 65  The "yyy" in the
69b0: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
69c0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e  */.  Token **pUn
69d0: 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74  qual     /* Writ
69e0: 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65  e the unqualifie
69f0: 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65  d object name he
6a00: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  re */.){.  int i
6a10: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
6a20: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
6a30: 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f  se holding the o
6a40: 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
6a50: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
6a60: 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  >db;..  assert( 
6a70: 70 4e 61 6d 65 32 21 3d 30 20 29 3b 0a 20 20 69  pName2!=0 );.  i
6a80: 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29  f( pName2->n>0 )
6a90: 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e  {.    if( db->in
6aa0: 69 74 2e 62 75 73 79 20 29 20 7b 0a 20 20 20 20  it.busy ) {.    
6ab0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
6ac0: 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72 72 75  g(pParse, "corru
6ad0: 70 74 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20  pt database");. 
6ae0: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
6af0: 20 20 20 20 7d 0a 20 20 20 20 2a 70 55 6e 71 75      }.    *pUnqu
6b00: 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20  al = pName2;.   
6b10: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69   iDb = sqlite3Fi
6b20: 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29  ndDb(db, pName1)
6b30: 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
6b40: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6b50: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
6b60: 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61   "unknown databa
6b70: 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b  se %T", pName1);
6b80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
6b90: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
6ba0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
6bb0: 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20  >init.iDb==0 || 
6bc0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c  db->init.busy ||
6bd0: 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
6be0: 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  T.             |
6bf0: 7c 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20  | (db->mDbFlags 
6c00: 26 20 44 42 46 4c 41 47 5f 56 61 63 75 75 6d 29  & DBFLAG_Vacuum)
6c10: 21 3d 30 29 3b 0a 20 20 20 20 69 44 62 20 3d 20  !=0);.    iDb = 
6c20: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20  db->init.iDb;.  
6c30: 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61    *pUnqual = pNa
6c40: 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  me1;.  }.  retur
6c50: 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n iDb;.}../*.** 
6c60: 54 72 75 65 20 69 66 20 50 52 41 47 4d 41 20 77  True if PRAGMA w
6c70: 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 69  ritable_schema i
6c80: 73 20 4f 4e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  s ON.*/.int sqli
6c90: 74 65 33 57 72 69 74 61 62 6c 65 53 63 68 65 6d  te3WritableSchem
6ca0: 61 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  a(sqlite3 *db){.
6cb0: 20 20 74 65 73 74 63 61 73 65 28 20 28 64 62 2d    testcase( (db-
6cc0: 3e 66 6c 61 67 73 26 28 53 51 4c 49 54 45 5f 57  >flags&(SQLITE_W
6cd0: 72 69 74 65 53 63 68 65 6d 61 7c 53 51 4c 49 54  riteSchema|SQLIT
6ce0: 45 5f 44 65 66 65 6e 73 69 76 65 29 29 3d 3d 30  E_Defensive))==0
6cf0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
6d00: 28 64 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49  (db->flags&(SQLI
6d10: 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c 53  TE_WriteSchema|S
6d20: 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65 29  QLITE_Defensive)
6d30: 29 3d 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  )==.            
6d40: 20 20 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53     SQLITE_WriteS
6d50: 63 68 65 6d 61 20 29 3b 0a 20 20 74 65 73 74 63  chema );.  testc
6d60: 61 73 65 28 20 28 64 62 2d 3e 66 6c 61 67 73 26  ase( (db->flags&
6d70: 28 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68  (SQLITE_WriteSch
6d80: 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e  ema|SQLITE_Defen
6d90: 73 69 76 65 29 29 3d 3d 0a 20 20 20 20 20 20 20  sive))==.       
6da0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
6db0: 65 66 65 6e 73 69 76 65 20 29 3b 0a 20 20 74 65  efensive );.  te
6dc0: 73 74 63 61 73 65 28 20 28 64 62 2d 3e 66 6c 61  stcase( (db->fla
6dd0: 67 73 26 28 53 51 4c 49 54 45 5f 57 72 69 74 65  gs&(SQLITE_Write
6de0: 53 63 68 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65  Schema|SQLITE_De
6df0: 66 65 6e 73 69 76 65 29 29 3d 3d 0a 20 20 20 20  fensive))==.    
6e00: 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49             (SQLI
6e10: 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c 53  TE_WriteSchema|S
6e20: 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65 29  QLITE_Defensive)
6e30: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 64 62   );.  return (db
6e40: 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49 54 45 5f  ->flags&(SQLITE_
6e50: 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51 4c 49  WriteSchema|SQLI
6e60: 54 45 5f 44 65 66 65 6e 73 69 76 65 29 29 3d 3d  TE_Defensive))==
6e70: 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65  SQLITE_WriteSche
6e80: 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ma;.}../*.** Thi
6e90: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
6ea0: 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68  d to check if th
6eb0: 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 7a  e UTF-8 string z
6ec0: 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c 0a  Name is a legal.
6ed0: 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6e  ** unqualified n
6ee0: 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73 63  ame for a new sc
6ef0: 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61 62  hema object (tab
6f00: 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77 20  le, index, view 
6f10: 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e 20  or.** trigger). 
6f20: 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c 65  All names are le
6f30: 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73 65  gal except those
6f40: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
6f50: 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22   the string.** "
6f60: 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70 70  sqlite_" (in upp
6f70: 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78  er, lower or mix
6f80: 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20 70  ed case). This p
6f90: 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61  ortion of the na
6fa0: 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72 65  mespace.** is re
6fb0: 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72  served for inter
6fc0: 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20  nal use..*/.int 
6fd0: 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
6fe0: 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70 50  ctName(Parse *pP
6ff0: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
7000: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20   *zName){.  if( 
7010: 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69  !pParse->db->ini
7020: 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73 65  t.busy && pParse
7030: 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20 20  ->nested==0 .   
7040: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
7050: 33 57 72 69 74 61 62 6c 65 53 63 68 65 6d 61 28  3WritableSchema(
7060: 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 0a 20  pParse->db)==0. 
7070: 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73           && 0==s
7080: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a  qlite3StrNICmp(z
7090: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
70a0: 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   7) ){.    sqlit
70b0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
70c0: 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20  e, "object name 
70d0: 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74  reserved for int
70e0: 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20  ernal use: %s", 
70f0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
7100: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
7110: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
7120: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
7130: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 52 49  * Return the PRI
7140: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 6f  MARY KEY index o
7150: 66 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49 6e 64  f a table.*/.Ind
7160: 65 78 20 2a 73 71 6c 69 74 65 33 50 72 69 6d 61  ex *sqlite3Prima
7170: 72 79 4b 65 79 49 6e 64 65 78 28 54 61 62 6c 65  ryKeyIndex(Table
7180: 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78   *pTab){.  Index
7190: 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 54 61   *p;.  for(p=pTa
71a0: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20  b->pIndex; p && 
71b0: 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  !IsPrimaryKeyInd
71c0: 65 78 28 70 29 3b 20 70 3d 70 2d 3e 70 4e 65 78  ex(p); p=p->pNex
71d0: 74 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  t){}.  return p;
71e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
71f0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 69   the column of i
7200: 6e 64 65 78 20 70 49 64 78 20 74 68 61 74 20 63  ndex pIdx that c
7210: 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 61  orresponds to ta
7220: 62 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43  ble.** column iC
7230: 6f 6c 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  ol.  Return -1 i
7240: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
7250: 69 31 36 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  i16 sqlite3Colum
7260: 6e 4f 66 49 6e 64 65 78 28 49 6e 64 65 78 20 2a  nOfIndex(Index *
7270: 70 49 64 78 2c 20 69 31 36 20 69 43 6f 6c 29 7b  pIdx, i16 iCol){
7280: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
7290: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f  i=0; i<pIdx->nCo
72a0: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
72b0: 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e  if( iCol==pIdx->
72c0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20 72 65  aiColumn[i] ) re
72d0: 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
72e0: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
72f0: 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63  * Begin construc
7300: 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65  ting a new table
7310: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
7320: 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73  in memory.  This
7330: 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   is.** the first
7340: 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69   of several acti
7350: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74  on routines that
7360: 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72   get called in r
7370: 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20  esponse.** to a 
7380: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
7390: 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74  tement.  In part
73a0: 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75  icular, this rou
73b0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a  tine is called.*
73c0: 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74  * after seeing t
73d0: 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61  okens "CREATE" a
73e0: 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74  nd "TABLE" and t
73f0: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54  he table name. T
7400: 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61  he isTemp.** fla
7410: 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
7420: 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65   table should be
7430: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61   stored in the a
7440: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
7450: 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61  e.** file instea
7460: 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e  d of in the main
7470: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
7480: 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
7490: 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68  y the case.** wh
74a0: 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72  en the "TEMP" or
74b0: 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79   "TEMPORARY" key
74c0: 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62  word occurs in b
74d0: 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45  etween.** CREATE
74e0: 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a   and TABLE..**.*
74f0: 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * The new table 
7500: 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61  record is initia
7510: 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e  lized and put in
7520: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
7530: 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f  le..** As more o
7540: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
7550: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  LE statement is 
7560: 70 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e  parsed, addition
7570: 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75  al action.** rou
7580: 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61  tines will be ca
7590: 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65  lled to add more
75a0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
75b0: 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20  this record..** 
75c0: 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
75d0: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
75e0: 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71  tatement, the sq
75f0: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20  lite3EndTable() 
7600: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
7610: 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65  lled to complete
7620: 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f   the constructio
7630: 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  n of the new tab
7640: 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f  le record..*/.vo
7650: 69 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  id sqlite3StartT
7660: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
7670: 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73  Parse,   /* Pars
7680: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
7690: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
76a0: 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f   /* First part o
76b0: 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  f the name of th
76c0: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
76d0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
76e0: 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  e2,   /* Second 
76f0: 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65  part of the name
7700: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
7710: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
7720: 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54  sTemp,      /* T
7730: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
7740: 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20   TEMP table */. 
7750: 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20   int isView,    
7760: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
7770: 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20  s is a VIEW */. 
7780: 20 69 6e 74 20 69 73 56 69 72 74 75 61 6c 2c 20   int isVirtual, 
7790: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
77a0: 73 20 69 73 20 61 20 56 49 52 54 55 41 4c 20 74  s is a VIRTUAL t
77b0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  able */.  int no
77c0: 45 72 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  Err        /* Do
77d0: 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c   nothing if tabl
77e0: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
77f0: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
7800: 70 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a  pTable;.  char *
7810: 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68  zName = 0; /* Th
7820: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65  e name of the ne
7830: 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  w table */.  sql
7840: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
7850: 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
7860: 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  ;.  int iDb;    
7870: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
7880: 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74   number to creat
7890: 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a  e the table in *
78a0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
78b0: 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66  ;    /* Unqualif
78c0: 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ied name of the 
78d0: 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  table to create 
78e0: 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e  */..  if( db->in
78f0: 69 74 2e 62 75 73 79 20 26 26 20 64 62 2d 3e 69  it.busy && db->i
7900: 6e 69 74 2e 6e 65 77 54 6e 75 6d 3d 3d 31 20 29  nit.newTnum==1 )
7910: 7b 0a 20 20 20 20 2f 2a 20 53 70 65 63 69 61 6c  {.    /* Special
7920: 20 63 61 73 65 3a 20 20 50 61 72 73 69 6e 67 20   case:  Parsing 
7930: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
7940: 72 20 6f 72 20 73 71 6c 69 74 65 5f 74 65 6d 70  r or sqlite_temp
7950: 5f 6d 61 73 74 65 72 20 73 63 68 65 6d 61 20 2a  _master schema *
7960: 2f 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e  /.    iDb = db->
7970: 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 7a 4e  init.iDb;.    zN
7980: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
7990: 74 72 44 75 70 28 64 62 2c 20 53 43 48 45 4d 41  trDup(db, SCHEMA
79a0: 5f 54 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20  _TABLE(iDb));.  
79b0: 20 20 70 4e 61 6d 65 20 3d 20 70 4e 61 6d 65 31    pName = pName1
79c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
79d0: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
79e0: 65 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73  e */.    iDb = s
79f0: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
7a00: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
7a10: 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
7a20: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
7a30: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69   ) return;.    i
7a40: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
7a50: 26 26 20 69 73 54 65 6d 70 20 26 26 20 70 4e 61  && isTemp && pNa
7a60: 6d 65 32 2d 3e 6e 3e 30 20 26 26 20 69 44 62 21  me2->n>0 && iDb!
7a70: 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =1 ){.      /* I
7a80: 66 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d  f creating a tem
7a90: 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d  p table, the nam
7aa0: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61  e may not be qua
7ab0: 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73 73 20 0a  lified. Unless .
7ac0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
7ad0: 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 22 74  abase name is "t
7ae0: 65 6d 70 22 20 61 6e 79 77 61 79 2e 20 20 2a 2f  emp" anyway.  */
7af0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
7b00: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
7b10: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
7b20: 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71  name must be unq
7b30: 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20  ualified");.    
7b40: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
7b50: 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
7b60: 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29  MPDB && isTemp )
7b70: 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 7a 4e   iDb = 1;.    zN
7b80: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
7b90: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
7ba0: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 49  Name);.    if( I
7bb0: 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
7bc0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7bd0: 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70  RenameTokenMap(p
7be0: 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 7a 4e  Parse, (void*)zN
7bf0: 61 6d 65 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20  ame, pName);.   
7c00: 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d   }.  }.  pParse-
7c10: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70  >sNameToken = *p
7c20: 4e 61 6d 65 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  Name;.  if( zNam
7c30: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
7c40: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
7c50: 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
7c60: 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a  ctName(pParse, z
7c70: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  Name) ){.    got
7c80: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
7c90: 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  ror;.  }.  if( d
7ca0: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29  b->init.iDb==1 )
7cb0: 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66   isTemp = 1;.#if
7cc0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7cd0: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
7ce0: 20 61 73 73 65 72 74 28 20 69 73 54 65 6d 70 3d   assert( isTemp=
7cf0: 3d 30 20 7c 7c 20 69 73 54 65 6d 70 3d 3d 31 20  =0 || isTemp==1 
7d00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 56  );.  assert( isV
7d10: 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69 65 77  iew==0 || isView
7d20: 3d 3d 31 20 29 3b 0a 20 20 7b 0a 20 20 20 20 73  ==1 );.  {.    s
7d30: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
7d40: 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Code[] = {.     
7d50: 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f    SQLITE_CREATE_
7d60: 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 53 51  TABLE,.       SQ
7d70: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
7d80: 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 53  _TABLE,.       S
7d90: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45  QLITE_CREATE_VIE
7da0: 57 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45  W,.       SQLITE
7db0: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45  _CREATE_TEMP_VIE
7dc0: 57 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 68 61  W.    };.    cha
7dd0: 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
7de0: 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a  [iDb].zDbSName;.
7df0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
7e00: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
7e10: 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
7e20: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54  SCHEMA_TABLE(isT
7e30: 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b  emp), 0, zDb) ){
7e40: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
7e50: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
7e60: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73     }.    if( !is
7e70: 56 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74  Virtual && sqlit
7e80: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
7e90: 73 65 2c 20 28 69 6e 74 29 61 43 6f 64 65 5b 69  se, (int)aCode[i
7ea0: 73 54 65 6d 70 2b 32 2a 69 73 56 69 65 77 5d 2c  sTemp+2*isView],
7eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ed0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 30          zName, 0
7ee0: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
7ef0: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
7f00: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
7f10: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d  }.#endif..  /* M
7f20: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77  ake sure the new
7f30: 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73   table name does
7f40: 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74   not collide wit
7f50: 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20  h an existing.  
7f60: 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
7f70: 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 61  e name in the sa
7f80: 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 73  me database.  Is
7f90: 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  sue an error mes
7fa0: 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74 20  sage if.  ** it 
7fb0: 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70 74  does. The except
7fc0: 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73 74  ion is if the st
7fd0: 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70 61  atement being pa
7fe0: 72 73 65 64 20 77 61 73 20 70 61 73 73 65 64 0a  rsed was passed.
7ff0: 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74    ** to an sqlit
8000: 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28  e3_declare_vtab(
8010: 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20  ) call. In that 
8020: 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f  case only the co
8030: 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20  lumn names.  ** 
8040: 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20 62  and types will b
8050: 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72 65  e used, so there
8060: 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74   is no need to t
8070: 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61 63  est for namespac
8080: 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e  e.  ** collision
8090: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 49  s..  */.  if( !I
80a0: 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52 53 45 20  N_SPECIAL_PARSE 
80b0: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62  ){.    char *zDb
80c0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
80d0: 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69 66  zDbSName;.    if
80e0: 28 20 21 49 73 52 65 75 73 65 53 63 68 65 6d 61  ( !IsReuseSchema
80f0: 28 64 62 29 20 26 26 20 53 51 4c 49 54 45 5f 4f  (db) && SQLITE_O
8100: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
8110: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
8120: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
8130: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
8140: 20 20 7d 0a 20 20 20 20 70 54 61 62 6c 65 20 3d    }.    pTable =
8150: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
8160: 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  e(db, zName, zDb
8170: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c  );.    if( pTabl
8180: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  e ){.      if( !
8190: 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20  noErr ){.       
81a0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
81b0: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
81c0: 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %T already exist
81d0: 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  s", pName);.    
81e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
81f0: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e   assert( !db->in
8200: 69 74 2e 62 75 73 79 20 7c 7c 20 43 4f 52 52 55  it.busy || CORRU
8210: 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 20  PT_DB );.       
8220: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
8230: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
8240: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20   iDb);.      }. 
8250: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
8260: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
8270: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
8280: 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
8290: 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29  zName, zDb)!=0 )
82a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
82b0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
82c0: 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
82d0: 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64  y an index named
82e0: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
82f0: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
8300: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
8310: 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62 6c 65 20  }.  }..  pTable 
8320: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
8330: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
8340: 28 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20  (Table));.  if( 
8350: 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  pTable==0 ){.   
8360: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
8370: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
8380: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
8390: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
83a0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
83b0: 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65  r++;.    goto be
83c0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
83d0: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a  .  }.  pTable->z
83e0: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
83f0: 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20  pTable->iPKey = 
8400: 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53  -1;.  pTable->pS
8410: 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
8420: 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  iDb].pSchema;.  
8430: 70 54 61 62 6c 65 2d 3e 6e 54 61 62 52 65 66 20  pTable->nTabRef 
8440: 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 1;.#ifdef SQLI
8450: 54 45 5f 44 45 46 41 55 4c 54 5f 52 4f 57 45 53  TE_DEFAULT_ROWES
8460: 54 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77  T.  pTable->nRow
8470: 4c 6f 67 45 73 74 20 3d 20 73 71 6c 69 74 65 33  LogEst = sqlite3
8480: 4c 6f 67 45 73 74 28 53 51 4c 49 54 45 5f 44 45  LogEst(SQLITE_DE
8490: 46 41 55 4c 54 5f 52 4f 57 45 53 54 29 3b 0a 23  FAULT_ROWEST);.#
84a0: 65 6c 73 65 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  else.  pTable->n
84b0: 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b  RowLogEst = 200;
84c0: 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71   assert( 200==sq
84d0: 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38  lite3LogEst(1048
84e0: 35 37 36 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  576) );.#endif. 
84f0: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
8500: 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 3b  >pNewTable==0 );
8510: 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  .  pParse->pNewT
8520: 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a  able = pTable;..
8530: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
8540: 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65  the magic sqlite
8550: 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
8560: 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72  used by autoincr
8570: 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e  ement,.  ** then
8580: 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65   record a pointe
8590: 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  r to this table 
85a0: 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
85b0: 62 61 73 65 20 73 74 72 75 63 74 75 72 65 0a 20  base structure. 
85c0: 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45   ** so that INSE
85d0: 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20  RT can find the 
85e0: 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20  table easily..  
85f0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
8600: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
8610: 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61 72  MENT.  if( !pPar
8620: 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20 73 74  se->nested && st
8630: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c  rcmp(zName, "sql
8640: 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d  ite_sequence")==
8650: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
8660: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
8670: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
8680: 20 30 29 20 29 3b 0a 20 20 20 20 70 54 61 62 6c   0) );.    pTabl
8690: 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71  e->pSchema->pSeq
86a0: 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  Tab = pTable;.  
86b0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42  }.#endif..  /* B
86c0: 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20  egin generating 
86d0: 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  the code that wi
86e0: 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74 61  ll insert the ta
86f0: 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a  ble record into.
8700: 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f    ** the SQLITE_
8710: 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e  MASTER table.  N
8720: 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61  ote in particula
8730: 72 20 74 68 61 74 20 77 65 20 6d 75 73 74 20 67  r that we must g
8740: 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64  o ahead.  ** and
8750: 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65   allocate the re
8760: 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20  cord number for 
8770: 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
8780: 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79  now.  Before any
8790: 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45  .  ** PRIMARY KE
87a0: 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77  Y or UNIQUE keyw
87b0: 6f 72 64 73 20 61 72 65 20 70 61 72 73 65 64 2e  ords are parsed.
87c0: 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73    Those keywords
87d0: 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a   will cause.  **
87e0: 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63   indices to be c
87f0: 72 65 61 74 65 64 20 61 6e 64 20 74 68 65 20 74  reated and the t
8800: 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74  able record must
8810: 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65   come before the
8820: 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20   .  ** indices. 
8830: 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f   Hence, the reco
8840: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
8850: 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20  e table must be 
8860: 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e  allocated.  ** n
8870: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ow..  */.  if( !
8880: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
8890: 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   (v = sqlite3Get
88a0: 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d 30  Vdbe(pParse))!=0
88b0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
88c0: 31 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c 65 46  1;.    int fileF
88d0: 6f 72 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20 72  ormat;.    int r
88e0: 65 67 31 2c 20 72 65 67 32 2c 20 72 65 67 33 3b  eg1, reg2, reg3;
88f0: 0a 20 20 20 20 2f 2a 20 6e 75 6c 6c 52 6f 77 5b  .    /* nullRow[
8900: 5d 20 69 73 20 61 6e 20 4f 50 5f 52 65 63 6f 72  ] is an OP_Recor
8910: 64 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20  d encoding of a 
8920: 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 35  row containing 5
8930: 20 4e 55 4c 4c 73 20 2a 2f 0a 20 20 20 20 73 74   NULLs */.    st
8940: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
8950: 6e 75 6c 6c 52 6f 77 5b 5d 20 3d 20 7b 20 36 2c  nullRow[] = { 6,
8960: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d   0, 0, 0, 0, 0 }
8970: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
8980: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
8990: 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
89a0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
89b0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
89c0: 42 4c 45 0a 20 20 20 20 69 66 28 20 69 73 56 69  BLE.    if( isVi
89d0: 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73  rtual ){.      s
89e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
89f0: 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a  (v, OP_VBegin);.
8a00: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
8a10: 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
8a20: 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f   format and enco
8a30: 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61 74 61  ding in the data
8a40: 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20 62 65  base have not be
8a50: 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20  en set, .    ** 
8a60: 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20  set them now..  
8a70: 20 20 2a 2f 0a 20 20 20 20 72 65 67 31 20 3d 20    */.    reg1 = 
8a80: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64  pParse->regRowid
8a90: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
8aa0: 6d 3b 0a 20 20 20 20 72 65 67 32 20 3d 20 70 50  m;.    reg2 = pP
8ab0: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 20 3d 20  arse->regRoot = 
8ac0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
8ad0: 20 20 20 20 72 65 67 33 20 3d 20 2b 2b 70 50 61      reg3 = ++pPa
8ae0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
8af0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
8b00: 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69  (v, OP_ReadCooki
8b10: 65 2c 20 69 44 62 2c 20 72 65 67 33 2c 20 42 54  e, iDb, reg3, BT
8b20: 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 29  REE_FILE_FORMAT)
8b30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8b40: 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44  eUsesBtree(v, iD
8b50: 62 29 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20  b);.    addr1 = 
8b60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8b70: 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 33  1(v, OP_If, reg3
8b80: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
8b90: 76 29 3b 0a 20 20 20 20 66 69 6c 65 46 6f 72 6d  v);.    fileForm
8ba0: 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  at = (db->flags 
8bb0: 26 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46  & SQLITE_LegacyF
8bc0: 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a 20 20 20  ileFmt)!=0 ?.   
8bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
8be0: 20 3a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 49   : SQLITE_MAX_FI
8bf0: 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20 20 20 20 73  LE_FORMAT;.    s
8c00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
8c10: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
8c20: 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 46 49 4c  , iDb, BTREE_FIL
8c30: 45 5f 46 4f 52 4d 41 54 2c 20 66 69 6c 65 46 6f  E_FORMAT, fileFo
8c40: 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  rmat);.    sqlit
8c50: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
8c60: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
8c70: 62 2c 20 42 54 52 45 45 5f 54 45 58 54 5f 45 4e  b, BTREE_TEXT_EN
8c80: 43 4f 44 49 4e 47 2c 20 45 4e 43 28 64 62 29 29  CODING, ENC(db))
8c90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8ca0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
8cb0: 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  r1);..    /* Thi
8cc0: 73 20 6a 75 73 74 20 63 72 65 61 74 65 73 20 61  s just creates a
8cd0: 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72 65   place-holder re
8ce0: 63 6f 72 64 20 69 6e 20 74 68 65 20 73 71 6c 69  cord in the sqli
8cf0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
8d00: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f  .    ** The reco
8d10: 72 64 20 63 72 65 61 74 65 64 20 64 6f 65 73 20  rd created does 
8d20: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74  not contain anyt
8d30: 68 69 6e 67 20 79 65 74 2e 20 20 49 74 20 77 69  hing yet.  It wi
8d40: 6c 6c 20 62 65 20 72 65 70 6c 61 63 65 64 0a 20  ll be replaced. 
8d50: 20 20 20 2a 2a 20 62 79 20 74 68 65 20 72 65 61     ** by the rea
8d60: 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f 64 65 20  l entry in code 
8d70: 67 65 6e 65 72 61 74 65 64 20 61 74 20 73 71 6c  generated at sql
8d80: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a  ite3EndTable()..
8d90: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
8da0: 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20  e rowid for the 
8db0: 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6c 65 66  new entry is lef
8dc0: 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50  t in register pP
8dd0: 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 2e 0a  arse->regRowid..
8de0: 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 6f 74 20      ** The root 
8df0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
8e00: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20  he new table is 
8e10: 6c 65 66 74 20 69 6e 20 72 65 67 20 70 50 61 72  left in reg pPar
8e20: 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20  se->regRoot..   
8e30: 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 61 6e   ** The rowid an
8e40: 64 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  d root page numb
8e50: 65 72 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65  er values are ne
8e60: 65 64 65 64 20 62 79 20 74 68 65 20 63 6f 64 65  eded by the code
8e70: 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 73 71 6c   that.    ** sql
8e80: 69 74 65 33 45 6e 64 54 61 62 6c 65 20 77 69 6c  ite3EndTable wil
8e90: 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20  l generate..    
8ea0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
8eb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
8ec0: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
8ed0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
8ee0: 4c 54 41 42 4c 45 29 0a 20 20 20 20 69 66 28 20  LTABLE).    if( 
8ef0: 69 73 56 69 65 77 20 7c 7c 20 69 73 56 69 72 74  isView || isVirt
8f00: 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ual ){.      sql
8f10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8f20: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
8f30: 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 65 6c 73   reg2);.    }els
8f40: 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20  e.#endif.    {. 
8f50: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 64 64       pParse->add
8f60: 72 43 72 54 61 62 20 3d 0a 20 20 20 20 20 20 20  rCrTab =.       
8f70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8f80: 4f 70 33 28 76 2c 20 4f 50 5f 43 72 65 61 74 65  Op3(v, OP_Create
8f90: 42 74 72 65 65 2c 20 69 44 62 2c 20 72 65 67 32  Btree, iDb, reg2
8fa0: 2c 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 29 3b  , BTREE_INTKEY);
8fb0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
8fc0: 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  e3OpenMasterTabl
8fd0: 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
8fe0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8ff0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
9000: 6f 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a  owid, 0, reg1);.
9010: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9020: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62  ddOp4(v, OP_Blob
9030: 2c 20 36 2c 20 72 65 67 33 2c 20 30 2c 20 6e 75  , 6, reg3, 0, nu
9040: 6c 6c 52 6f 77 2c 20 50 34 5f 53 54 41 54 49 43  llRow, P4_STATIC
9050: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
9060: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
9070: 6e 73 65 72 74 2c 20 30 2c 20 72 65 67 33 2c 20  nsert, 0, reg3, 
9080: 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  reg1);.    sqlit
9090: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
90a0: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
90b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
90c0: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43 6c  eAddOp0(v, OP_Cl
90d0: 6f 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ose);.  }..  /* 
90e0: 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f  Normal (non-erro
90f0: 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20  r) return. */.  
9100: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66  return;..  /* If
9110: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
9120: 2c 20 77 65 20 6a 75 6d 70 20 68 65 72 65 20 2a  , we jump here *
9130: 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  /.begin_table_er
9140: 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62  ror:.  sqlite3Db
9150: 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
9160: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
9170: 20 53 65 74 20 70 72 6f 70 65 72 74 69 65 73 20   Set properties 
9180: 6f 66 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d  of a table colum
9190: 6e 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 28  n based on the (
91a0: 6d 61 67 69 63 61 6c 29 0a 2a 2a 20 6e 61 6d 65  magical).** name
91b0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a   of the column..
91c0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
91d0: 41 42 4c 45 5f 48 49 44 44 45 4e 5f 43 4f 4c 55  ABLE_HIDDEN_COLU
91e0: 4d 4e 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MNS.void sqlite3
91f0: 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73  ColumnProperties
9200: 46 72 6f 6d 4e 61 6d 65 28 54 61 62 6c 65 20 2a  FromName(Table *
9210: 70 54 61 62 2c 20 43 6f 6c 75 6d 6e 20 2a 70 43  pTab, Column *pC
9220: 6f 6c 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  ol){.  if( sqlit
9230: 65 33 5f 73 74 72 6e 69 63 6d 70 28 70 43 6f 6c  e3_strnicmp(pCol
9240: 2d 3e 7a 4e 61 6d 65 2c 20 22 5f 5f 68 69 64 64  ->zName, "__hidd
9250: 65 6e 5f 5f 22 2c 20 31 30 29 3d 3d 30 20 29 7b  en__", 10)==0 ){
9260: 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c  .    pCol->colFl
9270: 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48  ags |= COLFLAG_H
9280: 49 44 44 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69  IDDEN;.  }else i
9290: 66 28 20 70 54 61 62 20 26 26 20 70 43 6f 6c 21  f( pTab && pCol!
92a0: 3d 70 54 61 62 2d 3e 61 43 6f 6c 20 26 26 20 28  =pTab->aCol && (
92b0: 70 43 6f 6c 5b 2d 31 5d 2e 63 6f 6c 46 6c 61 67  pCol[-1].colFlag
92c0: 73 20 26 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44  s & COLFLAG_HIDD
92d0: 45 4e 29 20 29 7b 0a 20 20 20 20 70 54 61 62 2d  EN) ){.    pTab-
92e0: 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
92f0: 4f 4f 4f 48 69 64 64 65 6e 3b 0a 20 20 7d 0a 7d  OOOHidden;.  }.}
9300: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
9310: 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e  Add a new column
9320: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
9330: 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
9340: 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a  nstructed..**.**
9350: 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
9360: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  s this routine o
9370: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  nce for each col
9380: 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  umn declaration.
9390: 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54  ** in a CREATE T
93a0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
93b0: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
93c0: 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64  le() gets called
93d0: 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74  .** first to get
93e0: 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20   things going.  
93f0: 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  Then this routin
9400: 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  e is called for 
9410: 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a  each.** column..
9420: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
9430: 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a  ddColumn(Parse *
9440: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
9450: 4e 61 6d 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79  Name, Token *pTy
9460: 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  pe){.  Table *p;
9470: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
9480: 20 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79   *z;.  char *zTy
9490: 70 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  pe;.  Column *pC
94a0: 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ol;.  sqlite3 *d
94b0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
94c0: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
94d0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
94e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
94f0: 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61   p->nCol+1>db->a
9500: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
9510: 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20  IT_COLUMN] ){.  
9520: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9530: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
9540: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25  any columns on %
9550: 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  s", p->zName);. 
9560: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
9570: 20 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   z = sqlite3DbMa
9580: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70 4e 61 6d  llocRaw(db, pNam
9590: 65 2d 3e 6e 20 2b 20 70 54 79 70 65 2d 3e 6e 20  e->n + pType->n 
95a0: 2b 20 32 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  + 2);.  if( z==0
95b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
95c0: 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
95d0: 54 20 29 20 73 71 6c 69 74 65 33 52 65 6e 61 6d  T ) sqlite3Renam
95e0: 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73 65  eTokenMap(pParse
95f0: 2c 20 28 76 6f 69 64 2a 29 7a 2c 20 70 4e 61 6d  , (void*)z, pNam
9600: 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20  e);.  memcpy(z, 
9610: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
9620: 3e 6e 29 3b 0a 20 20 7a 5b 70 4e 61 6d 65 2d 3e  >n);.  z[pName->
9630: 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  n] = 0;.  sqlite
9640: 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 66  3Dequote(z);.  f
9650: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
9660: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
9670: 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
9680: 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (z, p->aCol[i].z
9690: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
96a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
96b0: 67 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69  g(pParse, "dupli
96c0: 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  cate column name
96d0: 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20  : %s", z);.     
96e0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
96f0: 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74  b, z);.      ret
9700: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  urn;.    }.  }. 
9710: 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20   if( (p->nCol & 
9720: 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43  0x7)==0 ){.    C
9730: 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20  olumn *aNew;.   
9740: 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   aNew = sqlite3D
9750: 62 52 65 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61  bRealloc(db,p->a
9760: 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a  Col,(p->nCol+8)*
9770: 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30  sizeof(p->aCol[0
9780: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65  ]));.    if( aNe
9790: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  w==0 ){.      sq
97a0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
97b0: 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  z);.      return
97c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61  ;.    }.    p->a
97d0: 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a  Col = aNew;.  }.
97e0: 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f    pCol = &p->aCo
97f0: 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65  l[p->nCol];.  me
9800: 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69  mset(pCol, 0, si
9810: 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29  zeof(p->aCol[0])
9820: 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  );.  pCol->zName
9830: 20 3d 20 7a 3b 0a 20 20 73 71 6c 69 74 65 33 43   = z;.  sqlite3C
9840: 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46  olumnPropertiesF
9850: 72 6f 6d 4e 61 6d 65 28 70 2c 20 70 43 6f 6c 29  romName(p, pCol)
9860: 3b 0a 20 0a 20 20 69 66 28 20 70 54 79 70 65 2d  ;. .  if( pType-
9870: 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  >n==0 ){.    /* 
9880: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74  If there is no t
9890: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 63  ype specified, c
98a0: 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20  olumns have the 
98b0: 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79  default affinity
98c0: 0a 20 20 20 20 2a 2a 20 27 42 4c 4f 42 27 20 77  .    ** 'BLOB' w
98d0: 69 74 68 20 61 20 64 65 66 61 75 6c 74 20 73 69  ith a default si
98e0: 7a 65 20 6f 66 20 34 20 62 79 74 65 73 2e 20 2a  ze of 4 bytes. *
98f0: 2f 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69  /.    pCol->affi
9900: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
9910: 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c  F_BLOB;.    pCol
9920: 2d 3e 73 7a 45 73 74 20 3d 20 31 3b 0a 23 69 66  ->szEst = 1;.#if
9930: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
9940: 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
9950: 43 45 53 0a 20 20 20 20 69 66 28 20 34 3e 3d 73  CES.    if( 4>=s
9960: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
9970: 69 67 2e 73 7a 53 6f 72 74 65 72 52 65 66 20 29  ig.szSorterRef )
9980: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f  {.      pCol->co
9990: 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41  lFlags |= COLFLA
99a0: 47 5f 53 4f 52 54 45 52 52 45 46 3b 0a 20 20 20  G_SORTERREF;.   
99b0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73   }.#endif.  }els
99c0: 65 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 7a  e{.    zType = z
99d0: 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   + sqlite3Strlen
99e0: 33 30 28 7a 29 20 2b 20 31 3b 0a 20 20 20 20 6d  30(z) + 1;.    m
99f0: 65 6d 63 70 79 28 7a 54 79 70 65 2c 20 70 54 79  emcpy(zType, pTy
9a00: 70 65 2d 3e 7a 2c 20 70 54 79 70 65 2d 3e 6e 29  pe->z, pType->n)
9a10: 3b 0a 20 20 20 20 7a 54 79 70 65 5b 70 54 79 70  ;.    zType[pTyp
9a20: 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 73  e->n] = 0;.    s
9a30: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 54  qlite3Dequote(zT
9a40: 79 70 65 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  ype);.    pCol->
9a50: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
9a60: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a  e3AffinityType(z
9a70: 54 79 70 65 2c 20 70 43 6f 6c 29 3b 0a 20 20 20  Type, pCol);.   
9a80: 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
9a90: 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41 53 54 59  |= COLFLAG_HASTY
9aa0: 50 45 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 43 6f  PE;.  }.  p->nCo
9ab0: 6c 2b 2b 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63  l++;.  pParse->c
9ac0: 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20  onstraintName.n 
9ad0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  = 0;.}../*.** Th
9ae0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
9af0: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
9b00: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
9b10: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
9b20: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
9b30: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
9b40: 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e  A "NOT NULL" con
9b50: 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62  straint has.** b
9b60: 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f  een seen on a co
9b70: 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  lumn.  This rout
9b80: 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74  ine sets the not
9b90: 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20  Null flag on.** 
9ba0: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  the column curre
9bb0: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
9bc0: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
9bd0: 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75   sqlite3AddNotNu
9be0: 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ll(Parse *pParse
9bf0: 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a  , int onError){.
9c00: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f    Table *p;.  Co
9c10: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 70 20  lumn *pCol;.  p 
9c20: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
9c30: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
9c40: 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c  || NEVER(p->nCol
9c50: 3c 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  <1) ) return;.  
9c60: 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b  pCol = &p->aCol[
9c70: 70 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 70 43  p->nCol-1];.  pC
9c80: 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75  ol->notNull = (u
9c90: 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 2d 3e  8)onError;.  p->
9ca0: 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48  tabFlags |= TF_H
9cb0: 61 73 4e 6f 74 4e 75 6c 6c 3b 0a 0a 20 20 2f 2a  asNotNull;..  /*
9cc0: 20 53 65 74 20 74 68 65 20 75 6e 69 71 4e 6f 74   Set the uniqNot
9cd0: 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 20 61 6e 79  Null flag on any
9ce0: 20 55 4e 49 51 55 45 20 6f 72 20 50 4b 20 69 6e   UNIQUE or PK in
9cf0: 64 65 78 65 73 20 61 6c 72 65 61 64 79 20 63 72  dexes already cr
9d00: 65 61 74 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68  eated.  ** on th
9d10: 69 73 20 63 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a 20  is column.  */. 
9d20: 20 69 66 28 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c   if( pCol->colFl
9d30: 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 55 4e  ags & COLFLAG_UN
9d40: 49 51 55 45 20 29 7b 0a 20 20 20 20 49 6e 64 65  IQUE ){.    Inde
9d50: 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72  x *pIdx;.    for
9d60: 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b  (pIdx=p->pIndex;
9d70: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
9d80: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
9d90: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 4b  assert( pIdx->nK
9da0: 65 79 43 6f 6c 3d 3d 31 20 26 26 20 70 49 64 78  eyCol==1 && pIdx
9db0: 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
9dc0: 6e 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ne );.      if( 
9dd0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30  pIdx->aiColumn[0
9de0: 5d 3d 3d 70 2d 3e 6e 43 6f 6c 2d 31 20 29 7b 0a  ]==p->nCol-1 ){.
9df0: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 75 6e          pIdx->un
9e00: 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20  iqNotNull = 1;. 
9e10: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9e20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74  .}../*.** Scan t
9e30: 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e  he column type n
9e40: 61 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74  ame zType (lengt
9e50: 68 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74  h nType) and ret
9e60: 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63  urn the.** assoc
9e70: 69 61 74 65 64 20 61 66 66 69 6e 69 74 79 20 74  iated affinity t
9e80: 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ype..**.** This 
9e90: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63  routine does a c
9ea0: 61 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20  ase-independent 
9eb0: 73 65 61 72 63 68 20 6f 66 20 7a 54 79 70 65 20  search of zType 
9ec0: 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75 62 73  for the .** subs
9ed0: 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 66 6f  trings in the fo
9ee0: 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20 49  llowing table. I
9ef0: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62  f one of the sub
9f00: 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f  strings is.** fo
9f10: 75 6e 64 2c 20 74 68 65 20 63 6f 72 72 65 73 70  und, the corresp
9f20: 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69 74 79 20  onding affinity 
9f30: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
9f40: 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a  zType contains.*
9f50: 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  * more than one 
9f60: 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67  of the substring
9f70: 73 2c 20 65 6e 74 72 69 65 73 20 74 6f 77 61 72  s, entries towar
9f80: 64 20 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a  d the top of .**
9f90: 20 74 68 65 20 74 61 62 6c 65 20 74 61 6b 65 20   the table take 
9fa0: 70 72 69 6f 72 69 74 79 2e 20 46 6f 72 20 65 78  priority. For ex
9fb0: 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70 65 20  ample, if zType 
9fc0: 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a  is 'BLOBINT', .*
9fd0: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  * SQLITE_AFF_INT
9fe0: 45 47 45 52 20 69 73 20 72 65 74 75 72 6e 65 64  EGER is returned
9ff0: 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e  ..**.** Substrin
a000: 67 20 20 20 20 20 7c 20 41 66 66 69 6e 69 74 79  g     | Affinity
a010: 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
a020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a030: 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20  ----.** 'INT'   
a040: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
a050: 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43  FF_INTEGER.** 'C
a060: 48 41 52 27 20 20 20 20 20 20 20 20 7c 20 53 51  HAR'        | SQ
a070: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
a080: 20 27 43 4c 4f 42 27 20 20 20 20 20 20 20 20 7c   'CLOB'        |
a090: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
a0a0: 0a 2a 2a 20 27 54 45 58 54 27 20 20 20 20 20 20  .** 'TEXT'      
a0b0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54    | SQLITE_AFF_T
a0c0: 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20  EXT.** 'BLOB'   
a0d0: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
a0e0: 46 5f 42 4c 4f 42 0a 2a 2a 20 27 52 45 41 4c 27  F_BLOB.** 'REAL'
a0f0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
a100: 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c  _AFF_REAL.** 'FL
a110: 4f 41 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OA'        | SQL
a120: 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20  ITE_AFF_REAL.** 
a130: 27 44 4f 55 42 27 20 20 20 20 20 20 20 20 7c 20  'DOUB'        | 
a140: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
a150: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66  **.** If none of
a160: 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20   the substrings 
a170: 69 6e 20 74 68 65 20 61 62 6f 76 65 20 74 61 62  in the above tab
a180: 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a  le are found,.**
a190: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
a1a0: 52 49 43 20 69 73 20 72 65 74 75 72 6e 65 64 2e  RIC is returned.
a1b0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
a1c0: 41 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e  AffinityType(con
a1d0: 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20 43 6f  st char *zIn, Co
a1e0: 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b 0a 20 20 75  lumn *pCol){.  u
a1f0: 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72  32 h = 0;.  char
a200: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
a210: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e  F_NUMERIC;.  con
a220: 73 74 20 63 68 61 72 20 2a 7a 43 68 61 72 20 3d  st char *zChar =
a230: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 7a   0;..  assert( z
a240: 49 6e 21 3d 30 20 29 3b 0a 20 20 77 68 69 6c 65  In!=0 );.  while
a250: 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20 20 20  ( zIn[0] ){.    
a260: 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c  h = (h<<8) + sql
a270: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
a280: 5b 28 2a 7a 49 6e 29 26 30 78 66 66 5d 3b 0a 20  [(*zIn)&0xff];. 
a290: 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66     zIn++;.    if
a2a0: 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b  ( h==(('c'<<24)+
a2b0: 28 27 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c  ('h'<<16)+('a'<<
a2c0: 38 29 2b 27 72 27 29 20 29 7b 20 20 20 20 20 20  8)+'r') ){      
a2d0: 20 20 20 20 20 20 20 2f 2a 20 43 48 41 52 20 2a         /* CHAR *
a2e0: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
a2f0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
a300: 20 20 20 20 20 7a 43 68 61 72 20 3d 20 7a 49 6e       zChar = zIn
a310: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
a320: 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27  h==(('c'<<24)+('
a330: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
a340: 2b 27 62 27 29 20 29 7b 20 20 20 20 20 20 20 2f  +'b') ){       /
a350: 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20  * CLOB */.      
a360: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
a370: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _TEXT;.    }else
a380: 20 69 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32   if( h==(('t'<<2
a390: 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 78  4)+('e'<<16)+('x
a3a0: 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20  '<<8)+'t') ){   
a3b0: 20 20 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20      /* TEXT */. 
a3c0: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
a3d0: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
a3e0: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
a3f0: 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  b'<<24)+('l'<<16
a400: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20  )+('o'<<8)+'b') 
a410: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42           /* BLOB
a420: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 28   */.        && (
a430: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
a440: 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d 3d  NUMERIC || aff==
a450: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 29  SQLITE_AFF_REAL)
a460: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
a470: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b  SQLITE_AFF_BLOB;
a480: 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e 5b 30  .      if( zIn[0
a490: 5d 3d 3d 27 28 27 20 29 20 7a 43 68 61 72 20 3d  ]=='(' ) zChar =
a4a0: 20 7a 49 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51   zIn;.#ifndef SQ
a4b0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
a4c0: 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c  NG_POINT.    }el
a4d0: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c  se if( h==(('r'<
a4e0: 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28  <24)+('e'<<16)+(
a4f0: 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20  'a'<<8)+'l')    
a500: 20 20 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f        /* REAL */
a510: 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d  .        && aff=
a520: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
a530: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66  RIC ){.      aff
a540: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   = SQLITE_AFF_RE
a550: 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  AL;.    }else if
a560: 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b  ( h==(('f'<<24)+
a570: 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c  ('l'<<16)+('o'<<
a580: 38 29 2b 27 61 27 29 20 20 20 20 20 20 20 20 20  8)+'a')         
a590: 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20   /* FLOA */.    
a5a0: 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49      && aff==SQLI
a5b0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
a5c0: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
a5d0: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20  LITE_AFF_REAL;. 
a5e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
a5f0: 28 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c  (('d'<<24)+('o'<
a600: 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62  <16)+('u'<<8)+'b
a610: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ')          /* D
a620: 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  OUB */.        &
a630: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
a640: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
a650: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
a660: 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66  AFF_REAL;.#endif
a670: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
a680: 68 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28  h&0x00FFFFFF)==(
a690: 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c  ('i'<<16)+('n'<<
a6a0: 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a  8)+'t') ){    /*
a6b0: 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66   INT */.      af
a6c0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  f = SQLITE_AFF_I
a6d0: 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72  NTEGER;.      br
a6e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
a6f0: 20 20 2f 2a 20 49 66 20 70 43 6f 6c 20 69 73 20    /* If pCol is 
a700: 6e 6f 74 20 4e 55 4c 4c 2c 20 73 74 6f 72 65 20  not NULL, store 
a710: 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  an estimate of t
a720: 68 65 20 66 69 65 6c 64 20 73 69 7a 65 2e 20 20  he field size.  
a730: 54 68 65 0a 20 20 2a 2a 20 65 73 74 69 6d 61 74  The.  ** estimat
a740: 65 20 69 73 20 73 63 61 6c 65 64 20 73 6f 20 74  e is scaled so t
a750: 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
a760: 61 6e 20 69 6e 74 65 67 65 72 20 69 73 20 31 2e  an integer is 1.
a770: 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 6f 6c 20    */.  if( pCol 
a780: 29 7b 0a 20 20 20 20 69 6e 74 20 76 20 3d 20 30  ){.    int v = 0
a790: 3b 20 20 20 2f 2a 20 64 65 66 61 75 6c 74 20 73  ;   /* default s
a7a0: 69 7a 65 20 69 73 20 61 70 70 72 6f 78 20 34 20  ize is approx 4 
a7b0: 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 66 28  bytes */.    if(
a7c0: 20 61 66 66 3c 53 51 4c 49 54 45 5f 41 46 46 5f   aff<SQLITE_AFF_
a7d0: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
a7e0: 20 69 66 28 20 7a 43 68 61 72 20 29 7b 0a 20 20   if( zChar ){.  
a7f0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 43 68        while( zCh
a800: 61 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20  ar[0] ){.       
a810: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73     if( sqlite3Is
a820: 64 69 67 69 74 28 7a 43 68 61 72 5b 30 5d 29 20  digit(zChar[0]) 
a830: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
a840: 2a 20 42 4c 4f 42 28 6b 29 2c 20 56 41 52 43 48  * BLOB(k), VARCH
a850: 41 52 28 6b 29 2c 20 43 48 41 52 28 6b 29 20 2d  AR(k), CHAR(k) -
a860: 3e 20 72 3d 28 6b 2f 34 2b 31 29 20 2a 2f 0a 20  > r=(k/4+1) */. 
a870: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
a880: 65 33 47 65 74 49 6e 74 33 32 28 7a 43 68 61 72  e3GetInt32(zChar
a890: 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20  , &v);.         
a8a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a8b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
a8c0: 7a 43 68 61 72 2b 2b 3b 0a 20 20 20 20 20 20 20  zChar++;.       
a8d0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
a8e0: 20 20 20 20 20 20 20 20 76 20 3d 20 31 36 3b 20          v = 16; 
a8f0: 20 20 2f 2a 20 42 4c 4f 42 2c 20 54 45 58 54 2c    /* BLOB, TEXT,
a900: 20 43 4c 4f 42 20 2d 3e 20 72 3d 35 20 20 28 61   CLOB -> r=5  (a
a910: 70 70 72 6f 78 20 32 30 20 62 79 74 65 73 29 2a  pprox 20 bytes)*
a920: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
a930: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
a940: 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45  ABLE_SORTER_REFE
a950: 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20 76  RENCES.    if( v
a960: 3e 3d 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  >=sqlite3GlobalC
a970: 6f 6e 66 69 67 2e 73 7a 53 6f 72 74 65 72 52 65  onfig.szSorterRe
a980: 66 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  f ){.      pCol-
a990: 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c  >colFlags |= COL
a9a0: 46 4c 41 47 5f 53 4f 52 54 45 52 52 45 46 3b 0a  FLAG_SORTERREF;.
a9b0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
a9c0: 20 76 20 3d 20 76 2f 34 20 2b 20 31 3b 0a 20 20   v = v/4 + 1;.  
a9d0: 20 20 69 66 28 20 76 3e 32 35 35 20 29 20 76 20    if( v>255 ) v 
a9e0: 3d 20 32 35 35 3b 0a 20 20 20 20 70 43 6f 6c 2d  = 255;.    pCol-
a9f0: 3e 73 7a 45 73 74 20 3d 20 76 3b 0a 20 20 7d 0a  >szEst = v;.  }.
aa00: 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a    return aff;.}.
aa10: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65  ./*.** The expre
aa20: 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66  ssion is the def
aa30: 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
aa40: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
aa50: 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a   added column.**
aa60: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 75   of the table cu
aa70: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
aa80: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
aa90: 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20  * Default value 
aaa0: 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74  expressions must
aab0: 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52   be constant.  R
aac0: 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f  aise an exceptio
aad0: 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  n if this.** is 
aae0: 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a  not the case..**
aaf0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ab00: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
ab10: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
ab20: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
ab30: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
ab40: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
ab50: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
ab60: 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61  ite3AddDefaultVa
ab70: 6c 75 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  lue(.  Parse *pP
ab80: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
ab90: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
aba0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
abb0: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
abc0: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20 65   /* The parsed e
abd0: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65  xpression of the
abe0: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a   default value *
abf0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
ac00: 7a 53 74 61 72 74 2c 20 20 20 20 20 20 2f 2a 20  zStart,      /* 
ac10: 53 74 61 72 74 20 6f 66 20 74 68 65 20 64 65 66  Start of the def
ac20: 61 75 6c 74 20 76 61 6c 75 65 20 74 65 78 74 20  ault value text 
ac30: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
ac40: 2a 7a 45 6e 64 20 20 20 20 20 20 20 20 20 2f 2a  *zEnd         /*
ac50: 20 46 69 72 73 74 20 63 68 61 72 61 63 74 65 72   First character
ac60: 20 70 61 73 74 20 65 6e 64 20 6f 66 20 64 65 66   past end of def
ac70: 61 75 74 20 76 61 6c 75 65 20 74 65 78 74 20 2a  aut value text *
ac80: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
ac90: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
aca0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
acb0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
acc0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
acd0: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 21 3d 30  able;.  if( p!=0
ace0: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26   ){.    pCol = &
acf0: 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c  (p->aCol[p->nCol
ad00: 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73  -1]);.    if( !s
ad10: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
ad20: 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70  tantOrFunction(p
ad30: 45 78 70 72 2c 20 64 62 2d 3e 69 6e 69 74 2e 62  Expr, db->init.b
ad40: 75 73 79 29 20 29 7b 0a 20 20 20 20 20 20 73 71  usy) ){.      sq
ad50: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
ad60: 61 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76  arse, "default v
ad70: 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b  alue of column [
ad80: 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  %s] is not const
ad90: 61 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ant",.          
ada0: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
adb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
adc0: 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 45 78 70  * A copy of pExp
add0: 72 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61  r is used instea
ade0: 64 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  d of the origina
adf0: 6c 2c 20 61 73 20 70 45 78 70 72 20 63 6f 6e 74  l, as pExpr cont
ae00: 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ains.      ** to
ae10: 6b 65 6e 73 20 74 68 61 74 20 70 6f 69 6e 74 20  kens that point 
ae20: 74 6f 20 76 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f  to volatile memo
ae30: 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ry..      */.   
ae40: 20 20 20 45 78 70 72 20 78 3b 0a 20 20 20 20 20     Expr x;.     
ae50: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
ae60: 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66  te(db, pCol->pDf
ae70: 6c 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  lt);.      memse
ae80: 74 28 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&x, 0, sizeof(
ae90: 78 29 29 3b 0a 20 20 20 20 20 20 78 2e 6f 70 20  x));.      x.op 
aea0: 3d 20 54 4b 5f 53 50 41 4e 3b 0a 20 20 20 20 20  = TK_SPAN;.     
aeb0: 20 78 2e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 73 71   x.u.zToken = sq
aec0: 6c 69 74 65 33 44 62 53 70 61 6e 44 75 70 28 64  lite3DbSpanDup(d
aed0: 62 2c 20 7a 53 74 61 72 74 2c 20 7a 45 6e 64 29  b, zStart, zEnd)
aee0: 3b 0a 20 20 20 20 20 20 78 2e 70 4c 65 66 74 20  ;.      x.pLeft 
aef0: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 78  = pExpr;.      x
af00: 2e 66 6c 61 67 73 20 3d 20 45 50 5f 53 6b 69 70  .flags = EP_Skip
af10: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44  ;.      pCol->pD
af20: 66 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  flt = sqlite3Exp
af30: 72 44 75 70 28 64 62 2c 20 26 78 2c 20 45 58 50  rDup(db, &x, EXP
af40: 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
af50: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
af60: 65 28 64 62 2c 20 78 2e 75 2e 7a 54 6f 6b 65 6e  e(db, x.u.zToken
af70: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
af80: 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
af90: 45 43 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ECT ){.    sqlit
afa0: 65 33 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d 61  e3RenameExprUnma
afb0: 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  p(pParse, pExpr)
afc0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
afd0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
afe0: 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  xpr);.}../*.** B
aff0: 61 63 6b 77 61 72 64 73 20 43 6f 6d 70 61 74 69  ackwards Compati
b000: 62 69 6c 69 74 79 20 48 61 63 6b 3a 0a 2a 2a 20  bility Hack:.** 
b010: 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c 20 76  .** Historical v
b020: 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
b030: 65 20 61 63 63 65 70 74 65 64 20 73 74 72 69 6e  e accepted strin
b040: 67 73 20 61 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d  gs as column nam
b050: 65 73 20 69 6e 0a 2a 2a 20 69 6e 64 65 78 65 73  es in.** indexes
b060: 20 61 6e 64 20 50 52 49 4d 41 52 59 20 4b 45 59   and PRIMARY KEY
b070: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 6e 64   constraints and
b080: 20 69 6e 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   in UNIQUE const
b090: 72 61 69 6e 74 73 2e 20 20 45 78 61 6d 70 6c 65  raints.  Example
b0a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41  :.**.**     CREA
b0b0: 54 45 20 54 41 42 4c 45 20 78 79 7a 28 61 2c 62  TE TABLE xyz(a,b
b0c0: 2c 63 2c 64 2c 65 2c 50 52 49 4d 41 52 59 20 4b  ,c,d,e,PRIMARY K
b0d0: 45 59 28 27 61 27 29 2c 55 4e 49 51 55 45 28 27  EY('a'),UNIQUE('
b0e0: 62 27 2c 27 63 27 20 43 4f 4c 4c 41 54 45 20 74  b','c' COLLATE t
b0f0: 72 69 6d 29 0a 2a 2a 20 20 20 20 20 43 52 45 41  rim).**     CREA
b100: 54 45 20 49 4e 44 45 58 20 61 62 63 20 4f 4e 20  TE INDEX abc ON 
b110: 78 79 7a 28 27 63 27 2c 27 64 27 20 44 45 53 43  xyz('c','d' DESC
b120: 2c 27 65 27 20 43 4f 4c 4c 41 54 45 20 6e 6f 63  ,'e' COLLATE noc
b130: 61 73 65 20 44 45 53 43 29 3b 0a 2a 2a 0a 2a 2a  ase DESC);.**.**
b140: 20 54 68 69 73 20 69 73 20 67 6f 6f 66 79 2e 20   This is goofy. 
b150: 20 42 75 74 20 74 6f 20 70 72 65 73 65 72 76 65   But to preserve
b160: 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
b170: 74 69 62 69 6c 69 74 79 20 77 65 20 63 6f 6e 74  tibility we cont
b180: 69 6e 75 65 20 74 6f 0a 2a 2a 20 61 63 63 65 70  inue to.** accep
b190: 74 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  t it.  This rout
b1a0: 69 6e 65 20 64 6f 65 73 20 74 68 65 20 6e 65 63  ine does the nec
b1b0: 65 73 73 61 72 79 20 63 6f 6e 76 65 72 73 69 6f  essary conversio
b1c0: 6e 2e 20 20 49 74 20 63 6f 6e 76 65 72 74 73 0a  n.  It converts.
b1d0: 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ** the expressio
b1e0: 6e 20 67 69 76 65 6e 20 69 6e 20 69 74 73 20 61  n given in its a
b1f0: 72 67 75 6d 65 6e 74 20 66 72 6f 6d 20 61 20 54  rgument from a T
b200: 4b 5f 53 54 52 49 4e 47 20 69 6e 74 6f 20 61 20  K_STRING into a 
b210: 54 4b 5f 49 44 0a 2a 2a 20 69 66 20 74 68 65 20  TK_ID.** if the 
b220: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6a 75  expression is ju
b230: 73 74 20 61 20 54 4b 5f 53 54 52 49 4e 47 20 77  st a TK_STRING w
b240: 69 74 68 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20  ith an optional 
b250: 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73 65 2e 0a  COLLATE clause..
b260: 2a 2a 20 49 66 20 74 68 65 20 65 70 78 72 65 73  ** If the epxres
b270: 73 69 6f 6e 20 69 73 20 61 6e 79 74 68 69 6e 67  sion is anything
b280: 20 6f 74 68 65 72 20 74 68 61 6e 20 54 4b 5f 53   other than TK_S
b290: 54 52 49 4e 47 2c 20 74 68 65 20 65 78 70 72 65  TRING, the expre
b2a0: 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 75 6e 63 68  ssion is.** unch
b2b0: 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  anged..*/.static
b2c0: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 72   void sqlite3Str
b2d0: 69 6e 67 54 6f 49 64 28 45 78 70 72 20 2a 70 29  ingToId(Expr *p)
b2e0: 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  {.  if( p->op==T
b2f0: 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20  K_STRING ){.    
b300: 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a 20  p->op = TK_ID;. 
b310: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70   }else if( p->op
b320: 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20  ==TK_COLLATE && 
b330: 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  p->pLeft->op==TK
b340: 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 70  _STRING ){.    p
b350: 2d 3e 70 4c 65 66 74 2d 3e 6f 70 20 3d 20 54 4b  ->pLeft->op = TK
b360: 5f 49 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _ID;.  }.}../*.*
b370: 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68 65 20  * Designate the 
b380: 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20  PRIMARY KEY for 
b390: 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73  the table.  pLis
b3a0: 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e  t is a list of n
b3b0: 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75  ames .** of colu
b3c0: 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68  mns that form th
b3d0: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20  e primary key.  
b3e0: 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c  If pList is NULL
b3f0: 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f  , then the.** mo
b400: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
b410: 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  d column of the 
b420: 74 61 62 6c 65 20 69 73 20 74 68 65 20 70 72 69  table is the pri
b430: 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20  mary key..**.** 
b440: 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65  A table can have
b450: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69   at most one pri
b460: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68  mary key.  If th
b470: 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  e table already 
b480: 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79  has.** a primary
b490: 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20 69   key (and this i
b4a0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69  s the second pri
b4b0: 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63  mary key) then c
b4c0: 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f  reate an.** erro
b4d0: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
b4e0: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f  PRIMARY KEY is o
b4f0: 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  n a single colum
b500: 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79 70 65  n whose datatype
b510: 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20   is INTEGER,.** 
b520: 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79  then we will try
b530: 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c   to use that col
b540: 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 69 64  umn as the rowid
b550: 2e 20 20 53 65 74 20 74 68 65 20 54 61 62 6c 65  .  Set the Table
b560: 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20  .iPKey.** field 
b570: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64  of the table und
b580: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
b590: 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78 20  to be the index 
b5a0: 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45  of the.** INTEGE
b5b0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  R PRIMARY KEY co
b5c0: 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b  lumn.  Table.iPK
b5d0: 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20  ey is set to -1 
b5e0: 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  if there is.** n
b5f0: 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  o INTEGER PRIMAR
b600: 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Y KEY..**.** If 
b610: 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61  the key is not a
b620: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
b630: 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61  Y KEY, then crea
b640: 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69  te a unique.** i
b650: 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79  ndex for the key
b660: 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63  .  No index is c
b670: 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47  reated for INTEG
b680: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e  ER PRIMARY KEYs.
b690: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
b6a0: 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 0a 20  AddPrimaryKey(. 
b6b0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
b6c0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
b6d0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
b6e0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20  ist *pList,  /* 
b6f0: 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 20 6e 61  List of field na
b700: 6d 65 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mes to be indexe
b710: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  d */.  int onErr
b720: 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57 68 61 74  or,      /* What
b730: 20 74 6f 20 64 6f 20 77 69 74 68 20 61 20 75 6e   to do with a un
b740: 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63  iqueness conflic
b750: 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49  t */.  int autoI
b760: 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65  nc,      /* True
b770: 20 69 66 20 74 68 65 20 41 55 54 4f 49 4e 43 52   if the AUTOINCR
b780: 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20 69 73  EMENT keyword is
b790: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
b7a0: 74 20 73 6f 72 74 4f 72 64 65 72 20 20 20 20 20  t sortOrder     
b7b0: 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  /* SQLITE_SO_ASC
b7c0: 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45   or SQLITE_SO_DE
b7d0: 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  SC */.){.  Table
b7e0: 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   *pTab = pParse-
b7f0: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 43 6f  >pNewTable;.  Co
b800: 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a  lumn *pCol = 0;.
b810: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c    int iCol = -1,
b820: 20 69 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b   i;.  int nTerm;
b830: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
b840: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
b850: 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54  y_exit;.  if( pT
b860: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
b870: 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 20  F_HasPrimaryKey 
b880: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
b890: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
b8a0: 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25        "table \"%
b8b0: 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61  s\" has more tha
b8c0: 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65  n one primary ke
b8d0: 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  y", pTab->zName)
b8e0: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61  ;.    goto prima
b8f0: 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d  ry_key_exit;.  }
b900: 0a 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  .  pTab->tabFlag
b910: 73 20 7c 3d 20 54 46 5f 48 61 73 50 72 69 6d 61  s |= TF_HasPrima
b920: 72 79 4b 65 79 3b 0a 20 20 69 66 28 20 70 4c 69  ryKey;.  if( pLi
b930: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f  st==0 ){.    iCo
b940: 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d  l = pTab->nCol -
b950: 20 31 3b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26   1;.    pCol = &
b960: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
b970: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46  ;.    pCol->colF
b980: 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
b990: 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 6e 54 65  PRIMKEY;.    nTe
b9a0: 72 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  rm = 1;.  }else{
b9b0: 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 70 4c 69  .    nTerm = pLi
b9c0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66  st->nExpr;.    f
b9d0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b  or(i=0; i<nTerm;
b9e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
b9f0: 72 20 2a 70 43 45 78 70 72 20 3d 20 73 71 6c 69  r *pCExpr = sqli
ba00: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
ba10: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  te(pList->a[i].p
ba20: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 61 73 73  Expr);.      ass
ba30: 65 72 74 28 20 70 43 45 78 70 72 21 3d 30 20 29  ert( pCExpr!=0 )
ba40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
ba50: 74 72 69 6e 67 54 6f 49 64 28 70 43 45 78 70 72  tringToId(pCExpr
ba60: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 45  );.      if( pCE
ba70: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  xpr->op==TK_ID )
ba80: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
ba90: 63 68 61 72 20 2a 7a 43 4e 61 6d 65 20 3d 20 70  char *zCName = p
baa0: 43 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  CExpr->u.zToken;
bab0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 43 6f  .        for(iCo
bac0: 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  l=0; iCol<pTab->
bad0: 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
bae0: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
baf0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 4e 61  ite3StrICmp(zCNa
bb00: 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  me, pTab->aCol[i
bb10: 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  Col].zName)==0 )
bb20: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  {.            pC
bb30: 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c  ol = &pTab->aCol
bb40: 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 20 20  [iCol];.        
bb50: 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
bb60: 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52  gs |= COLFLAG_PR
bb70: 49 4d 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 20  IMKEY;.         
bb80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bb90: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
bba0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
bbb0: 7d 0a 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d 31  }.  if( nTerm==1
bbc0: 0a 20 20 20 26 26 20 70 43 6f 6c 0a 20 20 20 26  .   && pCol.   &
bbd0: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
bbe0: 28 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79  (sqlite3ColumnTy
bbf0: 70 65 28 70 43 6f 6c 2c 22 22 29 2c 20 22 49 4e  pe(pCol,""), "IN
bc00: 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 26 26  TEGER")==0.   &&
bc10: 20 73 6f 72 74 4f 72 64 65 72 21 3d 53 51 4c 49   sortOrder!=SQLI
bc20: 54 45 5f 53 4f 5f 44 45 53 43 0a 20 20 29 7b 0a  TE_SO_DESC.  ){.
bc30: 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d      if( IN_RENAM
bc40: 45 5f 4f 42 4a 45 43 54 20 26 26 20 70 4c 69 73  E_OBJECT && pLis
bc50: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
bc60: 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d  e3RenameTokenRem
bc70: 61 70 28 70 50 61 72 73 65 2c 20 26 70 54 61 62  ap(pParse, &pTab
bc80: 2d 3e 69 50 4b 65 79 2c 20 70 4c 69 73 74 2d 3e  ->iPKey, pList->
bc90: 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
bca0: 20 7d 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b   }.    pTab->iPK
bcb0: 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70  ey = iCol;.    p
bcc0: 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28  Tab->keyConf = (
bcd0: 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20  u8)onError;.    
bce0: 61 73 73 65 72 74 28 20 61 75 74 6f 49 6e 63 3d  assert( autoInc=
bcf0: 3d 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31  =0 || autoInc==1
bd00: 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61   );.    pTab->ta
bd10: 62 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e  bFlags |= autoIn
bd20: 63 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  c*TF_Autoincreme
bd30: 6e 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  nt;.    if( pLis
bd40: 74 20 29 20 70 50 61 72 73 65 2d 3e 69 50 6b 53  t ) pParse->iPkS
bd50: 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74  ortOrder = pList
bd60: 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
bd70: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75  ;.  }else if( au
bd80: 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66  toInc ){.#ifndef
bd90: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
bda0: 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73  OINCREMENT.    s
bdb0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
bdc0: 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52  Parse, "AUTOINCR
bdd0: 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c  EMENT is only al
bde0: 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20  lowed on an ".  
bdf0: 20 20 20 20 20 22 49 4e 54 45 47 45 52 20 50 52       "INTEGER PR
be00: 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e  IMARY KEY");.#en
be10: 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
be20: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
be30: 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30  dex(pParse, 0, 0
be40: 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72  , 0, pList, onEr
be50: 72 6f 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  ror, 0,.        
be60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be70: 20 20 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c     0, sortOrder,
be80: 20 30 2c 20 53 51 4c 49 54 45 5f 49 44 58 54 59   0, SQLITE_IDXTY
be90: 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 29 3b 0a  PE_PRIMARYKEY);.
bea0: 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20      pList = 0;. 
beb0: 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f   }..primary_key_
bec0: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45  exit:.  sqlite3E
bed0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
bee0: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29  arse->db, pList)
bef0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
bf00: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 43  *.** Add a new C
bf10: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
bf20: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
bf30: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
bf40: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
bf50: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 68 65  id sqlite3AddChe
bf60: 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  ckConstraint(.  
bf70: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
bf80: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
bf90: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
bfa0: 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20 54  pCheckExpr  /* T
bfb0: 68 65 20 63 68 65 63 6b 20 65 78 70 72 65 73 73  he check express
bfc0: 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  ion */.){.#ifnde
bfd0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
bfe0: 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  ECK.  Table *pTa
bff0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
c000: 54 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33  Table;.  sqlite3
c010: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
c020: 62 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26 26  b;.  if( pTab &&
c030: 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41   !IN_DECLARE_VTA
c040: 42 0a 20 20 20 26 26 20 21 73 71 6c 69 74 65 33  B.   && !sqlite3
c050: 42 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79 28  BtreeIsReadonly(
c060: 64 62 2d 3e 61 44 62 5b 64 62 2d 3e 69 6e 69 74  db->aDb[db->init
c070: 2e 69 44 62 5d 2e 70 42 74 29 0a 20 20 29 7b 0a  .iDb].pBt).  ){.
c080: 20 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63 6b      pTab->pCheck
c090: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
c0a0: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
c0b0: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 70   pTab->pCheck, p
c0c0: 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 20 20  CheckExpr);.    
c0d0: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73  if( pParse->cons
c0e0: 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a  traintName.n ){.
c0f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
c100: 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
c110: 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65 63  rse, pTab->pChec
c120: 6b 2c 20 26 70 50 61 72 73 65 2d 3e 63 6f 6e 73  k, &pParse->cons
c130: 74 72 61 69 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a  traintName, 1);.
c140: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65      }.  }else.#e
c150: 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ndif.  {.    sql
c160: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
c170: 50 61 72 73 65 2d 3e 64 62 2c 20 70 43 68 65 63  Parse->db, pChec
c180: 6b 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  kExpr);.  }.}../
c190: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c  *.** Set the col
c1a0: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
c1b0: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
c1c0: 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c  ntly parsed tabl
c1d0: 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74  e column.** to t
c1e0: 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e  he CollSeq given
c1f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
c200: 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28  3AddCollateType(
c210: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
c220: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
c230: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
c240: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c   i;.  char *zCol
c250: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
c260: 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61 6d 65  /* Dequoted name
c270: 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65   of collation se
c280: 71 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69  quence */.  sqli
c290: 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
c2a0: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
c2b0: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
c2c0: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
c2d0: 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50 61  ol-1;.  db = pPa
c2e0: 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c  rse->db;.  zColl
c2f0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
c300: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b  omToken(db, pTok
c310: 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c  en);.  if( !zCol
c320: 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69  l ) return;..  i
c330: 66 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  f( sqlite3Locate
c340: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
c350: 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 49 6e  zColl) ){.    In
c360: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 73  dex *pIdx;.    s
c370: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
c380: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c   p->aCol[i].zCol
c390: 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b  l);.    p->aCol[
c3a0: 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c  i].zColl = zColl
c3b0: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  ;.  .    /* If t
c3c0: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63  he column is dec
c3d0: 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e  lared as "<name>
c3e0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c   PRIMARY KEY COL
c3f0: 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20  LATE <type>",.  
c400: 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64    ** then an ind
c410: 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ex may have been
c420: 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73   created on this
c430: 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74   column before t
c440: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74  he.    ** collat
c450: 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64  ion type was add
c460: 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73  ed. Correct this
c470: 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61   if it is the ca
c480: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  se..    */.    f
c490: 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65  or(pIdx=p->pInde
c4a0: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
c4b0: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
c4c0: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
c4d0: 6e 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20  nKeyCol==1 );.  
c4e0: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
c4f0: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a  Column[0]==i ){.
c500: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
c510: 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f  Coll[0] = p->aCo
c520: 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  l[i].zColl;.    
c530: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
c540: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  e{.    sqlite3Db
c550: 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
c560: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
c570: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
c580: 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  rns the collatio
c590: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64  n sequence for d
c5a0: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74  atabase native t
c5b0: 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20  ext.** encoding 
c5c0: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
c5d0: 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20  e string zName, 
c5e0: 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a  length nName..**
c5f0: 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65  .** If the reque
c600: 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  sted collation s
c610: 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61  equence is not a
c620: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74  vailable, or not
c630: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e   available.** in
c640: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
c650: 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74  tive encoding, t
c660: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
c670: 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20  tory is invoked 
c680: 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74  to.** request it
c690: 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  . If the collati
c6a0: 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20  on factory does 
c6b0: 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20  not supply such 
c6c0: 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61  a sequence,.** a
c6d0: 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  nd the sequence 
c6e0: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  is available in 
c6f0: 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63  another text enc
c700: 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74  oding, then that
c710: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
c720: 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
c730: 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66  f no versions of
c740: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
c750: 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e  ollations sequen
c760: 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ce are available
c770: 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20  , or.** another 
c780: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
c790: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
c7a0: 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nd an error mess
c7b0: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
c7c0: 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a  .** pParse..**.*
c7d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
c7e0: 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
c7f0: 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f  nd sqlite3FindCo
c800: 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20 72  llSeq().  This r
c810: 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65  outine.** invoke
c820: 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
c830: 66 61 63 74 6f 72 79 20 69 66 20 74 68 65 20 6e  factory if the n
c840: 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63  amed collation c
c850: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a  annot be found.*
c860: 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 20  * and generates 
c870: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
c880: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
c890: 3a 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  : sqlite3FindCol
c8a0: 6c 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33 47  lSeq(), sqlite3G
c8b0: 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43  etCollSeq().*/.C
c8c0: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c  ollSeq *sqlite3L
c8d0: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72  ocateCollSeq(Par
c8e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
c8f0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
c900: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
c910: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38  pParse->db;.  u8
c920: 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a   enc = ENC(db);.
c930: 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20    u8 initbusy = 
c940: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20  db->init.busy;. 
c950: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
c960: 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
c970: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
c980: 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69  b, enc, zName, i
c990: 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20  nitbusy);.  if( 
c9a0: 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70  !initbusy && (!p
c9b0: 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e  Coll || !pColl->
c9c0: 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43 6f  xCmp) ){.    pCo
c9d0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43  ll = sqlite3GetC
c9e0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 65  ollSeq(pParse, e
c9f0: 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65  nc, pColl, zName
ca00: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
ca10: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   pColl;.}.../*.*
ca20: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
ca30: 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d  that will increm
ca40: 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63  ent the schema c
ca50: 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ookie..**.** The
ca60: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69   schema cookie i
ca70: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
ca80: 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68  ine when the sch
ca90: 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64  ema for the.** d
caa0: 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e  atabase changes.
cab0: 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68    After each sch
cac0: 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20  ema change, the 
cad0: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20  cookie value.** 
cae0: 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61  changes.  When a
caf0: 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72   process first r
cb00: 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20  eads the schema 
cb10: 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a  it records the.*
cb20: 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65  * cookie.  There
cb30: 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20  after, whenever 
cb40: 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73  it goes to acces
cb50: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a  s the database,.
cb60: 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65  ** it checks the
cb70: 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20   cookie to make 
cb80: 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20  sure the schema 
cb90: 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a  has not changed.
cba0: 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20  ** since it was 
cbb0: 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  last read..**.**
cbc0: 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f   This plan is no
cbd0: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c  t completely bul
cbe0: 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69  let-proof.  It i
cbf0: 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a  s possible for.*
cc00: 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20  * the schema to 
cc10: 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20  change multiple 
cc20: 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68  times and for th
cc30: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a  e cookie to be.*
cc40: 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72  * set back to pr
cc50: 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20  ior value.  But 
cc60: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61  schema changes a
cc70: 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a  re infrequent.**
cc80: 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69   and the probabi
cc90: 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20  lity of hitting 
cca0: 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20  the same cookie 
ccb0: 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a  value is only.**
ccc0: 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33   1 chance in 2^3
ccd0: 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66  2.  So we're saf
cce0: 65 20 65 6e 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20  e enough..**.** 
ccf0: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
cd00: 46 3a 20 52 2d 33 34 32 33 30 2d 35 36 30 34 39  F: R-34230-56049
cd10: 20 53 51 4c 69 74 65 20 61 75 74 6f 6d 61 74 69   SQLite automati
cd20: 63 61 6c 6c 79 20 69 6e 63 72 65 6d 65 6e 74 73  cally increments
cd30: 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 2d 76  .** the schema-v
cd40: 65 72 73 69 6f 6e 20 77 68 65 6e 65 76 65 72 20  ersion whenever 
cd50: 74 68 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67  the schema chang
cd60: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
cd70: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
cd80: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
cd90: 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74  nt iDb){.  sqlit
cda0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
cdb0: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  >db;.  Vdbe *v =
cdc0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
cdd0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
cde0: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
cdf0: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
ce00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ce10: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  Op3(v, OP_SetCoo
ce20: 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f  kie, iDb, BTREE_
ce30: 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20  SCHEMA_VERSION, 
ce40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ce50: 20 20 20 20 28 69 6e 74 29 28 31 2b 28 75 6e 73      (int)(1+(uns
ce60: 69 67 6e 65 64 29 64 62 2d 3e 61 44 62 5b 69 44  igned)db->aDb[iD
ce70: 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  b].pSchema->sche
ce80: 6d 61 5f 63 6f 6f 6b 69 65 29 29 3b 0a 7d 0a 0a  ma_cookie));.}..
ce90: 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68  /*.** Measure th
cea0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
ceb0: 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f  acters needed to
cec0: 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   output the give
ced0: 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e  n.** identifier.
cee0: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74    The number ret
cef0: 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61  urned includes a
cf00: 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a  ny quotes used.*
cf10: 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69  * but does not i
cf20: 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20  nclude the null 
cf30: 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a  terminator..**.*
cf40: 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 20 69  * The estimate i
cf50: 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20  s conservative. 
cf60: 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72   It might be lar
cf70: 67 65 72 20 74 68 61 74 20 77 68 61 74 20 69 73  ger that what is
cf80: 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65  .** really neede
cf90: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
cfa0: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e   identLength(con
cfb0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
cfc0: 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b  nt n;.  for(n=0;
cfd0: 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a   *z; n++, z++){.
cfe0: 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20      if( *z=='"' 
cff0: 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20  ){ n++; }.  }.  
d000: 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a  return n + 2;.}.
d010: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ./*.** The first
d020: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
d030: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75  pointer to an ou
d040: 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 65  tput buffer. The
d050: 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61   second .** para
d060: 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
d070: 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  er to an integer
d080: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
d090: 68 65 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20  he offset at.** 
d0a0: 77 68 69 63 68 20 74 6f 20 77 72 69 74 65 20 69  which to write i
d0b0: 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62  nto the output b
d0c0: 75 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63  uffer. This func
d0d0: 74 69 6f 6e 20 63 6f 70 69 65 73 20 74 68 65 0a  tion copies the.
d0e0: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  ** nul-terminate
d0f0: 64 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64  d string pointed
d100: 20 74 6f 20 62 79 20 74 68 65 20 74 68 69 72 64   to by the third
d110: 20 70 61 72 61 6d 65 74 65 72 2c 20 7a 53 69 67   parameter, zSig
d120: 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20  nedIdent,.** to 
d130: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 66  the specified of
d140: 66 73 65 74 20 69 6e 20 74 68 65 20 62 75 66 66  fset in the buff
d150: 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 20 2a  er and updates *
d160: 70 49 64 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a  pIdx to refer.**
d170: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
d180: 74 65 20 61 66 74 65 72 20 74 68 65 20 6c 61 73  te after the las
d190: 74 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 62  t byte written b
d1a0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
d1b0: 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 73  .** .** If the s
d1c0: 74 72 69 6e 67 20 7a 53 69 67 6e 65 64 49 64 65  tring zSignedIde
d1d0: 6e 74 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69  nt consists enti
d1e0: 72 65 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75  rely of alpha-nu
d1f0: 6d 65 72 69 63 0a 2a 2a 20 63 68 61 72 61 63 74  meric.** charact
d200: 65 72 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65  ers, does not be
d210: 67 69 6e 20 77 69 74 68 20 61 20 64 69 67 69 74  gin with a digit
d220: 20 61 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20 53   and is not an S
d230: 51 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74  QL keyword,.** t
d240: 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64  hen it is copied
d250: 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62   to the output b
d260: 75 66 66 65 72 20 65 78 61 63 74 6c 79 20 61 73  uffer exactly as
d270: 20 69 74 20 69 73 2e 20 4f 74 68 65 72 77 69 73   it is. Otherwis
d280: 65 2c 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f 74  e,.** it is quot
d290: 65 64 20 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d  ed using double-
d2a0: 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  quotes..*/.stati
d2b0: 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28  c void identPut(
d2c0: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49  char *z, int *pI
d2d0: 64 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65  dx, char *zSigne
d2e0: 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67  dIdent){.  unsig
d2f0: 6e 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74  ned char *zIdent
d300: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
d310: 72 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b  r*)zSignedIdent;
d320: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65  .  int i, j, nee
d330: 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70  dQuote;.  i = *p
d340: 49 64 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b  Idx;..  for(j=0;
d350: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
d360: 7b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  {.    if( !sqlit
d370: 65 33 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74  e3Isalnum(zIdent
d380: 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a  [j]) && zIdent[j
d390: 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a  ]!='_' ) break;.
d3a0: 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20    }.  needQuote 
d3b0: 3d 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74  = sqlite3Isdigit
d3c0: 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20  (zIdent[0]).    
d3d0: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
d3e0: 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49  e3KeywordCode(zI
d3f0: 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a  dent, j)!=TK_ID.
d400: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 7a              || z
d410: 49 64 65 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20 20  Ident[j]!=0.    
d420: 20 20 20 20 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b          || j==0;
d430: 0a 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  ..  if( needQuot
d440: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  e ) z[i++] = '"'
d450: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
d460: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
d470: 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e    z[i++] = zIden
d480: 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49  t[j];.    if( zI
d490: 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a  dent[j]=='"' ) z
d4a0: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d  [i++] = '"';.  }
d4b0: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
d4c0: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
d4d0: 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a  .  z[i] = 0;.  *
d4e0: 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a  pIdx = i;.}../*.
d4f0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52  ** Generate a CR
d500: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
d510: 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65  ment appropriate
d520: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a   for the given.*
d530: 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79  * table.  Memory
d540: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78   to hold the tex
d550: 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  t of the stateme
d560: 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a  nt is obtained.*
d570: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  * from sqliteMal
d580: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
d590: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
d5a0: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
d5b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
d5c0: 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74  *createTableStmt
d5d0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
d5e0: 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ble *p){.  int i
d5f0: 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a  , k, n;.  char *
d600: 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a  zStmt;.  char *z
d610: 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45  Sep, *zSep2, *zE
d620: 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  nd;.  Column *pC
d630: 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66  ol;.  n = 0;.  f
d640: 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f  or(pCol = p->aCo
d650: 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  l, i=0; i<p->nCo
d660: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
d670: 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c  .    n += identL
d680: 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  ength(pCol->zNam
d690: 65 29 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20  e) + 5;.  }.  n 
d6a0: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
d6b0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
d6c0: 6e 3c 35 30 20 29 7b 20 0a 20 20 20 20 7a 53 65  n<50 ){ .    zSe
d6d0: 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70  p = "";.    zSep
d6e0: 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e  2 = ",";.    zEn
d6f0: 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65  d = ")";.  }else
d700: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e  {.    zSep = "\n
d710: 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d    ";.    zSep2 =
d720: 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45   ",\n  ";.    zE
d730: 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a  nd = "\n)";.  }.
d740: 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d    n += 35 + 6*p-
d750: 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d  >nCol;.  zStmt =
d760: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
d770: 52 61 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28  Raw(0, n);.  if(
d780: 20 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20   zStmt==0 ){.   
d790: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
d7a0: 28 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  (db);.    return
d7b0: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
d7c0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53  3_snprintf(n, zS
d7d0: 74 6d 74 2c 20 22 43 52 45 41 54 45 20 54 41 42  tmt, "CREATE TAB
d7e0: 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c  LE ");.  k = sql
d7f0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74  ite3Strlen30(zSt
d800: 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28  mt);.  identPut(
d810: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e  zStmt, &k, p->zN
d820: 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b  ame);.  zStmt[k+
d830: 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28  +] = '(';.  for(
d840: 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d  pCol=p->aCol, i=
d850: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
d860: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
d870: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
d880: 72 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65  r * const azType
d890: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f  [] = {.        /
d8a0: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  * SQLITE_AFF_BLO
d8b0: 42 20 20 20 20 2a 2f 20 22 22 2c 0a 20 20 20 20  B    */ "",.    
d8c0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
d8d0: 46 5f 54 45 58 54 20 20 20 20 2a 2f 20 22 20 54  F_TEXT    */ " T
d8e0: 45 58 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a  EXT",.        /*
d8f0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
d900: 52 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20  RIC */ " NUM",. 
d910: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
d920: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20  _AFF_INTEGER */ 
d930: 22 20 49 4e 54 22 2c 0a 20 20 20 20 20 20 20 20  " INT",.        
d940: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  /* SQLITE_AFF_RE
d950: 41 4c 20 20 20 20 2a 2f 20 22 20 52 45 41 4c 22  AL    */ " REAL"
d960: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
d970: 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  len;.    const c
d980: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20  har *zType;..   
d990: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
d9a0: 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d  f(n-k, &zStmt[k]
d9b0: 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b  , zSep);.    k +
d9c0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
d9d0: 30 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20  0(&zStmt[k]);.  
d9e0: 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a    zSep = zSep2;.
d9f0: 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74      identPut(zSt
da00: 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e  mt, &k, pCol->zN
da10: 61 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ame);.    assert
da20: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
da30: 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  -SQLITE_AFF_BLOB
da40: 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73   >= 0 );.    ass
da50: 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ert( pCol->affin
da60: 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ity-SQLITE_AFF_B
da70: 4c 4f 42 20 3c 20 41 72 72 61 79 53 69 7a 65 28  LOB < ArraySize(
da80: 61 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20 74  azType) );.    t
da90: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
daa0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
dab0: 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20  AFF_BLOB );.    
dac0: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e  testcase( pCol->
dad0: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
dae0: 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20  _AFF_TEXT );.   
daf0: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
db00: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
db10: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b  E_AFF_NUMERIC );
db20: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
db30: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
db40: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
db50: 52 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  R );.    testcas
db60: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
db70: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  y==SQLITE_AFF_RE
db80: 41 4c 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a  AL );.    .    z
db90: 54 79 70 65 20 3d 20 61 7a 54 79 70 65 5b 70 43  Type = azType[pC
dba0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20 53  ol->affinity - S
dbb0: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 3b  QLITE_AFF_BLOB];
dbc0: 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74  .    len = sqlit
dbd0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65  e3Strlen30(zType
dbe0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
dbf0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
dc00: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 0a  QLITE_AFF_BLOB .
dc10: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
dc20: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73  Col->affinity==s
dc30: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
dc40: 70 65 28 7a 54 79 70 65 2c 20 30 29 20 29 3b 0a  pe(zType, 0) );.
dc50: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 53 74 6d      memcpy(&zStm
dc60: 74 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c 65 6e  t[k], zType, len
dc70: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b  );.    k += len;
dc80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 3d  .    assert( k<=
dc90: 6e 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n );.  }.  sqlit
dca0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c  e3_snprintf(n-k,
dcb0: 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22   &zStmt[k], "%s"
dcc0: 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72  , zEnd);.  retur
dcd0: 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zStmt;.}../*.*
dce0: 2a 20 52 65 73 69 7a 65 20 61 6e 20 49 6e 64 65  * Resize an Inde
dcf0: 78 20 6f 62 6a 65 63 74 20 74 6f 20 68 6f 6c 64  x object to hold
dd00: 20 4e 20 63 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c   N columns total
dd10: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
dd20: 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
dd30: 73 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d  s and SQLITE_NOM
dd40: 45 4d 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72  EM on an OOM err
dd50: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
dd60: 74 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a  t resizeIndexObj
dd70: 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ect(sqlite3 *db,
dd80: 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e   Index *pIdx, in
dd90: 74 20 4e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45  t N){.  char *zE
dda0: 78 74 72 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74  xtra;.  int nByt
ddb0: 65 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6e  e;.  if( pIdx->n
ddc0: 43 6f 6c 75 6d 6e 3e 3d 4e 20 29 20 72 65 74 75  Column>=N ) retu
ddd0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
dde0: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 73  assert( pIdx->is
ddf0: 52 65 73 69 7a 65 64 3d 3d 30 20 29 3b 0a 20 20  Resized==0 );.  
de00: 6e 42 79 74 65 20 3d 20 28 73 69 7a 65 6f 66 28  nByte = (sizeof(
de10: 63 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28  char*) + sizeof(
de20: 69 31 36 29 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a  i16) + 1)*N;.  z
de30: 45 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33 44  Extra = sqlite3D
de40: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
de50: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 7a 45  nByte);.  if( zE
de60: 78 74 72 61 3d 3d 30 20 29 20 72 65 74 75 72 6e  xtra==0 ) return
de70: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
de80: 50 54 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78  PT;.  memcpy(zEx
de90: 74 72 61 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  tra, pIdx->azCol
dea0: 6c 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  l, sizeof(char*)
deb0: 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b  *pIdx->nColumn);
dec0: 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20  .  pIdx->azColl 
ded0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29  = (const char**)
dee0: 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61  zExtra;.  zExtra
def0: 20 2b 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 2a   += sizeof(char*
df00: 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45  )*N;.  memcpy(zE
df10: 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 69 43 6f  xtra, pIdx->aiCo
df20: 6c 75 6d 6e 2c 20 73 69 7a 65 6f 66 28 69 31 36  lumn, sizeof(i16
df30: 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  )*pIdx->nColumn)
df40: 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  ;.  pIdx->aiColu
df50: 6d 6e 20 3d 20 28 69 31 36 2a 29 7a 45 78 74 72  mn = (i16*)zExtr
df60: 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73  a;.  zExtra += s
df70: 69 7a 65 6f 66 28 69 31 36 29 2a 4e 3b 0a 20 20  izeof(i16)*N;.  
df80: 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70  memcpy(zExtra, p
df90: 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  Idx->aSortOrder,
dfa0: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b   pIdx->nColumn);
dfb0: 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  .  pIdx->aSortOr
dfc0: 64 65 72 20 3d 20 28 75 38 2a 29 7a 45 78 74 72  der = (u8*)zExtr
dfd0: 61 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  a;.  pIdx->nColu
dfe0: 6d 6e 20 3d 20 4e 3b 0a 20 20 70 49 64 78 2d 3e  mn = N;.  pIdx->
dff0: 69 73 52 65 73 69 7a 65 64 20 3d 20 31 3b 0a 20  isResized = 1;. 
e000: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e010: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69  K;.}../*.** Esti
e020: 6d 61 74 65 20 74 68 65 20 74 6f 74 61 6c 20 72  mate the total r
e030: 6f 77 20 77 69 64 74 68 20 66 6f 72 20 61 20 74  ow width for a t
e040: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
e050: 76 6f 69 64 20 65 73 74 69 6d 61 74 65 54 61 62  void estimateTab
e060: 6c 65 57 69 64 74 68 28 54 61 62 6c 65 20 2a 70  leWidth(Table *p
e070: 54 61 62 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Tab){.  unsigned
e080: 20 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 63   wTable = 0;.  c
e090: 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 70 54 61  onst Column *pTa
e0a0: 62 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  bCol;.  int i;. 
e0b0: 20 66 6f 72 28 69 3d 70 54 61 62 2d 3e 6e 43 6f   for(i=pTab->nCo
e0c0: 6c 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d  l, pTabCol=pTab-
e0d0: 3e 61 43 6f 6c 3b 20 69 3e 30 3b 20 69 2d 2d 2c  >aCol; i>0; i--,
e0e0: 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20   pTabCol++){.   
e0f0: 20 77 54 61 62 6c 65 20 2b 3d 20 70 54 61 62 43   wTable += pTabC
e100: 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20  ol->szEst;.  }. 
e110: 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79   if( pTab->iPKey
e120: 3c 30 20 29 20 77 54 61 62 6c 65 2b 2b 3b 0a 20  <0 ) wTable++;. 
e130: 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20   pTab->szTabRow 
e140: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
e150: 77 54 61 62 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a  wTable*4);.}../*
e160: 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
e170: 20 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66   average size of
e180: 20 61 20 72 6f 77 20 66 6f 72 20 61 6e 20 69 6e   a row for an in
e190: 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
e1a0: 6f 69 64 20 65 73 74 69 6d 61 74 65 49 6e 64 65  oid estimateInde
e1b0: 78 57 69 64 74 68 28 49 6e 64 65 78 20 2a 70 49  xWidth(Index *pI
e1c0: 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  dx){.  unsigned 
e1d0: 77 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 69 6e  wIndex = 0;.  in
e1e0: 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c  t i;.  const Col
e1f0: 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 49 64 78  umn *aCol = pIdx
e200: 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a  ->pTable->aCol;.
e210: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
e220: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
e230: 7b 0a 20 20 20 20 69 31 36 20 78 20 3d 20 70 49  {.    i16 x = pI
e240: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  dx->aiColumn[i];
e250: 0a 20 20 20 20 61 73 73 65 72 74 28 20 78 3c 70  .    assert( x<p
e260: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43 6f  Idx->pTable->nCo
e270: 6c 20 29 3b 0a 20 20 20 20 77 49 6e 64 65 78 20  l );.    wIndex 
e280: 2b 3d 20 78 3c 30 20 3f 20 31 20 3a 20 61 43 6f  += x<0 ? 1 : aCo
e290: 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  l[pIdx->aiColumn
e2a0: 5b 69 5d 5d 2e 73 7a 45 73 74 3b 0a 20 20 7d 0a  [i]].szEst;.  }.
e2b0: 20 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77    pIdx->szIdxRow
e2c0: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
e2d0: 28 77 49 6e 64 65 78 2a 34 29 3b 0a 7d 0a 0a 2f  (wIndex*4);.}../
e2e0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
e2f0: 20 76 61 6c 75 65 20 78 20 69 73 20 66 6f 75 6e   value x is foun
e300: 64 20 61 6e 79 20 6f 66 20 74 68 65 20 66 69 72  d any of the fir
e310: 73 74 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20  st nCol entries 
e320: 6f 66 20 61 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74  of aiCol[].*/.st
e330: 61 74 69 63 20 69 6e 74 20 68 61 73 43 6f 6c 75  atic int hasColu
e340: 6d 6e 28 63 6f 6e 73 74 20 69 31 36 20 2a 61 69  mn(const i16 *ai
e350: 43 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20 69  Col, int nCol, i
e360: 6e 74 20 78 29 7b 0a 20 20 77 68 69 6c 65 28 20  nt x){.  while( 
e370: 6e 43 6f 6c 2d 2d 20 3e 20 30 20 29 20 69 66 28  nCol-- > 0 ) if(
e380: 20 78 3d 3d 2a 28 61 69 43 6f 6c 2b 2b 29 20 29   x==*(aiCol++) )
e390: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
e3a0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 63  urn 0;.}../* Rec
e3b0: 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 4e 6f  ompute the colNo
e3c0: 74 49 64 78 65 64 20 66 69 65 6c 64 20 6f 66 20  tIdxed field of 
e3d0: 74 68 65 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  the Index..**.**
e3e0: 20 63 6f 6c 4e 6f 74 49 64 78 65 64 20 69 73 20   colNotIdxed is 
e3f0: 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20 68  a bitmask that h
e400: 61 73 20 61 20 30 20 62 69 74 20 72 65 70 72 65  as a 0 bit repre
e410: 73 65 6e 74 69 6e 67 20 65 61 63 68 20 69 6e 64  senting each ind
e420: 65 78 65 64 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20  exed.** columns 
e430: 74 68 61 74 20 61 72 65 20 77 69 74 68 69 6e 20  that are within 
e440: 74 68 65 20 66 69 72 73 74 20 36 33 20 63 6f 6c  the first 63 col
e450: 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c  umns of the tabl
e460: 65 2e 20 20 54 68 65 0a 2a 2a 20 68 69 67 68 2d  e.  The.** high-
e470: 6f 72 64 65 72 20 62 69 74 20 6f 66 20 63 6f 6c  order bit of col
e480: 4e 6f 74 49 64 78 65 64 20 69 73 20 61 6c 77 61  NotIdxed is alwa
e490: 79 73 20 31 2e 20 20 41 6c 6c 20 75 6e 69 6e 64  ys 1.  All unind
e4a0: 65 78 65 64 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  exed columns.** 
e4b0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 76  of the table hav
e4c0: 65 20 61 20 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e a 1..**.** The
e4d0: 20 63 6f 6c 4e 6f 74 49 64 78 65 64 20 6d 61 73   colNotIdxed mas
e4e0: 6b 20 69 73 20 41 4e 44 2d 65 64 20 77 69 74 68  k is AND-ed with
e4f0: 20 74 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d   the SrcList.a[]
e500: 2e 63 6f 6c 55 73 65 64 20 6d 61 73 6b 0a 2a 2a  .colUsed mask.**
e510: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
e520: 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 63 6f   the index is co
e530: 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2f  vering index..*/
e540: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 63  .static void rec
e550: 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74  omputeColumnsNot
e560: 49 6e 64 65 78 65 64 28 49 6e 64 65 78 20 2a 70  Indexed(Index *p
e570: 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20  Idx){.  Bitmask 
e580: 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a  m = 0;.  int j;.
e590: 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43    for(j=pIdx->nC
e5a0: 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a  olumn-1; j>=0; j
e5b0: 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d  --){.    int x =
e5c0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
e5d0: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 30  j];.    if( x>=0
e5e0: 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
e5f0: 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a  se( x==BMS-1 );.
e600: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
e610: 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20  x==BMS-2 );.    
e620: 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 20    if( x<BMS-1 ) 
e630: 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b  m |= MASKBIT(x);
e640: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 64  .    }.  }.  pId
e650: 78 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65 64 20 3d  x->colNotIdxed =
e660: 20 7e 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 28   ~m;.  assert( (
e670: 70 49 64 78 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65  pIdx->colNotIdxe
e680: 64 3e 3e 36 33 29 3d 3d 31 20 29 3b 0a 7d 0a 0a  d>>63)==1 );.}..
e690: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
e6a0: 6e 65 20 72 75 6e 73 20 61 74 20 74 68 65 20 65  ne runs at the e
e6b0: 6e 64 20 6f 66 20 70 61 72 73 69 6e 67 20 61 20  nd of parsing a 
e6c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
e6d0: 74 65 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20 68  tement that.** h
e6e0: 61 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  as a WITHOUT ROW
e6f0: 49 44 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20  ID clause.  The 
e700: 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74  job of this rout
e710: 69 6e 65 20 69 73 20 74 6f 20 63 6f 6e 76 65 72  ine is to conver
e720: 74 20 62 6f 74 68 0a 2a 2a 20 69 6e 74 65 72 6e  t both.** intern
e730: 61 6c 20 73 63 68 65 6d 61 20 64 61 74 61 20 73  al schema data s
e740: 74 72 75 63 74 75 72 65 73 20 61 6e 64 20 74 68  tructures and th
e750: 65 20 67 65 6e 65 72 61 74 65 64 20 56 44 42 45  e generated VDBE
e760: 20 63 6f 64 65 20 73 6f 20 74 68 61 74 20 74 68   code so that th
e770: 65 79 0a 2a 2a 20 61 72 65 20 61 70 70 72 6f 70  ey.** are approp
e780: 72 69 61 74 65 20 66 6f 72 20 61 20 57 49 54 48  riate for a WITH
e790: 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 20  OUT ROWID table 
e7a0: 69 6e 73 74 65 61 64 20 6f 66 20 61 20 72 6f 77  instead of a row
e7b0: 69 64 20 74 61 62 6c 65 2e 0a 2a 2a 20 43 68 61  id table..** Cha
e7c0: 6e 67 65 73 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a  nges include:.**
e7d0: 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 53 65 74  .**     (1)  Set
e7e0: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   all columns of 
e7f0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
e800: 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 74 6f  schema object to
e810: 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a   be NOT NULL..**
e820: 20 20 20 20 20 28 32 29 20 20 43 6f 6e 76 65 72       (2)  Conver
e830: 74 20 50 33 20 70 61 72 61 6d 65 74 65 72 20 6f  t P3 parameter o
e840: 66 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65 42  f the OP_CreateB
e850: 74 72 65 65 20 66 72 6f 6d 20 42 54 52 45 45 5f  tree from BTREE_
e860: 49 4e 54 4b 45 59 20 0a 2a 2a 20 20 20 20 20 20  INTKEY .**      
e870: 20 20 20 20 69 6e 74 6f 20 42 54 52 45 45 5f 42      into BTREE_B
e880: 4c 4f 42 4b 45 59 2e 0a 2a 2a 20 20 20 20 20 28  LOBKEY..**     (
e890: 33 29 20 20 42 79 70 61 73 73 20 74 68 65 20 63  3)  Bypass the c
e8a0: 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  reation of the s
e8b0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
e8c0: 6c 65 20 65 6e 74 72 79 0a 2a 2a 20 20 20 20 20  le entry.**     
e8d0: 20 20 20 20 20 66 6f 72 20 74 68 65 20 50 52 49       for the PRI
e8e0: 4d 41 52 59 20 4b 45 59 20 61 73 20 74 68 65 20  MARY KEY as the 
e8f0: 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65  primary key inde
e900: 78 20 69 73 20 6e 6f 77 0a 2a 2a 20 20 20 20 20  x is now.**     
e910: 20 20 20 20 20 69 64 65 6e 74 69 66 69 65 64 20       identified 
e920: 62 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  by the sqlite_ma
e930: 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74 72 79  ster table entry
e940: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 74   of the table it
e950: 73 65 6c 66 2e 0a 2a 2a 20 20 20 20 20 28 34 29  self..**     (4)
e960: 20 20 53 65 74 20 74 68 65 20 49 6e 64 65 78 2e    Set the Index.
e970: 74 6e 75 6d 20 6f 66 20 74 68 65 20 50 52 49 4d  tnum of the PRIM
e980: 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f 62  ARY KEY Index ob
e990: 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20  ject in the.**  
e9a0: 20 20 20 20 20 20 20 20 73 63 68 65 6d 61 20 74          schema t
e9b0: 6f 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66  o the rootpage f
e9c0: 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74 61 62  rom the main tab
e9d0: 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 35 29 20 20  le..**     (5)  
e9e0: 41 64 64 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f  Add all table co
e9f0: 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 50 52 49  lumns to the PRI
ea00: 4d 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f  MARY KEY Index o
ea10: 62 6a 65 63 74 0a 2a 2a 20 20 20 20 20 20 20 20  bject.**        
ea20: 20 20 73 6f 20 74 68 61 74 20 74 68 65 20 50 52    so that the PR
ea30: 49 4d 41 52 59 20 4b 45 59 20 69 73 20 61 20 63  IMARY KEY is a c
ea40: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20  overing index.  
ea50: 54 68 65 20 73 75 72 70 6c 75 73 0a 2a 2a 20 20  The surplus.**  
ea60: 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20          columns 
ea70: 61 72 65 20 70 61 72 74 20 6f 66 20 4b 65 79 49  are part of KeyI
ea80: 6e 66 6f 2e 6e 41 6c 6c 46 69 65 6c 64 20 61 6e  nfo.nAllField an
ea90: 64 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 66  d are not used f
eaa0: 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73  or.**          s
eab0: 6f 72 74 69 6e 67 20 6f 72 20 6c 6f 6f 6b 75 70  orting or lookup
eac0: 20 6f 72 20 75 6e 69 71 75 65 6e 65 73 73 20 63   or uniqueness c
ead0: 68 65 63 6b 73 2e 0a 2a 2a 20 20 20 20 20 28 36  hecks..**     (6
eae0: 29 20 20 52 65 70 6c 61 63 65 20 74 68 65 20 72  )  Replace the r
eaf0: 6f 77 69 64 20 74 61 69 6c 20 6f 6e 20 61 6c 6c  owid tail on all
eb00: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67   automatically g
eb10: 65 6e 65 72 61 74 65 64 20 55 4e 49 51 55 45 0a  enerated UNIQUE.
eb20: 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e 64 69  **          indi
eb30: 63 65 73 20 77 69 74 68 20 74 68 65 20 50 52 49  ces with the PRI
eb40: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73  MARY KEY columns
eb50: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 76 69 72 74  ..**.** For virt
eb60: 75 61 6c 20 74 61 62 6c 65 73 2c 20 6f 6e 6c 79  ual tables, only
eb70: 20 28 31 29 20 69 73 20 70 65 72 66 6f 72 6d 65   (1) is performe
eb80: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
eb90: 64 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f  d convertToWitho
eba0: 75 74 52 6f 77 69 64 54 61 62 6c 65 28 50 61 72  utRowidTable(Par
ebb0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
ebc0: 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65  e *pTab){.  Inde
ebd0: 78 20 2a 70 49 64 78 3b 0a 20 20 49 6e 64 65 78  x *pIdx;.  Index
ebe0: 20 2a 70 50 6b 3b 0a 20 20 69 6e 74 20 6e 50 6b   *pPk;.  int nPk
ebf0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
ec00: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
ec10: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
ec20: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
ec30: 64 62 65 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  dbe;..  /* Mark 
ec40: 65 76 65 72 79 20 50 52 49 4d 41 52 59 20 4b 45  every PRIMARY KE
ec50: 59 20 63 6f 6c 75 6d 6e 20 61 73 20 4e 4f 54 20  Y column as NOT 
ec60: 4e 55 4c 4c 20 28 65 78 63 65 70 74 20 66 6f 72  NULL (except for
ec70: 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73   imposter tables
ec80: 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ).  */.  if( !db
ec90: 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54  ->init.imposterT
eca0: 61 62 6c 65 20 29 7b 0a 20 20 20 20 66 6f 72 28  able ){.    for(
ecb0: 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  i=0; i<pTab->nCo
ecc0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
ecd0: 66 28 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  f( (pTab->aCol[i
ece0: 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c  ].colFlags & COL
ecf0: 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21 3d 30  FLAG_PRIMKEY)!=0
ed00: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62   ){.        pTab
ed10: 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c  ->aCol[i].notNul
ed20: 6c 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  l = OE_Abort;.  
ed30: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
ed40: 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68  .  /* Convert th
ed50: 65 20 50 33 20 6f 70 65 72 61 6e 64 20 6f 66 20  e P3 operand of 
ed60: 74 68 65 20 4f 50 5f 43 72 65 61 74 65 42 74 72  the OP_CreateBtr
ed70: 65 65 20 6f 70 63 6f 64 65 20 66 72 6f 6d 20 42  ee opcode from B
ed80: 54 52 45 45 5f 49 4e 54 4b 45 59 0a 20 20 2a 2a  TREE_INTKEY.  **
ed90: 20 69 6e 74 6f 20 42 54 52 45 45 5f 42 4c 4f 42   into BTREE_BLOB
eda0: 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  KEY..  */.  if( 
edb0: 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61  pParse->addrCrTa
edc0: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
edd0: 20 76 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   v );.    sqlite
ede0: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
edf0: 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54   pParse->addrCrT
ee00: 61 62 2c 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45  ab, BTREE_BLOBKE
ee10: 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  Y);.  }..  /* Lo
ee20: 63 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59  cate the PRIMARY
ee30: 20 4b 45 59 20 69 6e 64 65 78 2e 20 20 4f 72 2c   KEY index.  Or,
ee40: 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 77   if this table w
ee50: 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20  as originally.  
ee60: 2a 2a 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ** an INTEGER PR
ee70: 49 4d 41 52 59 20 4b 45 59 20 74 61 62 6c 65 2c  IMARY KEY table,
ee80: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 50 52   create a new PR
ee90: 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e  IMARY KEY index.
eea0: 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61   .  */.  if( pTa
eeb0: 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20  b->iPKey>=0 ){. 
eec0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
eed0: 73 74 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 69 70  st;.    Token ip
eee0: 6b 54 6f 6b 65 6e 3b 0a 20 20 20 20 73 71 6c 69  kToken;.    sqli
eef0: 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 69 70  te3TokenInit(&ip
ef00: 6b 54 6f 6b 65 6e 2c 20 70 54 61 62 2d 3e 61 43  kToken, pTab->aC
ef10: 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e  ol[pTab->iPKey].
ef20: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73  zName);.    pLis
ef30: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
ef40: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
ef50: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
ef60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
ef70: 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f  xprAlloc(db, TK_
ef80: 49 44 2c 20 26 69 70 6b 54 6f 6b 65 6e 2c 20 30  ID, &ipkToken, 0
ef90: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  ));.    if( pLis
efa0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
efb0: 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73     pList->a[0].s
efc0: 6f 72 74 4f 72 64 65 72 20 3d 20 70 50 61 72 73  ortOrder = pPars
efd0: 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72 3b  e->iPkSortOrder;
efe0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
eff0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d  rse->pNewTable==
f000: 70 54 61 62 20 29 3b 0a 20 20 20 20 73 71 6c 69  pTab );.    sqli
f010: 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70  te3CreateIndex(p
f020: 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20  Parse, 0, 0, 0, 
f030: 70 4c 69 73 74 2c 20 70 54 61 62 2d 3e 6b 65 79  pList, pTab->key
f040: 43 6f 6e 66 2c 20 30 2c 20 30 2c 20 30 2c 20 30  Conf, 0, 0, 0, 0
f050: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f060: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
f070: 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b  IDXTYPE_PRIMARYK
f080: 45 59 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  EY);.    if( db-
f090: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
f0a0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
f0b0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 50 6b 20  return;.    pPk 
f0c0: 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
f0d0: 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
f0e0: 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
f0f0: 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = -1;.  }else{. 
f100: 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33     pPk = sqlite3
f110: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
f120: 70 54 61 62 29 3b 0a 20 20 20 20 61 73 73 65 72  pTab);.    asser
f130: 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a 0a 20 20  t( pPk!=0 );..  
f140: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 6d 6f    /*.    ** Remo
f150: 76 65 20 61 6c 6c 20 72 65 64 75 6e 64 61 6e 74  ve all redundant
f160: 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68   columns from th
f170: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20  e PRIMARY KEY.  
f180: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 68 61  For example, cha
f190: 6e 67 65 0a 20 20 20 20 2a 2a 20 22 50 52 49 4d  nge.    ** "PRIM
f1a0: 41 52 59 20 4b 45 59 28 61 2c 62 2c 61 2c 62 2c  ARY KEY(a,b,a,b,
f1b0: 63 2c 62 2c 63 2c 64 29 22 20 69 6e 74 6f 20 6a  c,b,c,d)" into j
f1c0: 75 73 74 20 22 50 52 49 4d 41 52 59 20 4b 45 59  ust "PRIMARY KEY
f1d0: 28 61 2c 62 2c 63 2c 64 29 22 2e 20 20 4c 61 74  (a,b,c,d)".  Lat
f1e0: 65 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 61  er.    ** code a
f1f0: 73 73 75 6d 65 73 20 74 68 65 20 50 52 49 4d 41  ssumes the PRIMA
f200: 52 59 20 4b 45 59 20 63 6f 6e 74 61 69 6e 73 20  RY KEY contains 
f210: 6e 6f 20 72 65 70 65 61 74 65 64 20 63 6f 6c 75  no repeated colu
f220: 6d 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mns..    */.    
f230: 66 6f 72 28 69 3d 6a 3d 31 3b 20 69 3c 70 50 6b  for(i=j=1; i<pPk
f240: 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b  ->nKeyCol; i++){
f250: 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 43 6f  .      if( hasCo
f260: 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75  lumn(pPk->aiColu
f270: 6d 6e 2c 20 6a 2c 20 70 50 6b 2d 3e 61 69 43 6f  mn, j, pPk->aiCo
f280: 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20  lumn[i]) ){.    
f290: 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e      pPk->nColumn
f2a0: 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  --;.      }else{
f2b0: 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69  .        pPk->ai
f2c0: 43 6f 6c 75 6d 6e 5b 6a 2b 2b 5d 20 3d 20 70 50  Column[j++] = pP
f2d0: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  k->aiColumn[i];.
f2e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f2f0: 20 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3d    pPk->nKeyCol =
f300: 20 6a 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   j;.  }.  assert
f310: 28 20 70 50 6b 21 3d 30 20 29 3b 0a 20 20 70 50  ( pPk!=0 );.  pP
f320: 6b 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20  k->isCovering = 
f330: 31 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  1;.  if( !db->in
f340: 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c 65  it.imposterTable
f350: 20 29 20 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e   ) pPk->uniqNotN
f360: 75 6c 6c 20 3d 20 31 3b 0a 20 20 6e 50 6b 20 3d  ull = 1;.  nPk =
f370: 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 0a   pPk->nKeyCol;..
f380: 20 20 2f 2a 20 42 79 70 61 73 73 20 74 68 65 20    /* Bypass the 
f390: 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  creation of the 
f3a0: 50 52 49 4d 41 52 59 20 4b 45 59 20 62 74 72 65  PRIMARY KEY btre
f3b0: 65 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65  e and the sqlite
f3c0: 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62  _master.  ** tab
f3d0: 6c 65 20 65 6e 74 72 79 2e 20 54 68 69 73 20 69  le entry. This i
f3e0: 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20  s only required 
f3f0: 69 66 20 63 75 72 72 65 6e 74 6c 79 20 67 65 6e  if currently gen
f400: 65 72 61 74 69 6e 67 20 56 44 42 45 0a 20 20 2a  erating VDBE.  *
f410: 2a 20 63 6f 64 65 20 66 6f 72 20 61 20 43 52 45  * code for a CRE
f420: 41 54 45 20 54 41 42 4c 45 20 28 6e 6f 74 20 77  ATE TABLE (not w
f430: 68 65 6e 20 70 61 72 73 69 6e 67 20 6f 6e 65 20  hen parsing one 
f440: 61 73 20 70 61 72 74 20 6f 66 20 72 65 61 64 69  as part of readi
f450: 6e 67 0a 20 20 2a 2a 20 61 20 64 61 74 61 62 61  ng.  ** a databa
f460: 73 65 20 73 63 68 65 6d 61 29 2e 20 20 2a 2f 0a  se schema).  */.
f470: 20 20 69 66 28 20 76 20 26 26 20 70 50 6b 2d 3e    if( v && pPk->
f480: 74 6e 75 6d 3e 30 20 29 7b 0a 20 20 20 20 61 73  tnum>0 ){.    as
f490: 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62  sert( db->init.b
f4a0: 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  usy==0 );.    sq
f4b0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f  lite3VdbeChangeO
f4c0: 70 63 6f 64 65 28 76 2c 20 70 50 6b 2d 3e 74 6e  pcode(v, pPk->tn
f4d0: 75 6d 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20  um, OP_Goto);.  
f4e0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74  }..  /* The root
f4f0: 20 70 61 67 65 20 6f 66 20 74 68 65 20 50 52 49   page of the PRI
f500: 4d 41 52 59 20 4b 45 59 20 69 73 20 74 68 65 20  MARY KEY is the 
f510: 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 20  table root page 
f520: 2a 2f 0a 20 20 70 50 6b 2d 3e 74 6e 75 6d 20 3d  */.  pPk->tnum =
f530: 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 0a 20 20   pTab->tnum;..  
f540: 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 69 6e  /* Update the in
f550: 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
f560: 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 55 4e  tation of all UN
f570: 49 51 55 45 20 69 6e 64 69 63 65 73 20 62 79 20  IQUE indices by 
f580: 63 6f 6e 76 65 72 74 69 6e 67 0a 20 20 2a 2a 20  converting.  ** 
f590: 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 20  the final rowid 
f5a0: 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20 6f 6e 65 20  column into one 
f5b0: 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20  or more columns 
f5c0: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
f5d0: 45 59 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  EY..  */.  for(p
f5e0: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
f5f0: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
f600: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  x->pNext){.    i
f610: 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28 20 49 73  nt n;.    if( Is
f620: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
f630: 70 49 64 78 29 20 29 20 63 6f 6e 74 69 6e 75 65  pIdx) ) continue
f640: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b  ;.    for(i=n=0;
f650: 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20   i<nPk; i++){.  
f660: 20 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75      if( !hasColu
f670: 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  mn(pIdx->aiColum
f680: 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  n, pIdx->nKeyCol
f690: 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  , pPk->aiColumn[
f6a0: 69 5d 29 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d  i]) ) n++;.    }
f6b0: 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b  .    if( n==0 ){
f6c0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69  .      /* This i
f6d0: 6e 64 65 78 20 69 73 20 61 20 73 75 70 65 72 73  ndex is a supers
f6e0: 65 74 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72  et of the primar
f6f0: 79 20 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20 70  y key */.      p
f700: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70  Idx->nColumn = p
f710: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20  Idx->nKeyCol;.  
f720: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
f730: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 73 69    }.    if( resi
f740: 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62  zeIndexObject(db
f750: 2c 20 70 49 64 78 2c 20 70 49 64 78 2d 3e 6e 4b  , pIdx, pIdx->nK
f760: 65 79 43 6f 6c 2b 6e 29 20 29 20 72 65 74 75 72  eyCol+n) ) retur
f770: 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  n;.    for(i=0, 
f780: 6a 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  j=pIdx->nKeyCol;
f790: 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20   i<nPk; i++){.  
f7a0: 20 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75      if( !hasColu
f7b0: 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  mn(pIdx->aiColum
f7c0: 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  n, pIdx->nKeyCol
f7d0: 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  , pPk->aiColumn[
f7e0: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  i]) ){.        p
f7f0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
f800: 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   = pPk->aiColumn
f810: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 64  [i];.        pId
f820: 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 70  x->azColl[j] = p
f830: 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20  Pk->azColl[i];. 
f840: 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
f850: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
f860: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
f870: 75 6d 6e 3e 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  umn>=pIdx->nKeyC
f880: 6f 6c 2b 6e 20 29 3b 0a 20 20 20 20 61 73 73 65  ol+n );.    asse
f890: 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
f8a0: 6e 3e 3d 6a 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  n>=j );.  }..  /
f8b0: 2a 20 41 64 64 20 61 6c 6c 20 74 61 62 6c 65 20  * Add all table 
f8c0: 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 50  columns to the P
f8d0: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
f8e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 6b 3c  .  */.  if( nPk<
f8f0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
f900: 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64 65    if( resizeInde
f910: 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 50 6b 2c  xObject(db, pPk,
f920: 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 20 72   pTab->nCol) ) r
f930: 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69  eturn;.    for(i
f940: 3d 30 2c 20 6a 3d 6e 50 6b 3b 20 69 3c 70 54 61  =0, j=nPk; i<pTa
f950: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
f960: 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c       if( !hasCol
f970: 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  umn(pPk->aiColum
f980: 6e 2c 20 6a 2c 20 69 29 20 29 7b 0a 20 20 20 20  n, j, i) ){.    
f990: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 50      assert( j<pP
f9a0: 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  k->nColumn );.  
f9b0: 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c        pPk->aiCol
f9c0: 75 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a 20 20 20 20  umn[j] = i;.    
f9d0: 20 20 20 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b      pPk->azColl[
f9e0: 6a 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42  j] = sqlite3StrB
f9f0: 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 20 20 6a  INARY;.        j
fa00: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
fa10: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
fa20: 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b  k->nColumn==j );
fa30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
fa40: 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a 20 20  b->nCol==j );.  
fa50: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b 2d 3e  }else{.    pPk->
fa60: 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61 62 2d 3e  nColumn = pTab->
fa70: 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65 63 6f  nCol;.  }.  reco
fa80: 6d 70 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74 49  mputeColumnsNotI
fa90: 6e 64 65 78 65 64 28 70 50 6b 29 3b 0a 7d 0a 0a  ndexed(pPk);.}..
faa0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fab0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
fac0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
fad0: 75 65 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 61  ue if zName is a
fae0: 20 73 68 61 64 6f 77 20 74 61 62 6c 65 20 6e 61   shadow table na
faf0: 6d 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  me in the curren
fb00: 74 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  t database.** co
fb10: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
fb20: 7a 4e 61 6d 65 20 69 73 20 74 65 6d 70 6f 72 61  zName is tempora
fb30: 72 69 6c 79 20 6d 6f 64 69 66 69 65 64 20 77 68  rily modified wh
fb40: 69 6c 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ile this routine
fb50: 20 69 73 20 72 75 6e 6e 69 6e 67 2c 20 62 75 74   is running, but
fb60: 20 69 73 0a 2a 2a 20 72 65 73 74 6f 72 65 64 20   is.** restored 
fb70: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
fb80: 76 61 6c 75 65 20 70 72 69 6f 72 20 74 6f 20 74  value prior to t
fb90: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
fba0: 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
fbb0: 20 69 6e 74 20 69 73 53 68 61 64 6f 77 54 61 62   int isShadowTab
fbc0: 6c 65 4e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a  leName(sqlite3 *
fbd0: 64 62 2c 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  db, char *zName)
fbe0: 7b 0a 20 20 63 68 61 72 20 2a 7a 54 61 69 6c 3b  {.  char *zTail;
fbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc00: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
fc10: 74 68 65 20 6c 61 73 74 20 22 5f 22 20 69 6e 20  the last "_" in 
fc20: 7a 4e 61 6d 65 20 2a 2f 0a 20 20 54 61 62 6c 65  zName */.  Table
fc30: 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
fc40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
fc50: 65 20 74 68 61 74 20 7a 4e 61 6d 65 20 69 73 20  e that zName is 
fc60: 61 20 73 68 61 64 6f 77 20 6f 66 20 2a 2f 0a 20  a shadow of */. 
fc70: 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 3b 20 20   Module *pMod;  
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fc90: 2a 20 4d 6f 64 75 6c 65 20 66 6f 72 20 74 68 65  * Module for the
fca0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
fcb0: 2f 0a 0a 20 20 7a 54 61 69 6c 20 3d 20 73 74 72  /..  zTail = str
fcc0: 72 63 68 72 28 7a 4e 61 6d 65 2c 20 27 5f 27 29  rchr(zName, '_')
fcd0: 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c 3d 3d 30  ;.  if( zTail==0
fce0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 2a   ) return 0;.  *
fcf0: 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 70 54 61  zTail = 0;.  pTa
fd00: 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  b = sqlite3FindT
fd10: 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
fd20: 30 29 3b 0a 20 20 2a 7a 54 61 69 6c 20 3d 20 27  0);.  *zTail = '
fd30: 5f 27 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  _';.  if( pTab==
fd40: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
fd50: 69 66 28 20 21 49 73 56 69 72 74 75 61 6c 28 70  if( !IsVirtual(p
fd60: 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Tab) ) return 0;
fd70: 0a 20 20 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c  .  pMod = (Modul
fd80: 65 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46 69  e*)sqlite3HashFi
fd90: 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c  nd(&db->aModule,
fda0: 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41   pTab->azModuleA
fdb0: 72 67 5b 30 5d 29 3b 0a 20 20 69 66 28 20 70 4d  rg[0]);.  if( pM
fdc0: 6f 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  od==0 ) return 0
fdd0: 3b 0a 20 20 69 66 28 20 70 4d 6f 64 2d 3e 70 4d  ;.  if( pMod->pM
fde0: 6f 64 75 6c 65 2d 3e 69 56 65 72 73 69 6f 6e 3c  odule->iVersion<
fdf0: 33 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  3 ) return 0;.  
fe00: 69 66 28 20 70 4d 6f 64 2d 3e 70 4d 6f 64 75 6c  if( pMod->pModul
fe10: 65 2d 3e 78 53 68 61 64 6f 77 4e 61 6d 65 3d 3d  e->xShadowName==
fe20: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
fe30: 72 65 74 75 72 6e 20 70 4d 6f 64 2d 3e 70 4d 6f  return pMod->pMo
fe40: 64 75 6c 65 2d 3e 78 53 68 61 64 6f 77 4e 61 6d  dule->xShadowNam
fe50: 65 28 7a 54 61 69 6c 2b 31 29 3b 0a 7d 0a 23 65  e(zTail+1);.}.#e
fe60: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 69 73 53  lse.# define isS
fe70: 68 61 64 6f 77 54 61 62 6c 65 4e 61 6d 65 28 78  hadowTableName(x
fe80: 2c 79 29 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20  ,y) 0.#endif /* 
fe90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fea0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
feb0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  */../*.** This r
fec0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
fed0: 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66   to report the f
fee0: 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74 65  inal ")" that te
fef0: 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52  rminates.** a CR
ff00: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
ff10: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
ff20: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
ff30: 74 68 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f  that other actio
ff40: 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20  n routines have 
ff50: 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a  been building.**
ff60: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
ff70: 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74   internal hash t
ff80: 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20  ables, assuming 
ff90: 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a  no errors have.*
ffa0: 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a  * occurred..**.*
ffb0: 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74  * An entry for t
ffc0: 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65  he table is made
ffd0: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74   in the master t
ffe0: 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e  able on disk, un
fff0: 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73 20  less.** this is 
10000 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
10010 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75  e or db->init.bu
10020 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d  sy==1.  When db-
10030 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a  >init.busy==1.**
10040 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
10050 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c   reading the sql
10060 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
10070 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74   because we just
10080 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f  .** connected to
10090 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72   the database or
100a0 20 62 65 63 61 75 73 65 20 74 68 65 20 73 71 6c   because the sql
100b0 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
100c0 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79   has.** recently
100d0 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74 68 65   changed, so the
100e0 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20   entry for this 
100f0 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78  table already ex
10100 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73  ists in.** the s
10110 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
10120 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77  le.  We do not w
10130 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69 74  ant to create it
10140 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66   again..**.** If
10150 20 74 68 65 20 70 53 65 6c 65 63 74 20 61 72 67   the pSelect arg
10160 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  ument is not NUL
10170 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  L, it means that
10180 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
10190 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63   was called to c
101a0 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 67 65  reate a table ge
101b0 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a  nerated from a .
101c0 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  ** "CREATE TABLE
101d0 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e   ... AS SELECT .
101e0 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  .." statement.  
101f0 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  The column names
10200 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74   of.** the new t
10210 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20  able will match 
10220 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
10230 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f  f the SELECT..*/
10240 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64  .void sqlite3End
10250 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a  Table(.  Parse *
10260 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
10270 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
10280 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43  t */.  Token *pC
10290 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ons,           /
102a0 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20  * The ',' token 
102b0 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 63  after the last c
102c0 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20  olumn defn. */. 
102d0 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20   Token *pEnd,   
102e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
102f0 27 29 27 20 62 65 66 6f 72 65 20 6f 70 74 69 6f  ')' before optio
10300 6e 73 20 69 6e 20 74 68 65 20 43 52 45 41 54 45  ns in the CREATE
10310 20 54 41 42 4c 45 20 2a 2f 0a 20 20 75 38 20 74   TABLE */.  u8 t
10320 61 62 4f 70 74 73 2c 20 20 20 20 20 20 20 20 20  abOpts,         
10330 20 20 20 20 2f 2a 20 45 78 74 72 61 20 74 61 62      /* Extra tab
10340 6c 65 20 6f 70 74 69 6f 6e 73 2e 20 55 73 75 61  le options. Usua
10350 6c 6c 79 20 30 2e 20 2a 2f 0a 20 20 53 65 6c 65  lly 0. */.  Sele
10360 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20  ct *pSelect     
10370 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66 72      /* Select fr
10380 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e 2e  om a "CREATE ...
10390 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29   AS SELECT" */.)
103a0 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 20 20 20  {.  Table *p;   
103b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
103c0 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a   The new table *
103d0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
103e0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a  = pParse->db; /*
103f0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
10400 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
10410 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
10420 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
10430 61 73 65 20 69 6e 20 77 68 69 63 68 20 74 68 65  ase in which the
10440 20 74 61 62 6c 65 20 6c 69 76 65 73 20 2a 2f 0a   table lives */.
10450 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
10460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
10470 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78 20  n implied index 
10480 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  of the table */.
10490 0a 20 20 69 66 28 20 70 45 6e 64 3d 3d 30 20 26  .  if( pEnd==0 &
104a0 26 20 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  & pSelect==0 ){.
104b0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
104c0 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
104d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
104e0 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
104f0 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
10500 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
10510 69 66 28 20 70 53 65 6c 65 63 74 3d 3d 30 20 26  if( pSelect==0 &
10520 26 20 69 73 53 68 61 64 6f 77 54 61 62 6c 65 4e  & isShadowTableN
10530 61 6d 65 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65  ame(db, p->zName
10540 29 20 29 7b 0a 20 20 20 20 70 2d 3e 74 61 62 46  ) ){.    p->tabF
10550 6c 61 67 73 20 7c 3d 20 54 46 5f 53 68 61 64 6f  lags |= TF_Shado
10560 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  w;.  }..  /* If 
10570 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  the db->init.bus
10580 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20  y is 1 it means 
10590 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
105a0 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20  he SQL off the. 
105b0 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74   ** "sqlite_mast
105c0 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74  er" or "sqlite_t
105d0 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c  emp_master" tabl
105e0 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20  e on the disk.. 
105f0 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72   ** So do not wr
10600 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ite to the disk 
10610 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20  again.  Extract 
10620 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
10630 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68  mber.  ** for th
10640 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
10650 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
10660 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70  m field.  (The p
10670 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
10680 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
10690 20 70 75 74 20 74 68 65 72 65 20 62 79 20 74 68   put there by th
106a0 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72  e sqliteOpenCb r
106b0 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2a 0a 20 20  outine.).  **.  
106c0 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f 74 20 70  ** If the root p
106d0 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 31 2c  age number is 1,
106e0 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 69 73   that means this
106f0 20 69 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   is the sqlite_m
10700 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65  aster.  ** table
10710 20 69 74 73 65 6c 66 2e 20 20 53 6f 20 6d 61 72   itself.  So mar
10720 6b 20 69 74 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a  k it read-only..
10730 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
10740 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
10750 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
10760 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
10770 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 22 29  rMsg(pParse, "")
10780 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
10790 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 6e 75      }.    p->tnu
107a0 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  m = db->init.new
107b0 54 6e 75 6d 3b 0a 20 20 20 20 69 66 28 20 70 2d  Tnum;.    if( p-
107c0 3e 74 6e 75 6d 3d 3d 31 20 29 20 70 2d 3e 74 61  >tnum==1 ) p->ta
107d0 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 52 65 61  bFlags |= TF_Rea
107e0 64 6f 6e 6c 79 3b 0a 20 20 7d 0a 0a 20 20 61 73  donly;.  }..  as
107f0 73 65 72 74 28 20 28 70 2d 3e 74 61 62 46 6c 61  sert( (p->tabFla
10800 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61  gs & TF_HasPrima
10810 72 79 4b 65 79 29 3d 3d 30 0a 20 20 20 20 20 20  ryKey)==0.      
10820 20 7c 7c 20 70 2d 3e 69 50 4b 65 79 3e 3d 30 20   || p->iPKey>=0 
10830 7c 7c 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72  || sqlite3Primar
10840 79 4b 65 79 49 6e 64 65 78 28 70 29 21 3d 30 20  yKeyIndex(p)!=0 
10850 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d  );.  assert( (p-
10860 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48  >tabFlags & TF_H
10870 61 73 50 72 69 6d 61 72 79 4b 65 79 29 21 3d 30  asPrimaryKey)!=0
10880 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 2d 3e 69  .       || (p->i
10890 50 4b 65 79 3c 30 20 26 26 20 73 71 6c 69 74 65  PKey<0 && sqlite
108a0 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
108b0 28 70 29 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  (p)==0) );..  /*
108c0 20 53 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73   Special process
108d0 69 6e 67 20 66 6f 72 20 57 49 54 48 4f 55 54 20  ing for WITHOUT 
108e0 52 4f 57 49 44 20 54 61 62 6c 65 73 20 2a 2f 0a  ROWID Tables */.
108f0 20 20 69 66 28 20 74 61 62 4f 70 74 73 20 26 20    if( tabOpts & 
10900 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20  TF_WithoutRowid 
10910 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74  ){.    if( (p->t
10920 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74  abFlags & TF_Aut
10930 6f 69 6e 63 72 65 6d 65 6e 74 29 20 29 7b 0a 20  oincrement) ){. 
10940 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
10950 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
10960 20 20 20 20 20 20 20 22 41 55 54 4f 49 4e 43 52         "AUTOINCR
10970 45 4d 45 4e 54 20 6e 6f 74 20 61 6c 6c 6f 77 65  EMENT not allowe
10980 64 20 6f 6e 20 57 49 54 48 4f 55 54 20 52 4f 57  d on WITHOUT ROW
10990 49 44 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20  ID tables");.   
109a0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
109b0 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62  .    if( (p->tab
109c0 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50 72  Flags & TF_HasPr
109d0 69 6d 61 72 79 4b 65 79 29 3d 3d 30 20 29 7b 0a  imaryKey)==0 ){.
109e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
109f0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 50  orMsg(pParse, "P
10a00 52 49 4d 41 52 59 20 4b 45 59 20 6d 69 73 73 69  RIMARY KEY missi
10a10 6e 67 20 6f 6e 20 74 61 62 6c 65 20 25 73 22 2c  ng on table %s",
10a20 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20   p->zName);.    
10a30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
10a40 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 57  tabFlags |= TF_W
10a50 69 74 68 6f 75 74 52 6f 77 69 64 20 7c 20 54 46  ithoutRowid | TF
10a60 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b  _NoVisibleRowid;
10a70 0a 20 20 20 20 20 20 63 6f 6e 76 65 72 74 54 6f  .      convertTo
10a80 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c  WithoutRowidTabl
10a90 65 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  e(pParse, p);.  
10aa0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 44 62 20 3d    }.  }..  iDb =
10ab0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
10ac0 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63  Index(db, p->pSc
10ad0 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20  hema);..#ifndef 
10ae0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
10af0 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e  K.  /* Resolve n
10b00 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48 45 43  ames in all CHEC
10b10 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 70  K constraint exp
10b20 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ressions..  */. 
10b30 20 69 66 28 20 70 2d 3e 70 43 68 65 63 6b 20 29   if( p->pCheck )
10b40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
10b50 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63  olveSelfReferenc
10b60 65 28 70 50 61 72 73 65 2c 20 70 2c 20 4e 43 5f  e(pParse, p, NC_
10b70 49 73 43 68 65 63 6b 2c 20 30 2c 20 70 2d 3e 70  IsCheck, 0, p->p
10b80 43 68 65 63 6b 29 3b 0a 20 20 7d 0a 23 65 6e 64  Check);.  }.#end
10b90 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
10ba0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
10bb0 29 20 2a 2f 0a 0a 20 20 2f 2a 20 45 73 74 69 6d  ) */..  /* Estim
10bc0 61 74 65 20 74 68 65 20 61 76 65 72 61 67 65 20  ate the average 
10bd0 72 6f 77 20 73 69 7a 65 20 66 6f 72 20 74 68 65  row size for the
10be0 20 74 61 62 6c 65 20 61 6e 64 20 66 6f 72 20 61   table and for a
10bf0 6c 6c 20 69 6d 70 6c 69 65 64 20 69 6e 64 69 63  ll implied indic
10c00 65 73 20 2a 2f 0a 20 20 65 73 74 69 6d 61 74 65  es */.  estimate
10c10 54 61 62 6c 65 57 69 64 74 68 28 70 29 3b 0a 20  TableWidth(p);. 
10c20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e   for(pIdx=p->pIn
10c30 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
10c40 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
10c50 20 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57    estimateIndexW
10c60 69 64 74 68 28 70 49 64 78 29 3b 0a 20 20 7d 0a  idth(pIdx);.  }.
10c70 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69  .  /* If not ini
10c80 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20  tializing, then 
10c90 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20  create a record 
10ca0 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
10cb0 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51  e.  ** in the SQ
10cc0 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
10cd0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
10ce0 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e..  **.  ** If 
10cf0 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52  this is a TEMPOR
10d00 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65  ARY table, write
10d10 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20   the entry into 
10d20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20  the auxiliary.  
10d30 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  ** file instead 
10d40 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  of into the main
10d50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
10d60 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
10d70 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
10d80 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65   int n;.    Vdbe
10d90 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   *v;.    char *z
10da0 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65  Type;    /* "vie
10db0 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f  w" or "table" */
10dc0 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65  .    char *zType
10dd0 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f  2;   /* "VIEW" o
10de0 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20  r "TABLE" */.   
10df0 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20   char *zStmt;   
10e00 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20   /* Text of the 
10e10 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20  CREATE TABLE or 
10e20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74  CREATE VIEW stat
10e30 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20  ement */..    v 
10e40 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
10e50 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
10e60 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
10e70 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c  return;..    sql
10e80 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
10e90 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a  , OP_Close, 0);.
10ea0 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20  .    /* .    ** 
10eb0 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65  Initialize zType
10ec0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69 65   for the new vie
10ed0 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20 20  w or table..    
10ee0 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53  */.    if( p->pS
10ef0 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
10f00 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74    /* A regular t
10f10 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54  able */.      zT
10f20 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20  ype = "table";. 
10f30 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54       zType2 = "T
10f40 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53  ABLE";.#ifndef S
10f50 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
10f60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10f70 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20   /* A view */.  
10f80 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65      zType = "vie
10f90 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32  w";.      zType2
10fa0 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69   = "VIEW";.#endi
10fb0 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
10fc0 49 66 20 74 68 69 73 20 69 73 20 61 20 43 52 45  If this is a CRE
10fd0 41 54 45 20 54 41 42 4c 45 20 78 78 20 41 53 20  ATE TABLE xx AS 
10fe0 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63  SELECT ..., exec
10ff0 75 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20  ute the SELECT. 
11000 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
11010 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
11020 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72  new table. The r
11030 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20  oot-page number 
11040 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  for the.    ** n
11050 65 77 20 74 61 62 6c 65 20 69 73 20 69 6e 20 72  ew table is in r
11060 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e  egister pParse->
11070 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a  regRoot..    **.
11080 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20      ** Once the 
11090 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20  SELECT has been 
110a0 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65 33  coded by sqlite3
110b0 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20  Select(), it is 
110c0 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74  in a.    ** suit
110d0 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75  able state to qu
110e0 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ery for the colu
110f0 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70  mn names and typ
11100 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20  es to be used.  
11110 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20    ** by the new 
11120 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  table..    **.  
11130 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63 61    ** A shared-ca
11140 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69  che write-lock i
11150 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74  s not required t
11160 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6e  o write to the n
11170 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a  ew table,.    **
11180 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63   as a schema-loc
11190 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  k must have alre
111a0 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  ady been obtaine
111b0 64 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e 20  d to create it. 
111c0 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20 73  Since.    ** a s
111d0 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75  chema-lock exclu
111e0 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64 61  des all other da
111f0 74 61 62 61 73 65 20 75 73 65 72 73 2c 20 74 68  tabase users, th
11200 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75  e write-lock wou
11210 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 64  ld.    ** be red
11220 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20  undant..    */. 
11230 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
11240 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65  {.      SelectDe
11250 73 74 20 64 65 73 74 3b 20 20 20 20 2f 2a 20 57  st dest;    /* W
11260 68 65 72 65 20 74 68 65 20 53 45 4c 45 43 54 20  here the SELECT 
11270 73 68 6f 75 6c 64 20 73 74 6f 72 65 20 72 65 73  should store res
11280 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ults */.      in
11290 74 20 72 65 67 59 69 65 6c 64 3b 20 20 20 20 20  t regYield;     
112a0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
112b0 6c 64 69 6e 67 20 63 6f 2d 72 6f 75 74 69 6e 65  lding co-routine
112c0 20 65 6e 74 72 79 2d 70 6f 69 6e 74 20 2a 2f 0a   entry-point */.
112d0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f        int addrTo
112e0 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70  p;        /* Top
112f0 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75 74 69   of the co-routi
11300 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ne */.      int 
11310 72 65 67 52 65 63 3b 20 20 20 20 20 20 20 20 20  regRec;         
11320 2f 2a 20 41 20 72 65 63 6f 72 64 20 74 6f 20 62  /* A record to b
11330 65 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 68  e insert into th
11340 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20  e new table */. 
11350 20 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69       int regRowi
11360 64 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  d;       /* Rowi
11370 64 20 6f 66 20 74 68 65 20 6e 65 78 74 20 72 6f  d of the next ro
11380 77 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20  w to insert */. 
11390 20 20 20 20 20 69 6e 74 20 61 64 64 72 49 6e 73       int addrIns
113a0 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 6f 70 20  Loop;    /* Top 
113b0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
113c0 69 6e 73 65 72 74 69 6e 67 20 72 6f 77 73 20 2a  inserting rows *
113d0 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
113e0 53 65 6c 54 61 62 3b 20 20 20 20 20 2f 2a 20 41  SelTab;     /* A
113f0 20 74 61 62 6c 65 20 74 68 61 74 20 64 65 73 63   table that desc
11400 72 69 62 65 73 20 74 68 65 20 53 45 4c 45 43 54  ribes the SELECT
11410 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 20   results */..   
11420 20 20 20 72 65 67 59 69 65 6c 64 20 3d 20 2b 2b     regYield = ++
11430 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
11440 20 20 20 20 72 65 67 52 65 63 20 3d 20 2b 2b 70      regRec = ++p
11450 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
11460 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b     regRowid = ++
11470 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
11480 20 20 20 20 61 73 73 65 72 74 28 70 50 61 72 73      assert(pPars
11490 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20 20 20  e->nTab==1);.   
114a0 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f     sqlite3MayAbo
114b0 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  rt(pParse);.    
114c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
114d0 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  Op3(v, OP_OpenWr
114e0 69 74 65 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e  ite, 1, pParse->
114f0 72 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20  regRoot, iDb);. 
11500 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11510 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
11520 41 47 5f 50 32 49 53 52 45 47 29 3b 0a 20 20 20  AG_P2ISREG);.   
11530 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20     pParse->nTab 
11540 3d 20 32 3b 0a 20 20 20 20 20 20 61 64 64 72 54  = 2;.      addrT
11550 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
11560 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
11570 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
11580 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
11590 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c  P_InitCoroutine,
115a0 20 72 65 67 59 69 65 6c 64 2c 20 30 2c 20 61 64   regYield, 0, ad
115b0 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 69 66  drTop);.      if
115c0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
115d0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 70   return;.      p
115e0 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
115f0 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
11600 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
11610 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  t);.      if( pS
11620 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72  elTab==0 ) retur
11630 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  n;.      assert(
11640 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20   p->aCol==0 );. 
11650 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70       p->nCol = p
11660 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
11670 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53      p->aCol = pS
11680 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20  elTab->aCol;.   
11690 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
116a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c   = 0;.      pSel
116b0 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
116c0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65       sqlite3Dele
116d0 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c  teTable(db, pSel
116e0 54 61 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Tab);.      sqli
116f0 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
11700 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72  t(&dest, SRT_Cor
11710 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64  outine, regYield
11720 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11730 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
11740 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 3b 0a  Select, &dest);.
11750 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
11760 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
11770 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11780 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76  beEndCoroutine(v
11790 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20  , regYield);.   
117a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
117b0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f  mpHere(v, addrTo
117c0 70 20 2d 20 31 29 3b 0a 20 20 20 20 20 20 61 64  p - 1);.      ad
117d0 64 72 49 6e 73 4c 6f 6f 70 20 3d 20 73 71 6c 69  drInsLoop = sqli
117e0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
117f0 20 4f 50 5f 59 69 65 6c 64 2c 20 64 65 73 74 2e   OP_Yield, dest.
11800 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
11810 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
11820 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11830 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
11840 61 6b 65 52 65 63 6f 72 64 2c 20 64 65 73 74 2e  akeRecord, dest.
11850 69 53 64 73 74 2c 20 64 65 73 74 2e 6e 53 64 73  iSdst, dest.nSds
11860 74 2c 20 72 65 67 52 65 63 29 3b 0a 20 20 20 20  t, regRec);.    
11870 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 41 66    sqlite3TableAf
11880 66 69 6e 69 74 79 28 76 2c 20 70 2c 20 30 29 3b  finity(v, p, 0);
11890 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
118a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
118b0 65 77 52 6f 77 69 64 2c 20 31 2c 20 72 65 67 52  ewRowid, 1, regR
118c0 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  owid);.      sql
118d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
118e0 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 31 2c 20  , OP_Insert, 1, 
118f0 72 65 67 52 65 63 2c 20 72 65 67 52 6f 77 69 64  regRec, regRowid
11900 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11910 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
11920 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  InsLoop);.      
11930 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
11940 65 72 65 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f  ere(v, addrInsLo
11950 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  op);.      sqlit
11960 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
11970 4f 50 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a 20 20  OP_Close, 1);.  
11980 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70    }..    /* Comp
11990 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ute the complete
119a0 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
119b0 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ATE statement */
119c0 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
119d0 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   ){.      zStmt 
119e0 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d  = createTableStm
119f0 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65  t(db, p);.    }e
11a00 6c 73 65 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e  lse{.      Token
11a10 20 2a 70 45 6e 64 32 20 3d 20 74 61 62 4f 70 74   *pEnd2 = tabOpt
11a20 73 20 3f 20 26 70 50 61 72 73 65 2d 3e 73 4c 61  s ? &pParse->sLa
11a30 73 74 54 6f 6b 65 6e 20 3a 20 70 45 6e 64 3b 0a  stToken : pEnd;.
11a40 20 20 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 28        n = (int)(
11a50 70 45 6e 64 32 2d 3e 7a 20 2d 20 70 50 61 72 73  pEnd2->z - pPars
11a60 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29  e->sNameToken.z)
11a70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 6e 64  ;.      if( pEnd
11a80 32 2d 3e 7a 5b 30 5d 21 3d 27 3b 27 20 29 20 6e  2->z[0]!=';' ) n
11a90 20 2b 3d 20 70 45 6e 64 32 2d 3e 6e 3b 0a 20 20   += pEnd2->n;.  
11aa0 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69      zStmt = sqli
11ab0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a  te3MPrintf(db, .
11ac0 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
11ad0 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70  E %s %.*s", zTyp
11ae0 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73  e2, n, pParse->s
11af0 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20  NameToken.z.    
11b00 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
11b10 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68  /* A slot for th
11b20 65 20 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72  e record has alr
11b30 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
11b40 74 65 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20  ted in the .    
11b50 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ** SQLITE_MASTER
11b60 20 74 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74   table.  We just
11b70 20 6e 65 65 64 20 74 6f 20 75 70 64 61 74 65 20   need to update 
11b80 74 68 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61  that slot with a
11b90 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  ll.    ** the in
11ba0 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20  formation we've 
11bb0 63 6f 6c 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a  collected..    *
11bc0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  /.    sqlite3Nes
11bd0 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
11be0 0a 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25  .      "UPDATE %
11bf0 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20 20  Q.%s ".         
11c00 22 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20  "SET type='%s', 
11c10 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d  name=%Q, tbl_nam
11c20 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23  e=%Q, rootpage=#
11c30 25 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20  %d, sql=%Q ".   
11c40 20 20 20 20 22 57 48 45 52 45 20 72 6f 77 69 64      "WHERE rowid
11c50 3d 23 25 64 22 2c 0a 20 20 20 20 20 20 64 62 2d  =#%d",.      db-
11c60 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
11c70 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c  me, MASTER_NAME,
11c80 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20  .      zType,.  
11c90 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20      p->zName,.  
11ca0 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20      p->zName,.  
11cb0 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52      pParse->regR
11cc0 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74  oot,.      zStmt
11cd0 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ,.      pParse->
11ce0 72 65 67 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a  regRowid.    );.
11cf0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
11d00 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20  e(db, zStmt);.  
11d10 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
11d20 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
11d30 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  b);..#ifndef SQL
11d40 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
11d50 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68  REMENT.    /* Ch
11d60 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65  eck to see if we
11d70 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
11d80 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  an sqlite_sequen
11d90 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 20  ce table for.   
11da0 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72 61 63   ** keeping trac
11db0 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d 65  k of autoincreme
11dc0 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a  nt keys..    */.
11dd0 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46      if( (p->tabF
11de0 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e  lags & TF_Autoin
11df0 63 72 65 6d 65 6e 74 29 21 3d 30 20 29 7b 0a 20  crement)!=0 ){. 
11e00 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26       Db *pDb = &
11e10 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
11e20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
11e30 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
11e40 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
11e50 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
11e60 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61  >pSchema->pSeqTa
11e70 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
11e80 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
11e90 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
11ea0 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42       "CREATE TAB
11eb0 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71  LE %Q.sqlite_seq
11ec0 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29 22  uence(name,seq)"
11ed0 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  ,.          pDb-
11ee0 3e 7a 44 62 53 4e 61 6d 65 0a 20 20 20 20 20 20  >zDbSName.      
11ef0 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
11f00 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
11f10 2a 20 52 65 70 61 72 73 65 20 65 76 65 72 79 74  * Reparse everyt
11f20 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f  hing to update o
11f30 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61  ur internal data
11f40 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20   structures */. 
11f50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11f60 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 70  dParseSchemaOp(p
11f70 50 61 72 73 65 2c 20 69 44 62 2c 0a 20 20 20 20  Parse, iDb,.    
11f80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
11f90 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e  rintf(db, "tbl_n
11fa0 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70  ame='%q' AND typ
11fb0 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 20 70  e!='trigger'", p
11fc0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a  ->zName));.  }..
11fd0 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61  .  /* Add the ta
11fe0 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65  ble to the in-me
11ff0 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
12000 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62  ion of the datab
12010 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ase..  */.  if( 
12020 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
12030 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64  .    Table *pOld
12040 3b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53  ;.    Schema *pS
12050 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65  chema = p->pSche
12060 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ma;.    assert( 
12070 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
12080 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
12090 30 29 20 29 3b 0a 20 20 20 20 70 4f 6c 64 20 3d  0) );.    pOld =
120a0 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
120b0 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c  rt(&pSchema->tbl
120c0 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  Hash, p->zName, 
120d0 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  p);.    if( pOld
120e0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
120f0 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a  ( p==pOld );  /*
12100 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
12110 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20  e failed inside 
12120 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a  HashInsert() */.
12130 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d        sqlite3Oom
12140 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20  Fault(db);.     
12150 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
12160 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54     pParse->pNewT
12170 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62  able = 0;.    db
12180 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42  ->mDbFlags |= DB
12190 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67  FLAG_SchemaChang
121a0 65 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e;..#ifndef SQLI
121b0 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42  TE_OMIT_ALTERTAB
121c0 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 70  LE.    if( !p->p
121d0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
121e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
121f0 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
12200 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  *)pParse->sNameT
12210 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e  oken.z;.      in
12220 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61  t nName;.      a
12230 73 73 65 72 74 28 20 21 70 53 65 6c 65 63 74 20  ssert( !pSelect 
12240 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e 64  && pCons && pEnd
12250 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43   );.      if( pC
12260 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  ons->z==0 ){.   
12270 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e       pCons = pEn
12280 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
12290 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29 28 28   nName = (int)((
122a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f  const char *)pCo
122b0 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a  ns->z - zName);.
122c0 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f        p->addColO
122d0 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71 6c  ffset = 13 + sql
122e0 69 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e 28  ite3Utf8CharLen(
122f0 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
12300 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
12310 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
12320 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a  E_OMIT_VIEW./*.*
12330 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
12340 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
12350 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61  in order to crea
12360 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f  te a new VIEW.*/
12370 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
12380 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73 65  ateView(.  Parse
12390 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
123a0 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
123b0 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
123c0 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20  *pBegin,     /* 
123d0 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
123e0 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 65   that begins the
123f0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
12400 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
12410 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20     /* The token 
12420 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e  that holds the n
12430 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20  ame of the view 
12440 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
12450 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e2,     /* The t
12460 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
12470 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
12480 76 69 65 77 20 2a 2f 0a 20 20 45 78 70 72 4c 69  view */.  ExprLi
12490 73 74 20 2a 70 43 4e 61 6d 65 73 2c 20 2f 2a 20  st *pCNames, /* 
124a0 4f 70 74 69 6f 6e 61 6c 20 6c 69 73 74 20 6f 66  Optional list of
124b0 20 76 69 65 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d   view column nam
124c0 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  es */.  Select *
124d0 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20  pSelect,   /* A 
124e0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
124f0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
12500 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a  e the new view *
12510 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20  /.  int isTemp, 
12520 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66         /* TRUE f
12530 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76  or a TEMPORARY v
12540 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45  iew */.  int noE
12550 72 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  rr          /* S
12560 75 70 70 72 65 73 73 20 65 72 72 6f 72 20 6d 65  uppress error me
12570 73 73 61 67 65 73 20 69 66 20 56 49 45 57 20 61  ssages if VIEW a
12580 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
12590 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  .){.  Table *p;.
125a0 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74    int n;.  const
125b0 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65   char *z;.  Toke
125c0 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65  n sEnd;.  DbFixe
125d0 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20  r sFix;.  Token 
125e0 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e  *pName = 0;.  in
125f0 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33  t iDb;.  sqlite3
12600 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
12610 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
12620 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20 20  ->nVar>0 ){.    
12630 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
12640 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65 74  pParse, "paramet
12650 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f  ers are not allo
12660 77 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b 0a  wed in views");.
12670 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f      goto create_
12680 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20 7d 0a 20  view_fail;.  }. 
12690 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
126a0 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  le(pParse, pName
126b0 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d  1, pName2, isTem
126c0 70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b  p, 1, 0, noErr);
126d0 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
126e0 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
126f0 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  p==0 || pParse->
12700 6e 45 72 72 20 29 20 67 6f 74 6f 20 63 72 65 61  nErr ) goto crea
12710 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20  te_view_fail;.  
12720 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
12730 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
12740 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
12750 65 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69  e);.  iDb = sqli
12760 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
12770 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  (db, p->pSchema)
12780 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e  ;.  sqlite3FixIn
12790 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
127a0 2c 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70  , iDb, "view", p
127b0 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c  Name);.  if( sql
127c0 69 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73  ite3FixSelect(&s
127d0 46 69 78 2c 20 70 53 65 6c 65 63 74 29 20 29 20  Fix, pSelect) ) 
127e0 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77  goto create_view
127f0 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  _fail;..  /* Mak
12800 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
12810 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74  entire SELECT st
12820 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66  atement that def
12830 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20  ines the view.. 
12840 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f   ** This will fo
12850 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72  rce all the Expr
12860 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20  .token.z values 
12870 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
12880 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  y.  ** allocated
12890 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69   rather than poi
128a0 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20  nt to the input 
128b0 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d  string - which m
128c0 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  eans that.  ** t
128d0 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74  hey will persist
128e0 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65   after the curre
128f0 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  nt sqlite3_exec(
12900 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a  ) call returns..
12910 20 20 2a 2f 0a 20 20 69 66 28 20 49 4e 5f 52 45    */.  if( IN_RE
12920 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20  NAME_OBJECT ){. 
12930 20 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20     p->pSelect = 
12940 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 70 53 65  pSelect;.    pSe
12950 6c 65 63 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  lect = 0;.  }els
12960 65 7b 0a 20 20 20 20 70 2d 3e 70 53 65 6c 65 63  e{.    p->pSelec
12970 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
12980 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74  tDup(db, pSelect
12990 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
129a0 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 43 68 65  );.  }.  p->pChe
129b0 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ck = sqlite3Expr
129c0 4c 69 73 74 44 75 70 28 64 62 2c 20 70 43 4e 61  ListDup(db, pCNa
129d0 6d 65 73 2c 20 45 58 50 52 44 55 50 5f 52 45 44  mes, EXPRDUP_RED
129e0 55 43 45 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  UCE);.  if( db->
129f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
12a00 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f  oto create_view_
12a10 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61  fail;..  /* Loca
12a20 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  te the end of th
12a30 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  e CREATE VIEW st
12a40 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73  atement.  Make s
12a50 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a  End point to.  *
12a60 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a  * the end..  */.
12a70 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d    sEnd = pParse-
12a80 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 61  >sLastToken;.  a
12a90 73 73 65 72 74 28 20 73 45 6e 64 2e 7a 5b 30 5d  ssert( sEnd.z[0]
12aa0 21 3d 30 20 7c 7c 20 73 45 6e 64 2e 6e 3d 3d 30  !=0 || sEnd.n==0
12ab0 20 29 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a   );.  if( sEnd.z
12ac0 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20  [0]!=';' ){.    
12ad0 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e  sEnd.z += sEnd.n
12ae0 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d  ;.  }.  sEnd.n =
12af0 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28   0;.  n = (int)(
12b00 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d  sEnd.z - pBegin-
12b10 3e 7a 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  >z);.  assert( n
12b20 3e 30 20 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67  >0 );.  z = pBeg
12b30 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20  in->z;.  while( 
12b40 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
12b50 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d  [n-1]) ){ n--; }
12b60 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e  .  sEnd.z = &z[n
12b70 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  -1];.  sEnd.n = 
12b80 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c  1;..  /* Use sql
12b90 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74  ite3EndTable() t
12ba0 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74  o add the view t
12bb0 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  o the SQLITE_MAS
12bc0 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  TER table */.  s
12bd0 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70  qlite3EndTable(p
12be0 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c  Parse, 0, &sEnd,
12bf0 20 30 2c 20 30 29 3b 0a 0a 63 72 65 61 74 65 5f   0, 0);..create_
12c00 76 69 65 77 5f 66 61 69 6c 3a 0a 20 20 73 71 6c  view_fail:.  sql
12c10 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
12c20 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  (db, pSelect);. 
12c30 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
12c40 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 73 71 6c  BJECT ){.    sql
12c50 69 74 65 33 52 65 6e 61 6d 65 45 78 70 72 6c 69  ite3RenameExprli
12c60 73 74 55 6e 6d 61 70 28 70 50 61 72 73 65 2c 20  stUnmap(pParse, 
12c70 70 43 4e 61 6d 65 73 29 3b 0a 20 20 7d 0a 20 20  pCNames);.  }.  
12c80 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
12c90 65 6c 65 74 65 28 64 62 2c 20 70 43 4e 61 6d 65  elete(db, pCName
12ca0 73 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  s);.  return;.}.
12cb0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
12cc0 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23  _OMIT_VIEW */..#
12cd0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
12ce0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
12cf0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
12d00 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
12d10 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61  LE)./*.** The Ta
12d20 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54  ble structure pT
12d30 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61  able is really a
12d40 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20   VIEW.  Fill in 
12d50 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20  the names of.** 
12d60 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
12d70 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70  he view in the p
12d80 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e  Table structure.
12d90 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
12da0 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73  ber.** of errors
12db0 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  .  If an error i
12dc0 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20  s seen leave an 
12dd0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
12de0 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
12df0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12e00 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
12e10 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  es(Parse *pParse
12e20 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
12e30 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54  {.  Table *pSelT
12e40 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20  ab;   /* A fake 
12e50 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68  table from which
12e60 20 77 65 20 67 65 74 20 74 68 65 20 72 65 73 75   we get the resu
12e70 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65  lt set */.  Sele
12e80 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a  ct *pSel;     /*
12e90 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   Copy of the SEL
12ea0 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ECT that impleme
12eb0 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a  nts the view */.
12ec0 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20    int nErr = 0; 
12ed0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
12ee0 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
12ef0 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  red */.  int n; 
12f00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
12f10 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20  mporarily holds 
12f20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75  the number of cu
12f30 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a  rsors assigned *
12f40 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
12f50 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
12f60 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
12f70 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63  ction for malloc
12f80 20 65 72 72 6f 72 73 20 2a 2f 0a 23 69 66 6e 64   errors */.#ifnd
12f90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
12fa0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e  IRTUALTABLE.  in
12fb0 74 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66  t rc;.#endif.#if
12fc0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12fd0 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
12fe0 20 73 71 6c 69 74 65 33 5f 78 61 75 74 68 20 78   sqlite3_xauth x
12ff0 41 75 74 68 3b 20 20 20 20 20 20 20 2f 2a 20 53  Auth;       /* S
13000 61 76 65 64 20 78 41 75 74 68 20 70 6f 69 6e 74  aved xAuth point
13010 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  er */.#endif..  
13020 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20 29  assert( pTable )
13030 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
13040 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
13050 42 4c 45 0a 20 20 64 62 2d 3e 6e 53 63 68 65 6d  BLE.  db->nSchem
13060 61 4c 6f 63 6b 2b 2b 3b 0a 20 20 72 63 20 3d 20  aLock++;.  rc = 
13070 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43  sqlite3VtabCallC
13080 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20 70  onnect(pParse, p
13090 54 61 62 6c 65 29 3b 0a 20 20 64 62 2d 3e 6e 53  Table);.  db->nS
130a0 63 68 65 6d 61 4c 6f 63 6b 2d 2d 3b 0a 20 20 69  chemaLock--;.  i
130b0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
130c0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
130d0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c   IsVirtual(pTabl
130e0 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  e) ) return 0;.#
130f0 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
13100 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
13110 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20    /* A positive 
13120 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63  nCol means the c
13130 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72  olumns names for
13140 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a 20   this view are. 
13150 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77   ** already know
13160 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  n..  */.  if( pT
13170 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72  able->nCol>0 ) r
13180 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41  eturn 0;..  /* A
13190 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69   negative nCol i
131a0 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b  s a special mark
131b0 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  er meaning that 
131c0 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  we are currently
131d0 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20  .  ** trying to 
131e0 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75  compute the colu
131f0 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65  mn names.  If we
13200 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74   enter this rout
13210 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20  ine with.  ** a 
13220 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69  negative nCol, i
13230 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d  t means two or m
13240 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61  ore views form a
13250 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73   loop, like this
13260 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
13270 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20  CREATE VIEW one 
13280 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
13290 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43   two;.  **     C
132a0 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20 41  REATE VIEW two A
132b0 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
132c0 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  one;.  **.  ** A
132d0 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 65 72 72  ctually, the err
132e0 6f 72 20 61 62 6f 76 65 20 69 73 20 6e 6f 77 20  or above is now 
132f0 63 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f 20  caught prior to 
13300 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 70 6f  reaching this po
13310 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68  int..  ** But th
13320 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
13330 20 69 73 20 73 74 69 6c 6c 20 69 6d 70 6f 72 74   is still import
13340 61 6e 74 20 61 73 20 69 74 20 64 6f 65 73 20 63  ant as it does c
13350 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69 6e 20 74  ome up.  ** in t
13360 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
13370 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 43 52 45  ** .  **     CRE
13380 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e 65  ATE TABLE main.e
13390 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20 20 20 20  x1(a);.  **     
133a0 43 52 45 41 54 45 20 54 45 4d 50 20 56 49 45 57  CREATE TEMP VIEW
133b0 20 65 78 31 20 41 53 20 53 45 4c 45 43 54 20 61   ex1 AS SELECT a
133c0 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a 20   FROM ex1;.  ** 
133d0 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
133e0 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f  M temp.ex1;.  */
133f0 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e  .  if( pTable->n
13400 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  Col<0 ){.    sql
13410 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
13420 72 73 65 2c 20 22 76 69 65 77 20 25 73 20 69 73  rse, "view %s is
13430 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69   circularly defi
13440 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  ned", pTable->zN
13450 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
13460 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   1;.  }.  assert
13470 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d  ( pTable->nCol>=
13480 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  0 );..  /* If we
13490 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
134a0 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20  t means we need 
134b0 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74  to compute the t
134c0 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a  able names..  **
134d0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63   Note that the c
134e0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52 65  all to sqlite3Re
134f0 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
13500 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e  ) will expand an
13510 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65  y.  ** "*" eleme
13520 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  nts in the resul
13530 74 73 20 73 65 74 20 6f 66 20 74 68 65 20 76 69  ts set of the vi
13540 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73 69  ew and will assi
13550 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20  gn cursors.  ** 
13560 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20  to the elements 
13570 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
13580 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20 6e  se.  But we do n
13590 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20 63 68  ot want these ch
135a0 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65  anges.  ** to be
135b0 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20   permanent.  So 
135c0 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20  the computation 
135d0 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70  is done on a cop
135e0 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a  y of the SELECT.
135f0 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
13600 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
13610 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  view..  */.  ass
13620 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65  ert( pTable->pSe
13630 6c 65 63 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d  lect );.  pSel =
13640 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
13650 70 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53  p(db, pTable->pS
13660 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28  elect, 0);.  if(
13670 20 70 53 65 6c 20 29 7b 0a 23 69 66 6e 64 65 66   pSel ){.#ifndef
13680 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54   SQLITE_OMIT_ALT
13690 45 52 54 41 42 4c 45 0a 20 20 20 20 75 38 20 65  ERTABLE.    u8 e
136a0 50 61 72 73 65 4d 6f 64 65 20 3d 20 70 50 61 72  ParseMode = pPar
136b0 73 65 2d 3e 65 50 61 72 73 65 4d 6f 64 65 3b 0a  se->eParseMode;.
136c0 20 20 20 20 70 50 61 72 73 65 2d 3e 65 50 61 72      pParse->ePar
136d0 73 65 4d 6f 64 65 20 3d 20 50 41 52 53 45 5f 4d  seMode = PARSE_M
136e0 4f 44 45 5f 4e 4f 52 4d 41 4c 3b 0a 23 65 6e 64  ODE_NORMAL;.#end
136f0 69 66 0a 20 20 20 20 6e 20 3d 20 70 50 61 72 73  if.    n = pPars
13700 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c  e->nTab;.    sql
13710 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
13720 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
13730 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20   pSel->pSrc);.  
13740 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
13750 20 2d 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f   -1;.    db->loo
13760 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 2b  kaside.bDisable+
13770 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  +;.#ifndef SQLIT
13780 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
13790 54 49 4f 4e 0a 20 20 20 20 78 41 75 74 68 20 3d  TION.    xAuth =
137a0 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20   db->xAuth;.    
137b0 64 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20  db->xAuth = 0;. 
137c0 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c     pSelTab = sql
137d0 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
137e0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
137f0 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75  el);.    db->xAu
13800 74 68 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73  th = xAuth;.#els
13810 65 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20  e.    pSelTab = 
13820 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
13830 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
13840 20 70 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20   pSel);.#endif. 
13850 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20     pParse->nTab 
13860 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 54 61  = n;.    if( pTa
13870 62 6c 65 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20  ble->pCheck ){. 
13880 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45 20 56       /* CREATE V
13890 49 45 57 20 6e 61 6d 65 28 61 72 67 6c 69 73 74  IEW name(arglist
138a0 29 20 41 53 20 2e 2e 2e 0a 20 20 20 20 20 20 2a  ) AS ....      *
138b0 2a 20 54 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  * The names of t
138c0 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  he columns in th
138d0 65 20 74 61 62 6c 65 20 61 72 65 20 74 61 6b 65  e table are take
138e0 6e 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20  n from.      ** 
138f0 61 72 67 6c 69 73 74 20 77 68 69 63 68 20 69 73  arglist which is
13900 20 73 74 6f 72 65 64 20 69 6e 20 70 54 61 62 6c   stored in pTabl
13910 65 2d 3e 70 43 68 65 63 6b 2e 20 20 54 68 65 20  e->pCheck.  The 
13920 70 43 68 65 63 6b 20 66 69 65 6c 64 0a 20 20 20  pCheck field.   
13930 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 68     ** normally h
13940 6f 6c 64 73 20 43 48 45 43 4b 20 63 6f 6e 73 74  olds CHECK const
13950 72 61 69 6e 74 73 20 6f 6e 20 61 6e 20 6f 72 64  raints on an ord
13960 69 6e 61 72 79 20 74 61 62 6c 65 2c 20 62 75 74  inary table, but
13970 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 20   for.      ** a 
13980 56 49 45 57 20 69 74 20 68 6f 6c 64 73 20 74 68  VIEW it holds th
13990 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  e list of column
139a0 20 6e 61 6d 65 73 2e 0a 20 20 20 20 20 20 2a 2f   names..      */
139b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
139c0 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
139d0 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65  t(pParse, pTable
139e0 2d 3e 70 43 68 65 63 6b 2c 20 0a 20 20 20 20 20  ->pCheck, .     
139f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a00 20 20 20 20 20 20 20 20 20 20 20 20 26 70 54 61              &pTa
13a10 62 6c 65 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  ble->nCol, &pTab
13a20 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20  le->aCol);.     
13a30 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
13a40 61 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 20  ailed==0 .      
13a50 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   && pParse->nErr
13a60 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 54  ==0.       && pT
13a70 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c  able->nCol==pSel
13a80 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 0a  ->pEList->nExpr.
13a90 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
13aa0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
13ab0 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
13ac0 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
13ad0 70 54 61 62 6c 65 2c 20 70 53 65 6c 29 3b 0a 20  pTable, pSel);. 
13ae0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
13af0 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a   if( pSelTab ){.
13b00 20 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45 20        /* CREATE 
13b10 56 49 45 57 20 6e 61 6d 65 20 41 53 2e 2e 2e 20  VIEW name AS... 
13b20 20 77 69 74 68 6f 75 74 20 61 6e 20 61 72 67 75   without an argu
13b30 6d 65 6e 74 20 6c 69 73 74 2e 20 20 43 6f 6e 73  ment list.  Cons
13b40 74 72 75 63 74 0a 20 20 20 20 20 20 2a 2a 20 74  truct.      ** t
13b50 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
13b60 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20  from the SELECT 
13b70 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64  statement that d
13b80 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e  efines the view.
13b90 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13ba0 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
13bb0 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
13bc0 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
13bd0 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
13be0 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f       pTable->aCo
13bf0 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
13c00 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  l;.      pSelTab
13c10 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
13c20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
13c30 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
13c40 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
13c50 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c  MutexHeld(db, 0,
13c60 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
13c70 29 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ) );.    }else{.
13c80 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43        pTable->nC
13c90 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45  ol = 0;.      nE
13ca0 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rr++;.    }.    
13cb0 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
13cc0 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b  le(db, pSelTab);
13cd0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
13ce0 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
13cf0 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  l);.    db->look
13d00 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 2d 2d  aside.bDisable--
13d10 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
13d20 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45  _OMIT_ALTERTABLE
13d30 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 65 50 61  .    pParse->ePa
13d40 72 73 65 4d 6f 64 65 20 3d 20 65 50 61 72 73 65  rseMode = eParse
13d50 4d 6f 64 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  Mode;.#endif.  }
13d60 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72 72   else {.    nErr
13d70 2b 2b 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65  ++;.  }.  pTable
13d80 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d  ->pSchema->schem
13d90 61 46 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72  aFlags |= DB_Unr
13da0 65 73 65 74 56 69 65 77 73 3b 0a 20 20 69 66 28  esetViews;.  if(
13db0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
13dc0 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
13dd0 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  DeleteColumnName
13de0 73 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20  s(db, pTable);. 
13df0 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20     pTable->aCol 
13e00 3d 20 30 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d  = 0;.    pTable-
13e10 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 23  >nCol = 0;.  }.#
13e20 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
13e30 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72  OMIT_VIEW */.  r
13e40 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a  eturn nErr;  .}.
13e50 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
13e60 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
13e70 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
13e80 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
13e90 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23  TUALTABLE) */..#
13ea0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13eb0 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c  IT_VIEW./*.** Cl
13ec0 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ear the column n
13ed0 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20  ames from every 
13ee0 56 49 45 57 20 69 6e 20 64 61 74 61 62 61 73 65  VIEW in database
13ef0 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   idx..*/.static 
13f00 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52  void sqliteViewR
13f10 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20  esetAll(sqlite3 
13f20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20  *db, int idx){. 
13f30 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20   HashElem *i;.  
13f40 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
13f50 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
13f60 62 2c 20 69 64 78 2c 20 30 29 20 29 3b 0a 20 20  b, idx, 0) );.  
13f70 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65 72  if( !DbHasProper
13f80 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55  ty(db, idx, DB_U
13f90 6e 72 65 73 65 74 56 69 65 77 73 29 20 29 20 72  nresetViews) ) r
13fa0 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73  eturn;.  for(i=s
13fb0 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
13fc0 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63  db->aDb[idx].pSc
13fd0 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20  hema->tblHash); 
13fe0 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  i;i=sqliteHashNe
13ff0 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c  xt(i)){.    Tabl
14000 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
14010 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
14020 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
14030 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ct ){.      sqli
14040 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e  te3DeleteColumnN
14050 61 6d 65 73 28 64 62 2c 20 70 54 61 62 29 3b 0a  ames(db, pTab);.
14060 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
14070 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 54 61 62   = 0;.      pTab
14080 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
14090 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50  }.  }.  DbClearP
140a0 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c  roperty(db, idx,
140b0 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
140c0 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
140d0 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52 65  ine sqliteViewRe
140e0 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64  setAll(A,B).#end
140f0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
14100 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  T_VIEW */../*.**
14110 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
14120 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
14130 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20 74  VDBE to adjust t
14140 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  he internal sche
14150 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53 51  ma.** used by SQ
14160 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20 62 74  Lite when the bt
14170 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73 20  ree layer moves 
14180 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67  a table root pag
14190 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70  e. The.** root-p
141a0 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  age of a table o
141b0 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61 62  r index in datab
141c0 61 73 65 20 69 44 62 20 68 61 73 20 63 68 61 6e  ase iDb has chan
141d0 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a  ged from iFrom.*
141e0 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20  * to iTo..**.** 
141f0 54 69 63 6b 65 74 20 23 31 37 32 38 3a 20 20 54  Ticket #1728:  T
14200 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20  he symbol table 
14210 6d 69 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74  might still cont
14220 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  ain information.
14230 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64  ** on tables and
14240 2f 6f 72 20 69 6e 64 69 63 65 73 20 74 68 61 74  /or indices that
14250 20 61 72 65 20 74 68 65 20 70 72 6f 63 65 73 73   are the process
14260 20 6f 66 20 62 65 69 6e 67 20 64 65 6c 65 74 65   of being delete
14270 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72 65  d..** If you are
14280 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66   unlucky, one of
14290 20 74 68 6f 73 65 20 64 65 6c 65 74 65 64 20 69   those deleted i
142a0 6e 64 69 63 65 73 20 6f 72 20 74 61 62 6c 65 73  ndices or tables
142b0 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 20 74   might.** have t
142c0 68 65 20 73 61 6d 65 20 72 6f 6f 74 70 61 67 65  he same rootpage
142d0 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20 72   number as the r
142e0 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  eal table or ind
142f0 65 78 20 74 68 61 74 20 69 73 0a 2a 2a 20 62 65  ex that is.** be
14300 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77  ing moved.  So w
14310 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65  e cannot stop se
14320 61 72 63 68 69 6e 67 20 61 66 74 65 72 20 74 68  arching after th
14330 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 0a 2a  e first match .*
14340 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66 69  * because the fi
14350 72 73 74 20 6d 61 74 63 68 20 6d 69 67 68 74 20  rst match might 
14360 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  be for one of th
14370 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65  e deleted indice
14380 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20 61  s.** or tables a
14390 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 62 6c 65  nd not the table
143a0 2f 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 61  /index that is a
143b0 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f  ctually being mo
143c0 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20  ved..** We must 
143d0 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67  continue looping
143e0 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65   until all table
143f0 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20 77 69  s and indices wi
14400 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d  th.** rootpage==
14410 69 46 72 6f 6d 20 68 61 76 65 20 62 65 65 6e 20  iFrom have been 
14420 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 68 61 76  converted to hav
14430 65 20 61 20 72 6f 6f 74 70 61 67 65 20 6f 66 20  e a rootpage of 
14440 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  iTo.** in order 
14450 74 6f 20 62 65 20 63 65 72 74 61 69 6e 20 74 68  to be certain th
14460 61 74 20 77 65 20 67 6f 74 20 74 68 65 20 72 69  at we got the ri
14470 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e  ght one..*/.#ifn
14480 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14490 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20  AUTOVACUUM.void 
144a0 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d  sqlite3RootPageM
144b0 6f 76 65 64 28 73 71 6c 69 74 65 33 20 2a 64 62  oved(sqlite3 *db
144c0 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 69  , int iDb, int i
144d0 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a  From, int iTo){.
144e0 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65    HashElem *pEle
144f0 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68  m;.  Hash *pHash
14500 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20  ;.  Db *pDb;..  
14510 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
14520 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
14530 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
14540 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
14550 44 62 5d 3b 0a 20 20 70 48 61 73 68 20 3d 20 26  Db];.  pHash = &
14560 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62  pDb->pSchema->tb
14570 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c  lHash;.  for(pEl
14580 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
14590 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d  st(pHash); pElem
145a0 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
145b0 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
145c0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
145d0 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
145e0 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28  (pElem);.    if(
145f0 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72   pTab->tnum==iFr
14600 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  om ){.      pTab
14610 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20  ->tnum = iTo;.  
14620 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68 20    }.  }.  pHash 
14630 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  = &pDb->pSchema-
14640 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f 72 28  >idxHash;.  for(
14650 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
14660 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45  First(pHash); pE
14670 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
14680 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
14690 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
146a0 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  dx = sqliteHashD
146b0 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
146c0 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d  if( pIdx->tnum==
146d0 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70  iFrom ){.      p
146e0 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b  Idx->tnum = iTo;
146f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
14700 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
14710 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74   code to erase t
14720 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
14730 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20 66  ot-page iTable f
14740 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44 62  rom database iDb
14750 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65 20  ..** Also write 
14760 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20 74  code to modify t
14770 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
14780 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65 72   table and inter
14790 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66  nal schema.** if
147a0 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20   a root-page of 
147b0 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73  another table is
147c0 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74   moved by the bt
147d0 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73 74  ree-layer whilst
147e0 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61 62  .** erasing iTab
147f0 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68 61 70  le (this can hap
14800 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f  pen with an auto
14810 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
14820 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  )..*/ .static vo
14830 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61  id destroyRootPa
14840 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
14850 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e  , int iTable, in
14860 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a  t iDb){.  Vdbe *
14870 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
14880 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e  be(pParse);.  in
14890 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
148a0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
148b0 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3c 32  ;.  if( iTable<2
148c0 20 29 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d   ) sqlite3ErrorM
148d0 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72 72  sg(pParse, "corr
148e0 75 70 74 20 73 63 68 65 6d 61 22 29 3b 0a 20 20  upt schema");.  
148f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14900 33 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c  3(v, OP_Destroy,
14910 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 69 44 62   iTable, r1, iDb
14920 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61 79 41  );.  sqlite3MayA
14930 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 23 69  bort(pParse);.#i
14940 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14950 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
14960 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 73 74 6f  * OP_Destroy sto
14970 72 65 73 20 61 6e 20 69 6e 20 69 6e 74 65 67 65  res an in intege
14980 72 20 72 31 2e 20 49 66 20 74 68 69 73 20 69 6e  r r1. If this in
14990 74 65 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f  teger.  ** is no
149a0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20  n-zero, then it 
149b0 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  is the root page
149c0 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 74 61 62   number of a tab
149d0 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a  le moved to.  **
149e0 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c 65   location iTable
149f0 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
14a00 63 6f 64 65 20 6d 6f 64 69 66 69 65 73 20 74 68  code modifies th
14a10 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
14a20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65  table to.  ** re
14a30 66 6c 65 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a  flect this..  **
14a40 0a 20 20 2a 2a 20 54 68 65 20 22 23 4e 4e 4e 22  .  ** The "#NNN"
14a50 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73 20 61   in the SQL is a
14a60 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e   special constan
14a70 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77 68 61  t that means wha
14a80 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a  tever value.  **
14a90 20 69 73 20 69 6e 20 72 65 67 69 73 74 65 72 20   is in register 
14aa0 4e 4e 4e 2e 20 20 53 65 65 20 67 72 61 6d 6d 61  NNN.  See gramma
14ab0 72 20 72 75 6c 65 73 20 61 73 73 6f 63 69 61 74  r rules associat
14ac0 65 64 20 77 69 74 68 20 74 68 65 20 54 4b 5f 52  ed with the TK_R
14ad0 45 47 49 53 54 45 52 0a 20 20 2a 2a 20 74 6f 6b  EGISTER.  ** tok
14ae0 65 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  en for additiona
14af0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20  l information.. 
14b00 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73   */.  sqlite3Nes
14b10 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
14b20 20 0a 20 20 20 20 20 22 55 50 44 41 54 45 20 25   .     "UPDATE %
14b30 51 2e 25 73 20 53 45 54 20 72 6f 6f 74 70 61 67  Q.%s SET rootpag
14b40 65 3d 25 64 20 57 48 45 52 45 20 23 25 64 20 41  e=%d WHERE #%d A
14b50 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 22  ND rootpage=#%d"
14b60 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  ,.     pParse->d
14b70 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
14b80 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d  Name, MASTER_NAM
14b90 45 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 72  E, iTable, r1, r
14ba0 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  1);.#endif.  sql
14bb0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
14bc0 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
14bd0 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56  }../*.** Write V
14be0 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73  DBE code to eras
14bf0 65 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64  e table pTab and
14c00 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20   all associated 
14c10 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e  indices on disk.
14c20 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61  .** Code to upda
14c30 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  te the sqlite_ma
14c40 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20  ster tables and 
14c50 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
14c60 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69  definitions.** i
14c70 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61  n case a root-pa
14c80 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
14c90 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73  another table is
14ca0 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74   moved by the bt
14cb0 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20  ree layer.** is 
14cc0 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69 73  also added (this
14cd0 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
14ce0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
14cf0 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74  database)..*/.st
14d00 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f  atic void destro
14d10 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  yTable(Parse *pP
14d20 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
14d30 62 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  b){.  /* If the 
14d40 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20  database may be 
14d50 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61  auto-vacuum capa
14d60 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f  ble (if SQLITE_O
14d70 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
14d80 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e   ** is not defin
14d90 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ed), then it is 
14da0 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c  important to cal
14db0 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20  l OP_Destroy on 
14dc0 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61  the.  ** table a
14dd0 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61  nd index root-pa
14de0 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74  ges in order, st
14df0 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20  arting with the 
14e00 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a  numerically .  *
14e10 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  * largest root-p
14e20 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73  age number. This
14e30 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
14e40 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f   none of the roo
14e50 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20  t-pages.  ** to 
14e60 62 65 20 64 65 73 74 72 6f 79 65 64 20 69 73 20  be destroyed is 
14e70 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20  relocated by an 
14e80 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72  earlier OP_Destr
14e90 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a  oy. i.e. if the.
14ea0 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77    ** following w
14eb0 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a  ere coded:.  **.
14ec0 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    ** OP_Destroy 
14ed0 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a  4 0.  ** ....  *
14ee0 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30  * OP_Destroy 5 0
14ef0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72  .  **.  ** and r
14f00 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70 70 65  oot page 5 happe
14f10 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61  ned to be the la
14f20 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20  rgest root-page 
14f30 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20  number in the.  
14f40 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ** database, the
14f50 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f  n root page 5 wo
14f60 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20  uld be moved to 
14f70 70 61 67 65 20 34 20 62 79 20 74 68 65 20 0a 20  page 4 by the . 
14f80 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20   ** "OP_Destroy 
14f90 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65  4 0" opcode. The
14fa0 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f   subsequent "OP_
14fb0 44 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75  Destroy 5 0" wou
14fc0 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72  ld hit.  ** a fr
14fd0 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20  ee-list page..  
14fe0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
14ff0 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e  pTab->tnum;.  in
15000 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30  t iDestroyed = 0
15010 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  ;..  while( 1 ){
15020 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
15030 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65  ;.    int iLarge
15040 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  st = 0;..    if(
15050 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c   iDestroyed==0 |
15060 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65  | iTab<iDestroye
15070 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67  d ){.      iLarg
15080 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  est = iTab;.    
15090 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  }.    for(pIdx=p
150a0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
150b0 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
150c0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
150d0 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75  iIdx = pIdx->tnu
150e0 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  m;.      assert(
150f0 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d   pIdx->pSchema==
15100 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
15110 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73  .      if( (iDes
15120 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49  troyed==0 || (iI
15130 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20  dx<iDestroyed)) 
15140 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74  && iIdx>iLargest
15150 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72   ){.        iLar
15160 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20  gest = iIdx;.   
15170 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
15180 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29  f( iLargest==0 )
15190 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  {.      return;.
151a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
151b0 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
151c0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
151d0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
151e0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
151f0 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
15200 20 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d 3e   && iDb<pParse->
15210 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 20  db->nDb );.     
15220 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
15230 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73  (pParse, iLarges
15240 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69  t, iDb);.      i
15250 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72  Destroyed = iLar
15260 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  gest;.    }.  }.
15270 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
15280 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74 68 65  entries from the
15290 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20 74 61   sqlite_statN ta
152a0 62 6c 65 73 20 28 66 6f 72 20 4e 20 69 6e 20 28  bles (for N in (
152b0 31 2c 32 2c 33 29 29 0a 2a 2a 20 61 66 74 65 72  1,2,3)).** after
152c0 20 61 20 44 52 4f 50 20 49 4e 44 45 58 20 6f 72   a DROP INDEX or
152d0 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d 6d   DROP TABLE comm
152e0 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  and..*/.static v
152f0 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72  oid sqlite3Clear
15300 53 74 61 74 54 61 62 6c 65 73 28 0a 20 20 50 61  StatTables(.  Pa
15310 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
15320 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
15330 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
15340 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20   int iDb,       
15350 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
15360 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a  atabase number *
15370 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
15380 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a 20 22 69  zType,     /* "i
15390 64 78 22 20 6f 72 20 22 74 62 6c 22 20 2a 2f 0a  dx" or "tbl" */.
153a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
153b0 61 6d 65 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame      /* Name
153c0 20 6f 66 20 69 6e 64 65 78 20 6f 72 20 74 61 62   of index or tab
153d0 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  le */.){.  int i
153e0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
153f0 7a 44 62 4e 61 6d 65 20 3d 20 70 50 61 72 73 65  zDbName = pParse
15400 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
15410 44 62 53 4e 61 6d 65 3b 0a 20 20 66 6f 72 28 69  DbSName;.  for(i
15420 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b 2b 29 7b 0a  =1; i<=4; i++){.
15430 20 20 20 20 63 68 61 72 20 7a 54 61 62 5b 32 34      char zTab[24
15440 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ];.    sqlite3_s
15450 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
15460 54 61 62 29 2c 7a 54 61 62 2c 22 73 71 6c 69 74  Tab),zTab,"sqlit
15470 65 5f 73 74 61 74 25 64 22 2c 69 29 3b 0a 20 20  e_stat%d",i);.  
15480 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
15490 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64  dTable(pParse->d
154a0 62 2c 20 7a 54 61 62 2c 20 7a 44 62 4e 61 6d 65  b, zTab, zDbName
154b0 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
154c0 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
154d0 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44  arse,.        "D
154e0 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73  ELETE FROM %Q.%s
154f0 20 57 48 45 52 45 20 25 73 3d 25 51 22 2c 0a 20   WHERE %s=%Q",. 
15500 20 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c 20         zDbName, 
15510 7a 54 61 62 2c 20 7a 54 79 70 65 2c 20 7a 4e 61  zTab, zType, zNa
15520 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  me.      );.    
15530 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
15540 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
15550 64 72 6f 70 20 61 20 74 61 62 6c 65 2e 0a 2a 2f  drop a table..*/
15560 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
15570 65 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65  eDropTable(Parse
15580 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
15590 2a 70 54 61 62 2c 20 69 6e 74 20 69 44 62 2c 20  *pTab, int iDb, 
155a0 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20 56  int isView){.  V
155b0 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
155c0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
155d0 64 62 3b 0a 20 20 54 72 69 67 67 65 72 20 2a 70  db;.  Trigger *p
155e0 54 72 69 67 67 65 72 3b 0a 20 20 44 62 20 2a 70  Trigger;.  Db *p
155f0 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
15600 62 5d 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  b];..  v = sqlit
15610 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
15620 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  );.  assert( v!=
15630 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65  0 );.  sqlite3Be
15640 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
15650 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
15660 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
15670 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
15680 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72  ABLE.  if( IsVir
15690 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
156a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
156b0 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e  Op0(v, OP_VBegin
156c0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
156d0 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69   /* Drop all tri
156e0 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64  ggers associated
156f0 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
15700 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43  being dropped. C
15710 6f 64 65 0a 20 20 2a 2a 20 69 73 20 67 65 6e 65  ode.  ** is gene
15720 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65 20  rated to remove 
15730 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71 6c  entries from sql
15740 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f  ite_master and/o
15750 72 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65  r.  ** sqlite_te
15760 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71  mp_master if req
15770 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54  uired..  */.  pT
15780 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33  rigger = sqlite3
15790 54 72 69 67 67 65 72 4c 69 73 74 28 70 50 61 72  TriggerList(pPar
157a0 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 77 68 69  se, pTab);.  whi
157b0 6c 65 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a  le( pTrigger ){.
157c0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69      assert( pTri
157d0 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  gger->pSchema==p
157e0 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20  Tab->pSchema || 
157f0 0a 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65  .        pTrigge
15800 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e  r->pSchema==db->
15810 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29  aDb[1].pSchema )
15820 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f  ;.    sqlite3Dro
15830 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61 72  pTriggerPtr(pPar
15840 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20  se, pTrigger);. 
15850 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54     pTrigger = pT
15860 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  rigger->pNext;. 
15870 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
15880 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
15890 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76  EMENT.  /* Remov
158a0 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66  e any entries of
158b0 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75   the sqlite_sequ
158c0 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63  ence table assoc
158d0 69 61 74 65 64 20 77 69 74 68 0a 20 20 2a 2a 20  iated with.  ** 
158e0 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
158f0 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69 73  dropped. This is
15900 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65   done before the
15910 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70 65   table is droppe
15920 64 0a 20 20 2a 2a 20 61 74 20 74 68 65 20 62 74  d.  ** at the bt
15930 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61  ree level, in ca
15940 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65  se the sqlite_se
15950 71 75 65 6e 63 65 20 74 61 62 6c 65 20 6e 65 65  quence table nee
15960 64 73 20 74 6f 0a 20 20 2a 2a 20 6d 6f 76 65 20  ds to.  ** move 
15970 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
15980 68 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70  he drop (can hap
15990 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  pen in auto-vacu
159a0 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 2a 2f 0a 20  um mode)..  */. 
159b0 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c   if( pTab->tabFl
159c0 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63  ags & TF_Autoinc
159d0 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71  rement ){.    sq
159e0 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
159f0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22  (pParse,.      "
15a00 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 73  DELETE FROM %Q.s
15a10 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 57  qlite_sequence W
15a20 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20  HERE name=%Q",. 
15a30 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61       pDb->zDbSNa
15a40 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a  me, pTab->zName.
15a50 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69      );.  }.#endi
15a60 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  f..  /* Drop all
15a70 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
15a80 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 65  able and index e
15a90 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66 65  ntries that refe
15aa0 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 61  r to the.  ** ta
15ab0 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61 6d  ble. The program
15ac0 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f   name loops thro
15ad0 75 67 68 20 74 68 65 20 6d 61 73 74 65 72 20 74  ugh the master t
15ae0 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65 73  able and deletes
15af0 0a 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77 20  .  ** every row 
15b00 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61  that refers to a
15b10 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73 61   table of the sa
15b20 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f  me name as the o
15b30 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20 64 72  ne being.  ** dr
15b40 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72 73 20  opped. Triggers 
15b50 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61  are handled sepa
15b60 72 61 74 65 6c 79 20 62 65 63 61 75 73 65 20 61  rately because a
15b70 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65 0a   trigger can be.
15b80 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20    ** created in 
15b90 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
15ba0 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  e that refers to
15bb0 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74   a table in anot
15bc0 68 65 72 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  her.  ** databas
15bd0 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
15be0 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
15bf0 72 73 65 2c 20 0a 20 20 20 20 20 20 22 44 45 4c  rse, .      "DEL
15c00 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57  ETE FROM %Q.%s W
15c10 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51  HERE tbl_name=%Q
15c20 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69 67   and type!='trig
15c30 67 65 72 27 22 2c 0a 20 20 20 20 20 20 70 44 62  ger'",.      pDb
15c40 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54  ->zDbSName, MAST
15c50 45 52 5f 4e 41 4d 45 2c 20 70 54 61 62 2d 3e 7a  ER_NAME, pTab->z
15c60 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 69 73  Name);.  if( !is
15c70 56 69 65 77 20 26 26 20 21 49 73 56 69 72 74 75  View && !IsVirtu
15c80 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
15c90 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61  destroyTable(pPa
15ca0 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a  rse, pTab);.  }.
15cb0 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65  .  /* Remove the
15cc0 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72 6f   table entry fro
15cd0 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65 72  m SQLite's inter
15ce0 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20 6d  nal schema and m
15cf0 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68 65 20 73  odify.  ** the s
15d00 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20  chema cookie..  
15d10 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  */.  if( IsVirtu
15d20 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
15d30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15d40 34 28 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f 79  4(v, OP_VDestroy
15d50 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61  , iDb, 0, 0, pTa
15d60 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  b->zName, 0);.  
15d70 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
15d80 74 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20  t(pParse);.  }. 
15d90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15da0 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62  p4(v, OP_DropTab
15db0 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70  le, iDb, 0, 0, p
15dc0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Tab->zName, 0);.
15dd0 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
15de0 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
15df0 62 29 3b 0a 20 20 73 71 6c 69 74 65 56 69 65 77  b);.  sqliteView
15e00 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62  ResetAll(db, iDb
15e10 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
15e20 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
15e30 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  ed to do the wor
15e40 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c  k of a DROP TABL
15e50 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  E statement..** 
15e60 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  pName is the nam
15e70 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
15e80 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f  o be dropped..*/
15e90 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f  .void sqlite3Dro
15ea0 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
15eb0 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
15ec0 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77  Name, int isView
15ed0 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20  , int noErr){.  
15ee0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56  Table *pTab;.  V
15ef0 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
15f00 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
15f10 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
15f20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
15f30 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
15f40 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
15f50 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  le;.  }.  assert
15f60 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
15f70 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
15f80 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
15f90 0a 20 20 69 66 28 20 21 49 73 52 65 75 73 65 53  .  if( !IsReuseS
15fa0 63 68 65 6d 61 28 64 62 29 20 26 26 20 73 71 6c  chema(db) && sql
15fb0 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
15fc0 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78  Parse) ) goto ex
15fd0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
15fe0 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d   if( noErr ) db-
15ff0 3e 73 75 70 70 72 65 73 73 45 72 72 2b 2b 3b 0a  >suppressErr++;.
16000 20 20 61 73 73 65 72 74 28 20 69 73 56 69 65 77    assert( isView
16010 3d 3d 30 20 7c 7c 20 69 73 56 69 65 77 3d 3d 4c  ==0 || isView==L
16020 4f 43 41 54 45 5f 56 49 45 57 20 29 3b 0a 20 20  OCATE_VIEW );.  
16030 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
16040 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50  cateTableItem(pP
16050 61 72 73 65 2c 20 69 73 56 69 65 77 2c 20 26 70  arse, isView, &p
16060 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 69  Name->a[0]);.  i
16070 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73  f( noErr ) db->s
16080 75 70 70 72 65 73 73 45 72 72 2d 2d 3b 0a 0a 20  uppressErr--;.. 
16090 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
160a0 20 20 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20      if( noErr ) 
160b0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
160c0 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61  yNamedSchema(pPa
160d0 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  rse, pName->a[0]
160e0 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  .zDatabase);.   
160f0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
16100 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62  table;.  }.  iDb
16110 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
16120 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
16130 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73  ->pSchema);.  as
16140 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
16150 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
16160 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 57 72   sqlite3SchemaWr
16170 69 74 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  itable(pParse, i
16180 44 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 54  Db);..  /* If pT
16190 61 62 20 69 73 20 61 20 76 69 72 74 75 61 6c 20  ab is a virtual 
161a0 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69 65 77  table, call View
161b0 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29  GetColumnNames()
161c0 20 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a 2a 20   to ensure.  ** 
161d0 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  it is initialize
161e0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73  d..  */.  if( Is
161f0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26  Virtual(pTab) &&
16200 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
16210 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
16220 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20  e, pTab) ){.    
16230 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
16240 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  able;.  }.#ifnde
16250 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
16260 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
16270 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
16280 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
16290 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c  ab = SCHEMA_TABL
162a0 45 28 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73  E(iDb);.    cons
162b0 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
162c0 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
162d0 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ame;.    const c
162e0 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b 0a  har *zArg2 = 0;.
162f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
16300 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
16310 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
16320 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a  zTab, 0, zDb)){.
16330 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
16340 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
16350 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  }.    if( isView
16360 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f   ){.      if( !O
16370 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
16380 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
16390 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
163a0 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20  OP_TEMP_VIEW;.  
163b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
163c0 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
163d0 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20  _DROP_VIEW;.    
163e0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
163f0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
16400 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69  ABLE.    }else i
16410 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
16420 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65  b) ){.      code
16430 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56   = SQLITE_DROP_V
16440 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41 72  TABLE;.      zAr
16450 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  g2 = sqlite3GetV
16460 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 2d  Table(db, pTab)-
16470 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65  >pMod->zName;.#e
16480 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
16490 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
164a0 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
164b0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
164c0 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
164d0 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  EMP_TABLE;.     
164e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
164f0 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
16500 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  OP_TABLE;.      
16510 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
16520 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
16530 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70  (pParse, code, p
16540 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67  Tab->zName, zArg
16550 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  2, zDb) ){.     
16560 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
16570 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20  table;.    }.   
16580 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
16590 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
165a0 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61  LITE_DELETE, pTa
165b0 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62  b->zName, 0, zDb
165c0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
165d0 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
165e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
165f0 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  f.  if( sqlite3S
16600 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e  trNICmp(pTab->zN
16610 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
16620 37 29 3d 3d 30 20 0a 20 20 20 20 26 26 20 73 71  7)==0 .    && sq
16630 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54  lite3StrNICmp(pT
16640 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  ab->zName, "sqli
16650 74 65 5f 73 74 61 74 22 2c 20 31 31 29 21 3d 30  te_stat", 11)!=0
16660 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
16670 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
16680 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f  "table %s may no
16690 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70  t be dropped", p
166a0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
166b0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
166c0 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e  table;.  }..#ifn
166d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
166e0 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65  VIEW.  /* Ensure
166f0 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20 6e   DROP TABLE is n
16700 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69 65  ot used on a vie
16710 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45 57  w, and DROP VIEW
16720 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a   is not used.  *
16730 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20  * on a table..  
16740 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77 20  */.  if( isView 
16750 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  && pTab->pSelect
16760 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
16770 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
16780 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41 42  e, "use DROP TAB
16790 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62  LE to delete tab
167a0 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  le %s", pTab->zN
167b0 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
167c0 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
167d0 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65    }.  if( !isVie
167e0 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65  w && pTab->pSele
167f0 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
16800 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
16810 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49 45 57  , "use DROP VIEW
16820 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20   to delete view 
16830 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
16840 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
16850 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
16860 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65  .#endif..  /* Ge
16870 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
16880 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20  emove the table 
16890 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20  from the master 
168a0 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69  table.  ** on di
168b0 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  sk..  */.  v = s
168c0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
168d0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
168e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
168f0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
16900 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
16910 3b 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65  ;.    if( !isVie
16920 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  w ){.      sqlit
16930 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65  e3ClearStatTable
16940 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  s(pParse, iDb, "
16950 74 62 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  tbl", pTab->zNam
16960 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
16970 33 46 6b 44 72 6f 70 54 61 62 6c 65 28 70 50 61  3FkDropTable(pPa
16980 72 73 65 2c 20 70 4e 61 6d 65 2c 20 70 54 61 62  rse, pName, pTab
16990 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
169a0 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c  ite3CodeDropTabl
169b0 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
169c0 69 44 62 2c 20 69 73 56 69 65 77 29 3b 0a 20 20  iDb, isView);.  
169d0 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  }..exit_drop_tab
169e0 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63  le:.  sqlite3Src
169f0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
16a00 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
16a10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
16a20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
16a30 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b   a new foreign k
16a40 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a  ey on the table.
16a50 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  ** currently und
16a60 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
16a70 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72    pFromCol deter
16a80 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75  mines which colu
16a90 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75  mns.** in the cu
16aa0 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e  rrent table poin
16ab0 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e  t to the foreign
16ac0 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43   key.  If pFromC
16ad0 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f  ol==0 then.** co
16ae0 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f  nnect the key to
16af0 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
16b00 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20   inserted.  pTo 
16b10 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a  is the name of.*
16b20 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65  * the table refe
16b30 72 72 65 64 20 74 6f 20 28 61 2e 6b 2e 61 20 74  rred to (a.k.a t
16b40 68 65 20 22 70 61 72 65 6e 74 22 20 74 61 62 6c  he "parent" tabl
16b50 65 29 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61  e).  pToCol is a
16b60 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 74 61 62 6c   list.** of tabl
16b70 65 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74  es in the parent
16b80 20 70 54 6f 20 74 61 62 6c 65 2e 20 20 66 6c 61   pTo table.  fla
16b90 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  gs contains all.
16ba0 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ** information a
16bb0 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63  bout the conflic
16bc0 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
16bd0 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66 69 65  orithms specifie
16be0 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44  d.** in the ON D
16bf0 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45  ELETE, ON UPDATE
16c00 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63   and ON INSERT c
16c10 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  lauses..**.** An
16c20 20 46 4b 65 79 20 73 74 72 75 63 74 75 72 65 20   FKey structure 
16c30 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 61  is created and a
16c40 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  dded to the tabl
16c50 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75  e currently.** u
16c60 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
16c70 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d  n in the pParse-
16c80 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64  >pNewTable field
16c90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65  ..**.** The fore
16ca0 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66  ign key is set f
16cb0 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f  or IMMEDIATE pro
16cc0 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73  cessing.  A subs
16cd0 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74  equent call.** t
16ce0 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f  o sqlite3DeferFo
16cf0 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74  reignKey() might
16d00 20 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20   change this to 
16d10 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69  DEFERRED..*/.voi
16d20 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  d sqlite3CreateF
16d30 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72  oreignKey(.  Par
16d40 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
16d50 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
16d60 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
16d70 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f  st *pFromCol,  /
16d80 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69  * Columns in thi
16d90 73 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69  s table that poi
16da0 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c  nt to other tabl
16db0 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  e */.  Token *pT
16dc0 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  o,          /* N
16dd0 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72  ame of the other
16de0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72   table */.  Expr
16df0 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20  List *pToCol,   
16e00 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74   /* Columns in t
16e10 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  he other table *
16e20 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
16e30 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
16e40 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
16e50 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29  algorithms. */.)
16e60 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
16e70 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69  = pParse->db;.#i
16e80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16e90 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
16ea0 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b  FKey *pFKey = 0;
16eb0 0a 20 20 46 4b 65 79 20 2a 70 4e 65 78 74 54 6f  .  FKey *pNextTo
16ec0 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70  ;.  Table *p = p
16ed0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
16ee0 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
16ef0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43   int i;.  int nC
16f00 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a  ol;.  char *z;..
16f10 20 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d 30    assert( pTo!=0
16f20 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c   );.  if( p==0 |
16f30 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41  | IN_DECLARE_VTA
16f40 42 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  B ) goto fk_end;
16f50 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d  .  if( pFromCol=
16f60 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43  =0 ){.    int iC
16f70 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  ol = p->nCol-1;.
16f80 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 69 43      if( NEVER(iC
16f90 6f 6c 3c 30 29 20 29 20 67 6f 74 6f 20 66 6b 5f  ol<0) ) goto fk_
16fa0 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f  end;.    if( pTo
16fb0 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e  Col && pToCol->n
16fc0 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20  Expr!=1 ){.     
16fd0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
16fe0 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67  (pParse, "foreig
16ff0 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20  n key on %s".   
17000 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72        " should r
17010 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e  eference only on
17020 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c  e column of tabl
17030 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20  e %T",.         
17040 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  p->aCol[iCol].zN
17050 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20  ame, pTo);.     
17060 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
17070 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31    }.    nCol = 1
17080 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54  ;.  }else if( pT
17090 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e  oCol && pToCol->
170a0 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d  nExpr!=pFromCol-
170b0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71  >nExpr ){.    sq
170c0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
170d0 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 6e  arse,.        "n
170e0 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
170f0 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
17100 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
17110 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20  he number of ". 
17120 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20         "columns 
17130 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  in the reference
17140 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67  d table");.    g
17150 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65  oto fk_end;.  }e
17160 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  lse{.    nCol = 
17170 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b  pFromCol->nExpr;
17180 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73  .  }.  nByte = s
17190 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20  izeof(*pFKey) + 
171a0 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28  (nCol-1)*sizeof(
171b0 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20  pFKey->aCol[0]) 
171c0 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20  + pTo->n + 1;.  
171d0 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
171e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f    for(i=0; i<pTo
171f0 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  Col->nExpr; i++)
17200 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d  {.      nByte +=
17210 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
17220 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  (pToCol->a[i].zN
17230 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a  ame) + 1;.    }.
17240 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71    }.  pFKey = sq
17250 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
17260 6f 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20  o(db, nByte );. 
17270 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 7b   if( pFKey==0 ){
17280 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  .    goto fk_end
17290 3b 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 70  ;.  }.  pFKey->p
172a0 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65  From = p;.  pFKe
172b0 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70  y->pNextFrom = p
172c0 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28  ->pFKey;.  z = (
172d0 63 68 61 72 2a 29 26 70 46 4b 65 79 2d 3e 61 43  char*)&pFKey->aC
172e0 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65  ol[nCol];.  pFKe
172f0 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 69 66  y->zTo = z;.  if
17300 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  ( IN_RENAME_OBJE
17310 43 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  CT ){.    sqlite
17320 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28  3RenameTokenMap(
17330 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 7a  pParse, (void*)z
17340 2c 20 70 54 6f 29 3b 0a 20 20 7d 0a 20 20 6d 65  , pTo);.  }.  me
17350 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20  mcpy(z, pTo->z, 
17360 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f  pTo->n);.  z[pTo
17370 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  ->n] = 0;.  sqli
17380 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20  te3Dequote(z);. 
17390 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a   z += pTo->n+1;.
173a0 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20    pFKey->nCol = 
173b0 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f  nCol;.  if( pFro
173c0 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70  mCol==0 ){.    p
173d0 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46  FKey->aCol[0].iF
173e0 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b  rom = p->nCol-1;
173f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
17400 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
17410 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  ++){.      int j
17420 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
17430 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29   j<p->nCol; j++)
17440 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
17450 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e  lite3StrICmp(p->
17460 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70  aCol[j].zName, p
17470 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  FromCol->a[i].zN
17480 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
17490 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c       pFKey->aCol
174a0 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20  [i].iFrom = j;. 
174b0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
174c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
174d0 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70  }.      if( j>=p
174e0 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
174f0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
17500 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
17510 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f       "unknown co
17520 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66  lumn \"%s\" in f
17530 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
17540 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20  ition", .       
17550 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69     pFromCol->a[i
17560 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
17570 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
17580 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
17590 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
175a0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  T ){.        sql
175b0 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52  ite3RenameTokenR
175c0 65 6d 61 70 28 70 50 61 72 73 65 2c 20 26 70 46  emap(pParse, &pF
175d0 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2c 20 70 46  Key->aCol[i], pF
175e0 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
175f0 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
17600 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f   }.  }.  if( pTo
17610 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Col ){.    for(i
17620 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
17630 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  {.      int n = 
17640 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
17650 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
17660 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79  me);.      pFKey
17670 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d  ->aCol[i].zCol =
17680 20 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 49 4e   z;.      if( IN
17690 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29  _RENAME_OBJECT )
176a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
176b0 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61  3RenameTokenRema
176c0 70 28 70 50 61 72 73 65 2c 20 7a 2c 20 70 54 6f  p(pParse, z, pTo
176d0 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
176e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
176f0 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c  memcpy(z, pToCol
17700 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29  ->a[i].zName, n)
17710 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30  ;.      z[n] = 0
17720 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31  ;.      z += n+1
17730 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46  ;.    }.  }.  pF
17740 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20  Key->isDeferred 
17750 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 41  = 0;.  pFKey->aA
17760 63 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29 28  ction[0] = (u8)(
17770 66 6c 61 67 73 20 26 20 30 78 66 66 29 3b 20 20  flags & 0xff);  
17780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20            /* ON 
17790 44 45 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a 2f  DELETE action */
177a0 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f  .  pFKey->aActio
177b0 6e 5b 31 5d 20 3d 20 28 75 38 29 28 28 66 6c 61  n[1] = (u8)((fla
177c0 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66  gs >> 8 ) & 0xff
177d0 29 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44 41  );    /* ON UPDA
177e0 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  TE action */..  
177f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
17800 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
17810 62 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d 61  b, 0, p->pSchema
17820 29 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20 3d  ) );.  pNextTo =
17830 20 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65 33   (FKey *)sqlite3
17840 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70  HashInsert(&p->p
17850 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68  Schema->fkeyHash
17860 2c 20 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  , .      pFKey->
17870 7a 54 6f 2c 20 28 76 6f 69 64 20 2a 29 70 46 4b  zTo, (void *)pFK
17880 65 79 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e  ey.  );.  if( pN
17890 65 78 74 54 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a  extTo==pFKey ){.
178a0 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
178b0 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 67 6f 74  ult(db);.    got
178c0 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  o fk_end;.  }.  
178d0 69 66 28 20 70 4e 65 78 74 54 6f 20 29 7b 0a 20  if( pNextTo ){. 
178e0 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 78 74     assert( pNext
178f0 54 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30 20 29  To->pPrevTo==0 )
17900 3b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65  ;.    pFKey->pNe
17910 78 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f 3b 0a  xtTo = pNextTo;.
17920 20 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72      pNextTo->pPr
17930 65 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a 20 20  evTo = pFKey;.  
17940 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  }..  /* Link the
17950 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20   foreign key to 
17960 74 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65  the table as the
17970 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f   last step..  */
17980 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46  .  p->pFKey = pF
17990 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30  Key;.  pFKey = 0
179a0 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c  ;..fk_end:.  sql
179b0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
179c0 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  FKey);.#endif /*
179d0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
179e0 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
179f0 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  Y) */.  sqlite3E
17a00 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
17a10 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73  , pFromCol);.  s
17a20 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
17a30 6c 65 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29  lete(db, pToCol)
17a40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
17a50 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
17a60 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41  d when an INITIA
17a70 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72  LLY IMMEDIATE or
17a80 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
17a90 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73  RED.** clause is
17aa0 20 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66   seen as part of
17ab0 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64   a foreign key d
17ac0 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20  efinition.  The 
17ad0 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61  isDeferred.** pa
17ae0 72 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72  rameter is 1 for
17af0 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
17b00 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e  RED and 0 for IN
17b10 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54  ITIALLY IMMEDIAT
17b20 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69  E..** The behavi
17b30 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  or of the most r
17b40 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20  ecently created 
17b50 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61  foreign key is a
17b60 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72  djusted.** accor
17b70 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  dingly..*/.void 
17b80 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65  sqlite3DeferFore
17b90 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50  ignKey(Parse *pP
17ba0 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65  arse, int isDefe
17bb0 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53  rred){.#ifndef S
17bc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
17bd0 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a  GN_KEY.  Table *
17be0 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46  pTab;.  FKey *pF
17bf0 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62  Key;.  if( (pTab
17c00 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
17c10 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b  able)==0 || (pFK
17c20 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79  ey = pTab->pFKey
17c30 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
17c40 20 61 73 73 65 72 74 28 20 69 73 44 65 66 65 72   assert( isDefer
17c50 72 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65  red==0 || isDefe
17c60 72 72 65 64 3d 3d 31 20 29 3b 20 2f 2a 20 45 56  rred==1 ); /* EV
17c70 3a 20 52 2d 33 30 33 32 33 2d 32 31 39 31 37 20  : R-30323-21917 
17c80 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65  */.  pFKey->isDe
17c90 66 65 72 72 65 64 20 3d 20 28 75 38 29 69 73 44  ferred = (u8)isD
17ca0 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a  eferred;.#endif.
17cb0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
17cc0 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
17cd0 20 65 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c   erase and refil
17ce0 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20  l index *pIdx.  
17cf0 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20  This is.** used 
17d00 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20  to initialize a 
17d10 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e  newly created in
17d20 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70  dex or to recomp
17d30 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ute the.** conte
17d40 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69  nt of an index i
17d50 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20  n response to a 
17d60 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e  REINDEX command.
17d70 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f  .**.** if memRoo
17d80 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67  tPage is not neg
17d90 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20  ative, it means 
17da0 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 69  that the index i
17db0 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74  s newly.** creat
17dc0 65 64 2e 20 20 54 68 65 20 72 65 67 69 73 74 65  ed.  The registe
17dd0 72 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6d  r specified by m
17de0 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61  emRootPage conta
17df0 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20  ins the.** root 
17e00 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
17e10 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65  he index.  If me
17e20 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67  mRootPage is neg
17e30 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  ative, then.** t
17e40 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  he index already
17e50 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74   exists and must
17e60 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f   be cleared befo
17e70 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65  re being refille
17e80 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f  d and.** the roo
17e90 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
17ea0 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 61   the index is ta
17eb0 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d  ken from pIndex-
17ec0 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  >tnum..*/.static
17ed0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66   void sqlite3Ref
17ee0 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a  illIndex(Parse *
17ef0 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70  pParse, Index *p
17f00 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f  Index, int memRo
17f10 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65  otPage){.  Table
17f20 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d   *pTab = pIndex-
17f30 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65  >pTable;  /* The
17f40 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 69   table that is i
17f50 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
17f60 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iTab = pParse->n
17f70 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74  Tab++;     /* Bt
17f80 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  ree cursor used 
17f90 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e  for pTab */.  in
17fa0 74 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d  t iIdx = pParse-
17fb0 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20  >nTab++;     /* 
17fc0 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65  Btree cursor use
17fd0 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a  d for pIndex */.
17fe0 20 20 69 6e 74 20 69 53 6f 72 74 65 72 3b 20 20    int iSorter;  
17ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18000 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 65   /* Cursor opene
18010 64 20 62 79 20 4f 70 65 6e 53 6f 72 74 65 72 20  d by OpenSorter 
18020 28 69 66 20 69 6e 20 75 73 65 29 20 2a 2f 0a 20  (if in use) */. 
18030 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20   int addr1;     
18040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18050 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f  /* Address of to
18060 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  p of loop */.  i
18070 6e 74 20 61 64 64 72 32 3b 20 20 20 20 20 20 20  nt addr2;       
18080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18090 20 41 64 64 72 65 73 73 20 74 6f 20 6a 75 6d 70   Address to jump
180a0 20 74 6f 20 66 6f 72 20 6e 65 78 74 20 69 74 65   to for next ite
180b0 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
180c0 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  tnum;           
180d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
180e0 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65 78  ot page of index
180f0 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 74 49   */.  int iPartI
18100 64 78 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20  dxLabel;        
18110 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20       /* Jump to 
18120 74 68 69 73 20 6c 61 62 65 6c 20 74 6f 20 73 6b  this label to sk
18130 69 70 20 61 20 72 6f 77 20 2a 2f 0a 20 20 56 64  ip a row */.  Vd
18140 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
18150 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18160 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
18170 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20  to this virtual 
18180 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79  machine */.  Key
18190 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20  Info *pKey;     
181a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b              /* K
181b0 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78  eyInfo for index
181c0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63   */.  int regRec
181d0 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ord;            
181e0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
181f0 20 68 6f 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c   holding assembl
18200 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  ed index record 
18210 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
18220 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
18230 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
18240 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
18250 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71  /.  int iDb = sq
18260 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
18270 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70  ex(db, pIndex->p
18280 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65  Schema);..#ifnde
18290 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
182a0 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66  THORIZATION.  if
182b0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
182c0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
182d0 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65  E_REINDEX, pInde
182e0 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20  x->zName, 0,.   
182f0 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
18300 7a 44 62 53 4e 61 6d 65 20 29 20 29 7b 0a 20 20  zDbSName ) ){.  
18310 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
18320 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75 69  ndif..  /* Requi
18330 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  re a write-lock 
18340 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  on the table to 
18350 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70 65  perform this ope
18360 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  ration */.  sqli
18370 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
18380 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
18390 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e 7a  tnum, 1, pTab->z
183a0 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73 71  Name);..  v = sq
183b0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
183c0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
183d0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
183e0 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20   memRootPage>=0 
183f0 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d 65  ){.    tnum = me
18400 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65 6c  mRootPage;.  }el
18410 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70  se{.    tnum = p
18420 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 7d  Index->tnum;.  }
18430 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  .  pKey = sqlite
18440 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28  3KeyInfoOfIndex(
18450 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b  pParse, pIndex);
18460 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 21  .  assert( pKey!
18470 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
18480 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
18490 2d 3e 6e 45 72 72 20 29 3b 0a 0a 20 20 2f 2a 20  ->nErr );..  /* 
184a0 4f 70 65 6e 20 74 68 65 20 73 6f 72 74 65 72 20  Open the sorter 
184b0 63 75 72 73 6f 72 20 69 66 20 77 65 20 61 72 65  cursor if we are
184c0 20 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a   to use one. */.
184d0 20 20 69 53 6f 72 74 65 72 20 3d 20 70 50 61 72    iSorter = pPar
184e0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71  se->nTab++;.  sq
184f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
18500 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  v, OP_SorterOpen
18510 2c 20 69 53 6f 72 74 65 72 2c 20 30 2c 20 70 49  , iSorter, 0, pI
18520 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 28  ndex->nKeyCol, (
18530 63 68 61 72 2a 29 0a 20 20 20 20 20 20 20 20 20  char*).         
18540 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
18550 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65  e3KeyInfoRef(pKe
18560 79 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  y), P4_KEYINFO);
18570 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
18580 74 61 62 6c 65 2e 20 4c 6f 6f 70 20 74 68 72 6f  table. Loop thro
18590 75 67 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20  ugh all rows of 
185a0 74 68 65 20 74 61 62 6c 65 2c 20 69 6e 73 65 72  the table, inser
185b0 74 69 6e 67 20 69 6e 64 65 78 0a 20 20 2a 2a 20  ting index.  ** 
185c0 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 74 68 65  records into the
185d0 20 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 73 71   sorter. */.  sq
185e0 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
185f0 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62  Parse, iTab, iDb
18600 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52  , pTab, OP_OpenR
18610 65 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20  ead);.  addr1 = 
18620 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18630 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
18640 69 54 61 62 2c 20 30 29 3b 20 56 64 62 65 43 6f  iTab, 0); VdbeCo
18650 76 65 72 61 67 65 28 76 29 3b 0a 20 20 72 65 67  verage(v);.  reg
18660 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
18670 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
18680 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 75 6c  e);.  sqlite3Mul
18690 74 69 57 72 69 74 65 28 70 50 61 72 73 65 29 3b  tiWrite(pParse);
186a0 0a 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72  ..  sqlite3Gener
186b0 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72  ateIndexKey(pPar
186c0 73 65 2c 70 49 6e 64 65 78 2c 69 54 61 62 2c 72  se,pIndex,iTab,r
186d0 65 67 52 65 63 6f 72 64 2c 30 2c 26 69 50 61 72  egRecord,0,&iPar
186e0 74 49 64 78 4c 61 62 65 6c 2c 30 2c 30 29 3b 0a  tIdxLabel,0,0);.
186f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18700 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
18710 49 6e 73 65 72 74 2c 20 69 53 6f 72 74 65 72 2c  Insert, iSorter,
18720 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
18730 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 50 61 72  qlite3ResolvePar
18740 74 49 64 78 4c 61 62 65 6c 28 70 50 61 72 73 65  tIdxLabel(pParse
18750 2c 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c 29  , iPartIdxLabel)
18760 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
18770 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
18780 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31 29  , iTab, addr1+1)
18790 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
187a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
187b0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
187c0 31 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f  1);.  if( memRoo
187d0 74 50 61 67 65 3c 30 20 29 20 73 71 6c 69 74 65  tPage<0 ) sqlite
187e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
187f0 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69  P_Clear, tnum, i
18800 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  Db);.  sqlite3Vd
18810 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
18820 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c 20  penWrite, iIdx, 
18830 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20 20  tnum, iDb, .    
18840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18850 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 34  (char *)pKey, P4
18860 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c  _KEYINFO);.  sql
18870 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
18880 28 76 2c 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43  (v, OPFLAG_BULKC
18890 53 52 7c 28 28 6d 65 6d 52 6f 6f 74 50 61 67 65  SR|((memRootPage
188a0 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f 50 32 49 53  >=0)?OPFLAG_P2IS
188b0 52 45 47 3a 30 29 29 3b 0a 0a 20 20 61 64 64 72  REG:0));..  addr
188c0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
188d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
188e0 65 72 53 6f 72 74 2c 20 69 53 6f 72 74 65 72 2c  erSort, iSorter,
188f0 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   0); VdbeCoverag
18900 65 28 76 29 3b 0a 20 20 69 66 28 20 49 73 55 6e  e(v);.  if( IsUn
18910 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78  iqueIndex(pIndex
18920 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 32 20  ) ){.    int j2 
18930 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74  = sqlite3VdbeGot
18940 6f 28 76 2c 20 31 29 3b 0a 20 20 20 20 61 64 64  o(v, 1);.    add
18950 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
18960 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
18970 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 56      sqlite3VdbeV
18980 65 72 69 66 79 41 62 6f 72 74 61 62 6c 65 28 76  erifyAbortable(v
18990 2c 20 4f 45 5f 41 62 6f 72 74 29 3b 0a 20 20 20  , OE_Abort);.   
189a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
189b0 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53 6f 72 74  p4Int(v, OP_Sort
189c0 65 72 43 6f 6d 70 61 72 65 2c 20 69 53 6f 72 74  erCompare, iSort
189d0 65 72 2c 20 6a 32 2c 20 72 65 67 52 65 63 6f 72  er, j2, regRecor
189e0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
189f0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64              pInd
18a00 65 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64  ex->nKeyCol); Vd
18a10 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
18a20 20 20 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65     sqlite3Unique
18a30 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
18a40 65 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 70 49 6e  e, OE_Abort, pIn
18a50 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dex);.    sqlite
18a60 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
18a70 20 6a 32 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   j2);.  }else{. 
18a80 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74     addr2 = sqlit
18a90 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
18aa0 72 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  r(v);.  }.  sqli
18ab0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
18ac0 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20   OP_SorterData, 
18ad0 69 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63 6f  iSorter, regReco
18ae0 72 64 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c  rd, iIdx);.  sql
18af0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
18b00 2c 20 4f 50 5f 53 65 65 6b 45 6e 64 2c 20 69 49  , OP_SeekEnd, iI
18b10 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dx);.  sqlite3Vd
18b20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
18b30 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20  dxInsert, iIdx, 
18b40 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
18b50 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
18b60 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53  5(v, OPFLAG_USES
18b70 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71  EEKRESULT);.  sq
18b80 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
18b90 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
18ba0 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
18bb0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18bc0 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 53  P_SorterNext, iS
18bd0 6f 72 74 65 72 2c 20 61 64 64 72 32 29 3b 20 56  orter, addr2); V
18be0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
18bf0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
18c00 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
18c10 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ..  sqlite3VdbeA
18c20 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
18c30 65 2c 20 69 54 61 62 29 3b 0a 20 20 73 71 6c 69  e, iTab);.  sqli
18c40 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
18c50 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 29   OP_Close, iIdx)
18c60 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
18c70 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
18c80 65 2c 20 69 53 6f 72 74 65 72 29 3b 0a 7d 0a 0a  e, iSorter);.}..
18c90 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 68  /*.** Allocate h
18ca0 65 61 70 20 73 70 61 63 65 20 74 6f 20 68 6f 6c  eap space to hol
18cb0 64 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63  d an Index objec
18cc0 74 20 77 69 74 68 20 6e 43 6f 6c 20 63 6f 6c 75  t with nCol colu
18cd0 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65  mns..**.** Incre
18ce0 61 73 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  ase the allocati
18cf0 6f 6e 20 73 69 7a 65 20 74 6f 20 70 72 6f 76 69  on size to provi
18d00 64 65 20 61 6e 20 65 78 74 72 61 20 6e 45 78 74  de an extra nExt
18d10 72 61 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 38  ra bytes.** of 8
18d20 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 73 70  -byte aligned sp
18d30 61 63 65 20 61 66 74 65 72 20 74 68 65 20 49 6e  ace after the In
18d40 64 65 78 20 6f 62 6a 65 63 74 20 61 6e 64 20 72  dex object and r
18d50 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74  eturn a.** point
18d60 65 72 20 74 6f 20 74 68 69 73 20 65 78 74 72 61  er to this extra
18d70 20 73 70 61 63 65 20 69 6e 20 2a 70 70 45 78 74   space in *ppExt
18d80 72 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71  ra..*/.Index *sq
18d90 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64  lite3AllocateInd
18da0 65 78 4f 62 6a 65 63 74 28 0a 20 20 73 71 6c 69  exObject(.  sqli
18db0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
18dc0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
18dd0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 31 36  nection */.  i16
18de0 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20   nCol,          
18df0 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
18e00 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
18e10 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  the index */.  i
18e20 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20  nt nExtra,      
18e30 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
18e40 20 62 79 74 65 73 20 6f 66 20 65 78 74 72 61 20   bytes of extra 
18e50 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 20 2a  space to alloc *
18e60 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 45 78 74  /.  char **ppExt
18e70 72 61 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ra       /* Poin
18e80 74 65 72 20 74 6f 20 74 68 65 20 22 65 78 74 72  ter to the "extr
18e90 61 22 20 73 70 61 63 65 20 2a 2f 0a 29 7b 0a 20  a" space */.){. 
18ea0 20 49 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20   Index *p;      
18eb0 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
18ec0 65 64 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  ed index object 
18ed0 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  */.  int nByte; 
18ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
18ef0 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
18f00 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2b 20 61  Index object + a
18f10 72 72 61 79 73 20 2a 2f 0a 0a 20 20 6e 42 79 74  rrays */..  nByt
18f20 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  e = ROUND8(sizeo
18f30 66 28 49 6e 64 65 78 29 29 20 2b 20 20 20 20 20  f(Index)) +     
18f40 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
18f50 78 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a  x structure  */.
18f60 20 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38            ROUND8
18f70 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e  (sizeof(char*)*n
18f80 43 6f 6c 29 20 2b 20 20 20 20 20 20 20 20 20 2f  Col) +         /
18f90 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20  * Index.azColl  
18fa0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
18fb0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4c 6f  ROUND8(sizeof(Lo
18fc0 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b  gEst)*(nCol+1) +
18fd0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69       /* Index.ai
18fe0 52 6f 77 4c 6f 67 45 73 74 20 20 20 2a 2f 0a 20  RowLogEst   */. 
18ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19000 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c  sizeof(i16)*nCol
19010 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   +            /*
19020 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20   Index.aiColumn 
19030 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
19040 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38 29        sizeof(u8)
19050 2a 6e 43 6f 6c 29 3b 20 20 20 20 20 20 20 20 20  *nCol);         
19060 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f      /* Index.aSo
19070 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 20 3d  rtOrder */.  p =
19080 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
19090 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 2b  Zero(db, nByte +
190a0 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20   nExtra);.  if( 
190b0 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70  p ){.    char *p
190c0 45 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29  Extra = ((char*)
190d0 70 29 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  p)+ROUND8(sizeof
190e0 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 70 2d  (Index));.    p-
190f0 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74  >azColl = (const
19100 20 63 68 61 72 2a 2a 29 70 45 78 74 72 61 3b 20   char**)pExtra; 
19110 70 45 78 74 72 61 20 2b 3d 20 52 4f 55 4e 44 38  pExtra += ROUND8
19120 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e  (sizeof(char*)*n
19130 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 69 52  Col);.    p->aiR
19140 6f 77 4c 6f 67 45 73 74 20 3d 20 28 4c 6f 67 45  owLogEst = (LogE
19150 73 74 2a 29 70 45 78 74 72 61 3b 20 70 45 78 74  st*)pExtra; pExt
19160 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67  ra += sizeof(Log
19170 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 3b 0a 20  Est)*(nCol+1);. 
19180 20 20 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d     p->aiColumn =
19190 20 28 69 31 36 2a 29 70 45 78 74 72 61 3b 20 20   (i16*)pExtra;  
191a0 20 20 20 20 20 70 45 78 74 72 61 20 2b 3d 20 73       pExtra += s
191b0 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 3b  izeof(i16)*nCol;
191c0 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64  .    p->aSortOrd
191d0 65 72 20 3d 20 28 75 38 2a 29 70 45 78 74 72 61  er = (u8*)pExtra
191e0 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 75 6d 6e  ;.    p->nColumn
191f0 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e   = nCol;.    p->
19200 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2d  nKeyCol = nCol -
19210 20 31 3b 0a 20 20 20 20 2a 70 70 45 78 74 72 61   1;.    *ppExtra
19220 20 3d 20 28 28 63 68 61 72 2a 29 70 29 20 2b 20   = ((char*)p) + 
19230 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74  nByte;.  }.  ret
19240 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
19250 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64  Create a new ind
19260 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61  ex for an SQL ta
19270 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61  ble.  pName1.pNa
19280 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20  me2 is the name 
19290 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a  of the index .**
192a0 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73   and pTblList is
192b0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
192c0 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
192d0 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42  o be indexed.  B
192e0 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20  oth will .** be 
192f0 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61  NULL for a prima
19300 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64  ry key or an ind
19310 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74  ex that is creat
19320 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a  ed to satisfy a.
19330 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  ** UNIQUE constr
19340 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65  aint.  If pTable
19350 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20   and pIndex are 
19360 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65  NULL, use pParse
19370 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61  ->pNewTable.** a
19380 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  s the table to b
19390 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72  e indexed.  pPar
193a0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73  se->pNewTable is
193b0 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73   a table that is
193c0 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65  .** currently be
193d0 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20  ing constructed 
193e0 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  by a CREATE TABL
193f0 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  E statement..**.
19400 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  ** pList is a li
19410 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
19420 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c   be indexed.  pL
19430 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ist will be NULL
19440 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61   if this.** is a
19450 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
19460 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e  unique-constrain
19470 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  t on the most re
19480 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  cent column adde
19490 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c  d.** to the tabl
194a0 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
194b0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
194c0 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
194d0 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20  3CreateIndex(.  
194e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
194f0 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d     /* All inform
19500 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73  ation about this
19510 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65   parse */.  Toke
19520 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f  n *pName1,     /
19530 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20  * First part of 
19540 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20  index name. May 
19550 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b  be NULL */.  Tok
19560 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
19570 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f  /* Second part o
19580 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61  f index name. Ma
19590 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53  y be NULL */.  S
195a0 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65  rcList *pTblName
195b0 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e  , /* Table to in
195c0 64 65 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d  dex. Use pParse-
195d0 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20  >pNewTable if 0 
195e0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
195f0 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73  List,   /* A lis
19600 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
19610 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
19620 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
19630 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20     /* OE_Abort, 
19640 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65  OE_Ignore, OE_Re
19650 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e  place, or OE_Non
19660 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53  e */.  Token *pS
19670 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  tart,     /* The
19680 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68   CREATE token th
19690 61 74 20 62 65 67 69 6e 73 20 74 68 69 73 20 73  at begins this s
196a0 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78  tatement */.  Ex
196b0 70 72 20 2a 70 50 49 57 68 65 72 65 2c 20 20 20  pr *pPIWhere,   
196c0 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
196d0 20 66 6f 72 20 70 61 72 74 69 61 6c 20 69 6e 64   for partial ind
196e0 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  ices */.  int so
196f0 72 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20  rtOrder,     /* 
19700 53 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72  Sort order of pr
19710 69 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70  imary key when p
19720 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20  List==NULL */.  
19730 69 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 2c 20  int ifNotExist, 
19740 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72     /* Omit error
19750 20 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64   if index alread
19760 79 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 75 38  y exists */.  u8
19770 20 69 64 78 54 79 70 65 20 20 20 20 20 20 20 20   idxType        
19780 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 79   /* The index ty
19790 70 65 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  pe */.){.  Table
197a0 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20   *pTab = 0;     
197b0 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69  /* Table to be i
197c0 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65  ndexed */.  Inde
197d0 78 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 20  x *pIndex = 0;  
197e0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
197f0 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20   be created */. 
19800 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
19810 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ;     /* Name of
19820 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
19830 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
19840 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
19850 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
19860 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69  zName */.  int i
19870 2c 20 6a 3b 0a 20 20 44 62 46 69 78 65 72 20 73  , j;.  DbFixer s
19880 46 69 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  Fix;        /* F
19890 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74  or assigning dat
198a0 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70  abase names to p
198b0 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73  Table */.  int s
198c0 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20  ortOrderMask;   
198d0 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45  /* 1 to honor DE
198e0 53 43 20 69 6e 20 69 6e 64 65 78 2e 20 20 30 20  SC in index.  0 
198f0 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20  to ignore. */.  
19900 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
19910 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a  arse->db;.  Db *
19920 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
19930 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69 63   /* The specific
19940 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
19950 67 20 74 68 65 20 69 6e 64 65 78 65 64 20 64 61  g the indexed da
19960 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
19970 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
19980 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
19990 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69   database that i
199a0 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  s being written 
199b0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
199c0 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71  e = 0;    /* Unq
199d0 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66  ualified name of
199e0 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72   the index to cr
199f0 65 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  eate */.  struct
19a00 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
19a10 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f  pListItem; /* Fo
19a20 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70  r looping over p
19a30 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  List */.  int nE
19a40 78 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20  xtra = 0;       
19a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
19a60 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
19a70 72 20 7a 45 78 74 72 61 5b 5d 20 2a 2f 0a 20 20  r zExtra[] */.  
19a80 69 6e 74 20 6e 45 78 74 72 61 43 6f 6c 3b 20 20  int nExtraCol;  
19a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19aa0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78   /* Number of ex
19ab0 74 72 61 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64  tra columns need
19ac0 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45  ed */.  char *zE
19ad0 78 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20  xtra = 0;       
19ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
19af0 61 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68  a space after th
19b00 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a  e Index object *
19b10 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d  /.  Index *pPk =
19b20 20 30 3b 20 20 20 20 20 20 2f 2a 20 50 52 49 4d   0;      /* PRIM
19b30 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 66 6f  ARY KEY index fo
19b40 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  r WITHOUT ROWID 
19b50 74 61 62 6c 65 73 20 2a 2f 0a 0a 20 20 69 66 28  tables */..  if(
19b60 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
19b70 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
19b80 72 3e 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  r>0 ){.    goto 
19b90 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
19ba0 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 4e 5f  x;.  }.  if( IN_
19bb0 44 45 43 4c 41 52 45 5f 56 54 41 42 20 26 26 20  DECLARE_VTAB && 
19bc0 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  idxType!=SQLITE_
19bd0 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b  IDXTYPE_PRIMARYK
19be0 45 59 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  EY ){.    goto e
19bf0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
19c00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 49 73 52  ;.  }.  if( !IsR
19c10 65 75 73 65 53 63 68 65 6d 61 28 64 62 29 20 26  euseSchema(db) &
19c20 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  & SQLITE_OK!=sql
19c30 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
19c40 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f  Parse) ){.    go
19c50 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
19c60 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  ndex;.  }..  /*.
19c70 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61    ** Find the ta
19c80 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62  ble that is to b
19c90 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75  e indexed.  Retu
19ca0 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20  rn early if not 
19cb0 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  found..  */.  if
19cc0 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  ( pTblName!=0 ){
19cd0 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65  ..    /* Use the
19ce0 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20   two-part index 
19cf0 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  name to determin
19d00 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  e the database .
19d10 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68      ** to search
19d20 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20   for the table. 
19d30 27 46 69 78 27 20 74 68 65 20 74 61 62 6c 65 20  'Fix' the table 
19d40 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a  name to this db.
19d50 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f      ** before lo
19d60 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61 62  oking up the tab
19d70 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  le..    */.    a
19d80 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26  ssert( pName1 &&
19d90 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69   pName2 );.    i
19da0 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
19db0 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
19dc0 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
19dd0 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  &pName);.    if(
19de0 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78   iDb<0 ) goto ex
19df0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
19e00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
19e10 6d 65 20 26 26 20 70 4e 61 6d 65 2d 3e 7a 20 29  me && pName->z )
19e20 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
19e30 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20  E_OMIT_TEMPDB.  
19e40 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65    /* If the inde
19e50 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61  x name was unqua
19e60 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66  lified, check if
19e70 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a   the table.    *
19e80 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c  * is a temp tabl
19e90 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68  e. If so, set th
19ea0 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e  e database to 1.
19eb0 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a   Do not do this.
19ec0 20 20 20 20 2a 2a 20 69 66 20 69 6e 69 74 69 61      ** if initia
19ed0 6c 69 73 69 6e 67 20 61 20 64 61 74 61 62 61 73  lising a databas
19ee0 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f  e schema..    */
19ef0 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
19f00 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20  it.busy ){.     
19f10 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53   pTab = sqlite3S
19f20 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61  rcListLookup(pPa
19f30 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a  rse, pTblName);.
19f40 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32        if( pName2
19f50 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26  ->n==0 && pTab &
19f60 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d  & pTab->pSchema=
19f70 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68  =db->aDb[1].pSch
19f80 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ema ){.        i
19f90 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  Db = 1;.      }.
19fa0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
19fb0 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74    sqlite3FixInit
19fc0 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20  (&sFix, pParse, 
19fd0 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e  iDb, "index", pN
19fe0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 73 71  ame);.    if( sq
19ff0 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28  lite3FixSrcList(
1a000 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29  &sFix, pTblName)
1a010 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63   ){.      /* Bec
1a020 61 75 73 65 20 74 68 65 20 70 61 72 73 65 72 20  ause the parser 
1a030 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e  constructs pTblN
1a040 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c  ame from a singl
1a050 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20  e identifier,.  
1a060 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69      ** sqlite3Fi
1a070 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76  xSrcList can nev
1a080 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20  er fail. */.    
1a090 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20    assert(0);.   
1a0a0 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71   }.    pTab = sq
1a0b0 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
1a0c0 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20  Item(pParse, 0, 
1a0d0 26 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 29  &pTblName->a[0])
1a0e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
1a0f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
1a100 30 20 7c 7c 20 70 54 61 62 3d 3d 30 20 29 3b 0a  0 || pTab==0 );.
1a110 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
1a120 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
1a130 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66  te_index;.    if
1a140 28 20 69 44 62 3d 3d 31 20 26 26 20 64 62 2d 3e  ( iDb==1 && db->
1a150 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
1a160 21 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  !=pTab->pSchema 
1a170 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1a180 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1a190 20 0a 20 20 20 20 20 20 20 20 20 20 20 22 63 61   .           "ca
1a1a0 6e 6e 6f 74 20 63 72 65 61 74 65 20 61 20 54 45  nnot create a TE
1a1b0 4d 50 20 69 6e 64 65 78 20 6f 6e 20 6e 6f 6e 2d  MP index on non-
1a1c0 54 45 4d 50 20 74 61 62 6c 65 20 5c 22 25 73 5c  TEMP table \"%s\
1a1d0 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  "",.           p
1a1e0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
1a1f0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1a200 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
1a210 0a 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77  .    if( !HasRow
1a220 69 64 28 70 54 61 62 29 20 29 20 70 50 6b 20 3d  id(pTab) ) pPk =
1a230 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
1a240 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
1a250 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
1a260 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a  rt( pName==0 );.
1a270 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61      assert( pSta
1a280 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61  rt==0 );.    pTa
1a290 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
1a2a0 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 21  Table;.    if( !
1a2b0 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74  pTab ) goto exit
1a2c0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1a2d0 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
1a2e0 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
1a2f0 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
1a300 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26 64  ;.  }.  pDb = &d
1a310 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20  b->aDb[iDb];..  
1a320 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
1a330 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1a340 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a  rse->nErr==0 );.
1a350 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1a360 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d  NICmp(pTab->zNam
1a370 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29  e, "sqlite_", 7)
1a380 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 64  ==0 .       && d
1a390 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 0a  b->init.busy==0.
1a3a0 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  #if SQLITE_USER_
1a3b0 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20  AUTHENTICATION. 
1a3c0 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
1a3d0 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 70 54  UserAuthTable(pT
1a3e0 61 62 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 0a 23 65  ab->zName)==0.#e
1a3f0 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
1a400 54 45 5f 41 4c 4c 4f 57 5f 53 51 4c 49 54 45 5f  TE_ALLOW_SQLITE_
1a410 4d 41 53 54 45 52 5f 49 4e 44 45 58 0a 20 20 20  MASTER_INDEX.   
1a420 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
1a430 72 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61  rICmp(&pTab->zNa
1a440 6d 65 5b 37 5d 2c 22 6d 61 73 74 65 72 22 29 21  me[7],"master")!
1a450 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  =0.#endif.      
1a460 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
1a470 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65  Cmp(&pTab->zName
1a480 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c  [7],"altertab_",
1a490 39 29 21 3d 30 0a 20 29 7b 0a 20 20 20 20 73 71  9)!=0. ){.    sq
1a4a0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1a4b0 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
1a4c0 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
1a4d0 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ed", pTab->zName
1a4e0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
1a4f0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1a500 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1a510 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66  E_OMIT_VIEW.  if
1a520 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
1a530 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
1a540 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1a550 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65  views may not be
1a560 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20   indexed");.    
1a570 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1a580 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64  _index;.  }.#end
1a590 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
1a5a0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1a5b0 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74  BLE.  if( IsVirt
1a5c0 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
1a5d0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1a5e0 28 70 50 61 72 73 65 2c 20 22 76 69 72 74 75 61  (pParse, "virtua
1a5f0 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  l tables may not
1a600 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20   be indexed");. 
1a610 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1a620 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
1a630 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  endif..  /*.  **
1a640 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f   Find the name o
1a650 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61  f the index.  Ma
1a660 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
1a670 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f   not already ano
1a680 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ther.  ** index 
1a690 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  or table with th
1a6a0 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20  e same name.  . 
1a6b0 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69   **.  ** Excepti
1a6c0 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72  on:  If we are r
1a6d0 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73  eading the names
1a6e0 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e   of permanent in
1a6f0 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20  dices from the. 
1a700 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   ** sqlite_maste
1a710 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65  r table (because
1a720 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
1a730 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20  ess changed the 
1a740 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a  schema) and.  **
1a750 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65   one of the inde
1a760 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73  x names collides
1a770 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f   with the name o
1a780 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  f a temporary ta
1a790 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65  ble or.  ** inde
1a7a0 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  x, then we will 
1a7b0 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63  continue to proc
1a7c0 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a  ess this index..
1a7d0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61    **.  ** If pNa
1a7e0 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  me==0 it means t
1a7f0 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20  hat we are.  ** 
1a800 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70  dealing with a p
1a810 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e  rimary key or UN
1a820 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
1a830 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76    We have to inv
1a840 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e  ent our.  ** own
1a850 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   name..  */.  if
1a860 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a  ( pName ){.    z
1a870 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
1a880 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
1a890 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
1a8a0 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20  zName==0 ) goto 
1a8b0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1a8c0 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  x;.    assert( p
1a8d0 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  Name->z!=0 );.  
1a8e0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
1a8f0 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
1a900 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
1a910 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
1a920 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1a930 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
1a940 20 20 69 66 28 20 21 49 4e 5f 52 45 4e 41 4d 45    if( !IN_RENAME
1a950 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20  _OBJECT ){.     
1a960 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
1a970 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69  usy ){.        i
1a980 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  f( sqlite3FindTa
1a990 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30  ble(db, zName, 0
1a9a0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1a9b0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1a9c0 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
1a9d0 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61   is already a ta
1a9e0 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  ble named %s", z
1a9f0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
1aa00 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1aa10 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 20  e_index;.       
1aa20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1aa30 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
1aa40 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
1aa50 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 21   pDb->zDbSName)!
1aa60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
1aa70 28 20 21 69 66 4e 6f 74 45 78 69 73 74 20 29 7b  ( !ifNotExist ){
1aa80 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1aa90 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1aaa0 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72  e, "index %s alr
1aab0 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e  eady exists", zN
1aac0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ame);.        }e
1aad0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
1aae0 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
1aaf0 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 20 20 20  .busy );.       
1ab00 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
1ab10 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
1ab20 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  e, iDb);.       
1ab30 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20   }.        goto 
1ab40 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1ab50 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
1ab60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1ab70 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  t n;.    Index *
1ab80 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70  pLoop;.    for(p
1ab90 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65  Loop=pTab->pInde
1aba0 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70  x, n=1; pLoop; p
1abb0 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78  Loop=pLoop->pNex
1abc0 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e  t, n++){}.    zN
1abd0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
1abe0 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65  intf(db, "sqlite
1abf0 5f 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25 64  _autoindex_%s_%d
1ac00 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
1ac10 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  n);.    if( zNam
1ac20 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  e==0 ){.      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 0a 20 20 20  ndex;.    }..   
1ac50 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e   /* Automatic in
1ac60 64 65 78 20 6e 61 6d 65 73 20 67 65 6e 65 72 61  dex names genera
1ac70 74 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  ted from within 
1ac80 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f  sqlite3_declare_
1ac90 76 74 61 62 28 29 0a 20 20 20 20 2a 2a 20 6d 75  vtab().    ** mu
1aca0 73 74 20 68 61 76 65 20 6e 61 6d 65 73 20 74 68  st have names th
1acb0 61 74 20 61 72 65 20 64 69 73 74 69 6e 63 74 20  at are distinct 
1acc0 66 72 6f 6d 20 6e 6f 72 6d 61 6c 20 61 75 74 6f  from normal auto
1acd0 6d 61 74 69 63 20 69 6e 64 65 78 20 6e 61 6d 65  matic index name
1ace0 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  s..    ** The fo
1acf0 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e  llowing statemen
1ad00 74 20 63 6f 6e 76 65 72 74 73 20 22 73 71 6c 69  t converts "sqli
1ad10 74 65 33 5f 61 75 74 6f 69 6e 64 65 78 2e 2e 2e  te3_autoindex...
1ad20 22 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 22 73  " into.    ** "s
1ad30 71 6c 69 74 65 33 5f 62 75 74 6f 69 6e 64 65 78  qlite3_butoindex
1ad40 2e 2e 2e 22 20 69 6e 20 6f 72 64 65 72 20 74 6f  ..." in order to
1ad50 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 73 20   make the names 
1ad60 64 69 73 74 69 6e 63 74 2e 0a 20 20 20 20 2a 2a  distinct..    **
1ad70 20 54 68 65 20 22 76 74 61 62 5f 65 72 72 2e 74   The "vtab_err.t
1ad80 65 73 74 22 20 74 65 73 74 20 64 65 6d 6f 6e 73  est" test demons
1ad90 74 72 61 74 65 73 20 74 68 65 20 6e 65 65 64 20  trates the need 
1ada0 6f 66 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  of this statemen
1adb0 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 4e  t. */.    if( IN
1adc0 5f 53 50 45 43 49 41 4c 5f 50 41 52 53 45 20 29  _SPECIAL_PARSE )
1add0 20 7a 4e 61 6d 65 5b 37 5d 2b 2b 3b 0a 20 20 7d   zName[7]++;.  }
1ade0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
1adf0 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   authorization t
1ae00 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65  o create an inde
1ae10 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  x..  */.#ifndef 
1ae20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
1ae30 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  ORIZATION.  if( 
1ae40 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43  !IN_RENAME_OBJEC
1ae50 54 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  T ){.    const c
1ae60 68 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e  har *zDb = pDb->
1ae70 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69 66  zDbSName;.    if
1ae80 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
1ae90 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
1aea0 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41  E_INSERT, SCHEMA
1aeb0 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 30 2c 20  _TABLE(iDb), 0, 
1aec0 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
1aed0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1aee0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
1aef0 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  i = SQLITE_CREAT
1af00 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  E_INDEX;.    if(
1af10 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
1af20 20 69 44 62 3d 3d 31 20 29 20 69 20 3d 20 53 51   iDb==1 ) i = SQ
1af30 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
1af40 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
1af50 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
1af60 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d  (pParse, i, zNam
1af70 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
1af80 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
1af90 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1afa0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
1afb0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
1afc0 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61  pList==0, it mea
1afd0 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ns this routine 
1afe0 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61  was called to ma
1aff0 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a  ke a primary.  *
1b000 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65  * key out of the
1b010 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64   last column add
1b020 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ed to the table 
1b030 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
1b040 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61  on..  ** So crea
1b050 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74  te a fake list t
1b060 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e  o simulate this.
1b070 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73  .  */.  if( pLis
1b080 74 3d 3d 30 20 29 7b 0a 20 20 20 20 54 6f 6b 65  t==0 ){.    Toke
1b090 6e 20 70 72 65 76 43 6f 6c 3b 0a 20 20 20 20 43  n prevCol;.    C
1b0a0 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 26 70  olumn *pCol = &p
1b0b0 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e  Tab->aCol[pTab->
1b0c0 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 20 20 70 43 6f  nCol-1];.    pCo
1b0d0 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l->colFlags |= C
1b0e0 4f 4c 46 4c 41 47 5f 55 4e 49 51 55 45 3b 0a 20  OLFLAG_UNIQUE;. 
1b0f0 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49     sqlite3TokenI
1b100 6e 69 74 28 26 70 72 65 76 43 6f 6c 2c 20 70 43  nit(&prevCol, pC
1b110 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
1b120 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
1b130 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
1b140 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20 20 20  arse, 0,.       
1b150 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1b160 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49  prAlloc(db, TK_I
1b170 44 2c 20 26 70 72 65 76 43 6f 6c 2c 20 30 29 29  D, &prevCol, 0))
1b180 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
1b190 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
1b1a0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
1b1b0 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
1b1c0 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20  nExpr==1 );.    
1b1d0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
1b1e0 65 74 53 6f 72 74 4f 72 64 65 72 28 70 4c 69 73  etSortOrder(pLis
1b1f0 74 2c 20 73 6f 72 74 4f 72 64 65 72 29 3b 0a 20  t, sortOrder);. 
1b200 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
1b210 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b  te3ExprListCheck
1b220 4c 65 6e 67 74 68 28 70 50 61 72 73 65 2c 20 70  Length(pParse, p
1b230 4c 69 73 74 2c 20 22 69 6e 64 65 78 22 29 3b 0a  List, "index");.
1b240 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65    }..  /* Figure
1b250 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79   out how many by
1b260 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 72 65  tes of space are
1b270 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
1b280 72 65 20 65 78 70 6c 69 63 69 74 6c 79 0a 20 20  re explicitly.  
1b290 2a 2a 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c  ** specified col
1b2a0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1b2b0 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  names..  */.  fo
1b2c0 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
1b2d0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1b2e0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
1b2f0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
1b300 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
1b310 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  xpr!=0 );.    if
1b320 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1b330 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20  COLLATE ){.     
1b340 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20 2b 20   nExtra += (1 + 
1b350 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1b360 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
1b370 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1b380 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74  /* .  ** Allocat
1b390 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75  e the index stru
1b3a0 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e  cture. .  */.  n
1b3b0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
1b3c0 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
1b3d0 20 6e 45 78 74 72 61 43 6f 6c 20 3d 20 70 50 6b   nExtraCol = pPk
1b3e0 20 3f 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20   ? pPk->nKeyCol 
1b3f0 3a 20 31 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20  : 1;.  pIndex = 
1b400 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49  sqlite3AllocateI
1b410 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70  ndexObject(db, p
1b420 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 6e 45  List->nExpr + nE
1b430 78 74 72 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20  xtraCol,.       
1b440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
1b460 4e 61 6d 65 20 2b 20 6e 45 78 74 72 61 20 2b 20  Name + nExtra + 
1b470 31 2c 20 26 7a 45 78 74 72 61 29 3b 0a 20 20 69  1, &zExtra);.  i
1b480 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
1b490 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
1b4a0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1b4b0 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  x;.  }.  assert(
1b4c0 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
1b4d0 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 69  NMENT(pIndex->ai
1b4e0 52 6f 77 4c 6f 67 45 73 74 29 20 29 3b 0a 20 20  RowLogEst) );.  
1b4f0 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
1b500 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e  TE_ALIGNMENT(pIn
1b510 64 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20 29 3b 0a  dex->azColl) );.
1b520 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20    pIndex->zName 
1b530 3d 20 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74  = zExtra;.  zExt
1b540 72 61 20 2b 3d 20 6e 4e 61 6d 65 20 2b 20 31 3b  ra += nName + 1;
1b550 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e 64 65 78  .  memcpy(pIndex
1b560 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  ->zName, zName, 
1b570 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64  nName+1);.  pInd
1b580 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61  ex->pTable = pTa
1b590 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  b;.  pIndex->onE
1b5a0 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72 72  rror = (u8)onErr
1b5b0 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 75 6e  or;.  pIndex->un
1b5c0 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72  iqNotNull = onEr
1b5d0 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20  ror!=OE_None;.  
1b5e0 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 20  pIndex->idxType 
1b5f0 3d 20 69 64 78 54 79 70 65 3b 0a 20 20 70 49 6e  = idxType;.  pIn
1b600 64 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64  dex->pSchema = d
1b610 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
1b620 65 6d 61 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e  ema;.  pIndex->n
1b630 4b 65 79 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e  KeyCol = pList->
1b640 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 70 50 49  nExpr;.  if( pPI
1b650 57 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c  Where ){.    sql
1b660 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52  ite3ResolveSelfR
1b670 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c  eference(pParse,
1b680 20 70 54 61 62 2c 20 4e 43 5f 50 61 72 74 49 64   pTab, NC_PartId
1b690 78 2c 20 70 50 49 57 68 65 72 65 2c 20 30 29 3b  x, pPIWhere, 0);
1b6a0 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 50 61  .    pIndex->pPa
1b6b0 72 74 49 64 78 57 68 65 72 65 20 3d 20 70 50 49  rtIdxWhere = pPI
1b6c0 57 68 65 72 65 3b 0a 20 20 20 20 70 50 49 57 68  Where;.    pPIWh
1b6d0 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  ere = 0;.  }.  a
1b6e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
1b6f0 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
1b700 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 0a 20 20  , iDb, 0) );..  
1b710 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
1b720 69 66 20 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e  if we should hon
1b730 6f 72 20 44 45 53 43 20 72 65 71 75 65 73 74 73  or DESC requests
1b740 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   on index column
1b750 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 62  s.  */.  if( pDb
1b760 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f  ->pSchema->file_
1b770 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20  format>=4 ){.   
1b780 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d   sortOrderMask =
1b790 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20   -1;   /* Honor 
1b7a0 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  DESC */.  }else{
1b7b0 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61  .    sortOrderMa
1b7c0 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67  sk = 0;    /* Ig
1b7d0 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d  nore DESC */.  }
1b7e0 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 74  ..  /* Analyze t
1b7f0 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65  he list of expre
1b800 73 73 69 6f 6e 73 20 74 68 61 74 20 66 6f 72 6d  ssions that form
1b810 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68   the terms of th
1b820 65 20 69 6e 64 65 78 20 61 6e 64 0a 20 20 2a 2a  e index and.  **
1b830 20 72 65 70 6f 72 74 20 61 6e 79 20 65 72 72 6f   report any erro
1b840 72 73 2e 20 20 49 6e 20 74 68 65 20 63 6f 6d 6d  rs.  In the comm
1b850 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
1b860 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1b870 65 78 61 63 74 6c 79 0a 20 20 2a 2a 20 61 20 74  exactly.  ** a t
1b880 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 73 74 6f  able column, sto
1b890 72 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69  re that column i
1b8a0 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 20 20 46  n aiColumn[].  F
1b8b0 6f 72 20 67 65 6e 65 72 61 6c 20 65 78 70 72 65  or general expre
1b8c0 73 73 69 6f 6e 73 2c 0a 20 20 2a 2a 20 70 6f 70  ssions,.  ** pop
1b8d0 75 6c 61 74 65 20 70 49 6e 64 65 78 2d 3e 61 43  ulate pIndex->aC
1b8e0 6f 6c 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65  olExpr and store
1b8f0 20 58 4e 5f 45 58 50 52 20 28 2d 32 29 20 69 6e   XN_EXPR (-2) in
1b900 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 0a 20 20 2a   aiColumn[]..  *
1b910 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73  *.  ** TODO: Iss
1b920 75 65 20 61 20 77 61 72 6e 69 6e 67 20 69 66 20  ue a warning if 
1b930 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75  two or more colu
1b940 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
1b950 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 0a   are identical..
1b960 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75 65    ** TODO: Issue
1b970 20 61 20 77 61 72 6e 69 6e 67 20 69 66 20 74 68   a warning if th
1b980 65 20 74 61 62 6c 65 20 70 72 69 6d 61 72 79 20  e table primary 
1b990 6b 65 79 20 69 73 20 75 73 65 64 20 61 73 20 70  key is used as p
1b9a0 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  art of the.  ** 
1b9b0 69 6e 64 65 78 20 6b 65 79 2e 0a 20 20 2a 2f 0a  index key..  */.
1b9c0 20 20 70 4c 69 73 74 49 74 65 6d 20 3d 20 70 4c    pListItem = pL
1b9d0 69 73 74 2d 3e 61 3b 0a 20 20 69 66 28 20 49 4e  ist->a;.  if( IN
1b9e0 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29  _RENAME_OBJECT )
1b9f0 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 43  {.    pIndex->aC
1ba00 6f 6c 45 78 70 72 20 3d 20 70 4c 69 73 74 3b 0a  olExpr = pList;.
1ba10 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20      pList = 0;. 
1ba20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
1ba30 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  pIndex->nKeyCol;
1ba40 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b   i++, pListItem+
1ba50 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 43  +){.    Expr *pC
1ba60 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
1ba70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d         /* The i-
1ba80 74 68 20 69 6e 64 65 78 20 65 78 70 72 65 73 73  th index express
1ba90 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  ion */.    int r
1baa0 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65  equestedSortOrde
1bab0 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 53 43  r;        /* ASC
1bac0 20 6f 72 20 44 45 53 43 20 6f 6e 20 74 68 65 20   or DESC on the 
1bad0 69 2d 74 68 20 65 78 70 72 65 73 73 69 6f 6e 20  i-th expression 
1bae0 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
1baf0 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20  r *zColl;       
1bb00 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
1bb10 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
1bb20 20 2a 2f 0a 0a 20 20 20 20 73 71 6c 69 74 65 33   */..    sqlite3
1bb30 53 74 72 69 6e 67 54 6f 49 64 28 70 4c 69 73 74  StringToId(pList
1bb40 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
1bb50 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
1bb60 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50  SelfReference(pP
1bb70 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f 49  arse, pTab, NC_I
1bb80 64 78 45 78 70 72 2c 20 70 4c 69 73 74 49 74 65  dxExpr, pListIte
1bb90 6d 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  m->pExpr, 0);.  
1bba0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
1bbb0 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  rr ) goto exit_c
1bbc0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
1bbd0 20 70 43 45 78 70 72 20 3d 20 73 71 6c 69 74 65   pCExpr = sqlite
1bbe0 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
1bbf0 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70  (pListItem->pExp
1bc00 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 45 78  r);.    if( pCEx
1bc10 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
1bc20 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  N ){.      if( p
1bc30 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65  Tab==pParse->pNe
1bc40 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  wTable ){.      
1bc50 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1bc60 67 28 70 50 61 72 73 65 2c 20 22 65 78 70 72 65  g(pParse, "expre
1bc70 73 73 69 6f 6e 73 20 70 72 6f 68 69 62 69 74 65  ssions prohibite
1bc80 64 20 69 6e 20 50 52 49 4d 41 52 59 20 4b 45 59  d in PRIMARY KEY
1bc90 20 61 6e 64 20 22 0a 20 20 20 20 20 20 20 20 20   and ".         
1bca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcb0 20 20 20 20 20 20 20 22 55 4e 49 51 55 45 20 63         "UNIQUE c
1bcc0 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a 20 20  onstraints");.  
1bcd0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1bce0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1bcf0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1bd00 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72  pIndex->aColExpr
1bd10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
1bd20 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20  Index->aColExpr 
1bd30 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  = pList;.       
1bd40 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20   pList = 0;.    
1bd50 20 20 7d 0a 20 20 20 20 20 20 6a 20 3d 20 58 4e    }.      j = XN
1bd60 5f 45 58 50 52 3b 0a 20 20 20 20 20 20 70 49 6e  _EXPR;.      pIn
1bd70 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
1bd80 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20   = XN_EXPR;.    
1bd90 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f    pIndex->uniqNo
1bda0 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d  tNull = 0;.    }
1bdb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 20 3d 20  else{.      j = 
1bdc0 70 43 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b  pCExpr->iColumn;
1bdd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
1bde0 3c 3d 30 78 37 66 66 66 20 29 3b 0a 20 20 20 20  <=0x7fff );.    
1bdf0 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20 20    if( j<0 ){.   
1be00 20 20 20 20 20 6a 20 3d 20 70 54 61 62 2d 3e 69       j = pTab->i
1be10 50 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73  PKey;.      }els
1be20 65 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c  e if( pTab->aCol
1be30 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29  [j].notNull==0 )
1be40 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  {.        pIndex
1be50 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20  ->uniqNotNull = 
1be60 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1be70 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
1be80 6e 5b 69 5d 20 3d 20 28 69 31 36 29 6a 3b 0a 20  n[i] = (i16)j;. 
1be90 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d     }.    zColl =
1bea0 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   0;.    if( pLis
1beb0 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70  tItem->pExpr->op
1bec0 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a  ==TK_COLLATE ){.
1bed0 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b        int nColl;
1bee0 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70  .      zColl = p
1bef0 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d  ListItem->pExpr-
1bf00 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
1bf10 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   nColl = sqlite3
1bf20 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 20  Strlen30(zColl) 
1bf30 2b 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  + 1;.      asser
1bf40 74 28 20 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c 6c  t( nExtra>=nColl
1bf50 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
1bf60 28 7a 45 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c 20  (zExtra, zColl, 
1bf70 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7a 43  nColl);.      zC
1bf80 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20  oll = zExtra;.  
1bf90 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 43      zExtra += nC
1bfa0 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  oll;.      nExtr
1bfb0 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20  a -= nColl;.    
1bfc0 7d 65 6c 73 65 20 69 66 28 20 6a 3e 3d 30 20 29  }else if( j>=0 )
1bfd0 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  {.      zColl = 
1bfe0 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43  pTab->aCol[j].zC
1bff0 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  oll;.    }.    i
1c000 66 28 20 21 7a 43 6f 6c 6c 20 29 20 7a 43 6f 6c  f( !zColl ) zCol
1c010 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49  l = sqlite3StrBI
1c020 4e 41 52 59 3b 0a 20 20 20 20 69 66 28 20 21 64  NARY;.    if( !d
1c030 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
1c040 21 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f  !sqlite3LocateCo
1c050 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43  llSeq(pParse, zC
1c060 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  oll) ){.      go
1c070 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1c080 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
1c090 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
1c0a0 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72  ] = zColl;.    r
1c0b0 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65  equestedSortOrde
1c0c0 72 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73  r = pListItem->s
1c0d0 6f 72 74 4f 72 64 65 72 20 26 20 73 6f 72 74 4f  ortOrder & sortO
1c0e0 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49  rderMask;.    pI
1c0f0 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
1c100 5b 69 5d 20 3d 20 28 75 38 29 72 65 71 75 65 73  [i] = (u8)reques
1c110 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  tedSortOrder;.  
1c120 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74  }..  /* Append t
1c130 68 65 20 74 61 62 6c 65 20 6b 65 79 20 74 6f 20  he table key to 
1c140 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
1c150 6e 64 65 78 2e 20 20 46 6f 72 20 57 49 54 48 4f  ndex.  For WITHO
1c160 55 54 20 52 4f 57 49 44 0a 20 20 2a 2a 20 74 61  UT ROWID.  ** ta
1c170 62 6c 65 73 20 28 77 68 65 6e 20 70 50 6b 21 3d  bles (when pPk!=
1c180 30 29 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20  0) this will be 
1c190 74 68 65 20 64 65 63 6c 61 72 65 64 20 50 52 49  the declared PRI
1c1a0 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f 72 0a 20  MARY KEY.  For. 
1c1b0 20 2a 2a 20 6e 6f 72 6d 61 6c 20 74 61 62 6c 65   ** normal table
1c1c0 73 20 28 77 68 65 6e 20 70 50 6b 3d 3d 30 29 20  s (when pPk==0) 
1c1d0 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65  this will be the
1c1e0 20 72 6f 77 69 64 2e 0a 20 20 2a 2f 0a 20 20 69   rowid..  */.  i
1c1f0 66 28 20 70 50 6b 20 29 7b 0a 20 20 20 20 66 6f  f( pPk ){.    fo
1c200 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b  r(j=0; j<pPk->nK
1c210 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  eyCol; j++){.   
1c220 20 20 20 69 6e 74 20 78 20 3d 20 70 50 6b 2d 3e     int x = pPk->
1c230 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
1c240 20 20 20 61 73 73 65 72 74 28 20 78 3e 3d 30 20     assert( x>=0 
1c250 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 61 73  );.      if( has
1c260 43 6f 6c 75 6d 6e 28 70 49 6e 64 65 78 2d 3e 61  Column(pIndex->a
1c270 69 43 6f 6c 75 6d 6e 2c 20 70 49 6e 64 65 78 2d  iColumn, pIndex-
1c280 3e 6e 4b 65 79 43 6f 6c 2c 20 78 29 20 29 7b 0a  >nKeyCol, x) ){.
1c290 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
1c2a0 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20 20 20 20  nColumn--; .    
1c2b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c2c0 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
1c2d0 6e 5b 69 5d 20 3d 20 78 3b 0a 20 20 20 20 20 20  n[i] = x;.      
1c2e0 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c    pIndex->azColl
1c2f0 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c  [i] = pPk->azCol
1c300 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 49  l[j];.        pI
1c310 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
1c320 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 53 6f 72 74  [i] = pPk->aSort
1c330 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20  Order[j];.      
1c340 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    i++;.      }. 
1c350 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1c360 20 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c   i==pIndex->nCol
1c370 75 6d 6e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  umn );.  }else{.
1c380 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
1c390 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 52 4f 57  lumn[i] = XN_ROW
1c3a0 49 44 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  ID;.    pIndex->
1c3b0 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69  azColl[i] = sqli
1c3c0 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20  te3StrBINARY;.  
1c3d0 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 66 61 75  }.  sqlite3Defau
1c3e0 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65 78 29  ltRowEst(pIndex)
1c3f0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1c400 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 20 65  pNewTable==0 ) e
1c410 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74  stimateIndexWidt
1c420 68 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a  h(pIndex);..  /*
1c430 20 49 66 20 74 68 69 73 20 69 6e 64 65 78 20 63   If this index c
1c440 6f 6e 74 61 69 6e 73 20 65 76 65 72 79 20 63 6f  ontains every co
1c450 6c 75 6d 6e 20 6f 66 20 69 74 73 20 74 61 62 6c  lumn of its tabl
1c460 65 2c 20 74 68 65 6e 20 6d 61 72 6b 0a 20 20 2a  e, then mark.  *
1c470 2a 20 69 74 20 61 73 20 61 20 63 6f 76 65 72 69  * it as a coveri
1c480 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 61 73  ng index */.  as
1c490 73 65 72 74 28 20 48 61 73 52 6f 77 69 64 28 70  sert( HasRowid(p
1c4a0 54 61 62 29 20 0a 20 20 20 20 20 20 7c 7c 20 70  Tab) .      || p
1c4b0 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20  Tab->iPKey<0 || 
1c4c0 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49  sqlite3ColumnOfI
1c4d0 6e 64 65 78 28 70 49 6e 64 65 78 2c 20 70 54 61  ndex(pIndex, pTa
1c4e0 62 2d 3e 69 50 4b 65 79 29 3e 3d 30 20 29 3b 0a  b->iPKey)>=0 );.
1c4f0 20 20 72 65 63 6f 6d 70 75 74 65 43 6f 6c 75 6d    recomputeColum
1c500 6e 73 4e 6f 74 49 6e 64 65 78 65 64 28 70 49 6e  nsNotIndexed(pIn
1c510 64 65 78 29 3b 0a 20 20 69 66 28 20 70 54 62 6c  dex);.  if( pTbl
1c520 4e 61 6d 65 21 3d 30 20 26 26 20 70 49 6e 64 65  Name!=0 && pInde
1c530 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 54 61 62  x->nColumn>=pTab
1c540 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 70 49  ->nCol ){.    pI
1c550 6e 64 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67  ndex->isCovering
1c560 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 6a 3d   = 1;.    for(j=
1c570 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
1c580 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
1c590 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20   j==pTab->iPKey 
1c5a0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1c5b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6c    if( sqlite3Col
1c5c0 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 6e 64 65  umnOfIndex(pInde
1c5d0 78 2c 6a 29 3e 3d 30 20 29 20 63 6f 6e 74 69 6e  x,j)>=0 ) contin
1c5e0 75 65 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78  ue;.      pIndex
1c5f0 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 30  ->isCovering = 0
1c600 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1c610 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1c620 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e  pTab==pParse->pN
1c630 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f  ewTable ){.    /
1c640 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
1c650 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74  as been called t
1c660 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f  o create an auto
1c670 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73 20 61  matic index as a
1c680 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f  .    ** result o
1c690 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  f a PRIMARY KEY 
1c6a0 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65  or UNIQUE clause
1c6b0 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66   on a column def
1c6c0 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20  inition, or.    
1c6d0 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  ** a PRIMARY KEY
1c6e0 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73   or UNIQUE claus
1c6f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  e following the 
1c700 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f  column definitio
1c710 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20  ns..    ** i.e. 
1c720 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  one of:.    **. 
1c730 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42     ** CREATE TAB
1c740 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b  LE t(x PRIMARY K
1c750 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43  EY, y);.    ** C
1c760 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c  REATE TABLE t(x,
1c770 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29   y, UNIQUE(x, y)
1c780 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
1c790 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 68 65   Either way, che
1c7a0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
1c7b0 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68   table already h
1c7c0 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78  as such an index
1c7d0 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20  . If.    ** so, 
1c7e0 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65  don't bother cre
1c7f0 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20  ating this one. 
1c800 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65  This only applie
1c810 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f  s to.    ** auto
1c820 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65  matically create
1c830 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73  d indices. Users
1c840 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20   can do as they 
1c850 77 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a  wish with.    **
1c860 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65   explicit indice
1c870 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s..    **.    **
1c880 20 54 77 6f 20 55 4e 49 51 55 45 20 6f 72 20 50   Two UNIQUE or P
1c890 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
1c8a0 72 61 69 6e 74 73 20 61 72 65 20 63 6f 6e 73 69  raints are consi
1c8b0 64 65 72 65 64 20 65 71 75 69 76 61 6c 65 6e 74  dered equivalent
1c8c0 0a 20 20 20 20 2a 2a 20 28 61 6e 64 20 74 68 75  .    ** (and thu
1c8d0 73 20 73 75 70 70 72 65 73 73 69 6e 67 20 74 68  s suppressing th
1c8e0 65 20 73 65 63 6f 6e 64 20 6f 6e 65 29 20 65 76  e second one) ev
1c8f0 65 6e 20 69 66 20 74 68 65 79 20 68 61 76 65 20  en if they have 
1c900 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20 2a 2a  different.    **
1c910 20 73 6f 72 74 20 6f 72 64 65 72 73 2e 0a 20 20   sort orders..  
1c920 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
1c930 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65  here are differe
1c940 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  nt collating seq
1c950 75 65 6e 63 65 73 20 6f 72 20 69 66 20 74 68 65  uences or if the
1c960 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20   columns of.    
1c970 2a 2a 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  ** the constrain
1c980 74 20 6f 63 63 75 72 20 69 6e 20 64 69 66 66 65  t occur in diffe
1c990 72 65 6e 74 20 6f 72 64 65 72 73 2c 20 74 68 65  rent orders, the
1c9a0 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  n the constraint
1c9b0 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 63 6f 6e  s are.    ** con
1c9c0 73 69 64 65 72 65 64 20 64 69 73 74 69 6e 63 74  sidered distinct
1c9d0 20 61 6e 64 20 62 6f 74 68 20 72 65 73 75 6c 74   and both result
1c9e0 20 69 6e 20 73 65 70 61 72 61 74 65 20 69 6e 64   in separate ind
1c9f0 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ices..    */.   
1ca00 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
1ca10 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
1ca20 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
1ca30 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
1ca40 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20  {.      int k;. 
1ca50 20 20 20 20 20 61 73 73 65 72 74 28 20 49 73 55       assert( IsU
1ca60 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29  niqueIndex(pIdx)
1ca70 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1ca80 28 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65 21  ( pIdx->idxType!
1ca90 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f  =SQLITE_IDXTYPE_
1caa0 41 50 50 44 45 46 20 29 3b 0a 20 20 20 20 20 20  APPDEF );.      
1cab0 61 73 73 65 72 74 28 20 49 73 55 6e 69 71 75 65  assert( IsUnique
1cac0 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20 29 3b  Index(pIndex) );
1cad0 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ..      if( pIdx
1cae0 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e 64 65  ->nKeyCol!=pInde
1caf0 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e  x->nKeyCol ) con
1cb00 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72  tinue;.      for
1cb10 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 4b  (k=0; k<pIdx->nK
1cb20 65 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20  eyCol; k++){.   
1cb30 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1cb40 2a 7a 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  *z1;.        con
1cb50 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 20  st char *z2;.   
1cb60 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
1cb70 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 3e 3d  x->aiColumn[k]>=
1cb80 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
1cb90 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
1cba0 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f  k]!=pIndex->aiCo
1cbb0 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b  lumn[k] ) break;
1cbc0 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 49  .        z1 = pI
1cbd0 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20  dx->azColl[k];. 
1cbe0 20 20 20 20 20 20 20 7a 32 20 3d 20 70 49 6e 64         z2 = pInd
1cbf0 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20  ex->azColl[k];. 
1cc00 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1cc10 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32  e3StrICmp(z1, z2
1cc20 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ) ) break;.     
1cc30 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d   }.      if( k==
1cc40 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b  pIdx->nKeyCol ){
1cc50 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
1cc60 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64  x->onError!=pInd
1cc70 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20  ex->onError ){. 
1cc80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
1cc90 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61   constraint crea
1cca0 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64  tes the same ind
1ccb0 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75 73  ex as a previous
1ccc0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
1ccd0 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66 69  nstraint specifi
1cce0 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20  ed somewhere in 
1ccf0 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
1cd00 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
1cd10 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72        ** However
1cd20 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54   the ON CONFLICT
1cd30 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69 66   clauses are dif
1cd40 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20  ferent. If both 
1cd50 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20  this .          
1cd60 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e  ** constraint an
1cd70 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  d the previous e
1cd80 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72  quivalent constr
1cd90 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63  aint have explic
1cda0 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  it.          ** 
1cdb0 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
1cdc0 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20 65  ses this is an e
1cdd0 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c  rror. Otherwise,
1cde0 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 20   use the.       
1cdf0 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79     ** explicitly
1ce00 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61 76   specified behav
1ce10 69 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65  ior for the inde
1ce20 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  x..          */.
1ce30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28            if( !(
1ce40 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
1ce50 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e  E_Default || pIn
1ce60 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  dex->onError==OE
1ce70 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20  _Default) ){.   
1ce80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1ce90 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1cea0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1ceb0 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f    "conflicting O
1cec0 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
1ced0 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30  es specified", 0
1cee0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1cef0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
1cf00 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
1cf10 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
1cf20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72        pIdx->onEr
1cf30 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e  ror = pIndex->on
1cf40 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  Error;.         
1cf50 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1cf60 20 20 20 20 20 69 66 28 20 69 64 78 54 79 70 65       if( idxType
1cf70 3d 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  ==SQLITE_IDXTYPE
1cf80 5f 50 52 49 4d 41 52 59 4b 45 59 20 29 20 70 49  _PRIMARYKEY ) pI
1cf90 64 78 2d 3e 69 64 78 54 79 70 65 20 3d 20 69 64  dx->idxType = id
1cfa0 78 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 69  xType;.        i
1cfb0 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
1cfc0 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ECT ){.         
1cfd0 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
1cfe0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e 64   pParse->pNewInd
1cff0 65 78 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  ex;.          pP
1d000 61 72 73 65 2d 3e 70 4e 65 77 49 6e 64 65 78 20  arse->pNewIndex 
1d010 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  = pIndex;.      
1d020 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a      pIndex = 0;.
1d030 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d040 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
1d050 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
1d060 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
1d070 66 28 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  f( !IN_RENAME_OB
1d080 4a 45 43 54 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  JECT ){..    /* 
1d090 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64  Link the new Ind
1d0a0 65 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  ex structure to 
1d0b0 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f  its table and to
1d0c0 20 74 68 65 20 6f 74 68 65 72 0a 20 20 20 20 2a   the other.    *
1d0d0 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  * in-memory data
1d0e0 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73 2e  base structures.
1d0f0 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73   .    */.    ass
1d100 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
1d110 72 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  r==0 );.    if( 
1d120 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
1d130 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  .      Index *p;
1d140 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1d150 49 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52 53 45  IN_SPECIAL_PARSE
1d160 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1d170 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
1d180 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20  utexHeld(db, 0, 
1d190 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29  pIndex->pSchema)
1d1a0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
1d1b0 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20  blName!=0 ){.   
1d1c0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75       pIndex->tnu
1d1d0 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  m = db->init.new
1d1e0 54 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 69 66  Tnum;.        if
1d1f0 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 48 61  ( sqlite3IndexHa
1d200 73 44 75 70 6c 69 63 61 74 65 52 6f 6f 74 50 61  sDuplicateRootPa
1d210 67 65 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20  ge(pIndex) ){.  
1d220 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1d230 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1d240 22 69 6e 76 61 6c 69 64 20 72 6f 6f 74 70 61 67  "invalid rootpag
1d250 65 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  e");.          p
1d260 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
1d270 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1d280 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
1d290 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1d2a0 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  x;.        }.   
1d2b0 20 20 20 7d 0a 20 20 20 20 20 20 70 20 3d 20 73     }.      p = s
1d2c0 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
1d2d0 28 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  (&pIndex->pSchem
1d2e0 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20 20 20  a->idxHash, .   
1d2f0 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
1d300 4e 61 6d 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20  Name, pIndex);. 
1d310 20 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20       if( p ){.  
1d320 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
1d330 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d  =pIndex );  /* M
1d340 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
1d350 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
1d360 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
1d370 74 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 67  t(db);.        g
1d380 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1d390 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
1d3a0 20 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67       db->mDbFlag
1d3b0 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65  s |= DBFLAG_Sche
1d3c0 6d 61 43 68 61 6e 67 65 3b 0a 20 20 20 20 7d 0a  maChange;.    }.
1d3d0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
1d3e0 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 43  is the initial C
1d3f0 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
1d400 65 6d 65 6e 74 20 28 6f 72 20 43 52 45 41 54 45  ement (or CREATE
1d410 20 54 41 42 4c 45 20 69 66 20 74 68 65 0a 20 20   TABLE if the.  
1d420 20 20 2a 2a 20 69 6e 64 65 78 20 69 73 20 61 6e    ** index is an
1d430 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78 20 66   implied index f
1d440 6f 72 20 61 20 55 4e 49 51 55 45 20 6f 72 20 50  or a UNIQUE or P
1d450 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
1d460 72 61 69 6e 74 29 20 74 68 65 6e 0a 20 20 20 20  raint) then.    
1d470 2a 2a 20 65 6d 69 74 20 63 6f 64 65 20 74 6f 20  ** emit code to 
1d480 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64  allocate the ind
1d490 65 78 20 72 6f 6f 74 70 61 67 65 20 6f 6e 20 64  ex rootpage on d
1d4a0 69 73 6b 20 61 6e 64 20 6d 61 6b 65 20 61 6e 20  isk and make an 
1d4b0 65 6e 74 72 79 20 66 6f 72 0a 20 20 20 20 2a 2a  entry for.    **
1d4c0 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 74 68   the index in th
1d4d0 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
1d4e0 74 61 62 6c 65 20 61 6e 64 20 70 6f 70 75 6c 61  table and popula
1d4f0 74 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 74  te the index wit
1d500 68 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74  h.    ** content
1d510 2e 20 20 42 75 74 2c 20 64 6f 20 6e 6f 74 20 64  .  But, do not d
1d520 6f 20 74 68 69 73 20 69 66 20 77 65 20 61 72 65  o this if we are
1d530 20 73 69 6d 70 6c 79 20 72 65 61 64 69 6e 67 20   simply reading 
1d540 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
1d550 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74  r.    ** table t
1d560 6f 20 70 61 72 73 65 20 74 68 65 20 73 63 68 65  o parse the sche
1d570 6d 61 2c 20 6f 72 20 69 66 20 74 68 69 73 20 69  ma, or if this i
1d580 6e 64 65 78 20 69 73 20 74 68 65 20 50 52 49 4d  ndex is the PRIM
1d590 41 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20 20  ARY KEY index.  
1d5a0 20 20 2a 2a 20 6f 66 20 61 20 57 49 54 48 4f 55    ** of a WITHOU
1d5b0 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a 20  T ROWID table.. 
1d5c0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
1d5d0 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d  pTblName==0 it m
1d5e0 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20  eans this index 
1d5f0 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20  is generated as 
1d600 61 6e 20 69 6d 70 6c 69 65 64 20 50 52 49 4d 41  an implied PRIMA
1d610 52 59 20 4b 45 59 0a 20 20 20 20 2a 2a 20 6f 72  RY KEY.    ** or
1d620 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20 69 6e   UNIQUE index in
1d630 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
1d640 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63  statement.  Sinc
1d650 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  e the table.    
1d660 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ** has just been
1d670 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e   created, it con
1d680 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e  tains no data an
1d690 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74  d the index init
1d6a0 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a  ialization.    *
1d6b0 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b  * step can be sk
1d6c0 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ipped..    */.  
1d6d0 20 20 65 6c 73 65 20 69 66 28 20 48 61 73 52 6f    else if( HasRo
1d6e0 77 69 64 28 70 54 61 62 29 20 7c 7c 20 70 54 62  wid(pTab) || pTb
1d6f0 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20  lName!=0 ){.    
1d700 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 20    Vdbe *v;.     
1d710 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20   char *zStmt;.  
1d720 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b      int iMem = +
1d730 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a  +pParse->nMem;..
1d740 20 20 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65        v = sqlite
1d750 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1d760 3b 0a 20 20 20 20 20 20 69 66 28 20 76 3d 3d 30  ;.      if( v==0
1d770 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
1d780 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20  ate_index;..    
1d790 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
1d7a0 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
1d7b0 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 20  rse, 1, iDb);.. 
1d7c0 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74       /* Create t
1d7d0 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20  he rootpage for 
1d7e0 74 68 65 20 69 6e 64 65 78 20 75 73 69 6e 67 20  the index using 
1d7f0 43 72 65 61 74 65 49 6e 64 65 78 2e 20 42 75 74  CreateIndex. But
1d800 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a   before.      **
1d810 20 64 6f 69 6e 67 20 73 6f 2c 20 63 6f 64 65 20   doing so, code 
1d820 61 20 4e 6f 6f 70 20 69 6e 73 74 72 75 63 74 69  a Noop instructi
1d830 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 69 74 73  on and store its
1d840 20 61 64 64 72 65 73 73 20 69 6e 20 0a 20 20 20   address in .   
1d850 20 20 20 2a 2a 20 49 6e 64 65 78 2e 74 6e 75 6d     ** Index.tnum
1d860 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
1d870 65 64 20 69 6e 20 63 61 73 65 20 74 68 69 73 20  ed in case this 
1d880 69 6e 64 65 78 20 69 73 20 61 63 74 75 61 6c 6c  index is actuall
1d890 79 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 50 52  y a .      ** PR
1d8a0 49 4d 41 52 59 20 4b 45 59 20 61 6e 64 20 74 68  IMARY KEY and th
1d8b0 65 20 74 61 62 6c 65 20 69 73 20 61 63 74 75 61  e table is actua
1d8c0 6c 6c 79 20 61 20 57 49 54 48 4f 55 54 20 52 4f  lly a WITHOUT RO
1d8d0 57 49 44 20 74 61 62 6c 65 2e 20 49 6e 20 0a 20  WID table. In . 
1d8e0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61 73       ** that cas
1d8f0 65 20 74 68 65 20 63 6f 6e 76 65 72 74 54 6f 57  e the convertToW
1d900 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65  ithoutRowidTable
1d910 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  () routine will 
1d920 72 65 70 6c 61 63 65 0a 20 20 20 20 20 20 2a 2a  replace.      **
1d930 20 74 68 65 20 4e 6f 6f 70 20 77 69 74 68 20 61   the Noop with a
1d940 20 47 6f 74 6f 20 74 6f 20 6a 75 6d 70 20 6f 76   Goto to jump ov
1d950 65 72 20 74 68 65 20 56 44 42 45 20 63 6f 64 65  er the VDBE code
1d960 20 67 65 6e 65 72 61 74 65 64 20 62 65 6c 6f 77   generated below
1d970 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 6e 64 65  . */.      pInde
1d980 78 2d 3e 74 6e 75 6d 20 3d 20 73 71 6c 69 74 65  x->tnum = sqlite
1d990 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
1d9a0 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73  P_Noop);.      s
1d9b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1d9c0 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 42 74 72  (v, OP_CreateBtr
1d9d0 65 65 2c 20 69 44 62 2c 20 69 4d 65 6d 2c 20 42  ee, iDb, iMem, B
1d9e0 54 52 45 45 5f 42 4c 4f 42 4b 45 59 29 3b 0a 0a  TREE_BLOBKEY);..
1d9f0 20 20 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20        /* Gather 
1da00 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78  the complete tex
1da10 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
1da20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
1da30 69 6e 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  into.      ** th
1da40 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c 65  e zStmt variable
1da50 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1da60 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20  if( pStart ){.  
1da70 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69        int n = (i
1da80 6e 74 29 28 70 50 61 72 73 65 2d 3e 73 4c 61 73  nt)(pParse->sLas
1da90 74 54 6f 6b 65 6e 2e 7a 20 2d 20 70 4e 61 6d 65  tToken.z - pName
1daa0 2d 3e 7a 29 20 2b 20 70 50 61 72 73 65 2d 3e 73  ->z) + pParse->s
1dab0 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a 20 20 20  LastToken.n;.   
1dac0 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e       if( pName->
1dad0 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29 20 6e 2d  z[n-1]==';' ) n-
1dae0 2d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  -;.        /* A 
1daf0 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68  named index with
1db00 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45   an explicit CRE
1db10 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
1db20 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a  ent */.        z
1db30 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
1db40 72 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41 54  rintf(db, "CREAT
1db50 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c  E%s INDEX %.*s",
1db60 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 45  .            onE
1db70 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20  rror==OE_None ? 
1db80 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 20  "" : " UNIQUE", 
1db90 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20  n, pName->z);.  
1dba0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1dbb0 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74     /* An automat
1dbc0 69 63 20 69 6e 64 65 78 20 63 72 65 61 74 65 64  ic index created
1dbd0 20 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45   by a PRIMARY KE
1dbe0 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  Y or UNIQUE cons
1dbf0 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20  traint */.      
1dc00 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c    /* zStmt = sql
1dc10 69 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29 3b  ite3MPrintf("");
1dc20 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 53 74 6d   */.        zStm
1dc30 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a  t = 0;.      }..
1dc40 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20        /* Add an 
1dc50 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f  entry in sqlite_
1dc60 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69 73 20  master for this 
1dc70 69 6e 64 65 78 0a 20 20 20 20 20 20 2a 2f 0a 20  index.      */. 
1dc80 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74       sqlite3Nest
1dc90 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  edParse(pParse, 
1dca0 0a 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45  .          "INSE
1dcb0 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41  RT INTO %Q.%s VA
1dcc0 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c  LUES('index',%Q,
1dcd0 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20  %Q,#%d,%Q);",.  
1dce0 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b          db->aDb[
1dcf0 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d  iDb].zDbSName, M
1dd00 41 53 54 45 52 5f 4e 41 4d 45 2c 0a 20 20 20 20  ASTER_NAME,.    
1dd10 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e        pIndex->zN
1dd20 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 70  ame,.          p
1dd30 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
1dd40 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20 20 20 20        iMem,.    
1dd50 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20        zStmt.    
1dd60 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73        );.      s
1dd70 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1dd80 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 20 20   zStmt);..      
1dd90 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65  /* Fill the inde
1dda0 78 20 77 69 74 68 20 64 61 74 61 20 61 6e 64 20  x with data and 
1ddb0 72 65 70 61 72 73 65 20 74 68 65 20 73 63 68 65  reparse the sche
1ddc0 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45  ma. Code an OP_E
1ddd0 78 70 69 72 65 0a 20 20 20 20 20 20 2a 2a 20 74  xpire.      ** t
1dde0 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  o invalidate all
1ddf0 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74   pre-compiled st
1de00 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 20 20  atements..      
1de10 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 54 62  */.      if( pTb
1de20 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  lName ){.       
1de30 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
1de40 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
1de50 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20  ex, iMem);.     
1de60 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
1de70 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
1de80 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Db);.        sql
1de90 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65  ite3VdbeAddParse
1dea0 53 63 68 65 6d 61 4f 70 28 70 50 61 72 73 65 2c  SchemaOp(pParse,
1deb0 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20   iDb,.          
1dec0 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66    sqlite3MPrintf
1ded0 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27 20  (db, "name='%q' 
1dee0 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27  AND type='index'
1def0 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ", pIndex->zName
1df00 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ));.        sqli
1df10 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1df20 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 2c 20 31   OP_Expire, 0, 1
1df30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
1df40 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1df50 70 48 65 72 65 28 76 2c 20 70 49 6e 64 65 78 2d  pHere(v, pIndex-
1df60 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 7d 0a 20 20  >tnum);.    }.  
1df70 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64  }..  /* When add
1df80 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ing an index to 
1df90 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69  the list of indi
1dfa0 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c  ces for a table,
1dfb0 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20   make.  ** sure 
1dfc0 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65  all indices labe
1dfd0 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63  led OE_Replace c
1dfe0 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68  ome after all th
1dff0 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a  ose labeled.  **
1e000 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69   OE_Ignore.  Thi
1e010 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66  s is necessary f
1e020 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 63  or the correct c
1e030 6f 6e 73 74 72 61 69 6e 74 20 63 68 65 63 6b 0a  onstraint check.
1e040 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20    ** processing 
1e050 28 69 6e 20 73 71 6c 69 74 65 33 47 65 6e 65 72  (in sqlite3Gener
1e060 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65  ateConstraintChe
1e070 63 6b 73 28 29 29 20 61 73 20 70 61 72 74 20 6f  cks()) as part o
1e080 66 0a 20 20 2a 2a 20 55 50 44 41 54 45 20 61 6e  f.  ** UPDATE an
1e090 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  d INSERT stateme
1e0a0 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66  nts.  .  */.  if
1e0b0 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
1e0c0 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29  || pTblName==0 )
1e0d0 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f  {.    if( onErro
1e0e0 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c  r!=OE_Replace ||
1e0f0 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30   pTab->pIndex==0
1e100 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61  .         || pTa
1e110 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  b->pIndex->onErr
1e120 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b  or==OE_Replace){
1e130 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
1e140 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e  Next = pTab->pIn
1e150 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  dex;.      pTab-
1e160 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
1e170 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e180 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72     Index *pOther
1e190 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
1e1a0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f  .      while( pO
1e1b0 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70  ther->pNext && p
1e1c0 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e  Other->pNext->on
1e1d0 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
1e1e0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74  e ){.        pOt
1e1f0 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  her = pOther->pN
1e200 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
1e210 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
1e220 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74   = pOther->pNext
1e230 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e  ;.      pOther->
1e240 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a  pNext = pIndex;.
1e250 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78      }.    pIndex
1e260 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 65 6c 73 65   = 0;.  }.  else
1e270 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
1e280 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73  BJECT ){.    ass
1e290 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65  ert( pParse->pNe
1e2a0 77 49 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20 20  wIndex==0 );.   
1e2b0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e 64   pParse->pNewInd
1e2c0 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  ex = pIndex;.   
1e2d0 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d   pIndex = 0;.  }
1e2e0 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20  ..  /* Clean up 
1e2f0 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a  before exiting *
1e300 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  /.exit_create_in
1e310 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65  dex:.  if( pInde
1e320 78 20 29 20 73 71 6c 69 74 65 33 46 72 65 65 49  x ) sqlite3FreeI
1e330 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
1e340 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
1e350 65 6c 65 74 65 28 64 62 2c 20 70 50 49 57 68 65  elete(db, pPIWhe
1e360 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  re);.  sqlite3Ex
1e370 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
1e380 20 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74   pList);.  sqlit
1e390 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
1e3a0 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  db, pTblName);. 
1e3b0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1e3c0 62 2c 20 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  b, zName);.}../*
1e3d0 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64  .** Fill the Ind
1e3e0 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72  ex.aiRowEst[] ar
1e3f0 72 61 79 20 77 69 74 68 20 64 65 66 61 75 6c 74  ray with default
1e400 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69   information - i
1e410 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f  nformation.** to
1e420 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 77 65   be used when we
1e430 20 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68   have not run th
1e440 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e  e ANALYZE comman
1e450 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73  d..**.** aiRowEs
1e460 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65 64  t[0] is supposed
1e470 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
1e480 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
1e490 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e  ts in the index.
1e4a0 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20  .** Since we do 
1e4b0 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20  not know, guess 
1e4c0 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f  1 million.  aiRo
1e4d0 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73  wEst[1] is an es
1e4e0 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a  timate of the.**
1e4f0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1e500 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  in the table tha
1e510 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74  t match any part
1e520 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20  icular value of 
1e530 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c  the.** first col
1e540 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
1e550 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69  .  aiRowEst[2] i
1e560 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
1e570 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
1e580 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63  f rows that matc
1e590 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72  h any particular
1e5a0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
1e5b0 74 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75  the first 2 colu
1e5c0 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e  mns.** of the in
1e5d0 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  dex.  And so for
1e5e0 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77  th.  It must alw
1e5f0 61 79 73 20 62 65 20 74 68 65 20 63 61 73 65 20  ays be the case 
1e600 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20  that.*.**       
1e610 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c      aiRowEst[N]<
1e620 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a  =aiRowEst[N-1].*
1e630 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f  *           aiRo
1e640 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a  wEst[N]>=1.**.**
1e650 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74   Apart from that
1e660 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65  , we have little
1e670 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65   to go on beside
1e680 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74  s intuition as t
1e690 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73  o.** how aiRowEs
1e6a0 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  t[] should be in
1e6b0 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20  itialized.  The 
1e6c0 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65  numbers generate
1e6d0 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61  d here.** are ba
1e6e0 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76  sed on typical v
1e6f0 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61  alues found in a
1e700 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a  ctual indices..*
1e710 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
1e720 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65  faultRowEst(Inde
1e730 78 20 2a 70 49 64 78 29 7b 0a 20 20 2f 2a 20 20  x *pIdx){.  /*  
1e740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 30                10
1e750 2c 20 20 39 2c 20 20 38 2c 20 20 37 2c 20 20 36  ,  9,  8,  7,  6
1e760 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61 56 61   */.  LogEst aVa
1e770 6c 5b 5d 20 3d 20 7b 20 33 33 2c 20 33 32 2c 20  l[] = { 33, 32, 
1e780 33 30 2c 20 32 38 2c 20 32 36 20 7d 3b 0a 20 20  30, 28, 26 };.  
1e790 4c 6f 67 45 73 74 20 2a 61 20 3d 20 70 49 64 78  LogEst *a = pIdx
1e7a0 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 3b 0a 20  ->aiRowLogEst;. 
1e7b0 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 4d 49 4e   int nCopy = MIN
1e7c0 28 41 72 72 61 79 53 69 7a 65 28 61 56 61 6c 29  (ArraySize(aVal)
1e7d0 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29  , pIdx->nKeyCol)
1e7e0 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  ;.  int i;..  /*
1e7f0 20 49 6e 64 65 78 65 73 20 77 69 74 68 20 64 65   Indexes with de
1e800 66 61 75 6c 74 20 72 6f 77 20 65 73 74 69 6d 61  fault row estima
1e810 74 65 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68  tes should not h
1e820 61 76 65 20 73 74 61 74 31 20 64 61 74 61 20 2a  ave stat1 data *
1e830 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 49 64  /.  assert( !pId
1e840 78 2d 3e 68 61 73 53 74 61 74 31 20 29 3b 0a 0a  x->hasStat1 );..
1e850 20 20 2f 2a 20 53 65 74 20 74 68 65 20 66 69 72    /* Set the fir
1e860 73 74 20 65 6e 74 72 79 20 28 6e 75 6d 62 65 72  st entry (number
1e870 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
1e880 69 6e 64 65 78 29 20 74 6f 20 74 68 65 20 65 73  index) to the es
1e890 74 69 6d 61 74 65 64 20 0a 20 20 2a 2a 20 6e 75  timated .  ** nu
1e8a0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
1e8b0 74 68 65 20 74 61 62 6c 65 2c 20 6f 72 20 68 61  the table, or ha
1e8c0 6c 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  lf the number of
1e8d0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
1e8e0 6c 65 0a 20 20 2a 2a 20 66 6f 72 20 61 20 70 61  le.  ** for a pa
1e8f0 72 74 69 61 6c 20 69 6e 64 65 78 2e 20 20 20 42  rtial index.   B
1e900 75 74 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74 68  ut do not let th
1e910 65 20 65 73 74 69 6d 61 74 65 20 64 72 6f 70 20  e estimate drop 
1e920 62 65 6c 6f 77 20 31 30 2e 20 2a 2f 0a 20 20 61  below 10. */.  a
1e930 5b 30 5d 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  [0] = pIdx->pTab
1e940 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a  le->nRowLogEst;.
1e950 20 20 69 66 28 20 70 49 64 78 2d 3e 70 50 61 72    if( pIdx->pPar
1e960 74 49 64 78 57 68 65 72 65 21 3d 30 20 29 20 61  tIdxWhere!=0 ) a
1e970 5b 30 5d 20 2d 3d 20 31 30 3b 20 20 61 73 73 65  [0] -= 10;  asse
1e980 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c  rt( 10==sqlite3L
1e990 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 69 66  ogEst(2) );.  if
1e9a0 28 20 61 5b 30 5d 3c 33 33 20 29 20 61 5b 30 5d  ( a[0]<33 ) a[0]
1e9b0 20 3d 20 33 33 3b 20 20 20 20 20 20 20 20 20 20   = 33;          
1e9c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1e9d0 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  33==sqlite3LogEs
1e9e0 74 28 31 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 45  t(10) );..  /* E
1e9f0 73 74 69 6d 61 74 65 20 74 68 61 74 20 61 5b 31  stimate that a[1
1ea00 5d 20 69 73 20 31 30 2c 20 61 5b 32 5d 20 69 73  ] is 10, a[2] is
1ea10 20 39 2c 20 61 5b 33 5d 20 69 73 20 38 2c 20 61   9, a[3] is 8, a
1ea20 5b 34 5d 20 69 73 20 37 2c 20 61 5b 35 5d 20 69  [4] is 7, a[5] i
1ea30 73 0a 20 20 2a 2a 20 36 20 61 6e 64 20 65 61 63  s.  ** 6 and eac
1ea40 68 20 73 75 62 73 65 71 75 65 6e 74 20 76 61 6c  h subsequent val
1ea50 75 65 20 28 69 66 20 61 6e 79 29 20 69 73 20 35  ue (if any) is 5
1ea60 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26  .  */.  memcpy(&
1ea70 61 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f 70  a[1], aVal, nCop
1ea80 79 2a 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29  y*sizeof(LogEst)
1ea90 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 70 79  );.  for(i=nCopy
1eaa0 2b 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b 65  +1; i<=pIdx->nKe
1eab0 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  yCol; i++){.    
1eac0 61 5b 69 5d 20 3d 20 32 33 3b 20 20 20 20 20 20  a[i] = 23;      
1ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
1eae0 73 65 72 74 28 20 32 33 3d 3d 73 71 6c 69 74 65  sert( 23==sqlite
1eaf0 33 4c 6f 67 45 73 74 28 35 29 20 29 3b 0a 20 20  3LogEst(5) );.  
1eb00 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  }..  assert( 0==
1eb10 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29  sqlite3LogEst(1)
1eb20 20 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71   );.  if( IsUniq
1eb30 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 20  ueIndex(pIdx) ) 
1eb40 61 5b 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 5d  a[pIdx->nKeyCol]
1eb50 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
1eb60 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1eb70 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e   drop an existin
1eb80 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20  g named index.  
1eb90 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
1eba0 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44  implements the D
1ebb0 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ROP INDEX statem
1ebc0 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
1ebd0 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61  ite3DropIndex(Pa
1ebe0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
1ebf0 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  List *pName, int
1ec00 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e   ifExists){.  In
1ec10 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56  dex *pIndex;.  V
1ec20 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
1ec30 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1ec40 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
1ec50 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1ec60 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f  ->nErr==0 );   /
1ec70 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77  * Never called w
1ec80 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73  ith prior errors
1ec90 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   */.  if( db->ma
1eca0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
1ecb0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
1ecc0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73  _index;.  }.  as
1ecd0 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
1ece0 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51  c==1 );.  if( SQ
1ecf0 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
1ed00 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
1ed10 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  e) ){.    goto e
1ed20 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
1ed30 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73    }.  pIndex = s
1ed40 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
1ed50 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  db, pName->a[0].
1ed60 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  zName, pName->a[
1ed70 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
1ed80 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29   if( pIndex==0 )
1ed90 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45 78 69  {.    if( !ifExi
1eda0 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  sts ){.      sql
1edb0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1edc0 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e  rse, "no such in
1edd0 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c  dex: %S", pName,
1ede0 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
1edf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
1ee00 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65  eVerifyNamedSche
1ee10 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  ma(pParse, pName
1ee20 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
1ee30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
1ee40 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
1ee50 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65   = 1;.    goto e
1ee60 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
1ee70 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78    }.  if( pIndex
1ee80 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54  ->idxType!=SQLIT
1ee90 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46  E_IDXTYPE_APPDEF
1eea0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1eeb0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1eec0 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65  "index associate
1eed0 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a  d with UNIQUE ".
1eee0 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52        "or PRIMAR
1eef0 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
1ef00 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70   cannot be dropp
1ef10 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74  ed", 0);.    got
1ef20 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1ef30 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73  x;.  }.  iDb = s
1ef40 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
1ef50 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e  dex(db, pIndex->
1ef60 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69  pSchema);.  sqli
1ef70 74 65 33 53 63 68 65 6d 61 57 72 69 74 61 62 6c  te3SchemaWritabl
1ef80 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
1ef90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1efa0 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
1efb0 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  N.  {.    int co
1efc0 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
1efd0 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c  _INDEX;.    Tabl
1efe0 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78  e *pTab = pIndex
1eff0 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f  ->pTable;.    co
1f000 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
1f010 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
1f020 53 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  SName;.    const
1f030 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43   char *zTab = SC
1f040 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b  HEMA_TABLE(iDb);
1f050 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1f060 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1f070 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
1f080 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29   zTab, 0, zDb) )
1f090 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
1f0a0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1f0b0 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49    }.    if( !OMI
1f0c0 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 20  T_TEMPDB && iDb 
1f0d0 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  ) code = SQLITE_
1f0e0 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b  DROP_TEMP_INDEX;
1f0f0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1f100 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1f110 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e  , code, pIndex->
1f120 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
1f130 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  me, zDb) ){.    
1f140 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
1f150 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
1f160 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
1f170 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1f180 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78  remove the index
1f190 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61   and from the ma
1f1a0 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ster table */.  
1f1b0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1f1c0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
1f1d0 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
1f1e0 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
1f1f0 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
1f200 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
1f210 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
1f220 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45  arse,.       "DE
1f230 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
1f240 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 20 41 4e  WHERE name=%Q AN
1f250 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c  D type='index'",
1f260 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  .       db->aDb[
1f270 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d  iDb].zDbSName, M
1f280 41 53 54 45 52 5f 4e 41 4d 45 2c 20 70 49 6e 64  ASTER_NAME, pInd
1f290 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b  ex->zName.    );
1f2a0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61  .    sqlite3Clea
1f2b0 72 53 74 61 74 54 61 62 6c 65 73 28 70 50 61 72  rStatTables(pPar
1f2c0 73 65 2c 20 69 44 62 2c 20 22 69 64 78 22 2c 20  se, iDb, "idx", 
1f2d0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b 0a  pIndex->zName);.
1f2e0 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
1f2f0 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
1f300 69 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f  iDb);.    destro
1f310 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65  yRootPage(pParse
1f320 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20  , pIndex->tnum, 
1f330 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
1f340 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1f350 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62  P_DropIndex, iDb
1f360 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e  , 0, 0, pIndex->
1f370 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a  zName, 0);.  }..
1f380 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a  exit_drop_index:
1f390 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
1f3a0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d  tDelete(db, pNam
1f3b0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72  e);.}../*.** pAr
1f3c0 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ray is a pointer
1f3d0 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20   to an array of 
1f3e0 6f 62 6a 65 63 74 73 2e 20 45 61 63 68 20 6f 62  objects. Each ob
1f3f0 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61  ject in the.** a
1f400 72 72 61 79 20 69 73 20 73 7a 45 6e 74 72 79 20  rray is szEntry 
1f410 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 54  bytes in size. T
1f420 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65 73  his routine uses
1f430 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
1f440 63 28 29 0a 2a 2a 20 74 6f 20 65 78 74 65 6e 64  c().** to extend
1f450 20 74 68 65 20 61 72 72 61 79 20 73 6f 20 74 68   the array so th
1f460 61 74 20 74 68 65 72 65 20 69 73 20 73 70 61 63  at there is spac
1f470 65 20 66 6f 72 20 61 20 6e 65 77 20 6f 62 6a 65  e for a new obje
1f480 63 74 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 2a  ct at the end..*
1f490 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66  *.** When this f
1f4a0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1f4b0 64 2c 20 2a 70 6e 45 6e 74 72 79 20 63 6f 6e 74  d, *pnEntry cont
1f4c0 61 69 6e 73 20 74 68 65 20 63 75 72 72 65 6e 74  ains the current
1f4d0 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65 20   size of.** the 
1f4e0 61 72 72 61 79 20 28 69 6e 20 65 6e 74 72 69 65  array (in entrie
1f4f0 73 20 2d 20 73 6f 20 74 68 65 20 61 6c 6c 6f 63  s - so the alloc
1f500 61 74 69 6f 6e 20 69 73 20 28 28 2a 70 6e 45 6e  ation is ((*pnEn
1f510 74 72 79 29 20 2a 20 73 7a 45 6e 74 72 79 29 20  try) * szEntry) 
1f520 62 79 74 65 73 0a 2a 2a 20 69 6e 20 74 6f 74 61  bytes.** in tota
1f530 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  l)..**.** If the
1f540 20 72 65 61 6c 6c 6f 63 28 29 20 69 73 20 73 75   realloc() is su
1f550 63 63 65 73 73 66 75 6c 20 28 69 2e 65 2e 20 69  ccessful (i.e. i
1f560 66 20 6e 6f 20 4f 4f 4d 20 63 6f 6e 64 69 74 69  f no OOM conditi
1f570 6f 6e 20 6f 63 63 75 72 73 29 2c 20 74 68 65 0a  on occurs), the.
1f580 2a 2a 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  ** space allocat
1f590 65 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6f  ed for the new o
1f5a0 62 6a 65 63 74 20 69 73 20 7a 65 72 6f 65 64 2c  bject is zeroed,
1f5b0 20 2a 70 6e 45 6e 74 72 79 20 75 70 64 61 74 65   *pnEntry update
1f5c0 64 20 74 6f 0a 2a 2a 20 72 65 66 6c 65 63 74 20  d to.** reflect 
1f5d0 74 68 65 20 6e 65 77 20 73 69 7a 65 20 6f 66 20  the new size of 
1f5e0 74 68 65 20 61 72 72 61 79 20 61 6e 64 20 61 20  the array and a 
1f5f0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
1f600 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  ew allocation.**
1f610 20 72 65 74 75 72 6e 65 64 2e 20 2a 70 49 64 78   returned. *pIdx
1f620 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69   is set to the i
1f630 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 65 77 20  ndex of the new 
1f640 61 72 72 61 79 20 65 6e 74 72 79 20 69 6e 20 74  array entry in t
1f650 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
1f660 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
1f670 65 20 72 65 61 6c 6c 6f 63 28 29 20 66 61 69 6c  e realloc() fail
1f680 73 2c 20 2a 70 49 64 78 20 69 73 20 73 65 74 20  s, *pIdx is set 
1f690 74 6f 20 2d 31 2c 20 2a 70 6e 45 6e 74 72 79 20  to -1, *pnEntry 
1f6a0 72 65 6d 61 69 6e 73 0a 2a 2a 20 75 6e 63 68 61  remains.** uncha
1f6b0 6e 67 65 64 20 61 6e 64 20 61 20 63 6f 70 79 20  nged and a copy 
1f6c0 6f 66 20 70 41 72 72 61 79 20 72 65 74 75 72 6e  of pArray return
1f6d0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ed..*/.void *sql
1f6e0 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
1f6f0 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
1f700 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  ,      /* Connec
1f710 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f  tion to notify o
1f720 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  f malloc failure
1f730 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72  s */.  void *pAr
1f740 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72 72 61  ray,     /* Arra
1f750 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 4d  y of objects.  M
1f760 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f 63 61  ight be realloca
1f770 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45  ted */.  int szE
1f780 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20 53 69  ntry,      /* Si
1f790 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a 65 63  ze of each objec
1f7a0 74 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 2a  t in the array *
1f7b0 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72 79  /.  int *pnEntry
1f7c0 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ,     /* Number 
1f7d0 6f 66 20 6f 62 6a 65 63 74 73 20 63 75 72 72 65  of objects curre
1f7e0 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a 20  ntly in use */. 
1f7f0 20 69 6e 74 20 2a 70 49 64 78 20 20 20 20 20 20   int *pIdx      
1f800 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
1f810 69 6e 64 65 78 20 6f 66 20 61 20 6e 65 77 20 73  index of a new s
1f820 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lot here */.){. 
1f830 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20   char *z;.  int 
1f840 6e 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20  n = *pnEntry;.  
1f850 69 66 28 20 28 6e 20 26 20 28 6e 2d 31 29 29 3d  if( (n & (n-1))=
1f860 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a  =0 ){.    int sz
1f870 20 3d 20 28 6e 3d 3d 30 29 20 3f 20 31 20 3a 20   = (n==0) ? 1 : 
1f880 32 2a 6e 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70  2*n;.    void *p
1f890 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
1f8a0 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72 61  ealloc(db, pArra
1f8b0 79 2c 20 73 7a 2a 73 7a 45 6e 74 72 79 29 3b 0a  y, sz*szEntry);.
1f8c0 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
1f8d0 29 7b 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d  ){.      *pIdx =
1f8e0 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   -1;.      retur
1f8f0 6e 20 70 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a  n pArray;.    }.
1f900 20 20 20 20 70 41 72 72 61 79 20 3d 20 70 4e 65      pArray = pNe
1f910 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68  w;.  }.  z = (ch
1f920 61 72 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d 65  ar*)pArray;.  me
1f930 6d 73 65 74 28 26 7a 5b 6e 20 2a 20 73 7a 45 6e  mset(&z[n * szEn
1f940 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79  try], 0, szEntry
1f950 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 6e 3b 0a  );.  *pIdx = n;.
1f960 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20    ++*pnEntry;.  
1f970 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d  return pArray;.}
1f980 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
1f990 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
1f9a0 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74  the given IdList
1f9b0 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
1f9c0 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65  IdList if.** nee
1f9d0 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65  d be..**.** A ne
1f9e0 77 20 49 64 4c 69 73 74 20 69 73 20 72 65 74 75  w IdList is retu
1f9f0 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66  rned, or NULL if
1fa00 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e   malloc() fails.
1fa10 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69  .*/.IdList *sqli
1fa20 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28  te3IdListAppend(
1fa30 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
1fa40 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  dList *pList, To
1fa50 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
1fa60 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1fa70 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
1fa80 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
1fa90 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
1faa0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1fab0 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
1fac0 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  IdList) );.    i
1fad0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
1fae0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c  turn 0;.  }.  pL
1faf0 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33  ist->a = sqlite3
1fb00 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
1fb10 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 70       db,.      p
1fb20 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73  List->a,.      s
1fb30 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
1fb40 5d 29 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74  ]),.      &pList
1fb50 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26 69 0a  ->nId,.      &i.
1fb60 20 20 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29    );.  if( i<0 )
1fb70 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  {.    sqlite3IdL
1fb80 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
1fb90 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ist);.    return
1fba0 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d   0;.  }.  pList-
1fbb0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71  >a[i].zName = sq
1fbc0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1fbd0 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a  en(db, pToken);.
1fbe0 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
1fbf0 4f 42 4a 45 43 54 20 26 26 20 70 4c 69 73 74 2d  OBJECT && pList-
1fc00 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20  >a[i].zName ){. 
1fc10 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65     sqlite3Rename
1fc20 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73 65 2c  TokenMap(pParse,
1fc30 20 28 76 6f 69 64 2a 29 70 4c 69 73 74 2d 3e 61   (void*)pList->a
1fc40 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 6b 65  [i].zName, pToke
1fc50 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  n);.  }.  return
1fc60 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
1fc70 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73   Delete an IdLis
1fc80 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1fc90 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 73  e3IdListDelete(s
1fca0 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69  qlite3 *db, IdLi
1fcb0 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
1fcc0 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
1fcd0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1fce0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
1fcf0 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
1fd00 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1fd10 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  b, pList->a[i].z
1fd20 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Name);.  }.  sql
1fd30 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1fd40 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69  List->a);.  sqli
1fd50 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
1fd60 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
1fd70 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
1fd80 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68  x in pList of th
1fd90 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d  e identifier nam
1fda0 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20  ed zId.  Return 
1fdb0 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75  -1.** if not fou
1fdc0 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
1fdd0 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64  e3IdListIndex(Id
1fde0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e  List *pList, con
1fdf0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
1fe00 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1fe10 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1fe20 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  n -1;.  for(i=0;
1fe30 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
1fe40 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
1fe50 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73  ite3StrICmp(pLis
1fe60 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  t->a[i].zName, z
1fe70 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72  Name)==0 ) retur
1fe80 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
1fe90 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n -1;.}../*.** M
1fea0 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61  aximum size of a
1feb0 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 2e   SrcList object.
1fec0 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20  .** The SrcList 
1fed0 6f 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74  object is used t
1fee0 6f 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20  o represent the 
1fef0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
1ff00 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
1ff10 6d 65 6e 74 2c 20 61 6e 64 20 74 68 65 20 71 75  ment, and the qu
1ff20 65 72 79 20 70 6c 61 6e 6e 65 72 20 63 61 6e 6e  ery planner cann
1ff30 6f 74 20 64 65 61 6c 20 77 69 74 68 20 6d 6f 72  ot deal with mor
1ff40 65 0a 2a 2a 20 74 68 61 6e 20 36 34 20 74 61 62  e.** than 64 tab
1ff50 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 2e 20 20  les in a join.  
1ff60 53 6f 20 61 6e 79 20 76 61 6c 75 65 20 6c 61 72  So any value lar
1ff70 67 65 72 20 74 68 61 6e 20 36 34 20 68 65 72 65  ger than 64 here
1ff80 0a 2a 2a 20 69 73 20 73 75 66 66 69 63 69 65 6e  .** is sufficien
1ff90 74 20 66 6f 72 20 6d 6f 73 74 20 75 73 65 73 2e  t for most uses.
1ffa0 20 20 53 6d 61 6c 6c 65 72 20 76 61 6c 75 65 73    Smaller values
1ffb0 2c 20 6c 69 6b 65 20 73 61 79 20 31 30 2c 20 61  , like say 10, a
1ffc0 72 65 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74  re.** appropriat
1ffd0 65 20 66 6f 72 20 73 6d 61 6c 6c 20 61 6e 64 20  e for small and 
1ffe0 6d 65 6d 6f 72 79 2d 6c 69 6d 69 74 65 64 20 61  memory-limited a
1fff0 70 70 6c 69 63 61 74 69 6f 6e 73 2e 0a 2a 2f 0a  pplications..*/.
20000 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4d  #ifndef SQLITE_M
20010 41 58 5f 53 52 43 4c 49 53 54 0a 23 20 64 65 66  AX_SRCLIST.# def
20020 69 6e 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ine SQLITE_MAX_S
20030 52 43 4c 49 53 54 20 32 30 30 0a 23 65 6e 64 69  RCLIST 200.#endi
20040 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20  f../*.** Expand 
20050 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61  the space alloca
20060 74 65 64 20 66 6f 72 20 74 68 65 20 67 69 76 65  ted for the give
20070 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63 74  n SrcList object
20080 20 62 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20   by.** creating 
20090 6e 45 78 74 72 61 20 6e 65 77 20 73 6c 6f 74 73  nExtra new slots
200a0 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 69 53   beginning at iS
200b0 74 61 72 74 2e 20 20 69 53 74 61 72 74 20 69 73  tart.  iStart is
200c0 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20   zero based..** 
200d0 4e 65 77 20 73 6c 6f 74 73 20 61 72 65 20 7a 65  New slots are ze
200e0 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  roed..**.** For 
200f0 65 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65  example, suppose
20100 20 61 20 53 72 63 4c 69 73 74 20 69 6e 69 74 69   a SrcList initi
20110 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74 77  ally contains tw
20120 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a  o entries: A,B..
20130 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20 33 20 6e  ** To append 3 n
20140 65 77 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20  ew entries onto 
20150 74 68 65 20 65 6e 64 2c 20 64 6f 20 74 68 69 73  the end, do this
20160 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74  :.**.**    sqlit
20170 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65  e3SrcListEnlarge
20180 28 64 62 2c 20 70 53 72 63 6c 69 73 74 2c 20 33  (db, pSrclist, 3
20190 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65  , 2);.**.** Afte
201a0 72 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65  r the call above
201b0 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69   it would contai
201c0 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e  n:  A, B, nil, n
201d0 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74  il, nil..** If t
201e0 68 65 20 69 53 74 61 72 74 20 61 72 67 75 6d 65  he iStart argume
201f0 6e 74 20 68 61 64 20 62 65 65 6e 20 31 20 69 6e  nt had been 1 in
20200 73 74 65 61 64 20 6f 66 20 32 2c 20 74 68 65 6e  stead of 2, then
20210 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77   the result.** w
20220 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 3a 20  ould have been: 
20230 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69   A, nil, nil, ni
20240 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65 70 65 6e  l, B.  To prepen
20250 64 20 74 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c  d the new slots,
20260 0a 2a 2a 20 74 68 65 20 69 53 74 61 72 74 20 76  .** the iStart v
20270 61 6c 75 65 20 77 6f 75 6c 64 20 62 65 20 30 2e  alue would be 0.
20280 20 20 54 68 65 20 72 65 73 75 6c 74 20 74 68 65    The result the
20290 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e  n would.** be: n
202a0 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c  il, nil, nil, A,
202b0 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d   B..**.** If a m
202c0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
202d0 20 66 61 69 6c 73 20 6f 72 20 74 68 65 20 53 72   fails or the Sr
202e0 63 4c 69 73 74 20 62 65 63 6f 6d 65 73 20 74 6f  cList becomes to
202f0 6f 20 6c 61 72 67 65 2c 20 6c 65 61 76 65 0a 2a  o large, leave.*
20300 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  * the original S
20310 72 63 4c 69 73 74 20 75 6e 63 68 61 6e 67 65 64  rcList unchanged
20320 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2c 20 61  , return NULL, a
20330 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  nd leave an erro
20340 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20  r message.** in 
20350 70 50 61 72 73 65 2e 0a 2a 2f 0a 53 72 63 4c 69  pParse..*/.SrcLi
20360 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
20370 73 74 45 6e 6c 61 72 67 65 28 0a 20 20 50 61 72  stEnlarge(.  Par
20380 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
20390 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
203a0 78 74 20 69 6e 74 6f 20 77 68 69 63 68 20 65 72  xt into which er
203b0 72 6f 72 73 20 61 72 65 20 72 65 70 6f 72 74 65  rors are reporte
203c0 64 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  d */.  SrcList *
203d0 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 68 65  pSrc,     /* The
203e0 20 53 72 63 4c 69 73 74 20 74 6f 20 62 65 20 65   SrcList to be e
203f0 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74  nlarged */.  int
20400 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
20410 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 77  /* Number of new
20420 20 73 6c 6f 74 73 20 74 6f 20 61 64 64 20 74 6f   slots to add to
20430 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20   pSrc->a[] */.  
20440 69 6e 74 20 69 53 74 61 72 74 20 20 20 20 20 20  int iStart      
20450 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
20460 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66 69 72 73  Src->a[] of firs
20470 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b  t new slot */.){
20480 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
20490 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
204a0 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61 72 61 6d  on calling param
204b0 65 74 65 72 73 20 2a 2f 0a 20 20 61 73 73 65 72  eters */.  asser
204c0 74 28 20 69 53 74 61 72 74 3e 3d 30 20 29 3b 0a  t( iStart>=0 );.
204d0 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61    assert( nExtra
204e0 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
204f0 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 61 73   pSrc!=0 );.  as
20500 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d 70 53  sert( iStart<=pS
20510 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a 20 20 2f  rc->nSrc );..  /
20520 2a 20 41 6c 6c 6f 63 61 74 65 20 61 64 64 69 74  * Allocate addit
20530 69 6f 6e 61 6c 20 73 70 61 63 65 20 69 66 20 6e  ional space if n
20540 65 65 64 65 64 20 2a 2f 0a 20 20 69 66 28 20 28  eeded */.  if( (
20550 75 33 32 29 70 53 72 63 2d 3e 6e 53 72 63 2b 6e  u32)pSrc->nSrc+n
20560 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e 41 6c 6c  Extra>pSrc->nAll
20570 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  oc ){.    SrcLis
20580 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74  t *pNew;.    int
20590 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72 63 2d 3e   nAlloc = pSrc->
205a0 6e 53 72 63 2a 32 2b 6e 45 78 74 72 61 3b 0a 20  nSrc*2+nExtra;. 
205b0 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
205c0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
205d0 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
205e0 2b 6e 45 78 74 72 61 3e 3d 53 51 4c 49 54 45 5f  +nExtra>=SQLITE_
205f0 4d 41 58 5f 53 52 43 4c 49 53 54 20 29 7b 0a 20  MAX_SRCLIST ){. 
20600 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
20610 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
20620 6f 20 6d 61 6e 79 20 46 52 4f 4d 20 63 6c 61 75  o many FROM clau
20630 73 65 20 74 65 72 6d 73 2c 20 6d 61 78 3a 20 25  se terms, max: %
20640 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  d",.            
20650 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
20660 5f 4d 41 58 5f 53 52 43 4c 49 53 54 29 3b 0a 20  _MAX_SRCLIST);. 
20670 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
20680 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 6c     }.    if( nAl
20690 6c 6f 63 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 53  loc>SQLITE_MAX_S
206a0 52 43 4c 49 53 54 20 29 20 6e 41 6c 6c 6f 63 20  RCLIST ) nAlloc 
206b0 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 52 43  = SQLITE_MAX_SRC
206c0 4c 49 53 54 3b 0a 20 20 20 20 70 4e 65 77 20 3d  LIST;.    pNew =
206d0 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
206e0 63 28 64 62 2c 20 70 53 72 63 2c 0a 20 20 20 20  c(db, pSrc,.    
206f0 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
20700 66 28 2a 70 53 72 63 29 20 2b 20 28 6e 41 6c 6c  f(*pSrc) + (nAll
20710 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 53 72  oc-1)*sizeof(pSr
20720 63 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20  c->a[0]) );.    
20730 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
20740 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
20750 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
20760 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
20770 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 20  .    }.    pSrc 
20780 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 53 72 63  = pNew;.    pSrc
20790 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f  ->nAlloc = nAllo
207a0 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76  c;.  }..  /* Mov
207b0 65 20 65 78 69 73 74 69 6e 67 20 73 6c 6f 74 73  e existing slots
207c0 20 74 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72   that come after
207d0 20 74 68 65 20 6e 65 77 6c 79 20 69 6e 73 65 72   the newly inser
207e0 74 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f  ted slots.  ** o
207f0 75 74 20 6f 66 20 74 68 65 20 77 61 79 20 2a 2f  ut of the way */
20800 0a 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e  .  for(i=pSrc->n
20810 53 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74  Src-1; i>=iStart
20820 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63  ; i--){.    pSrc
20830 2d 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20  ->a[i+nExtra] = 
20840 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a  pSrc->a[i];.  }.
20850 20 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20    pSrc->nSrc += 
20860 6e 45 78 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65  nExtra;..  /* Ze
20870 72 6f 20 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c  ro the newly all
20880 6f 63 61 74 65 64 20 73 6c 6f 74 73 20 2a 2f 0a  ocated slots */.
20890 20 20 6d 65 6d 73 65 74 28 26 70 53 72 63 2d 3e    memset(&pSrc->
208a0 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 73 69  a[iStart], 0, si
208b0 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29  zeof(pSrc->a[0])
208c0 2a 6e 45 78 74 72 61 29 3b 0a 20 20 66 6f 72 28  *nExtra);.  for(
208d0 69 3d 69 53 74 61 72 74 3b 20 69 3c 69 53 74 61  i=iStart; i<iSta
208e0 72 74 2b 6e 45 78 74 72 61 3b 20 69 2b 2b 29 7b  rt+nExtra; i++){
208f0 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e  .    pSrc->a[i].
20900 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20  iCursor = -1;.  
20910 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 61  }..  /* Return a
20920 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
20930 65 6e 6c 61 72 67 65 64 20 53 72 63 4c 69 73 74  enlarged SrcList
20940 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 53 72   */.  return pSr
20950 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  c;.}.../*.** App
20960 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20  end a new table 
20970 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65  name to the give
20980 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61  n SrcList.  Crea
20990 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  te a new SrcList
209a0 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20   if.** need be. 
209b0 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20   A new entry is 
209c0 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 53  created in the S
209d0 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70  rcList even if p
209e0 54 61 62 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a  Table is NULL..*
209f0 2a 0a 2a 2a 20 41 20 53 72 63 4c 69 73 74 20 69  *.** A SrcList i
20a00 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e  s returned, or N
20a10 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20  ULL if there is 
20a20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 72 20  an OOM error or 
20a30 69 66 20 74 68 65 0a 2a 2a 20 53 72 63 4c 69 73  if the.** SrcLis
20a40 74 20 67 72 6f 77 73 20 74 6f 20 6c 61 72 67 65  t grows to large
20a50 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 0a  .  The returned.
20a60 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74  ** SrcList might
20a70 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
20a80 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74  the SrcList that
20a90 20 77 61 73 20 69 6e 70 75 74 20 6f 72 20 69 74   was input or it
20aa0 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e   might be.** a n
20ab0 65 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f  ew one.  If an O
20ac0 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  OM error does oc
20ad0 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 70  curs, then the p
20ae0 72 69 6f 72 20 76 61 6c 75 65 20 6f 66 20 70 4c  rior value of pL
20af0 69 73 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 69  ist.** that is i
20b00 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75  nput to this rou
20b10 74 69 6e 65 20 69 73 20 61 75 74 6f 6d 61 74 69  tine is automati
20b20 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a  cally freed..**.
20b30 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20  ** If pDatabase 
20b40 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20  is not null, it 
20b50 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74  means that the t
20b60 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69  able has an opti
20b70 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65  onal.** database
20b80 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c   name prefix.  L
20b90 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61  ike this:  "data
20ba0 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68  base.table".  Th
20bb0 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70  e pDatabase.** p
20bc0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62  oints to the tab
20bd0 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
20be0 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f  pTable points to
20bf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
20c00 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69  me..** The SrcLi
20c10 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65  st.a[].zName fie
20c20 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  ld is filled wit
20c30 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  h the table name
20c40 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20   which might.** 
20c50 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65  come from pTable
20c60 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69   (if pDatabase i
20c70 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20  s NULL) or from 
20c80 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20  pDatabase.  .** 
20c90 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74  SrcList.a[].zDat
20ca0 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20  abase is filled 
20cb0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
20cc0 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62  e name from pTab
20cd0 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e  le,.** or with N
20ce0 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61  ULL if no databa
20cf0 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e  se is specified.
20d00 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  .**.** In other 
20d10 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c  words, if call l
20d20 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
20d30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
20d40 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41  rcListAppend(D,A
20d50 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,0);.**.** The
20d60 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e  n B is a table n
20d70 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
20d80 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73  base name is uns
20d90 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61  pecified.  If ca
20da0 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69  lled.** like thi
20db0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
20dc0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
20dd0 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a  ppend(D,A,B,C);.
20de0 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20  **.** Then C is 
20df0 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  the table name a
20e00 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61  nd B is the data
20e10 62 61 73 65 20 6e 61 6d 65 2e 20 20 49 66 20 43  base name.  If C
20e20 20 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74   is defined.** t
20e30 68 65 6e 20 73 6f 20 69 73 20 42 2e 20 20 49 6e  hen so is B.  In
20e40 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 65   other words, we
20e50 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 63 61   never have a ca
20e60 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a 20  se where:.**.** 
20e70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
20e80 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41  rcListAppend(D,A
20e90 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74  ,0,C);.**.** Bot
20ea0 68 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61  h pTable and pDa
20eb0 74 61 62 61 73 65 20 61 72 65 20 61 73 73 75 6d  tabase are assum
20ec0 65 64 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e  ed to be quoted.
20ed0 20 20 54 68 65 79 20 61 72 65 20 64 65 71 75 6f    They are dequo
20ee0 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62 65  ted.** before be
20ef0 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68 65  ing added to the
20f00 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72 63   SrcList..*/.Src
20f10 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
20f20 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50 61  ListAppend(.  Pa
20f30 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
20f40 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
20f50 74 65 78 74 2c 20 69 6e 20 77 68 69 63 68 20 65  text, in which e
20f60 72 72 6f 72 73 20 61 72 65 20 72 65 70 6f 72 74  rrors are report
20f70 65 64 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ed */.  SrcList 
20f80 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 41  *pList,     /* A
20f90 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20 53 72  ppend to this Sr
20fa0 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61  cList. NULL crea
20fb0 74 65 73 20 61 20 6e 65 77 20 53 72 63 4c 69 73  tes a new SrcLis
20fc0 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  t */.  Token *pT
20fd0 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 61  able,      /* Ta
20fe0 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f  ble to append */
20ff0 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62  .  Token *pDatab
21000 61 73 65 20 20 20 20 2f 2a 20 44 61 74 61 62 61  ase    /* Databa
21010 73 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  se of the table 
21020 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  */.){.  struct S
21030 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
21040 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  em;.  sqlite3 *d
21050 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 61  b;.  assert( pDa
21060 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20 70 54 61  tabase==0 || pTa
21070 62 6c 65 21 3d 30 20 29 3b 20 20 2f 2a 20 43 61  ble!=0 );  /* Ca
21080 6e 6e 6f 74 20 68 61 76 65 20 43 20 77 69 74 68  nnot have C with
21090 6f 75 74 20 42 20 2a 2f 0a 20 20 61 73 73 65 72  out B */.  asser
210a0 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a  t( pParse!=0 );.
210b0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
210c0 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 64 62 20  ->db!=0 );.  db 
210d0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
210e0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
210f0 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
21100 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
21110 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a  (pParse->db, siz
21120 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a  eof(SrcList) );.
21130 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
21140 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
21150 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
21160 20 31 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   1;.    pList->n
21170 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d  Src = 1;.    mem
21180 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 30 5d  set(&pList->a[0]
21190 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73  , 0, sizeof(pLis
211a0 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 70  t->a[0]));.    p
211b0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  List->a[0].iCurs
211c0 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65  or = -1;.  }else
211d0 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  {.    SrcList *p
211e0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53 72 63  New = sqlite3Src
211f0 4c 69 73 74 45 6e 6c 61 72 67 65 28 70 50 61 72  ListEnlarge(pPar
21200 73 65 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c  se, pList, 1, pL
21210 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 20 20  ist->nSrc);.    
21220 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
21230 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
21240 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
21250 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ist);.      retu
21260 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rn 0;.    }else{
21270 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70  .      pList = p
21280 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  New;.    }.  }. 
21290 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
212a0 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31  >a[pList->nSrc-1
212b0 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62 61  ];.  if( pDataba
212c0 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65 2d  se && pDatabase-
212d0 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61  >z==0 ){.    pDa
212e0 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a  tabase = 0;.  }.
212f0 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
21300 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  ){.    pItem->zN
21310 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
21320 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
21330 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70  Database);.    p
21340 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  Item->zDatabase 
21350 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
21360 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c  mToken(db, pTabl
21370 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
21380 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
21390 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
213a0 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 29  oken(db, pTable)
213b0 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 44 61  ;.    pItem->zDa
213c0 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a  tabase = 0;.  }.
213d0 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
213e0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
213f0 56 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78  VdbeCursor index
21400 20 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20   numbers to all 
21410 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c  tables in a SrcL
21420 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ist.*/.void sqli
21430 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
21440 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70  Cursors(Parse *p
21450 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
21460 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
21470 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
21480 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
21490 20 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c   assert(pList ||
214a0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
214b0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
214c0 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
214d0 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
214e0 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74  List->a; i<pList
214f0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
21500 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  em++){.      if(
21510 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e   pItem->iCursor>
21520 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
21530 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72    pItem->iCursor
21540 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
21550 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  +;.      if( pIt
21560 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
21570 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
21580 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
21590 72 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  rs(pParse, pItem
215a0 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29  ->pSelect->pSrc)
215b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
215c0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
215d0 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72  ete an entire Sr
215e0 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20  cList including 
215f0 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63  all its substruc
21600 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
21610 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
21620 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
21630 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
21640 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
21650 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
21660 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c  *pItem;.  if( pL
21670 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
21680 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
21690 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
216a0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
216b0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
216c0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
216d0 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
216e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
216f0 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
21700 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
21710 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
21720 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
21730 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
21740 69 73 49 6e 64 65 78 65 64 42 79 20 29 20 73 71  isIndexedBy ) sq
21750 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
21760 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  pItem->u1.zIndex
21770 65 64 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70  edBy);.    if( p
21780 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
21790 6e 63 20 29 20 73 71 6c 69 74 65 33 45 78 70 72  nc ) sqlite3Expr
217a0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
217b0 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
217c0 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  g);.    sqlite3D
217d0 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
217e0 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20  Item->pTab);.   
217f0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
21800 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
21810 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71  pSelect);.    sq
21820 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
21830 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b  db, pItem->pOn);
21840 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69  .    sqlite3IdLi
21850 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  stDelete(db, pIt
21860 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d  em->pUsing);.  }
21870 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
21880 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  NN(db, pList);.}
21890 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
218a0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
218b0 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20  y the parser to 
218c0 61 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74  add a new term t
218d0 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  o the.** end of 
218e0 61 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63  a growing FROM c
218f0 6c 61 75 73 65 2e 20 20 54 68 65 20 22 70 22 20  lause.  The "p" 
21900 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
21910 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20   part of.** the 
21920 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74  FROM clause that
21930 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
21940 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20  n constructed.  
21950 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69  "p" is NULL.** i
21960 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
21970 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20  rst term of the 
21980 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54  FROM clause.  pT
21990 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61  able and pDataba
219a0 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61  se.** are the na
219b0 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
219c0 61 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d  and database nam
219d0 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ed in the FROM c
219e0 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70  lause term..** p
219f0 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c  Database is NULL
21a00 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
21a10 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20   name qualifier 
21a20 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65  is missing - the
21a30 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20  .** usual case. 
21a40 20 49 66 20 74 68 65 20 74 65 72 6d 20 68 61 73   If the term has
21a50 20 61 6e 20 61 6c 69 61 73 2c 20 74 68 65 6e 20   an alias, then 
21a60 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f  pAlias points to
21a70 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f   the.** alias to
21a80 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72  ken.  If the ter
21a90 6d 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2c  m is a subquery,
21aa0 20 74 68 65 6e 20 70 53 75 62 71 75 65 72 79 20   then pSubquery 
21ab0 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54  is the.** SELECT
21ac0 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
21ad0 74 68 65 20 73 75 62 71 75 65 72 79 20 65 6e 63  the subquery enc
21ae0 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c  odes.  The pTabl
21af0 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61  e and.** pDataba
21b00 73 65 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  se parameters ar
21b10 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75  e NULL for subqu
21b20 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20  eries.  The pOn 
21b30 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61  and pUsing.** pa
21b40 72 61 6d 65 74 65 72 73 20 61 72 65 20 74 68 65  rameters are the
21b50 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
21b60 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
21b70 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  uses..**.** Retu
21b80 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  rn a new SrcList
21b90 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69   which encodes i
21ba0 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20  s the FROM with 
21bb0 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20  the new.** term 
21bc0 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73  added..*/.SrcLis
21bd0 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
21be0 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28  tAppendFromTerm(
21bf0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
21c00 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
21c10 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
21c20 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20  .  SrcList *p,  
21c30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
21c40 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74  e left part of t
21c50 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61  he FROM clause a
21c60 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20  lready seen */. 
21c70 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20   Token *pTable, 
21c80 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
21c90 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
21ca0 20 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d   add to the FROM
21cb0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b   clause */.  Tok
21cc0 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20  en *pDatabase,  
21cd0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
21ce0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
21cf0 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a  taining pTable *
21d00 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61  /.  Token *pAlia
21d10 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  s,          /* T
21d20 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
21d30 64 65 20 6f 66 20 74 68 65 20 41 53 20 73 75 62  de of the AS sub
21d40 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
21d50 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72  Select *pSubquer
21d60 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  y,      /* A sub
21d70 71 75 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c  query used in pl
21d80 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e  ace of a table n
21d90 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ame */.  Expr *p
21da0 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  On,             
21db0 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75 73   /* The ON claus
21dc0 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20  e of a join */. 
21dd0 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 20   IdList *pUsing 
21de0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
21df0 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
21e00 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73  a join */.){.  s
21e10 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
21e20 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c  em *pItem;.  sql
21e30 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
21e40 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21 70 20  e->db;.  if( !p 
21e50 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69 6e  && (pOn || pUsin
21e60 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  g) ){.    sqlite
21e70 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
21e80 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65  , "a JOIN clause
21e90 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66   is required bef
21ea0 6f 72 65 20 25 73 22 2c 20 0a 20 20 20 20 20 20  ore %s", .      
21eb0 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22 55  (pOn ? "ON" : "U
21ec0 53 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20 20  SING").    );.  
21ed0 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72    goto append_fr
21ee0 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  om_error;.  }.  
21ef0 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  p = sqlite3SrcLi
21f00 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
21f10 20 70 2c 20 70 54 61 62 6c 65 2c 20 70 44 61 74   p, pTable, pDat
21f20 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d  abase);.  if( p=
21f30 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61  =0 ){.    goto a
21f40 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72  ppend_from_error
21f50 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
21f60 70 2d 3e 6e 53 72 63 3e 30 20 29 3b 0a 20 20 70  p->nSrc>0 );.  p
21f70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e  Item = &p->a[p->
21f80 6e 53 72 63 2d 31 5d 3b 0a 20 20 61 73 73 65 72  nSrc-1];.  asser
21f90 74 28 20 28 70 54 61 62 6c 65 3d 3d 30 29 3d 3d  t( (pTable==0)==
21fa0 28 70 44 61 74 61 62 61 73 65 3d 3d 30 29 20 29  (pDatabase==0) )
21fb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
21fc0 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 70  m->zName==0 || p
21fd0 44 61 74 61 62 61 73 65 21 3d 30 20 29 3b 0a 20  Database!=0 );. 
21fe0 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
21ff0 42 4a 45 43 54 20 26 26 20 70 49 74 65 6d 2d 3e  BJECT && pItem->
22000 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 54 6f 6b  zName ){.    Tok
22010 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20 28 41 4c  en *pToken = (AL
22020 57 41 59 53 28 70 44 61 74 61 62 61 73 65 29 20  WAYS(pDatabase) 
22030 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 29  && pDatabase->z)
22040 20 3f 20 70 44 61 74 61 62 61 73 65 20 3a 20 70   ? pDatabase : p
22050 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74  Table;.    sqlit
22060 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70  e3RenameTokenMap
22070 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
22080 7a 4e 61 6d 65 2c 20 70 54 6f 6b 65 6e 29 3b 0a  zName, pToken);.
22090 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 41    }.  assert( pA
220a0 6c 69 61 73 21 3d 30 20 29 3b 0a 20 20 69 66 28  lias!=0 );.  if(
220b0 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20   pAlias->n ){.  
220c0 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20    pItem->zAlias 
220d0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
220e0 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61  mToken(db, pAlia
220f0 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d  s);.  }.  pItem-
22100 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62 71  >pSelect = pSubq
22110 75 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70  uery;.  pItem->p
22120 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65  On = pOn;.  pIte
22130 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55 73 69  m->pUsing = pUsi
22140 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  ng;.  return p;.
22150 0a 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72  . append_from_er
22160 72 6f 72 3a 0a 20 20 61 73 73 65 72 74 28 20 70  ror:.  assert( p
22170 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ==0 );.  sqlite3
22180 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
22190 4f 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64  On);.  sqlite3Id
221a0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
221b0 55 73 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65  Using);.  sqlite
221c0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
221d0 2c 20 70 53 75 62 71 75 65 72 79 29 3b 0a 20 20  , pSubquery);.  
221e0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
221f0 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44 45 58 45  ** Add an INDEXE
22200 44 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45  D BY or NOT INDE
22210 58 45 44 20 63 6c 61 75 73 65 20 74 6f 20 74 68  XED clause to th
22220 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
22230 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e  added .** elemen
22240 74 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65 2d  t of the source-
22250 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  list passed as t
22260 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
22270 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
22280 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65  te3SrcListIndexe
22290 64 42 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  dBy(Parse *pPars
222a0 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 54  e, SrcList *p, T
222b0 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64 42 79  oken *pIndexedBy
222c0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  ){.  assert( pIn
222d0 64 65 78 65 64 42 79 21 3d 30 20 29 3b 0a 20 20  dexedBy!=0 );.  
222e0 69 66 28 20 70 20 26 26 20 70 49 6e 64 65 78 65  if( p && pIndexe
222f0 64 42 79 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20  dBy->n>0 ){.    
22300 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
22310 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
22320 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 72 63 3e  assert( p->nSrc>
22330 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d  0 );.    pItem =
22340 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31   &p->a[p->nSrc-1
22350 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
22360 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65  Item->fg.notInde
22370 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  xed==0 );.    as
22380 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e  sert( pItem->fg.
22390 69 73 49 6e 64 65 78 65 64 42 79 3d 3d 30 20 29  isIndexedBy==0 )
223a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
223b0 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  tem->fg.isTabFun
223c0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  c==0 );.    if( 
223d0 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31  pIndexedBy->n==1
223e0 20 26 26 20 21 70 49 6e 64 65 78 65 64 42 79 2d   && !pIndexedBy-
223f0 3e 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  >z ){.      /* A
22400 20 22 4e 4f 54 20 49 4e 44 45 58 45 44 22 20 63   "NOT INDEXED" c
22410 6c 61 75 73 65 20 77 61 73 20 73 75 70 70 6c 69  lause was suppli
22420 65 64 2e 20 53 65 65 20 70 61 72 73 65 2e 79 20  ed. See parse.y 
22430 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72  .      ** constr
22440 75 63 74 20 22 69 6e 64 65 78 65 64 5f 6f 70 74  uct "indexed_opt
22450 22 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a  " for details. *
22460 2f 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66  /.      pItem->f
22470 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 31  g.notIndexed = 1
22480 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
22490 20 20 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e     pItem->u1.zIn
224a0 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65  dexedBy = sqlite
224b0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
224c0 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65  Parse->db, pInde
224d0 78 65 64 42 79 29 3b 0a 20 20 20 20 20 20 70 49  xedBy);.      pI
224e0 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65  tem->fg.isIndexe
224f0 64 42 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  dBy = 1;.    }. 
22500 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
22510 74 68 65 20 6c 69 73 74 20 6f 66 20 66 75 6e 63  the list of func
22520 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74  tion arguments t
22530 6f 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 6e  o the SrcList en
22540 74 72 79 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62  try for a.** tab
22550 6c 65 2d 76 61 6c 75 65 64 2d 66 75 6e 63 74 69  le-valued-functi
22560 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
22570 74 65 33 53 72 63 4c 69 73 74 46 75 6e 63 41 72  te3SrcListFuncAr
22580 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  gs(Parse *pParse
22590 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 45 78  , SrcList *p, Ex
225a0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
225b0 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73    if( p ){.    s
225c0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
225d0 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e  em *pItem = &p->
225e0 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20  a[p->nSrc-1];.  
225f0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
22600 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d  >fg.notIndexed==
22610 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
22620 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64   pItem->fg.isInd
22630 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20  exedBy==0 );.   
22640 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
22650 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20  fg.isTabFunc==0 
22660 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 31  );.    pItem->u1
22670 2e 70 46 75 6e 63 41 72 67 20 3d 20 70 4c 69 73  .pFuncArg = pLis
22680 74 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 66 67  t;.    pItem->fg
22690 2e 69 73 54 61 62 46 75 6e 63 20 3d 20 31 3b 0a  .isTabFunc = 1;.
226a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
226b0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
226c0 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
226d0 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  List);.  }.}../*
226e0 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 6e  .** When buildin
226f0 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 75  g up a FROM clau
22700 73 65 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  se in the parser
22710 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  , the join opera
22720 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61  tor.** is initia
22730 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74 6f 20  lly attached to 
22740 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  the left operand
22750 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64 65 20  .  But the code 
22760 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70  generator.** exp
22770 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ects the join op
22780 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20  erator to be on 
22790 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
227a0 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
227b0 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 6a  .** Shifts all j
227c0 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 72  oin operators fr
227d0 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
227e0 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 46   for an entire F
227f0 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a  ROM.** clause..*
22800 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75  *.** Example: Su
22810 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 69  ppose the join i
22820 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
22830 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 20 6e  **           A n
22840 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69  atural cross joi
22850 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70  n B.**.** The op
22860 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74 75 72  erator is "natur
22870 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20  al cross join". 
22880 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f 70 65   The A and B ope
22890 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72 65 64  rands are stored
228a0 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61  .** in p->a[0] a
228b0 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70  nd p->a[1], resp
228c0 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20 70  ectively.  The p
228d0 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 20  arser initially 
228e0 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70  stores the.** op
228f0 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e 20 20  erator with A.  
22900 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 69  This routine shi
22910 66 74 73 20 74 68 61 74 20 6f 70 65 72 61 74 6f  fts that operato
22920 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a  r over to B..*/.
22930 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
22940 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65  istShiftJoinType
22950 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20  (SrcList *p){.  
22960 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  if( p ){.    int
22970 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d   i;.    for(i=p-
22980 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d  >nSrc-1; i>0; i-
22990 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69  -){.      p->a[i
229a0 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  ].fg.jointype = 
229b0 70 2d 3e 61 5b 69 2d 31 5d 2e 66 67 2e 6a 6f 69  p->a[i-1].fg.joi
229c0 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20  ntype;.    }.   
229d0 20 70 2d 3e 61 5b 30 5d 2e 66 67 2e 6a 6f 69 6e   p->a[0].fg.join
229e0 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  type = 0;.  }.}.
229f0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
22a00 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20 61 20  VDBE code for a 
22a10 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 2e  BEGIN statement.
22a20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22a30 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  BeginTransaction
22a40 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
22a50 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71 6c  int type){.  sql
22a60 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
22a70 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20   *v;.  int i;.. 
22a80 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21   assert( pParse!
22a90 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61  =0 );.  db = pPa
22aa0 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
22ab0 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
22ac0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
22ad0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
22ae0 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
22af0 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 7b  BEGIN", 0, 0) ){
22b00 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
22b10 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
22b20 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
22b30 20 69 66 28 20 21 76 20 29 20 72 65 74 75 72 6e   if( !v ) return
22b40 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b  ;.  if( type!=TK
22b50 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20  _DEFERRED ){.   
22b60 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
22b70 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
22b80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22b90 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63  p2(v, OP_Transac
22ba0 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d  tion, i, (type==
22bb0 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29  TK_EXCLUSIVE)+1)
22bc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
22bd0 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20  dbeUsesBtree(v, 
22be0 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  i);.    }.  }.  
22bf0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22c00 30 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  0(v, OP_AutoComm
22c10 69 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  it);.}../*.** Ge
22c20 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
22c30 20 66 6f 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72   for a COMMIT or
22c40 20 52 4f 4c 4c 42 41 43 4b 20 73 74 61 74 65 6d   ROLLBACK statem
22c50 65 6e 74 2e 0a 2a 2a 20 43 6f 64 65 20 66 6f 72  ent..** Code for
22c60 20 52 4f 4c 4c 42 41 43 4b 20 69 73 20 67 65 6e   ROLLBACK is gen
22c70 65 72 61 74 65 64 20 69 66 20 65 54 79 70 65 3d  erated if eType=
22c80 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 2e 20 20 4f  =TK_ROLLBACK.  O
22c90 74 68 65 72 77 69 73 65 0a 2a 2a 20 63 6f 64 65  therwise.** code
22ca0 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66 6f   is generated fo
22cb0 72 20 61 20 43 4f 4d 4d 49 54 2e 0a 2a 2f 0a 76  r a COMMIT..*/.v
22cc0 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54 72  oid sqlite3EndTr
22cd0 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
22ce0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65 54 79  *pParse, int eTy
22cf0 70 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  pe){.  Vdbe *v;.
22d00 20 20 69 6e 74 20 69 73 52 6f 6c 6c 62 61 63 6b    int isRollback
22d10 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
22d20 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rse!=0 );.  asse
22d30 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d  rt( pParse->db!=
22d40 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  0 );.  assert( e
22d50 54 79 70 65 3d 3d 54 4b 5f 43 4f 4d 4d 49 54 20  Type==TK_COMMIT 
22d60 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 45 4e 44  || eType==TK_END
22d70 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f   || eType==TK_RO
22d80 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 69 73 52 6f  LLBACK );.  isRo
22d90 6c 6c 62 61 63 6b 20 3d 20 65 54 79 70 65 3d 3d  llback = eType==
22da0 54 4b 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 69  TK_ROLLBACK;.  i
22db0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
22dc0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
22dd0 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
22de0 0a 20 20 20 20 20 20 20 69 73 52 6f 6c 6c 62 61  .       isRollba
22df0 63 6b 20 3f 20 22 52 4f 4c 4c 42 41 43 4b 22 20  ck ? "ROLLBACK" 
22e00 3a 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  : "COMMIT", 0, 0
22e10 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
22e20 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74  .  }.  v = sqlit
22e30 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
22e40 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
22e50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22e60 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  Op2(v, OP_AutoCo
22e70 6d 6d 69 74 2c 20 31 2c 20 69 73 52 6f 6c 6c 62  mmit, 1, isRollb
22e80 61 63 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ack);.  }.}../*.
22e90 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
22ea0 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
22eb0 65 20 70 61 72 73 65 72 20 77 68 65 6e 20 69 74  e parser when it
22ec0 20 70 61 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e   parses a comman
22ed0 64 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20  d to create,.** 
22ee0 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62  release or rollb
22ef0 61 63 6b 20 61 6e 20 53 51 4c 20 73 61 76 65 70  ack an SQL savep
22f00 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  oint. .*/.void s
22f10 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28  qlite3Savepoint(
22f20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
22f30 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e  nt op, Token *pN
22f40 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
22f50 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
22f60 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
22f70 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  e->db, pName);. 
22f80 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
22f90 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
22fa0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
22fb0 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
22fc0 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
22fd0 41 54 49 4f 4e 0a 20 20 20 20 73 74 61 74 69 63  ATION.    static
22fe0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f   const char * co
22ff0 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45  nst az[] = { "BE
23000 47 49 4e 22 2c 20 22 52 45 4c 45 41 53 45 22 2c  GIN", "RELEASE",
23010 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20   "ROLLBACK" };. 
23020 20 20 20 61 73 73 65 72 74 28 20 21 53 41 56 45     assert( !SAVE
23030 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26 20 53  POINT_BEGIN && S
23040 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
23050 3d 3d 31 20 26 26 20 53 41 56 45 50 4f 49 4e 54  ==1 && SAVEPOINT
23060 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a  _ROLLBACK==2 );.
23070 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 21  #endif.    if( !
23080 76 20 7c 7c 20 73 71 6c 69 74 65 33 41 75 74 68  v || sqlite3Auth
23090 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
230a0 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20  LITE_SAVEPOINT, 
230b0 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30  az[op], zName, 0
230c0 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
230d0 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
230e0 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  >db, zName);.   
230f0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
23100 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
23110 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76  AddOp4(v, OP_Sav
23120 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30  epoint, op, 0, 0
23130 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41  , zName, P4_DYNA
23140 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  MIC);.  }.}../*.
23150 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
23160 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 69   TEMP database i
23170 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c  s open and avail
23180 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52  able for use.  R
23190 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d  eturn.** the num
231a0 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
231b0 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20  Leave any error 
231c0 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65 20  messages in the 
231d0 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
231e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
231f0 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65  OpenTempDatabase
23200 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
23210 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
23220 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
23230 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  f( db->aDb[1].pB
23240 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d  t==0 && !pParse-
23250 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
23260 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72 65  int rc;.    Btre
23270 65 20 2a 70 42 74 3b 0a 20 20 20 20 73 74 61 74  e *pBt;.    stat
23280 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61  ic const int fla
23290 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  gs = .          
232a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
232b0 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20  WRITE |.        
232c0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
232d0 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20  EATE |.         
232e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
232f0 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20  LUSIVE |.       
23300 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44     SQLITE_OPEN_D
23310 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20  ELETEONCLOSE |. 
23320 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
23330 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20  OPEN_TEMP_DB;.. 
23340 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
23350 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66  treeOpen(db->pVf
23360 73 2c 20 30 2c 20 64 62 2c 20 26 70 42 74 2c 20  s, 0, db, &pBt, 
23370 30 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69  0, flags);.    i
23380 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
23390 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
233a0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
233b0 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  , "unable to ope
233c0 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61  n a temporary da
233d0 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 20  tabase ".       
233e0 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69   "file for stori
233f0 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ng temporary tab
23400 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61  les");.      pPa
23410 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  rse->rc = rc;.  
23420 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
23430 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b    }.    db->aDb[
23440 31 5d 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  1].pBt = pBt;.  
23450 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
23460 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a  b[1].pSchema );.
23470 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e      if( SQLITE_N
23480 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72  OMEM==sqlite3Btr
23490 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 42  eeSetPageSize(pB
234a0 74 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73  t, db->nextPages
234b0 69 7a 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a 20  ize, -1, 0) ){. 
234c0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46       sqlite3OomF
234d0 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20  ault(db);.      
234e0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
234f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
23500 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20  }../*.** Record 
23510 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68  the fact that th
23520 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
23530 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  will need to be 
23540 76 65 72 69 66 69 65 64 0a 2a 2a 20 66 6f 72 20  verified.** for 
23550 64 61 74 61 62 61 73 65 20 69 44 62 2e 20 20 54  database iDb.  T
23560 68 65 20 63 6f 64 65 20 74 6f 20 61 63 74 75 61  he code to actua
23570 6c 6c 79 20 76 65 72 69 66 79 20 74 68 65 20 73  lly verify the s
23580 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a 20  chema cookie.** 
23590 77 69 6c 6c 20 6f 63 63 75 72 20 61 74 20 74 68  will occur at th
235a0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74 6f 70  e end of the top
235b0 2d 6c 65 76 65 6c 20 56 44 42 45 20 61 6e 64 20  -level VDBE and 
235c0 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65  will be generate
235d0 64 0a 2a 2a 20 6c 61 74 65 72 2c 20 62 79 20 73  d.** later, by s
235e0 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69  qlite3FinishCodi
235f0 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ng()..*/.void sq
23600 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
23610 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61  chema(Parse *pPa
23620 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  rse, int iDb){. 
23630 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
23640 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
23650 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
23660 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  ;..  assert( iDb
23670 3e 3d 30 20 26 26 20 69 44 62 3c 70 50 61 72 73  >=0 && iDb<pPars
23680 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  e->db->nDb );.  
23690 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
236a0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
236b0 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b  !=0 || iDb==1 );
236c0 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 53  .  assert( iDb<S
236d0 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
236e0 45 44 2b 32 20 29 3b 0a 20 20 61 73 73 65 72 74  ED+2 );.  assert
236f0 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
23700 75 74 65 78 48 65 6c 64 28 70 50 61 72 73 65 2d  utexHeld(pParse-
23710 3e 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  >db, iDb, 0) );.
23720 20 20 69 66 28 20 44 62 4d 61 73 6b 54 65 73 74    if( DbMaskTest
23730 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b  (pToplevel->cook
23740 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
23750 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74  ){.    DbMaskSet
23760 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b  (pToplevel->cook
23770 69 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20  ieMask, iDb);.  
23780 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
23790 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a  DB && iDb==1 ){.
237a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
237b0 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 54  nTempDatabase(pT
237c0 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a  oplevel);.    }.
237d0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
237e0 61 72 67 75 6d 65 6e 74 20 7a 44 62 20 69 73 20  argument zDb is 
237f0 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20  NULL, then call 
23800 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
23810 79 53 63 68 65 6d 61 28 29 20 66 6f 72 20 65 61  ySchema() for ea
23820 63 68 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20  ch .** attached 
23830 64 61 74 61 62 61 73 65 2e 20 4f 74 68 65 72 77  database. Otherw
23840 69 73 65 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66  ise, invoke it f
23850 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
23860 6e 61 6d 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a  named zDb only..
23870 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
23880 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63  odeVerifyNamedSc
23890 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72  hema(Parse *pPar
238a0 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
238b0 7a 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  zDb){.  sqlite3 
238c0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
238d0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
238e0 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
238f0 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70   i++){.    Db *p
23900 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
23910 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
23920 42 74 20 26 26 20 28 21 7a 44 62 20 7c 7c 20 30  Bt && (!zDb || 0
23930 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
23940 28 7a 44 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e  (zDb, pDb->zDbSN
23950 61 6d 65 29 29 20 29 7b 0a 20 20 20 20 20 20 73  ame)) ){.      s
23960 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
23970 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
23980 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
23990 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
239a0 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70 72  DBE code that pr
239b0 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67  epares for doing
239c0 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68   an operation th
239d0 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e  at.** might chan
239e0 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ge the database.
239f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
23a00 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65 77  ine starts a new
23a10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
23a20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61  we are not alrea
23a30 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74  dy within.** a t
23a40 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
23a50 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 77  we are already w
23a60 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
23a70 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63  ion, then a chec
23a80 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74  kpoint.** is set
23a90 20 69 66 20 74 68 65 20 73 65 74 53 74 61 74 65   if the setState
23aa0 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69  ment parameter i
23ab0 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b  s true.  A check
23ac0 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  point should.** 
23ad0 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61  be set for opera
23ae0 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74  tions that might
23af0 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20   fail (due to a 
23b00 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74  constraint) part
23b10 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74   of.** the way t
23b20 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68  hrough and which
23b30 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e   will need to un
23b40 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77  do some writes w
23b50 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
23b60 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65  .** rollback the
23b70 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69   whole transacti
23b80 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69  on.  For operati
23b90 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f  ons where all co
23ba0 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e  nstraints.** can
23bb0 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f   be checked befo
23bc0 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61  re any changes a
23bd0 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64  re made to the d
23be0 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e  atabase, it is n
23bf0 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72  ever.** necessar
23c00 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74  y to undo a writ
23c10 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70  e and the checkp
23c20 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  oint should not 
23c30 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  be set..*/.void 
23c40 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
23c50 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65  eOperation(Parse
23c60 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65   *pParse, int se
23c70 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20  tStatement, int 
23c80 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  iDb){.  Parse *p
23c90 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
23ca0 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
23cb0 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
23cc0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
23cd0 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
23ce0 0a 20 20 44 62 4d 61 73 6b 53 65 74 28 70 54 6f  .  DbMaskSet(pTo
23cf0 70 6c 65 76 65 6c 2d 3e 77 72 69 74 65 4d 61 73  plevel->writeMas
23d00 6b 2c 20 69 44 62 29 3b 0a 20 20 70 54 6f 70 6c  k, iDb);.  pTopl
23d10 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69  evel->isMultiWri
23d20 74 65 20 7c 3d 20 73 65 74 53 74 61 74 65 6d 65  te |= setStateme
23d30 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64  nt;.}../*.** Ind
23d40 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 73  icate that the s
23d50 74 61 74 65 6d 65 6e 74 20 63 75 72 72 65 6e 74  tatement current
23d60 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
23d70 63 74 69 6f 6e 20 6d 69 67 68 74 20 77 72 69 74  ction might writ
23d80 65 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f  e.** more than o
23d90 6e 65 20 65 6e 74 72 79 20 28 65 78 61 6d 70 6c  ne entry (exampl
23da0 65 3a 20 64 65 6c 65 74 69 6e 67 20 6f 6e 65 20  e: deleting one 
23db0 72 6f 77 20 74 68 65 6e 20 69 6e 73 65 72 74 69  row then inserti
23dc0 6e 67 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69  ng another,.** i
23dd0 6e 73 65 72 74 69 6e 67 20 6d 75 6c 74 69 70 6c  nserting multipl
23de0 65 20 72 6f 77 73 20 69 6e 20 61 20 74 61 62 6c  e rows in a tabl
23df0 65 2c 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20  e, or inserting 
23e00 61 20 72 6f 77 20 61 6e 64 20 69 6e 64 65 78 20  a row and index 
23e10 65 6e 74 72 69 65 73 2e 29 0a 2a 2a 20 49 66 20  entries.).** If 
23e20 61 6e 20 61 62 6f 72 74 20 6f 63 63 75 72 73 20  an abort occurs 
23e30 61 66 74 65 72 20 73 6f 6d 65 20 6f 66 20 74 68  after some of th
23e40 65 73 65 20 77 72 69 74 65 73 20 68 61 76 65 20  ese writes have 
23e50 63 6f 6d 70 6c 65 74 65 64 2c 20 74 68 65 6e 20  completed, then 
23e60 69 74 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65  it will.** be ne
23e70 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20  cessary to undo 
23e80 74 68 65 20 63 6f 6d 70 6c 65 74 65 64 20 77 72  the completed wr
23e90 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ites..*/.void sq
23ea0 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28  lite3MultiWrite(
23eb0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
23ec0 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
23ed0 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
23ee0 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
23ef0 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  );.  pToplevel->
23f00 69 73 4d 75 6c 74 69 57 72 69 74 65 20 3d 20 31  isMultiWrite = 1
23f10 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20  ;.}../* .** The 
23f20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 63  code generator c
23f30 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
23f40 65 20 69 66 20 69 73 20 64 69 73 63 6f 76 65 72  e if is discover
23f50 73 20 74 68 61 74 20 69 74 20 69 73 0a 2a 2a 20  s that it is.** 
23f60 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 62 6f 72  possible to abor
23f70 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 70 72  t a statement pr
23f80 69 6f 72 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f  ior to completio
23f90 6e 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20  n.  In order to 
23fa0 0a 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68 69 73  .** perform this
23fb0 20 61 62 6f 72 74 20 77 69 74 68 6f 75 74 20 63   abort without c
23fc0 6f 72 72 75 70 74 69 6e 67 20 74 68 65 20 64 61  orrupting the da
23fd0 74 61 62 61 73 65 2c 20 77 65 20 6e 65 65 64 20  tabase, we need 
23fe0 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20  to make.** sure 
23ff0 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65  that the stateme
24000 6e 74 20 69 73 20 70 72 6f 74 65 63 74 65 64 20  nt is protected 
24010 62 79 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  by a statement t
24020 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
24030 2a 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77  * Technically, w
24040 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73  e only need to s
24050 65 74 20 74 68 65 20 6d 61 79 41 62 6f 72 74 20  et the mayAbort 
24060 66 6c 61 67 20 69 66 20 74 68 65 0a 2a 2a 20 69  flag if the.** i
24070 73 4d 75 6c 74 69 57 72 69 74 65 20 66 6c 61 67  sMultiWrite flag
24080 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
24090 73 65 74 2e 20 20 54 68 65 72 65 20 69 73 20 61  set.  There is a
240a0 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79   time dependency
240b0 0a 2a 2a 20 73 75 63 68 20 74 68 61 74 20 74 68  .** such that th
240c0 65 20 61 62 6f 72 74 20 6d 75 73 74 20 6f 63 63  e abort must occ
240d0 75 72 20 61 66 74 65 72 20 74 68 65 20 6d 75 6c  ur after the mul
240e0 74 69 77 72 69 74 65 2e 20 20 54 68 69 73 20 6d  tiwrite.  This m
240f0 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 61  akes.** some sta
24100 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6c 76 69 6e  tements involvin
24110 67 20 74 68 65 20 52 45 50 4c 41 43 45 20 63 6f  g the REPLACE co
24120 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
24130 6e 20 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 67  n algorithm.** g
24140 6f 20 61 20 6c 69 74 74 6c 65 20 66 61 73 74 65  o a little faste
24150 72 2e 20 20 42 75 74 20 74 61 6b 69 6e 67 20 61  r.  But taking a
24160 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 69 73  dvantage of this
24170 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79   time dependency
24180 0a 2a 2a 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72  .** makes it mor
24190 65 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 70  e difficult to p
241a0 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 63 6f  rove that the co
241b0 64 65 20 69 73 20 63 6f 72 72 65 63 74 20 28 69  de is correct (i
241c0 6e 20 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72  n .** particular
241d0 2c 20 69 74 20 70 72 65 76 65 6e 74 73 20 75 73  , it prevents us
241e0 20 66 72 6f 6d 20 77 72 69 74 69 6e 67 20 61 6e   from writing an
241f0 20 65 66 66 65 63 74 69 76 65 0a 2a 2a 20 69 6d   effective.** im
24200 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
24210 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79  sqlite3AssertMay
24220 41 62 6f 72 74 28 29 29 20 61 6e 64 20 73 6f 20  Abort()) and so 
24230 77 65 20 68 61 76 65 20 63 68 6f 73 65 6e 0a 2a  we have chosen.*
24240 2a 20 74 6f 20 74 61 6b 65 20 74 68 65 20 73 61  * to take the sa
24250 66 65 20 72 6f 75 74 65 20 61 6e 64 20 73 6b 69  fe route and ski
24260 70 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  p the optimizati
24270 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
24280 74 65 33 4d 61 79 41 62 6f 72 74 28 50 61 72 73  te3MayAbort(Pars
24290 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61  e *pParse){.  Pa
242a0 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
242b0 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
242c0 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
242d0 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41   pToplevel->mayA
242e0 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  bort = 1;.}../*.
242f0 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61  ** Code an OP_Ha
24300 6c 74 20 74 68 61 74 20 63 61 75 73 65 73 20 74  lt that causes t
24310 68 65 20 76 64 62 65 20 74 6f 20 72 65 74 75 72  he vdbe to retur
24320 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  n an SQLITE_CONS
24330 54 52 41 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e  TRAINT.** error.
24340 20 54 68 65 20 6f 6e 45 72 72 6f 72 20 70 61 72   The onError par
24350 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65  ameter determine
24360 73 20 77 68 69 63 68 20 28 69 66 20 61 6e 79 29  s which (if any)
24370 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
24380 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72  t.** and/or curr
24390 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
243a0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
243b0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 48  */.void sqlite3H
243c0 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20  altConstraint(. 
243d0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
243e0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
243f0 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65  ntext */.  int e
24400 72 72 43 6f 64 65 2c 20 20 20 20 20 20 2f 2a 20  rrCode,      /* 
24410 65 78 74 65 6e 64 65 64 20 65 72 72 6f 72 20 63  extended error c
24420 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  ode */.  int onE
24430 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f  rror,      /* Co
24440 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f  nstraint type */
24450 0a 20 20 63 68 61 72 20 2a 70 34 2c 20 20 20 20  .  char *p4,    
24460 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65       /* Error me
24470 73 73 61 67 65 20 2a 2f 0a 20 20 69 38 20 70 34  ssage */.  i8 p4
24480 74 79 70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  type,        /* 
24490 50 34 5f 53 54 41 54 49 43 20 6f 72 20 50 34 5f  P4_STATIC or P4_
244a0 54 52 41 4e 53 49 45 4e 54 20 2a 2f 0a 20 20 75  TRANSIENT */.  u
244b0 38 20 70 35 45 72 72 6d 73 67 20 20 20 20 20 20  8 p5Errmsg      
244c0 20 2f 2a 20 50 35 5f 45 72 72 4d 73 67 20 74 79   /* P5_ErrMsg ty
244d0 70 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  pe */.){.  Vdbe 
244e0 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
244f0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
24500 73 73 65 72 74 28 20 28 65 72 72 43 6f 64 65 26  ssert( (errCode&
24510 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f  0xff)==SQLITE_CO
24520 4e 53 54 52 41 49 4e 54 20 29 3b 0a 20 20 69 66  NSTRAINT );.  if
24530 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62  ( onError==OE_Ab
24540 6f 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ort ){.    sqlit
24550 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  e3MayAbort(pPars
24560 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
24570 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
24580 50 5f 48 61 6c 74 2c 20 65 72 72 43 6f 64 65 2c  P_Halt, errCode,
24590 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c   onError, 0, p4,
245a0 20 70 34 74 79 70 65 29 3b 0a 20 20 73 71 6c 69   p4type);.  sqli
245b0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
245c0 76 2c 20 70 35 45 72 72 6d 73 67 29 3b 0a 7d 0a  v, p5Errmsg);.}.
245d0 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
245e0 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 55 4e  P_Halt due to UN
245f0 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20  IQUE or PRIMARY 
24600 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  KEY constraint v
24610 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  iolation..*/.voi
24620 64 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65 43  d sqlite3UniqueC
24630 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72  onstraint(.  Par
24640 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
24650 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
24660 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  t */.  int onErr
24670 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73  or,      /* Cons
24680 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20  traint type */. 
24690 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
246a0 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
246b0 74 68 61 74 20 74 72 69 67 67 65 72 73 20 74 68  that triggers th
246c0 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  e constraint */.
246d0 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b  ){.  char *zErr;
246e0 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 53 74 72 41  .  int j;.  StrA
246f0 63 63 75 6d 20 65 72 72 4d 73 67 3b 0a 20 20 54  ccum errMsg;.  T
24700 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 64  able *pTab = pId
24710 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 73 71  x->pTable;..  sq
24720 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69  lite3StrAccumIni
24730 74 28 26 65 72 72 4d 73 67 2c 20 70 50 61 72 73  t(&errMsg, pPars
24740 65 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 32 30 30  e->db, 0, 0, 200
24750 29 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 61  );.  if( pIdx->a
24760 43 6f 6c 45 78 70 72 20 29 7b 0a 20 20 20 20 73  ColExpr ){.    s
24770 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
24780 64 66 28 26 65 72 72 4d 73 67 2c 20 22 69 6e 64  df(&errMsg, "ind
24790 65 78 20 27 25 71 27 22 2c 20 70 49 64 78 2d 3e  ex '%q'", pIdx->
247a0 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  zName);.  }else{
247b0 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
247c0 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  pIdx->nKeyCol; j
247d0 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ++){.      char 
247e0 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 61 73 73  *zCol;.      ass
247f0 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c  ert( pIdx->aiCol
24800 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20 20  umn[j]>=0 );.   
24810 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     zCol = pTab->
24820 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c  aCol[pIdx->aiCol
24830 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20  umn[j]].zName;. 
24840 20 20 20 20 20 69 66 28 20 6a 20 29 20 73 71 6c       if( j ) sql
24850 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28  ite3_str_append(
24860 26 65 72 72 4d 73 67 2c 20 22 2c 20 22 2c 20 32  &errMsg, ", ", 2
24870 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24880 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26  _str_appendall(&
24890 65 72 72 4d 73 67 2c 20 70 54 61 62 2d 3e 7a 4e  errMsg, pTab->zN
248a0 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
248b0 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 26  te3_str_append(&
248c0 65 72 72 4d 73 67 2c 20 22 2e 22 2c 20 31 29 3b  errMsg, ".", 1);
248d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
248e0 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26 65 72  tr_appendall(&er
248f0 72 4d 73 67 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20  rMsg, zCol);.   
24900 20 7d 0a 20 20 7d 0a 20 20 7a 45 72 72 20 3d 20   }.  }.  zErr = 
24910 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46  sqlite3StrAccumF
24920 69 6e 69 73 68 28 26 65 72 72 4d 73 67 29 3b 0a  inish(&errMsg);.
24930 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e    sqlite3HaltCon
24940 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20  straint(pParse, 
24950 0a 20 20 20 20 49 73 50 72 69 6d 61 72 79 4b 65  .    IsPrimaryKe
24960 79 49 6e 64 65 78 28 70 49 64 78 29 20 3f 20 53  yIndex(pIdx) ? S
24970 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
24980 5f 50 52 49 4d 41 52 59 4b 45 59 20 0a 20 20 20  _PRIMARYKEY .   
24990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249a0 20 20 20 20 20 20 20 20 20 3a 20 53 51 4c 49 54           : SQLIT
249b0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49  E_CONSTRAINT_UNI
249c0 51 55 45 2c 0a 20 20 20 20 6f 6e 45 72 72 6f 72  QUE,.    onError
249d0 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41 4d  , zErr, P4_DYNAM
249e0 49 43 2c 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e  IC, P5_Constrain
249f0 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 0a 2f 2a  tUnique);.}.../*
24a00 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48  .** Code an OP_H
24a10 61 6c 74 20 64 75 65 20 74 6f 20 6e 6f 6e 2d 75  alt due to non-u
24a20 6e 69 71 75 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a  nique rowid..*/.
24a30 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 77 69  void sqlite3Rowi
24a40 64 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50  dConstraint(.  P
24a50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
24a60 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
24a70 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  ext */.  int onE
24a80 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f  rror,      /* Co
24a90 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
24aa0 6e 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20  n algorithm */. 
24ab0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 20 20 20   Table *pTab    
24ac0 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
24ad0 77 69 74 68 20 74 68 65 20 6e 6f 6e 2d 75 6e 69  with the non-uni
24ae0 71 75 65 20 72 6f 77 69 64 20 2a 2f 20 0a 29 7b  que rowid */ .){
24af0 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20  .  char *zMsg;. 
24b00 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
24b10 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b  Tab->iPKey>=0 ){
24b20 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69  .    zMsg = sqli
24b30 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73  te3MPrintf(pPars
24b40 65 2d 3e 64 62 2c 20 22 25 73 2e 25 73 22 2c 20  e->db, "%s.%s", 
24b50 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
24b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b70 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f         pTab->aCo
24b80 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a  l[pTab->iPKey].z
24b90 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  Name);.    rc = 
24ba0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
24bb0 54 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20  T_PRIMARYKEY;.  
24bc0 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4d 73 67 20  }else{.    zMsg 
24bd0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
24be0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 73  (pParse->db, "%s
24bf0 2e 72 6f 77 69 64 22 2c 20 70 54 61 62 2d 3e 7a  .rowid", pTab->z
24c00 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  Name);.    rc = 
24c10 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
24c20 54 5f 52 4f 57 49 44 3b 0a 20 20 7d 0a 20 20 73  T_ROWID;.  }.  s
24c30 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72  qlite3HaltConstr
24c40 61 69 6e 74 28 70 50 61 72 73 65 2c 20 72 63 2c  aint(pParse, rc,
24c50 20 6f 6e 45 72 72 6f 72 2c 20 7a 4d 73 67 2c 20   onError, zMsg, 
24c60 50 34 5f 44 59 4e 41 4d 49 43 2c 0a 20 20 20 20  P4_DYNAMIC,.    
24c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c80 20 20 20 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e      P5_Constrain
24c90 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a  tUnique);.}../*.
24ca0 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
24cb0 69 66 20 70 49 6e 64 65 78 20 75 73 65 73 20 74  if pIndex uses t
24cc0 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
24cd0 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65  uence pColl.  Re
24ce0 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
24cf0 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73  it does and fals
24d00 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  e if it does not
24d10 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
24d20 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
24d30 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c  .static int coll
24d40 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74  ationMatch(const
24d50 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e   char *zColl, In
24d60 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20  dex *pIndex){.  
24d70 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
24d80 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 66   zColl!=0 );.  f
24d90 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78  or(i=0; i<pIndex
24da0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
24db0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
24dc0 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43  *z = pIndex->azC
24dd0 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65  oll[i];.    asse
24de0 72 74 28 20 7a 21 3d 30 20 7c 7c 20 70 49 6e 64  rt( z!=0 || pInd
24df0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3c  ex->aiColumn[i]<
24e00 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  0 );.    if( pIn
24e10 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
24e20 3e 3d 30 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  >=0 && 0==sqlite
24e30 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c  3StrICmp(z, zCol
24e40 6c 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  l) ){.      retu
24e50 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
24e60 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
24e70 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  ndif../*.** Reco
24e80 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  mpute all indice
24e90 73 20 6f 66 20 70 54 61 62 20 74 68 61 74 20 75  s of pTab that u
24ea0 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  se the collating
24eb0 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
24ec0 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20  .** If pColl==0 
24ed0 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 20 61  then recompute a
24ee0 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54  ll indices of pT
24ef0 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ab..*/.#ifndef S
24f00 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
24f10 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  EX.static void r
24f20 65 69 6e 64 65 78 54 61 62 6c 65 28 50 61 72 73  eindexTable(Pars
24f30 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
24f40 20 2a 70 54 61 62 2c 20 63 68 61 72 20 63 6f 6e   *pTab, char con
24f50 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 69 66  st *zColl){.  if
24f60 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61  ( !IsVirtual(pTa
24f70 62 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  b) ){.    Index 
24f80 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20  *pIndex;        
24f90 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
24fa0 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
24fb0 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 20 20 66  h pTab */..    f
24fc0 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e  or(pIndex=pTab->
24fd0 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20  pIndex; pIndex; 
24fe0 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70  pIndex=pIndex->p
24ff0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
25000 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c   zColl==0 || col
25010 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c  lationMatch(zCol
25020 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20  l, pIndex) ){.  
25030 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20        int iDb = 
25040 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
25050 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
25060 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
25070 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
25080 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
25090 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
250a0 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Db);.        sql
250b0 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
250c0 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20  pParse, pIndex, 
250d0 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -1);.      }.   
250e0 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
250f0 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65  ./*.** Recompute
25100 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
25110 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c  all tables in al
25120 6c 20 64 61 74 61 62 61 73 65 73 20 77 68 65 72  l databases wher
25130 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73  e the.** indices
25140 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69   use the collati
25150 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ng sequence pCol
25160 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20  l.  If pColl==0 
25170 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a  then recompute.*
25180 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76  * all indices ev
25190 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66  erywhere..*/.#if
251a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
251b0 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20  _REINDEX.static 
251c0 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74 61  void reindexData
251d0 62 61 73 65 73 28 50 61 72 73 65 20 2a 70 50 61  bases(Parse *pPa
251e0 72 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74 20  rse, char const 
251f0 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70  *zColl){.  Db *p
25200 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
25210 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
25220 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  le database */. 
25230 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
25240 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25250 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64  The database ind
25260 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73  ex number */.  s
25270 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
25280 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68  rse->db;   /* Th
25290 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
252a0 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45  ction */.  HashE
252b0 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20  lem *k;         
252c0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
252d0 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65  oping over table
252e0 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61  s in pDb */.  Ta
252f0 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
25300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74            /* A t
25310 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61  able in the data
25320 62 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  base */..  asser
25330 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
25340 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64  oldsAllMutexes(d
25350 62 29 20 29 3b 20 20 2f 2a 20 4e 65 65 64 65 64  b) );  /* Needed
25360 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65   for schema acce
25370 73 73 20 2a 2f 0a 20 20 66 6f 72 28 69 44 62 3d  ss */.  for(iDb=
25380 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20  0, pDb=db->aDb; 
25390 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62  iDb<db->nDb; iDb
253a0 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20  ++, pDb++){.    
253b0 61 73 73 65 72 74 28 20 70 44 62 21 3d 30 20 29  assert( pDb!=0 )
253c0 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69  ;.    for(k=sqli
253d0 74 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62  teHashFirst(&pDb
253e0 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ->pSchema->tblHa
253f0 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74  sh);  k; k=sqlit
25400 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20  eHashNext(k)){. 
25410 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62       pTab = (Tab
25420 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  le*)sqliteHashDa
25430 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72 65 69  ta(k);.      rei
25440 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65  ndexTable(pParse
25450 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  , pTab, zColl);.
25460 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
25470 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  if../*.** Genera
25480 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
25490 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e  REINDEX command.
254a0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  .**.**        RE
254b0 49 4e 44 45 58 20 20 20 20 20 20 20 20 20 20 20  INDEX           
254c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254d0 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20   -- 1.**        
254e0 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74  REINDEX  <collat
254f0 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20 20 20  ion>            
25500 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20     -- 2.**      
25510 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74    REINDEX  ?<dat
25520 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61  abase>.?<tablena
25530 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20  me>  -- 3.**    
25540 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64      REINDEX  ?<d
25550 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78  atabase>.?<index
25560 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a  name>  -- 4.**.*
25570 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20  * Form 1 causes 
25580 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61  all indices in a
25590 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
255a0 62 61 73 65 73 20 74 6f 20 62 65 20 72 65 62 75  bases to be rebu
255b0 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72  ilt..** Form 2 r
255c0 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69  ebuilds all indi
255d0 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62  ces in all datab
255e0 61 73 65 73 20 74 68 61 74 20 75 73 65 20 74 68  ases that use th
255f0 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61  e named.** colla
25600 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20  ting function.  
25610 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20 72 65  Forms 3 and 4 re
25620 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65 64 20  build the named 
25630 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20  index or all.** 
25640 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
25650 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  ed with the name
25660 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e  d table..*/.#ifn
25670 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
25680 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c  REINDEX.void sql
25690 69 74 65 33 52 65 69 6e 64 65 78 28 50 61 72 73  ite3Reindex(Pars
256a0 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
256b0 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20   *pName1, Token 
256c0 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c  *pName2){.  Coll
256d0 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20  Seq *pColl;     
256e0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
256f0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f  ting sequence to
25700 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f   be reindexed, o
25710 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72  r NULL */.  char
25720 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   *z;            
25730 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
25740 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  of a table or in
25750 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dex */.  const c
25760 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20  har *zDb;       
25770 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
25780 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
25790 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
257a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
257b0 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   A table in the 
257c0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e  database */.  In
257d0 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
257e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
257f0 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
25800 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20   with pTab */.  
25810 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
25820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
25830 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  he database inde
25840 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71  x number */.  sq
25850 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
25860 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65  se->db;   /* The
25870 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
25880 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  tion */.  Token 
25890 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20  *pObjName;      
258a0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
258b0 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e   the table or in
258c0 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65  dex to be reinde
258d0 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61  xed */..  /* Rea
258e0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
258f0 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72  chema. If an err
25900 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65  or occurs, leave
25910 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
25920 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20  e.  ** and code 
25930 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
25940 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  turn NULL. */.  
25950 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
25960 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
25970 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
25980 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69  return;.  }..  i
25990 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a  f( pName1==0 ){.
259a0 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62      reindexDatab
259b0 61 73 65 73 28 70 50 61 72 73 65 2c 20 30 29 3b  ases(pParse, 0);
259c0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
259d0 65 6c 73 65 20 69 66 28 20 4e 45 56 45 52 28 70  else if( NEVER(p
259e0 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c 20 70 4e 61  Name2==0) || pNa
259f0 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  me2->z==0 ){.   
25a00 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20   char *zColl;.  
25a10 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31    assert( pName1
25a20 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c  ->z );.    zColl
25a30 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
25a40 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
25a50 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20  db, pName1);.   
25a60 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65   if( !zColl ) re
25a70 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  turn;.    pColl 
25a80 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
25a90 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29  lSeq(db, ENC(db)
25aa0 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20  , zColl, 0);.   
25ab0 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
25ac0 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62      reindexDatab
25ad0 61 73 65 73 28 70 50 61 72 73 65 2c 20 7a 43 6f  ases(pParse, zCo
25ae0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
25af0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f  e3DbFree(db, zCo
25b00 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ll);.      retur
25b10 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  n;.    }.    sql
25b20 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
25b30 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44 62  Coll);.  }.  iDb
25b40 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72   = sqlite3TwoPar
25b50 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
25b60 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
25b70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ObjName);.  if( 
25b80 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  iDb<0 ) return;.
25b90 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d    z = sqlite3Nam
25ba0 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
25bb0 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ObjName);.  if( 
25bc0 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  z==0 ) return;. 
25bd0 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69   zDb = db->aDb[i
25be0 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20  Db].zDbSName;.  
25bf0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69  pTab = sqlite3Fi
25c00 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a  ndTable(db, z, z
25c10 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20  Db);.  if( pTab 
25c20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61  ){.    reindexTa
25c30 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
25c40 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
25c50 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a  3DbFree(db, z);.
25c60 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
25c70 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
25c80 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
25c90 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74  z, zDb);.  sqlit
25ca0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
25cb0 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b  .  if( pIndex ){
25cc0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
25cd0 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
25ce0 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
25cf0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69  .    sqlite3Refi
25d00 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
25d10 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20  pIndex, -1);.   
25d20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
25d30 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
25d40 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74  Parse, "unable t
25d50 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65 20 6f  o identify the o
25d60 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69 6e  bject to be rein
25d70 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69  dexed");.}.#endi
25d80 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
25d90 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
25da0 75 72 65 20 74 68 61 74 20 69 73 20 61 70 70 72  ure that is appr
25db0 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20  opriate for the 
25dc0 67 69 76 65 6e 20 49 6e 64 65 78 2e 0a 2a 2a 0a  given Index..**.
25dd0 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68  ** The caller sh
25de0 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69  ould invoke sqli
25df0 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
25e00 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65  ) on the returne
25e10 64 20 6f 62 6a 65 63 74 0a 2a 2a 20 77 68 65 6e  d object.** when
25e20 20 69 74 20 68 61 73 20 66 69 6e 69 73 68 65 64   it has finished
25e30 20 75 73 69 6e 67 20 69 74 2e 0a 2a 2f 0a 4b 65   using it..*/.Ke
25e40 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65  yInfo *sqlite3Ke
25e50 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 50 61 72  yInfoOfIndex(Par
25e60 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65  se *pParse, Inde
25e70 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74 20  x *pIdx){.  int 
25e80 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20  i;.  int nCol = 
25e90 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  pIdx->nColumn;. 
25ea0 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 49 64 78   int nKey = pIdx
25eb0 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 4b 65 79  ->nKeyCol;.  Key
25ec0 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a 20 20 69 66  Info *pKey;.  if
25ed0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
25ee0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
25ef0 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75   pIdx->uniqNotNu
25f00 6c 6c 20 29 7b 0a 20 20 20 20 70 4b 65 79 20 3d  ll ){.    pKey =
25f10 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
25f20 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
25f30 20 6e 4b 65 79 2c 20 6e 43 6f 6c 2d 6e 4b 65 79   nKey, nCol-nKey
25f40 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
25f50 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65  pKey = sqlite3Ke
25f60 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73  yInfoAlloc(pPars
25f70 65 2d 3e 64 62 2c 20 6e 43 6f 6c 2c 20 30 29 3b  e->db, nCol, 0);
25f80 0a 20 20 7d 0a 20 20 69 66 28 20 70 4b 65 79 20  .  }.  if( pKey 
25f90 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
25fa0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
25fb0 72 69 74 65 61 62 6c 65 28 70 4b 65 79 29 20 29  riteable(pKey) )
25fc0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
25fd0 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
25fe0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
25ff0 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Coll = pIdx->azC
26000 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 70 4b  oll[i];.      pK
26010 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 7a  ey->aColl[i] = z
26020 43 6f 6c 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72  Coll==sqlite3Str
26030 42 49 4e 41 52 59 20 3f 20 30 20 3a 0a 20 20 20  BINARY ? 0 :.   
26040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26050 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61       sqlite3Loca
26060 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
26070 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , zColl);.      
26080 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pKey->aSortOrder
26090 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72  [i] = pIdx->aSor
260a0 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d  tOrder[i];.    }
260b0 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
260c0 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20 61  >nErr ){.      a
260d0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 72  ssert( pParse->r
260e0 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5f  c==SQLITE_ERROR_
260f0 4d 49 53 53 49 4e 47 5f 43 4f 4c 4c 53 45 51 20  MISSING_COLLSEQ 
26100 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  );.      if( pId
26110 78 2d 3e 62 4e 6f 51 75 65 72 79 3d 3d 30 20 29  x->bNoQuery==0 )
26120 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 65 61  {.        /* Dea
26130 63 74 69 76 61 74 65 20 74 68 65 20 69 6e 64 65  ctivate the inde
26140 78 20 62 65 63 61 75 73 65 20 69 74 20 63 6f 6e  x because it con
26150 74 61 69 6e 73 20 61 6e 20 75 6e 6b 6e 6f 77 6e  tains an unknown
26160 20 63 6f 6c 6c 61 74 69 6e 67 0a 20 20 20 20 20   collating.     
26170 20 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20     ** sequence. 
26180 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f   The only way to
26190 20 72 65 61 63 74 69 76 65 20 74 68 65 20 69 6e   reactive the in
261a0 64 65 78 20 69 73 20 74 6f 20 72 65 6c 6f 61 64  dex is to reload
261b0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
261c0 73 63 68 65 6d 61 2e 20 20 41 64 64 69 6e 67 20  schema.  Adding 
261d0 74 68 65 20 6d 69 73 73 69 6e 67 20 63 6f 6c 6c  the missing coll
261e0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6c  ating sequence l
261f0 61 74 65 72 20 64 6f 65 73 20 6e 6f 74 0a 20 20  ater does not.  
26200 20 20 20 20 20 20 2a 2a 20 72 65 61 63 74 69 76        ** reactiv
26210 65 20 74 68 65 20 69 6e 64 65 78 2e 20 20 54 68  e the index.  Th
26220 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 68 61  e application ha
26230 64 20 74 68 65 20 63 68 61 6e 63 65 20 74 6f 20  d the chance to 
26240 72 65 67 69 73 74 65 72 0a 20 20 20 20 20 20 20  register.       
26250 20 2a 2a 20 74 68 65 20 6d 69 73 73 69 6e 67 20   ** the missing 
26260 69 6e 64 65 78 20 75 73 69 6e 67 20 74 68 65 20  index using the 
26270 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 65 65 64 65 64  collation-needed
26280 20 63 61 6c 6c 62 61 63 6b 2e 20 20 46 6f 72 0a   callback.  For.
26290 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6d 70 6c          ** simpl
262a0 69 63 69 74 79 2c 20 53 51 4c 69 74 65 20 77 69  icity, SQLite wi
262b0 6c 6c 20 6e 6f 74 20 67 69 76 65 20 74 68 65 20  ll not give the 
262c0 61 70 70 6c 69 63 61 74 69 6f 6e 20 61 20 73 65  application a se
262d0 63 6f 6e 64 20 63 68 61 6e 63 65 2e 0a 20 20 20  cond chance..   
262e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
262f0 70 49 64 78 2d 3e 62 4e 6f 51 75 65 72 79 20 3d  pIdx->bNoQuery =
26300 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72   1;.        pPar
26310 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
26320 45 52 52 4f 52 5f 52 45 54 52 59 3b 0a 20 20 20  ERROR_RETRY;.   
26330 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
26340 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
26350 4b 65 79 29 3b 0a 20 20 20 20 20 20 70 4b 65 79  Key);.      pKey
26360 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
26370 20 20 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d    return pKey;.}
26380 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
26390 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 20 0a 2a 2a  _OMIT_CTE./* .**
263a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
263b0 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 70 65   invoked once pe
263c0 72 20 43 54 45 20 62 79 20 74 68 65 20 70 61 72  r CTE by the par
263d0 73 65 72 20 77 68 69 6c 65 20 70 61 72 73 69 6e  ser while parsin
263e0 67 20 61 20 0a 2a 2a 20 57 49 54 48 20 63 6c 61  g a .** WITH cla
263f0 75 73 65 2e 20 0a 2a 2f 0a 57 69 74 68 20 2a 73  use. .*/.With *s
26400 71 6c 69 74 65 33 57 69 74 68 41 64 64 28 0a 20  qlite3WithAdd(. 
26410 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
26420 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
26430 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
26440 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20   With *pWith,   
26450 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 69 73           /* Exis
26460 74 69 6e 67 20 57 49 54 48 20 63 6c 61 75 73 65  ting WITH clause
26470 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  , or NULL */.  T
26480 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20  oken *pName,    
26490 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
264a0 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 2d 74 61 62  f the common-tab
264b0 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
264c0 20 2a 70 41 72 67 6c 69 73 74 2c 20 20 20 20 20   *pArglist,     
264d0 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 63 6f 6c 75  /* Optional colu
264e0 6d 6e 20 6e 61 6d 65 20 6c 69 73 74 20 66 6f 72  mn name list for
264f0 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
26500 53 65 6c 65 63 74 20 2a 70 51 75 65 72 79 20 20  Select *pQuery  
26510 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79          /* Query
26520 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c   used to initial
26530 69 7a 65 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  ize the table */
26540 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
26550 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
26560 20 20 57 69 74 68 20 2a 70 4e 65 77 3b 0a 20 20    With *pNew;.  
26570 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20  char *zName;..  
26580 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
26590 65 20 43 54 45 20 6e 61 6d 65 20 69 73 20 75 6e  e CTE name is un
265a0 69 71 75 65 20 77 69 74 68 69 6e 20 74 68 69 73  ique within this
265b0 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20 49 66   WITH clause. If
265c0 0a 20 20 2a 2a 20 6e 6f 74 2c 20 73 74 6f 72 65  .  ** not, store
265d0 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65   an error in the
265e0 20 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65   Parse structure
265f0 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73  . */.  zName = s
26600 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
26610 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
26620 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  pName);.  if( zN
26630 61 6d 65 20 26 26 20 70 57 69 74 68 20 29 7b 0a  ame && pWith ){.
26640 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
26650 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d  or(i=0; i<pWith-
26660 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCte; i++){.   
26670 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
26680 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 57 69  rICmp(zName, pWi
26690 74 68 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  th->a[i].zName)=
266a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
266b0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
266c0 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65  arse, "duplicate
266d0 20 57 49 54 48 20 74 61 62 6c 65 20 6e 61 6d 65   WITH table name
266e0 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  : %s", zName);. 
266f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
26700 0a 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b  ..  if( pWith ){
26710 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
26720 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 20   sizeof(*pWith) 
26730 2b 20 28 73 69 7a 65 6f 66 28 70 57 69 74 68 2d  + (sizeof(pWith-
26740 3e 61 5b 31 5d 29 20 2a 20 70 57 69 74 68 2d 3e  >a[1]) * pWith->
26750 6e 43 74 65 29 3b 0a 20 20 20 20 70 4e 65 77 20  nCte);.    pNew 
26760 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
26770 6f 63 28 64 62 2c 20 70 57 69 74 68 2c 20 6e 42  oc(db, pWith, nB
26780 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  yte);.  }else{. 
26790 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
267a0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
267b0 2c 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29  , sizeof(*pWith)
267c0 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
267d0 20 28 70 4e 65 77 21 3d 30 20 26 26 20 7a 4e 61   (pNew!=0 && zNa
267e0 6d 65 21 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61  me!=0) || db->ma
267f0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
26800 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
26810 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ailed ){.    sql
26820 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
26830 74 65 28 64 62 2c 20 70 41 72 67 6c 69 73 74 29  te(db, pArglist)
26840 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
26850 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 51  ectDelete(db, pQ
26860 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  uery);.    sqlit
26870 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
26880 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  me);.    pNew = 
26890 70 57 69 74 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pWith;.  }else{.
268a0 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
268b0 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c 65 63 74 20  ->nCte].pSelect 
268c0 3d 20 70 51 75 65 72 79 3b 0a 20 20 20 20 70 4e  = pQuery;.    pN
268d0 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65  ew->a[pNew->nCte
268e0 5d 2e 70 43 6f 6c 73 20 3d 20 70 41 72 67 6c 69  ].pCols = pArgli
268f0 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b  st;.    pNew->a[
26900 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 4e 61 6d  pNew->nCte].zNam
26910 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 70  e = zName;.    p
26920 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74  New->a[pNew->nCt
26930 65 5d 2e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a  e].zCteErr = 0;.
26940 20 20 20 20 70 4e 65 77 2d 3e 6e 43 74 65 2b 2b      pNew->nCte++
26950 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
26960 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  pNew;.}../*.** F
26970 72 65 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ree the contents
26980 20 6f 66 20 74 68 65 20 57 69 74 68 20 6f 62 6a   of the With obj
26990 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
269a0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
269b0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
269c0 65 33 57 69 74 68 44 65 6c 65 74 65 28 73 71 6c  e3WithDelete(sql
269d0 69 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a  ite3 *db, With *
269e0 70 57 69 74 68 29 7b 0a 20 20 69 66 28 20 70 57  pWith){.  if( pW
269f0 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ith ){.    int i
26a00 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
26a10 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b  <pWith->nCte; i+
26a20 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
26a30 20 43 74 65 20 2a 70 43 74 65 20 3d 20 26 70 57   Cte *pCte = &pW
26a40 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  ith->a[i];.     
26a50 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
26a60 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d  Delete(db, pCte-
26a70 3e 70 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73  >pCols);.      s
26a80 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
26a90 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65  te(db, pCte->pSe
26aa0 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  lect);.      sql
26ab0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
26ac0 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Cte->zName);.   
26ad0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
26ae0 46 72 65 65 28 64 62 2c 20 70 57 69 74 68 29 3b  Free(db, pWith);
26af0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
26b00 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
26b10 5f 4f 4d 49 54 5f 43 54 45 29 20 2a 2f 0a        _OMIT_CTE) */.