/ Hex Artifact Content
Login

Artifact 52970b6cf3cf3107551a5d6dd668b0b261b0b491:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
03a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
03b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
03c0: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
03d0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20  */.  int iTab;  
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03f0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
0400: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0410: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0420: 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20 20 20 20  sWriteLock;     
0430: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 77     /* True for w
0440: 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c 73  rite lock.  Fals
0450: 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f 63  e for a read loc
0460: 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  k */.  const cha
0470: 72 20 2a 7a 4c 6f 63 6b 4e 61 6d 65 3b 20 2f 2a  r *zLockName; /*
0480: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
0490: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
04a0: 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
04b0: 74 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20  that we want to 
04c0: 6c 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20  lock a table at 
04d0: 72 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a  run-time.  .**.*
04e0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
04f0: 65 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f  e locked has roo
0500: 74 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20  t page iTab and 
0510: 69 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61  is found in data
0520: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72  base iDb..** A r
0530: 65 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c  ead or a write l
0540: 6f 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e  ock can be taken
0550: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73   depending on is
0560: 57 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  Writelock..**.**
0570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
0580: 73 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66  st records the f
0590: 61 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63  act that the loc
05a0: 6b 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54  k is desired.  T
05b0: 68 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61  he.** code to ma
05c0: 6b 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75  ke the lock occu
05d0: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  r is generated b
05e0: 79 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74  y a later call t
05f0: 6f 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f  o.** codeTableLo
0600: 63 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75  cks() which occu
0610: 72 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  rs during sqlite
0620: 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
0630: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0640: 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72  TableLock(.  Par
0650: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0660: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0670: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
0680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
0690: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
06a0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
06b0: 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  he table to lock
06c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
06d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
06e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
06f0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0700: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0710: 73 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f  sWriteLock,    /
0720: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69  * True for a wri
0730: 74 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e  te lock */.  con
0740: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
0750: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0760: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0770: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
0780: 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
0790: 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
07a0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  l(pParse);.  int
07b0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   i;.  int nBytes
07c0: 3b 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70  ;.  TableLock *p
07d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
07e0: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62  =0 );..  if( iDb
07f0: 3d 3d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==1 ) return;.  
0800: 69 66 28 20 21 73 71 6c 69 74 65 33 42 74 72 65  if( !sqlite3Btre
0810: 65 53 68 61 72 61 62 6c 65 28 70 50 61 72 73 65  eSharable(pParse
0820: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ->db->aDb[iDb].p
0830: 42 74 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Bt) ) return;.  
0840: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 70 6c  for(i=0; i<pTopl
0850: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0860: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
0870: 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62  &pToplevel->aTab
0880: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0890: 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20 26  f( p->iDb==iDb &
08a0: 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62 20  & p->iTab==iTab 
08b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57 72  ){.      p->isWr
08c0: 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69 73  iteLock = (p->is
08d0: 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73 57  WriteLock || isW
08e0: 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  riteLock);.     
08f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
0900: 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20 73   }..  nBytes = s
0910: 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b 29  izeof(TableLock)
0920: 20 2a 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e   * (pToplevel->n
0930: 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20  TableLock+1);.  
0940: 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c  pToplevel->aTabl
0950: 65 4c 6f 63 6b 20 3d 0a 20 20 20 20 20 20 73 71  eLock =.      sq
0960: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
0970: 46 72 65 65 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  Free(pToplevel->
0980: 64 62 2c 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61  db, pToplevel->a
0990: 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74 65  TableLock, nByte
09a0: 73 29 3b 0a 20 20 69 66 28 20 70 54 6f 70 6c 65  s);.  if( pTople
09b0: 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20  vel->aTableLock 
09c0: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 54 6f 70  ){.    p = &pTop
09d0: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
09e0: 6b 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61  k[pToplevel->nTa
09f0: 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20  bleLock++];.    
0a00: 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  p->iDb = iDb;.  
0a10: 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62    p->iTab = iTab
0a20: 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65  ;.    p->isWrite
0a30: 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f  Lock = isWriteLo
0a40: 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4c 6f 63 6b  ck;.    p->zLock
0a50: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
0a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 70 6c  }else{.    pTopl
0a70: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0a80: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
0a90: 33 4f 6f 6d 46 61 75 6c 74 28 70 54 6f 70 6c 65  3OomFault(pTople
0aa0: 76 65 6c 2d 3e 64 62 29 3b 0a 20 20 7d 0a 7d 0a  vel->db);.  }.}.
0ab0: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
0ac0: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74  P_TableLock inst
0ad0: 72 75 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68  ruction for each
0ae0: 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79   table locked by
0af0: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
0b00: 74 20 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79  t (configured by
0b10: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
0b20: 33 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a  3TableLock())..*
0b30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
0b40: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72  deTableLocks(Par
0b50: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
0b60: 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56  nt i;.  Vdbe *pV
0b70: 64 62 65 3b 20 0a 0a 20 20 70 56 64 62 65 20 3d  dbe; ..  pVdbe =
0b80: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
0b90: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
0ba0: 74 28 20 70 56 64 62 65 21 3d 30 20 29 3b 20 2f  t( pVdbe!=0 ); /
0bb0: 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  * sqlite3GetVdbe
0bc0: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 3a 20 56 44   cannot fail: VD
0bd0: 42 45 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  BE already alloc
0be0: 61 74 65 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  ated */..  for(i
0bf0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54  =0; i<pParse->nT
0c00: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0c10: 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70      TableLock *p
0c20: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62   = &pParse->aTab
0c30: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0c40: 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a  nt p1 = p->iDb;.
0c50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
0c60: 64 64 4f 70 34 28 70 56 64 62 65 2c 20 4f 50 5f  ddOp4(pVdbe, OP_
0c70: 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70  TableLock, p1, p
0c80: 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73 57 72 69  ->iTab, p->isWri
0c90: 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  teLock,.        
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
0cb0: 3e 7a 4c 6f 63 6b 4e 61 6d 65 2c 20 50 34 5f 53  >zLockName, P4_S
0cc0: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  TATIC);.  }.}.#e
0cd0: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f  lse.  #define co
0ce0: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a  deTableLocks(x).
0cf0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0d00: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0d10: 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20 6f   given yDbMask o
0d20: 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20 2d  bject is empty -
0d30: 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 20   if it contains 
0d40: 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20 54  no.** 1 bits.  T
0d50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0d60: 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61 73  sed by the DbMas
0d70: 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20 44  kAllZero() and D
0d80: 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a 2a  bMaskNotZero().*
0d90: 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53 51  * macros when SQ
0da0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0db0: 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  D is greater tha
0dc0: 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  n 30..*/.#if SQL
0dd0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
0de0: 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33 44  >30.int sqlite3D
0df0: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44 62  bMaskAllZero(yDb
0e00: 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20 69  Mask m){.  int i
0e10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
0e20: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b 20  izeof(yDbMask); 
0e30: 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29 20  i++) if( m[i] ) 
0e40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
0e50: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
0e60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0e70: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
0e80: 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  er a single SQL 
0e90: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ea0: 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64  en.** parsed and
0eb0: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20   a VDBE program 
0ec0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20  to execute that 
0ed0: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ee0: 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e 20  en.** prepared. 
0ef0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
0f00: 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e 67  ts the finishing
0f10: 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65 0a   touches on the.
0f20: 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  ** VDBE program 
0f30: 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 70  and resets the p
0f40: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20  Parse structure 
0f50: 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20  for the next.** 
0f60: 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  parse..**.** Not
0f70: 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72 72  e that if an err
0f80: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20  or occurred, it 
0f90: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
0fa0: 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42  e that.** no VDB
0fb0: 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72  E code was gener
0fc0: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
0fd0: 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
0fe0: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
0ff0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1000: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
1010: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
1020: 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a 20  Toplevel==0 );. 
1030: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1040: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1050: 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b  nested ) return;
1060: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1070: 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
1080: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 69  e->nErr ){.    i
1090: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
10a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 72 73  QLITE_OK ) pPars
10b0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
10c0: 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
10d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
10e0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
10f0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
1100: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
1110: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
1120: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
1130: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1140: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
1150: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
1160: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20  isMultiWrite .  
1170: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
1180: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
1190: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  t(v, pParse->may
11a0: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76  Abort));.  if( v
11b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11c0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
11d0: 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53 51 4c 49  Halt);..#if SQLI
11e0: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
11f0: 43 41 54 49 4f 4e 0a 20 20 20 20 69 66 28 20 70  CATION.    if( p
1200: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
1210: 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  k>0 && db->init.
1220: 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  busy==0 ){.     
1230: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
1240: 49 6e 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20  Init(db);.      
1250: 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74  if( db->auth.aut
1260: 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55 73 65  hLevel<UAUTH_Use
1270: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
1280: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1290: 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20 61  rse, "user not a
12a0: 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b 0a  uthenticated");.
12b0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
12c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 48  rc = SQLITE_AUTH
12d0: 5f 55 53 45 52 3b 0a 20 20 20 20 20 20 20 20 72  _USER;.        r
12e0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
12f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1300: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
1310: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
1320: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
1330: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
1340: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
1350: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
1360: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
1370: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
1380: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
1390: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
13a0: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
13b0: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
13c0: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
13d0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
13e0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
13f0: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
1400: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
1410: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
1420: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
1430: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1440: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1450: 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 26 26  iled==0 .     &&
1460: 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72 6f 28   (DbMaskNonZero(
1470: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1480: 73 6b 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70  sk) || pParse->p
1490: 43 6f 6e 73 74 45 78 70 72 29 0a 20 20 20 20 29  ConstExpr).    )
14a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 2c  {.      int iDb,
14b0: 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   i;.      assert
14c0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
14d0: 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f 64 65  Op(v, 0)->opcode
14e0: 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20 20 20  ==OP_Init );.   
14f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1500: 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a 20 20  mpHere(v, 0);.  
1510: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69      for(iDb=0; i
1520: 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
1530: 2b 29 7b 0a 20 20 20 20 20 20 20 20 53 63 68 65  +){.        Sche
1540: 6d 61 20 2a 70 53 63 68 65 6d 61 3b 0a 20 20 20  ma *pSchema;.   
1550: 20 20 20 20 20 69 66 28 20 44 62 4d 61 73 6b 54       if( DbMaskT
1560: 65 73 74 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  est(pParse->cook
1570: 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
1580: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
15a0: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
15b0: 3b 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d  ;.        pSchem
15c0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
15d0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  .pSchema;.      
15e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f0: 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20 20 20  Op4Int(v,.      
1600: 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63 74 69      OP_Transacti
1610: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
1620: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
1630: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 44   */.          iD
1640: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20 20   /* P1 */.      
1670: 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74 28 70      DbMaskTest(p
1680: 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
1690: 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a 2f 0a  ,iDb), /* P2 */.
16a0: 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d            pSchem
16b0: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
16c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
16d0: 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  P3 */.          
16e0: 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
16f0: 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
1700: 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20     /* P4 */.    
1710: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1720: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1730: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
1740: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b  eChangeP5(v, 1);
1750: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
1760: 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20 20 20  ment((v,.       
1770: 20 20 20 20 20 20 20 22 75 73 65 73 53 74 6d 74         "usesStmt
1780: 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70 50 61  Journal=%d", pPa
1790: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20 26 26  rse->mayAbort &&
17a0: 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69   pParse->isMulti
17b0: 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20 20 7d  Write));.      }
17c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
17e0: 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  E.      for(i=0;
17f0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61 62   i<pParse->nVtab
1800: 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Lock; i++){.    
1810: 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20 3d      char *vtab =
1820: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1830: 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 50  GetVTable(db, pP
1840: 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63 6b  arse->apVtabLock
1850: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [i]);.        sq
1860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1870: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c  v, OP_VBegin, 0,
1880: 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f   0, 0, vtab, P4_
1890: 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a 20  VTAB);.      }. 
18a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 74       pParse->nVt
18b0: 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e 64  abLock = 0;.#end
18c0: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 63  if..      /* Onc
18d0: 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69 65  e all the cookie
18e0: 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72 69  s have been veri
18f0: 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61 63  fied and transac
1900: 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a 20  tions opened, . 
1910: 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 74       ** obtain t
1920: 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
1930: 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69 73  e-locks. This is
1940: 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
1950: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 68  the .      ** sh
1960: 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75  ared-cache featu
1970: 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20  re is enabled.. 
1980: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
1990: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50 61  deTableLocks(pPa
19a0: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  rse);..      /* 
19b0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20 41  Initialize any A
19c0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61 74  UTOINCREMENT dat
19d0: 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65 71  a structures req
19e0: 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  uired..      */.
19f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74        sqlite3Aut
1a00: 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e 28  oincrementBegin(
1a10: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1a20: 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e 74  /* Code constant
1a30: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1a40: 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65 64  t where factored
1a50: 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c 6f   out of inner lo
1a60: 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ops */.      if(
1a70: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1a80: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45  xpr ){.        E
1a90: 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20 70  xprList *pEL = p
1aa0: 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
1ab0: 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  r;.        pPars
1ac0: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
1ad0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
1ae0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e 45  r(i=0; i<pEL->nE
1af0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1b00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b10: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
1b20: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  ->a[i].pExpr, pE
1b30: 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73 74  L->a[i].u.iConst
1b40: 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20 20  ExprReg);.      
1b50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
1b60: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a     /* Finally, j
1b70: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1b80: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1b90: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65   executable code
1ba0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1bb0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31 29  e3VdbeGoto(v, 1)
1bc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
1bd0: 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20  /* Get the VDBE 
1be0: 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f  program ready fo
1bf0: 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f  r execution.  */
1c00: 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72  .  if( v && pPar
1c10: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21  se->nErr==0 && !
1c20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c30: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1c40: 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1c50: 76 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 44 69  vel==0 );  /* Di
1c60: 73 61 62 6c 65 73 20 61 6e 64 20 72 65 2d 65 6e  sables and re-en
1c70: 61 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f 0a 20  ables match */. 
1c80: 20 20 20 2f 2a 20 41 20 6d 69 6e 69 6d 75 6d 20     /* A minimum 
1c90: 6f 66 20 6f 6e 65 20 63 75 72 73 6f 72 20 69 73  of one cursor is
1ca0: 20 72 65 71 75 69 72 65 64 20 69 66 20 61 75 74   required if aut
1cb0: 6f 69 6e 63 72 65 6d 65 6e 74 20 69 73 20 75 73  oincrement is us
1cc0: 65 64 0a 20 20 20 20 2a 20 20 53 65 65 20 74 69  ed.    *  See ti
1cd0: 63 6b 65 74 20 5b 61 36 39 36 33 37 39 63 31 66  cket [a696379c1f
1ce0: 30 38 38 36 36 5d 20 2a 2f 0a 20 20 20 20 69 66  08866] */.    if
1cf0: 28 20 70 50 61 72 73 65 2d 3e 70 41 69 6e 63 21  ( pParse->pAinc!
1d00: 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54  =0 && pParse->nT
1d10: 61 62 3d 3d 30 20 29 20 70 50 61 72 73 65 2d 3e  ab==0 ) pParse->
1d20: 6e 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 73 71  nTab = 1;.    sq
1d30: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
1d40: 64 79 28 76 2c 20 70 50 61 72 73 65 29 3b 0a 20  dy(v, pParse);. 
1d50: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
1d60: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
1d70: 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73 65  else{.    pParse
1d80: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
1d90: 52 4f 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ROR;.  }.}../*.*
1da0: 2a 20 52 75 6e 20 74 68 65 20 70 61 72 73 65 72  * Run the parser
1db0: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
1dc0: 74 6f 72 20 72 65 63 75 72 73 69 76 65 6c 79 20  tor recursively 
1dd0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65  in order to gene
1de0: 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72  rate.** code for
1df0: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
1e00: 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68  nt given onto th
1e10: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61  e end of the pPa
1e20: 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63  rse context.** c
1e30: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
1e40: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68  onstruction.  Wh
1e50: 65 6e 20 74 68 65 20 70 61 72 73 65 72 20 69 73  en the parser is
1e60: 20 72 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79   run recursively
1e70: 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68  .** this way, th
1e80: 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20  e final OP_Halt 
1e90: 69 73 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20  is not appended 
1ea0: 61 6e 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61  and other initia
1eb0: 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  lization.** and 
1ec0: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65  finalization ste
1ed0: 70 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62  ps are omitted b
1ee0: 65 63 61 75 73 65 20 74 68 6f 73 65 20 61 72 65  ecause those are
1ef0: 20 68 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65   handling by the
1f00: 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61  .** outermost pa
1f10: 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20  rser..**.** Not 
1f20: 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65  everything is ne
1f30: 73 74 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61  stable.  This fa
1f40: 63 69 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e  cility is design
1f50: 65 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20  ed to permit.** 
1f60: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20  INSERT, UPDATE, 
1f70: 61 6e 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61  and DELETE opera
1f80: 74 69 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51  tions against SQ
1f90: 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73  LITE_MASTER.  Us
1fa0: 65 0a 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75  e.** care if you
1fb0: 20 64 65 63 69 64 65 20 74 6f 20 74 72 79 20 74   decide to try t
1fc0: 6f 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69  o use this routi
1fd0: 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  ne for some othe
1fe0: 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76  r purposes..*/.v
1ff0: 6f 69 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65  oid sqlite3Neste
2000: 64 50 61 72 73 65 28 50 61 72 73 65 20 2a 70 50  dParse(Parse *pP
2010: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
2020: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
2030: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
2040: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63   char *zSql;.  c
2050: 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
2060: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2070: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
2080: 63 68 61 72 20 73 61 76 65 42 75 66 5b 50 41 52  char saveBuf[PAR
2090: 53 45 5f 54 41 49 4c 5f 53 5a 5d 3b 0a 0a 20 20  SE_TAIL_SZ];..  
20a0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
20b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
20c0: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73  ert( pParse->nes
20d0: 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65  ted<10 );  /* Ne
20e0: 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c  sting should onl
20f0: 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20  y be of limited 
2100: 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74  depth */.  va_st
2110: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
2120: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
2130: 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a  e3VMPrintf(db, z
2140: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
2150: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
2160: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
2170: 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d  return;   /* A m
2180: 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
2190: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20  failed */.  }.  
21a0: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b  pParse->nested++
21b0: 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42  ;.  memcpy(saveB
21c0: 75 66 2c 20 50 41 52 53 45 5f 54 41 49 4c 28 70  uf, PARSE_TAIL(p
21d0: 50 61 72 73 65 29 2c 20 50 41 52 53 45 5f 54 41  Parse), PARSE_TA
21e0: 49 4c 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74  IL_SZ);.  memset
21f0: 28 50 41 52 53 45 5f 54 41 49 4c 28 70 50 61 72  (PARSE_TAIL(pPar
2200: 73 65 29 2c 20 30 2c 20 50 41 52 53 45 5f 54 41  se), 0, PARSE_TA
2210: 49 4c 5f 53 5a 29 3b 0a 20 20 73 71 6c 69 74 65  IL_SZ);.  sqlite
2220: 33 52 75 6e 50 61 72 73 65 72 28 70 50 61 72 73  3RunParser(pPars
2230: 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72 4d 73  e, zSql, &zErrMs
2240: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
2250: 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
2260: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
2270: 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 6d  e(db, zSql);.  m
2280: 65 6d 63 70 79 28 50 41 52 53 45 5f 54 41 49 4c  emcpy(PARSE_TAIL
2290: 28 70 50 61 72 73 65 29 2c 20 73 61 76 65 42 75  (pParse), saveBu
22a0: 66 2c 20 50 41 52 53 45 5f 54 41 49 4c 5f 53 5a  f, PARSE_TAIL_SZ
22b0: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73  );.  pParse->nes
22c0: 74 65 64 2d 2d 3b 0a 7d 0a 0a 23 69 66 20 53 51  ted--;.}..#if SQ
22d0: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
22e0: 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 52  TICATION./*.** R
22f0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 7a 54  eturn TRUE if zT
2300: 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65  able is the name
2310: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 74   of the system t
2320: 61 62 6c 65 20 74 68 61 74 20 73 74 6f 72 65 73  able that stores
2330: 20 74 68 65 0a 2a 2a 20 6c 69 73 74 20 6f 66 20   the.** list of 
2340: 75 73 65 72 73 20 61 6e 64 20 74 68 65 69 72 20  users and their 
2350: 61 63 63 65 73 73 20 63 72 65 64 65 6e 74 69 61  access credentia
2360: 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ls..*/.int sqlit
2370: 65 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28  e3UserAuthTable(
2380: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
2390: 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  le){.  return sq
23a0: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54  lite3_stricmp(zT
23b0: 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 75 73  able, "sqlite_us
23c0: 65 72 22 29 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69  er")==0;.}.#endi
23d0: 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  f../*.** Locate 
23e0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
23f0: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
2400: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
2410: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
2420: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
2430: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
2440: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
2450: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
2460: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
2470: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
2480: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
2490: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
24a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
24b0: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
24c0: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
24d0: 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62  ched for the tab
24e0: 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69  le and the.** fi
24f0: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62  rst matching tab
2500: 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  le is returned. 
2510: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f   (No checking fo
2520: 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c  r duplicate tabl
2530: 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f  e.** names is do
2540: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
2550: 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66   order is TEMP f
2560: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
2570: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78   then any.** aux
2580: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
2590: 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65   added using the
25a0: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
25b0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
25c0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
25d0: 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  le()..*/.Table *
25e0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
25f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
2600: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
2610: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
2620: 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  tabase){.  Table
2630: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
2640: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65  ;..  /* All mute
2650: 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  xes are required
2660: 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65   for schema acce
2670: 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77  ss.  Make sure w
2680: 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a  e hold them. */.
2690: 20 20 61 73 73 65 72 74 28 20 7a 44 61 74 61 62    assert( zDatab
26a0: 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase!=0 || sqlite
26b0: 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
26c0: 74 65 78 65 73 28 64 62 29 20 29 3b 0a 23 69 66  texes(db) );.#if
26d0: 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
26e0: 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 2f 2a  HENTICATION.  /*
26f0: 20 4f 6e 6c 79 20 74 68 65 20 61 64 6d 69 6e 20   Only the admin 
2700: 75 73 65 72 20 69 73 20 61 6c 6c 6f 77 65 64 20  user is allowed 
2710: 74 6f 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  to know that the
2720: 20 73 71 6c 69 74 65 5f 75 73 65 72 20 74 61 62   sqlite_user tab
2730: 6c 65 0a 20 20 2a 2a 20 65 78 69 73 74 73 20 2a  le.  ** exists *
2740: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68  /.  if( db->auth
2750: 2e 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48  .authLevel<UAUTH
2760: 5f 41 64 6d 69 6e 20 26 26 20 73 71 6c 69 74 65  _Admin && sqlite
2770: 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 7a  3UserAuthTable(z
2780: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
2790: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
27a0: 6e 64 69 66 0a 20 20 77 68 69 6c 65 28 31 29 7b  ndif.  while(1){
27b0: 0a 20 20 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f  .    for(i=OMIT_
27c0: 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44  TEMPDB; i<db->nD
27d0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
27e0: 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69  nt j = (i<2) ? i
27f0: 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61  ^1 : i;   /* Sea
2800: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
2810: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 20 20 69 66  MAIN */.      if
2820: 28 20 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 7c  ( zDatabase==0 |
2830: 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  | sqlite3StrICmp
2840: 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e  (zDatabase, db->
2850: 61 44 62 5b 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29  aDb[j].zDbSName)
2860: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
2870: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
2880: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
2890: 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 20  , j, 0) );.     
28a0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
28b0: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b  shFind(&db->aDb[
28c0: 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  j].pSchema->tblH
28d0: 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ash, zName);.   
28e0: 20 20 20 20 20 69 66 28 20 70 20 29 20 72 65 74       if( p ) ret
28f0: 75 72 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20  urn p;.      }. 
2900: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4e 6f 74 20     }.    /* Not 
2910: 66 6f 75 6e 64 2e 20 20 49 66 20 74 68 65 20 6e  found.  If the n
2920: 61 6d 65 20 77 65 20 77 65 72 65 20 6c 6f 6f 6b  ame we were look
2930: 69 6e 67 20 66 6f 72 20 77 61 73 20 74 65 6d 70  ing for was temp
2940: 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20  .sqlite_master. 
2950: 20 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67     ** then chang
2960: 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 73 71  e the name to sq
2970: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
2980: 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20   and try again. 
2990: 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
29a0: 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c  e3StrICmp(zName,
29b0: 20 4d 41 53 54 45 52 5f 4e 41 4d 45 29 21 3d 30   MASTER_NAME)!=0
29c0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
29d0: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
29e0: 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d  p(zDatabase, db-
29f0: 3e 61 44 62 5b 31 5d 2e 7a 44 62 53 4e 61 6d 65  >aDb[1].zDbSName
2a00: 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )!=0 ) break;.  
2a10: 20 20 7a 4e 61 6d 65 20 3d 20 54 45 4d 50 5f 4d    zName = TEMP_M
2a20: 41 53 54 45 52 5f 4e 41 4d 45 3b 0a 20 20 7d 0a  ASTER_NAME;.  }.
2a30: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2a40: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
2a50: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
2a60: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
2a70: 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
2a80: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c  database.** tabl
2a90: 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  e given the name
2aa0: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61   of that table a
2ab0: 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
2ac0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
2ad0: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  ** database cont
2ae0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
2af0: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
2b00: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c  f not found.  Al
2b10: 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65  so leave an.** e
2b20: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
2b30: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
2b40: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
2b50: 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
2b60: 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73  is routine and s
2b70: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2b80: 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a  ) is that this.*
2b90: 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73  * routine leaves
2ba0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2bb0: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
2bc0: 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71  rMsg where.** sq
2bd0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29  lite3FindTable()
2be0: 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61   does not..*/.Ta
2bf0: 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61  ble *sqlite3Loca
2c00: 74 65 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  teTable(.  Parse
2c10: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2c20: 20 20 2f 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20    /* context in 
2c30: 77 68 69 63 68 20 74 6f 20 72 65 70 6f 72 74 20  which to report 
2c40: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75 33 32 20  errors */.  u32 
2c50: 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
2c60: 20 20 20 2f 2a 20 4c 4f 43 41 54 45 5f 56 49 45     /* LOCATE_VIE
2c70: 57 20 6f 72 20 4c 4f 43 41 54 45 5f 4e 4f 45 52  W or LOCATE_NOER
2c80: 52 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  R */.  const cha
2c90: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a  r *zName,     /*
2ca0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
2cb0: 6c 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e  le we are lookin
2cc0: 67 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  g for */.  const
2cd0: 20 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20   char *zDbase   
2ce0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2cf0: 20 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68   database.  Migh
2d00: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
2d10: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f    Table *p;..  /
2d20: 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
2d30: 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
2d40: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2d50: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
2d60: 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
2d70: 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
2d80: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
2d90: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
2da0: 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
2db0: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
2dc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2dd0: 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   }..  p = sqlite
2de0: 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  3FindTable(pPars
2df0: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44  e->db, zName, zD
2e00: 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d  base);.  if( p==
2e10: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
2e20: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 66 6c 61 67  har *zMsg = flag
2e30: 73 20 26 20 4c 4f 43 41 54 45 5f 56 49 45 57 20  s & LOCATE_VIEW 
2e40: 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65 77 22  ? "no such view"
2e50: 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c   : "no such tabl
2e60: 65 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e";.#ifndef SQLI
2e70: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2e80: 41 42 4c 45 0a 20 20 20 20 69 66 28 20 73 71 6c  ABLE.    if( sql
2e90: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 70  ite3FindDbName(p
2ea0: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 44 62 61 73  Parse->db, zDbas
2eb0: 65 29 3c 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  e)<1 ){.      /*
2ec0: 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 74 68 65   If zName is the
2ed0: 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   not the name of
2ee0: 20 61 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   a table in the 
2ef0: 73 63 68 65 6d 61 20 63 72 65 61 74 65 64 20 75  schema created u
2f00: 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 43 52  sing.      ** CR
2f10: 45 41 54 45 2c 20 74 68 65 6e 20 63 68 65 63 6b  EATE, then check
2f20: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 69 73   to see if it is
2f30: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20   the name of an 
2f40: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
2f50: 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20  at.      ** can 
2f60: 62 65 20 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20  be an eponymous 
2f70: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 2a  virtual table. *
2f80: 2f 0a 20 20 20 20 20 20 4d 6f 64 75 6c 65 20 2a  /.      Module *
2f90: 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 2a 29  pMod = (Module*)
2fa0: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
2fb0: 26 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4d 6f  &pParse->db->aMo
2fc0: 64 75 6c 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  dule, zName);.  
2fd0: 20 20 20 20 69 66 28 20 70 4d 6f 64 3d 3d 30 20      if( pMod==0 
2fe0: 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  && sqlite3_strni
2ff0: 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67  cmp(zName, "prag
3000: 6d 61 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20  ma_", 7)==0 ){. 
3010: 20 20 20 20 20 20 20 70 4d 6f 64 20 3d 20 73 71         pMod = sq
3020: 6c 69 74 65 33 50 72 61 67 6d 61 56 74 61 62 52  lite3PragmaVtabR
3030: 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2d 3e  egister(pParse->
3040: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
3050: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4d    }.      if( pM
3060: 6f 64 20 26 26 20 73 71 6c 69 74 65 33 56 74 61  od && sqlite3Vta
3070: 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 49  bEponymousTableI
3080: 6e 69 74 28 70 50 61 72 73 65 2c 20 70 4d 6f 64  nit(pParse, pMod
3090: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
30a0: 75 72 6e 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61  urn pMod->pEpoTa
30b0: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  b;.      }.    }
30c0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
30d0: 28 66 6c 61 67 73 20 26 20 4c 4f 43 41 54 45 5f  (flags & LOCATE_
30e0: 4e 4f 45 52 52 29 3d 3d 30 20 29 7b 0a 20 20 20  NOERR)==0 ){.   
30f0: 20 20 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b     if( zDbase ){
3100: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3110: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3120: 20 22 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a 4d   "%s: %s.%s", zM
3130: 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d  sg, zDbase, zNam
3140: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
3150: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3160: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3170: 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c   "%s: %s", zMsg,
3180: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   zName);.      }
3190: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63  .      pParse->c
31a0: 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
31b0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
31c0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
31d0: 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65  Locate the table
31e0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 2a   identified by *
31f0: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  p..**.** This is
3200: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
3210: 64 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  d sqlite3LocateT
3220: 61 62 6c 65 28 29 2e 20 54 68 65 20 64 69 66 66  able(). The diff
3230: 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 0a 2a  erence between.*
3240: 2a 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  * sqlite3LocateT
3250: 61 62 6c 65 28 29 20 61 6e 64 20 74 68 69 73 20  able() and this 
3260: 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 61 74  function is that
3270: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
3280: 65 73 74 72 69 63 74 73 0a 2a 2a 20 74 68 65 20  estricts.** the 
3290: 73 65 61 72 63 68 20 74 6f 20 73 63 68 65 6d 61  search to schema
32a0: 20 28 70 2d 3e 70 53 63 68 65 6d 61 29 20 69 66   (p->pSchema) if
32b0: 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e   it is not NULL.
32c0: 20 70 2d 3e 70 53 63 68 65 6d 61 20 6d 61 79 20   p->pSchema may 
32d0: 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20 69  be.** non-NULL i
32e0: 66 20 69 74 20 69 73 20 70 61 72 74 20 6f 66 20  f it is part of 
32f0: 61 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65  a view or trigge
3300: 72 20 70 72 6f 67 72 61 6d 20 64 65 66 69 6e 69  r program defini
3310: 74 69 6f 6e 2e 20 53 65 65 0a 2a 2a 20 73 71 6c  tion. See.** sql
3320: 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 29  ite3FixSrcList()
3330: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
3340: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c  .Table *sqlite3L
3350: 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 0a  ocateTableItem(.
3360: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3370: 20 0a 20 20 75 33 32 20 66 6c 61 67 73 2c 0a 20   .  u32 flags,. 
3380: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
3390: 69 74 65 6d 20 2a 70 0a 29 7b 0a 20 20 63 6f 6e  item *p.){.  con
33a0: 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20  st char *zDb;.  
33b0: 61 73 73 65 72 74 28 20 70 2d 3e 70 53 63 68 65  assert( p->pSche
33c0: 6d 61 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 61 74  ma==0 || p->zDat
33d0: 61 62 61 73 65 3d 3d 30 20 29 3b 0a 20 20 69 66  abase==0 );.  if
33e0: 28 20 70 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  ( p->pSchema ){.
33f0: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
3400: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
3410: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
3420: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
3430: 7a 44 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  zDb = pParse->db
3440: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
3450: 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ame;.  }else{.  
3460: 20 20 7a 44 62 20 3d 20 70 2d 3e 7a 44 61 74 61    zDb = p->zData
3470: 62 61 73 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  base;.  }.  retu
3480: 72 6e 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  rn sqlite3Locate
3490: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 66 6c  Table(pParse, fl
34a0: 61 67 73 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a  ags, p->zName, z
34b0: 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  Db);.}../*.** Lo
34c0: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
34d0: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
34e0: 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20  t describes .** 
34f0: 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
3500: 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  ex given the nam
3510: 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a  e of that index.
3520: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20  ** and the name 
3530: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
3540: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
3550: 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75  e index..** Retu
3560: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
3570: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
3580: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
3590: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
35a0: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
35b0: 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74  e.** table and t
35c0: 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  he first matchin
35d0: 67 20 69 6e 64 65 78 20 69 73 20 72 65 74 75 72  g index is retur
35e0: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
35f0: 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63  ng.** for duplic
3600: 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  ate index names 
3610: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
3620: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a  earch order is.*
3630: 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68  * TEMP first, th
3640: 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e  en MAIN, then an
3650: 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  y auxiliary data
3660: 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75  bases added.** u
3670: 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20  sing the ATTACH 
3680: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65  command..*/.Inde
3690: 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  x *sqlite3FindIn
36a0: 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dex(sqlite3 *db,
36b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
36c0: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
36d0: 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  zDb){.  Index *p
36e0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
36f0: 20 2f 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20   /* All mutexes 
3700: 61 72 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  are required for
3710: 20 73 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20   schema access. 
3720: 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f   Make sure we ho
3730: 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73  ld them. */.  as
3740: 73 65 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20  sert( zDb!=0 || 
3750: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
3760: 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20  sAllMutexes(db) 
3770: 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f  );.  for(i=OMIT_
3780: 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44  TEMPDB; i<db->nD
3790: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  b; i++){.    int
37a0: 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31   j = (i<2) ? i^1
37b0: 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68   : i;  /* Search
37c0: 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49   TEMP before MAI
37d0: 4e 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20  N */.    Schema 
37e0: 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  *pSchema = db->a
37f0: 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  Db[j].pSchema;. 
3800: 20 20 20 61 73 73 65 72 74 28 20 70 53 63 68 65     assert( pSche
3810: 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44  ma );.    if( zD
3820: 62 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  b && sqlite3StrI
3830: 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62  Cmp(zDb, db->aDb
3840: 5b 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29 20 29 20  [j].zDbSName) ) 
3850: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
3860: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
3870: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
3880: 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 20   j, 0) );.    p 
3890: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
38a0: 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  d(&pSchema->idxH
38b0: 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ash, zName);.   
38c0: 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a   if( p ) break;.
38d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
38e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d  }../*.** Reclaim
38f0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64   the memory used
3900: 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a   by an index.*/.
3910: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
3920: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64  Index(sqlite3 *d
3930: 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 23 69  b, Index *p){.#i
3940: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3950: 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71 6c 69  T_ANALYZE.  sqli
3960: 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78 53 61  te3DeleteIndexSa
3970: 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a 23 65  mples(db, p);.#e
3980: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 45 78  ndif.  sqlite3Ex
3990: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
39a0: 70 50 61 72 74 49 64 78 57 68 65 72 65 29 3b 0a  pPartIdxWhere);.
39b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
39c0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 61  tDelete(db, p->a
39d0: 43 6f 6c 45 78 70 72 29 3b 0a 20 20 73 71 6c 69  ColExpr);.  sqli
39e0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
39f0: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 69 66 28  >zColAff);.  if(
3a00: 20 70 2d 3e 69 73 52 65 73 69 7a 65 64 20 29 20   p->isResized ) 
3a10: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3a20: 2c 20 28 76 6f 69 64 20 2a 29 70 2d 3e 61 7a 43  , (void *)p->azC
3a30: 6f 6c 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  oll);.#ifdef SQL
3a40: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
3a50: 5f 4f 52 5f 53 54 41 54 34 0a 20 20 73 71 6c 69  _OR_STAT4.  sqli
3a60: 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 69 52 6f  te3_free(p->aiRo
3a70: 77 45 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  wEst);.#endif.  
3a80: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3a90: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  , p);.}../*.** F
3aa0: 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c  or the index cal
3ab0: 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69  led zIdxName whi
3ac0: 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74  ch is found in t
3ad0: 68 65 20 64 61 74 61 62 61 73 65 20 69 44 62 2c  he database iDb,
3ae0: 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20  .** unlike that 
3af0: 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54  index from its T
3b00: 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65  able then remove
3b10: 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a   the index from.
3b20: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61 73  ** the index has
3b30: 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65  h table and free
3b40: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75   all memory stru
3b50: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65  ctures associate
3b60: 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e  d.** with the in
3b70: 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  dex..*/.void sql
3b80: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
3b90: 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33  eteIndex(sqlite3
3ba0: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
3bb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e  onst char *zIdxN
3bc0: 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ame){.  Index *p
3bd0: 49 6e 64 65 78 3b 0a 20 20 48 61 73 68 20 2a 70  Index;.  Hash *p
3be0: 48 61 73 68 3b 0a 0a 20 20 61 73 73 65 72 74 28  Hash;..  assert(
3bf0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
3c00: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
3c10: 20 30 29 20 29 3b 0a 20 20 70 48 61 73 68 20 3d   0) );.  pHash =
3c20: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70   &db->aDb[iDb].p
3c30: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b  Schema->idxHash;
3c40: 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
3c50: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 70 48  te3HashInsert(pH
3c60: 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 30  ash, zIdxName, 0
3c70: 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
3c80: 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69  pIndex) ){.    i
3c90: 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  f( pIndex->pTabl
3ca0: 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65  e->pIndex==pInde
3cb0: 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  x ){.      pInde
3cc0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
3cd0: 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  x = pIndex->pNex
3ce0: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
3cf0: 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
3d00: 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61      /* Justifica
3d10: 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28 29  tion of ALWAYS()
3d20: 3b 20 20 54 68 65 20 69 6e 64 65 78 20 6d 75 73  ;  The index mus
3d30: 74 20 62 65 20 6f 6e 20 74 68 65 20 6c 69 73 74  t be on the list
3d40: 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64   of.      ** ind
3d50: 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70  ices. */.      p
3d60: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
3d70: 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  e->pIndex;.     
3d80: 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70   while( ALWAYS(p
3d90: 29 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70  ) && p->pNext!=p
3da0: 49 6e 64 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e  Index ){ p = p->
3db0: 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 20 20 69  pNext; }.      i
3dc0: 66 28 20 41 4c 57 41 59 53 28 70 20 26 26 20 70  f( ALWAYS(p && p
3dd0: 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29  ->pNext==pIndex)
3de0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70   ){.        p->p
3df0: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70  Next = pIndex->p
3e00: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
3e10: 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65    }.    freeInde
3e20: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
3e30: 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c   }.  db->flags |
3e40: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
3e50: 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hanges;.}../*.**
3e60: 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20 74 68   Look through th
3e70: 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e 20 64  e list of open d
3e80: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 69 6e  atabase files in
3e90: 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e 64 20 69   db->aDb[] and i
3ea0: 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65 20 62 65  f.** any have be
3eb0: 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65 6d 6f 76  en closed, remov
3ec0: 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20  e them from the 
3ed0: 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f 63 61 74  list.  Reallocat
3ee0: 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 61 44 62  e the.** db->aDb
3ef0: 5b 5d 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  [] structure to 
3f00: 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65 2c 20  a smaller size, 
3f10: 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a  if possible..**.
3f20: 2a 2a 20 45 6e 74 72 79 20 30 20 28 74 68 65 20  ** Entry 0 (the 
3f30: 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73 65 29  "main" database)
3f40: 20 61 6e 64 20 65 6e 74 72 79 20 31 20 28 74 68   and entry 1 (th
3f50: 65 20 22 74 65 6d 70 22 20 64 61 74 61 62 61 73  e "temp" databas
3f60: 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76 65 72 20  e).** are never 
3f70: 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 62  candidates for b
3f80: 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65 64 2e 0a  eing collapsed..
3f90: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
3fa0: 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65 41  ollapseDatabaseA
3fb0: 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62  rray(sqlite3 *db
3fc0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
3fd0: 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62   for(i=j=2; i<db
3fe0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
3ff0: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
4000: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
4010: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d     if( pDb->pBt=
4020: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
4030: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
4040: 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 3b 0a 20 20  b->zDbSName);.  
4050: 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d      pDb->zDbSNam
4060: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e  e = 0;.      con
4070: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
4080: 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20   if( j<i ){.    
4090: 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64    db->aDb[j] = d
40a0: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d  b->aDb[i];.    }
40b0: 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
40c0: 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69  db->nDb = j;.  i
40d0: 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26  f( db->nDb<=2 &&
40e0: 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44   db->aDb!=db->aD
40f0: 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d  bStatic ){.    m
4100: 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61  emcpy(db->aDbSta
4110: 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a  tic, db->aDb, 2*
4120: 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30  sizeof(db->aDb[0
4130: 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ]));.    sqlite3
4140: 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61  DbFree(db, db->a
4150: 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Db);.    db->aDb
4160: 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
4170: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
4180: 65 73 65 74 20 74 68 65 20 73 63 68 65 6d 61 20  eset the schema 
4190: 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
41a0: 20 61 74 20 69 6e 64 65 78 20 69 44 62 2e 20 20   at index iDb.  
41b0: 41 6c 73 6f 20 72 65 73 65 74 20 74 68 65 0a 2a  Also reset the.*
41c0: 2a 20 54 45 4d 50 20 73 63 68 65 6d 61 2e 0a 2a  * TEMP schema..*
41d0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
41e0: 73 65 74 4f 6e 65 53 63 68 65 6d 61 28 73 71 6c  setOneSchema(sql
41f0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
4200: 62 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20  b){.  Db *pDb;. 
4210: 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d   assert( iDb<db-
4220: 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 43 61  >nDb );..  /* Ca
4230: 73 65 20 31 3a 20 20 52 65 73 65 74 20 74 68 65  se 1:  Reset the
4240: 20 73 69 6e 67 6c 65 20 73 63 68 65 6d 61 20 69   single schema i
4250: 64 65 6e 74 69 66 69 65 64 20 62 79 20 69 44 62  dentified by iDb
4260: 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62 2d   */.  pDb = &db-
4270: 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 61 73 73  >aDb[iDb];.  ass
4280: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
4290: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
42a0: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 61 73 73  iDb, 0) );.  ass
42b0: 65 72 74 28 20 70 44 62 2d 3e 70 53 63 68 65 6d  ert( pDb->pSchem
42c0: 61 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  a!=0 );.  sqlite
42d0: 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62  3SchemaClear(pDb
42e0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 20 20 2f  ->pSchema);..  /
42f0: 2a 20 49 66 20 61 6e 79 20 64 61 74 61 62 61 73  * If any databas
4300: 65 20 6f 74 68 65 72 20 74 68 61 6e 20 54 45 4d  e other than TEM
4310: 50 20 69 73 20 72 65 73 65 74 2c 20 74 68 65 6e  P is reset, then
4320: 20 61 6c 73 6f 20 72 65 73 65 74 20 54 45 4d 50   also reset TEMP
4330: 0a 20 20 2a 2a 20 73 69 6e 63 65 20 54 45 4d 50  .  ** since TEMP
4340: 20 6d 69 67 68 74 20 62 65 20 68 6f 6c 64 69 6e   might be holdin
4350: 67 20 74 72 69 67 67 65 72 73 20 74 68 61 74 20  g triggers that 
4360: 72 65 66 65 72 65 6e 63 65 20 74 61 62 6c 65 73  reference tables
4370: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68   in the.  ** oth
4380: 65 72 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  er database..  *
4390: 2f 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20 29  /.  if( iDb!=1 )
43a0: 7b 0a 20 20 20 20 70 44 62 20 3d 20 26 64 62 2d  {.    pDb = &db-
43b0: 3e 61 44 62 5b 31 5d 3b 0a 20 20 20 20 61 73 73  >aDb[1];.    ass
43c0: 65 72 74 28 20 70 44 62 2d 3e 70 53 63 68 65 6d  ert( pDb->pSchem
43d0: 61 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  a!=0 );.    sqli
43e0: 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70  te3SchemaClear(p
43f0: 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Db->pSchema);.  
4400: 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }.  return;.}../
4410: 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73  *.** Erase all s
4420: 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f  chema informatio
4430: 6e 20 66 72 6f 6d 20 61 6c 6c 20 61 74 74 61 63  n from all attac
4440: 68 65 64 20 64 61 74 61 62 61 73 65 73 20 28 69  hed databases (i
4450: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 22 6d 61 69  ncluding.** "mai
4460: 6e 22 20 61 6e 64 20 22 74 65 6d 70 22 29 20 66  n" and "temp") f
4470: 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
4480: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
4490: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
44a0: 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f  ResetAllSchemasO
44b0: 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 73 71 6c 69  fConnection(sqli
44c0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
44d0: 69 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  i;.  sqlite3Btre
44e0: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
44f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
4500: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44  nDb; i++){.    D
4510: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
4520: 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
4530: 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  b->pSchema ){.  
4540: 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d      sqlite3Schem
4550: 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68  aClear(pDb->pSch
4560: 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ema);.    }.  }.
4570: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
4580: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
4590: 6e 67 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 56  nges;.  sqlite3V
45a0: 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62  tabUnlockList(db
45b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
45c0: 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20  eLeaveAll(db);. 
45d0: 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65   sqlite3Collapse
45e0: 44 61 74 61 62 61 73 65 41 72 72 61 79 28 64 62  DatabaseArray(db
45f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
4600: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
4610: 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74  ed when a commit
4620: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64   occurs..*/.void
4630: 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
4640: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71  ternalChanges(sq
4650: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62  lite3 *db){.  db
4660: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
4670: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
4680: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
4690: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
46a0: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ed for the colum
46b0: 6e 20 6e 61 6d 65 73 20 6f 66 20 61 20 74 61 62  n names of a tab
46c0: 6c 65 20 6f 72 20 76 69 65 77 20 28 74 68 65 0a  le or view (the.
46d0: 2a 2a 20 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20  ** Table.aCol[] 
46e0: 61 72 72 61 79 29 2e 0a 2a 2f 0a 76 6f 69 64 20  array)..*/.void 
46f0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c  sqlite3DeleteCol
4700: 75 6d 6e 4e 61 6d 65 73 28 73 71 6c 69 74 65 33  umnNames(sqlite3
4710: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61   *db, Table *pTa
4720: 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ble){.  int i;. 
4730: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
4740: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 21   assert( pTable!
4750: 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43 6f  =0 );.  if( (pCo
4760: 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  l = pTable->aCol
4770: 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  )!=0 ){.    for(
4780: 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e  i=0; i<pTable->n
4790: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
47a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
47b0: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  DbFree(db, pCol-
47c0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  >zName);.      s
47d0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
47e0: 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74  (db, pCol->pDflt
47f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4800: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  DbFree(db, pCol-
4810: 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20  >zColl);.    }. 
4820: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4830: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43 6f  (db, pTable->aCo
4840: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
4850: 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f   Remove the memo
4860: 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ry data structur
4870: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
4880: 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  th the given.** 
4890: 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67  Table.  No chang
48a0: 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64  es are made to d
48b0: 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74  isk by this rout
48c0: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ine..**.** This 
48d0: 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c  routine just del
48e0: 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73 74  etes the data st
48f0: 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65  ructure.  It doe
4900: 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20  s not unlink.** 
4910: 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20 73  the table data s
4920: 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68  tructure from th
4930: 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42  e hash table.  B
4940: 75 74 20 69 74 20 64 6f 65 73 20 64 65 73 74 72  ut it does destr
4950: 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72  oy.** memory str
4960: 75 63 74 75 72 65 73 20 6f 66 20 74 68 65 20 69  uctures of the i
4970: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
4980: 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74  gn keys associat
4990: 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20  ed with .** the 
49a0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
49b0: 20 64 62 20 70 61 72 61 6d 65 74 65 72 20 69 73   db parameter is
49c0: 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 74 20 69   optional.  It i
49d0: 73 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20  s needed if the 
49e0: 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 0a 2a 2a  Table object .**
49f0: 20 63 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61 73   contains lookas
4a00: 69 64 65 20 6d 65 6d 6f 72 79 2e 20 20 28 54 61  ide memory.  (Ta
4a10: 62 6c 65 20 6f 62 6a 65 63 74 73 20 69 6e 20 74  ble objects in t
4a20: 68 65 20 73 63 68 65 6d 61 20 64 6f 20 6e 6f 74  he schema do not
4a30: 20 75 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64   use.** lookasid
4a40: 65 20 6d 65 6d 6f 72 79 2c 20 62 75 74 20 73 6f  e memory, but so
4a50: 6d 65 20 65 70 68 65 6d 65 72 61 6c 20 54 61 62  me ephemeral Tab
4a60: 6c 65 20 6f 62 6a 65 63 74 73 20 64 6f 2e 29 20  le objects do.) 
4a70: 20 4f 72 20 74 68 65 0a 2a 2a 20 64 62 20 70 61   Or the.** db pa
4a80: 72 61 6d 65 74 65 72 20 63 61 6e 20 62 65 20 75  rameter can be u
4a90: 73 65 64 20 77 69 74 68 20 64 62 2d 3e 70 6e 42  sed with db->pnB
4aa0: 79 74 65 73 46 72 65 65 64 20 74 6f 20 6d 65 61  ytesFreed to mea
4ab0: 73 75 72 65 20 74 68 65 20 6d 65 6d 6f 72 79 0a  sure the memory.
4ac0: 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 54  ** used by the T
4ad0: 61 62 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  able object..*/.
4ae0: 73 74 61 74 69 63 20 76 6f 69 64 20 53 51 4c 49  static void SQLI
4af0: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 64 65 6c 65  TE_NOINLINE dele
4b00: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
4b10: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  *db, Table *pTab
4b20: 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  le){.  Index *pI
4b30: 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  ndex, *pNext;.  
4b40: 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 6e 4c  TESTONLY( int nL
4b50: 6f 6f 6b 61 73 69 64 65 3b 20 29 20 2f 2a 20 55  ookaside; ) /* U
4b60: 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 6c 6f  sed to verify lo
4b70: 6f 6b 61 73 69 64 65 20 6e 6f 74 20 75 73 65 64  okaside not used
4b80: 20 66 6f 72 20 73 63 68 65 6d 61 20 2a 2f 0a 0a   for schema */..
4b90: 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
4ba0: 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61  number of outsta
4bb0: 6e 64 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20  nding lookaside 
4bc0: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 69 6e 20 73  allocations in s
4bd0: 63 68 65 6d 61 20 54 61 62 6c 65 73 0a 20 20 2a  chema Tables.  *
4be0: 2a 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67  * prior to doing
4bf0: 20 61 6e 79 20 66 72 65 65 28 29 20 6f 70 65 72   any free() oper
4c00: 61 74 69 6f 6e 73 2e 20 20 53 69 6e 63 65 20 73  ations.  Since s
4c10: 63 68 65 6d 61 20 54 61 62 6c 65 73 20 64 6f 20  chema Tables do 
4c20: 6e 6f 74 20 75 73 65 0a 20 20 2a 2a 20 6c 6f 6f  not use.  ** loo
4c30: 6b 61 73 69 64 65 2c 20 74 68 69 73 20 6e 75 6d  kaside, this num
4c40: 62 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63  ber should not c
4c50: 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 54 45 53 54  hange. */.  TEST
4c60: 4f 4e 4c 59 28 20 6e 4c 6f 6f 6b 61 73 69 64 65  ONLY( nLookaside
4c70: 20 3d 20 28 64 62 20 26 26 20 28 70 54 61 62 6c   = (db && (pTabl
4c80: 65 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  e->tabFlags & TF
4c90: 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 29 20  _Ephemeral)==0) 
4ca0: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
4cb0: 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6c             db->l
4cc0: 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20 3a 20  ookaside.nOut : 
4cd0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  0 );..  /* Delet
4ce0: 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73  e all indices as
4cf0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
4d00: 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66  is table. */.  f
4d10: 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62  or(pIndex = pTab
4d20: 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64  le->pIndex; pInd
4d30: 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74  ex; pIndex=pNext
4d40: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
4d50: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
4d60: 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
4d70: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c  ->pSchema==pTabl
4d80: 65 2d 3e 70 53 63 68 65 6d 61 0a 20 20 20 20 20  e->pSchema.     
4d90: 20 20 20 20 7c 7c 20 28 49 73 56 69 72 74 75 61      || (IsVirtua
4da0: 6c 28 70 54 61 62 6c 65 29 20 26 26 20 70 49 6e  l(pTable) && pIn
4db0: 64 65 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51  dex->idxType!=SQ
4dc0: 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50  LITE_IDXTYPE_APP
4dd0: 44 45 46 29 20 29 3b 0a 20 20 20 20 69 66 28 20  DEF) );.    if( 
4de0: 28 64 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 6e  (db==0 || db->pn
4df0: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26  BytesFreed==0) &
4e00: 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61  & !IsVirtual(pTa
4e10: 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68  ble) ){.      ch
4e20: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e 64  ar *zName = pInd
4e30: 65 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20 20  ex->zName; .    
4e40: 20 20 54 45 53 54 4f 4e 4c 59 20 28 20 49 6e 64    TESTONLY ( Ind
4e50: 65 78 20 2a 70 4f 6c 64 20 3d 20 29 20 73 71 6c  ex *pOld = ) sql
4e60: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 0a  ite3HashInsert(.
4e70: 20 20 20 20 20 20 20 20 20 26 70 49 6e 64 65 78           &pIndex
4e80: 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
4e90: 73 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a 20 20 20  sh, zName, 0.   
4ea0: 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
4eb0: 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c  rt( db==0 || sql
4ec0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
4ed0: 65 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65  eld(db, 0, pInde
4ee0: 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20  x->pSchema) );. 
4ef0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c       assert( pOl
4f00: 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20 70 4f 6c  d==pIndex || pOl
4f10: 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  d==0 );.    }.  
4f20: 20 20 66 72 65 65 49 6e 64 65 78 28 64 62 2c 20    freeIndex(db, 
4f30: 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20  pIndex);.  }..  
4f40: 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 66 6f  /* Delete any fo
4f50: 72 65 69 67 6e 20 6b 65 79 73 20 61 74 74 61 63  reign keys attac
4f60: 68 65 64 20 74 6f 20 74 68 69 73 20 74 61 62 6c  hed to this tabl
4f70: 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46  e. */.  sqlite3F
4f80: 6b 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62  kDelete(db, pTab
4f90: 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  le);..  /* Delet
4fa0: 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  e the Table stru
4fb0: 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20  cture itself..  
4fc0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65  */.  sqlite3Dele
4fd0: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62  teColumnNames(db
4fe0: 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c  , pTable);.  sql
4ff0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5000: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  Table->zName);. 
5010: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5020: 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41  b, pTable->zColA
5030: 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ff);.  sqlite3Se
5040: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
5050: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b  Table->pSelect);
5060: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
5070: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61  stDelete(db, pTa
5080: 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 69  ble->pCheck);.#i
5090: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
50a0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
50b0: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61   sqlite3VtabClea
50c0: 72 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 23  r(db, pTable);.#
50d0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44  endif.  sqlite3D
50e0: 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65  bFree(db, pTable
50f0: 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  );..  /* Verify 
5100: 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61 73 69 64  that no lookasid
5110: 65 20 6d 65 6d 6f 72 79 20 77 61 73 20 75 73 65  e memory was use
5120: 64 20 62 79 20 73 63 68 65 6d 61 20 74 61 62 6c  d by schema tabl
5130: 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
5140: 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30 20 7c 7c  nLookaside==0 ||
5150: 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 64 62 2d   nLookaside==db-
5160: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20  >lookaside.nOut 
5170: 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  );.}.void sqlite
5180: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  3DeleteTable(sql
5190: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
51a0: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 2f 2a 20 44  *pTable){.  /* D
51b0: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
51c0: 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65   table until the
51d0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
51e0: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a   reaches zero. *
51f0: 2f 0a 20 20 69 66 28 20 21 70 54 61 62 6c 65 20  /.  if( !pTable 
5200: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
5210: 28 28 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42  ((!db || db->pnB
5220: 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26  ytesFreed==0) &&
5230: 20 28 2d 2d 70 54 61 62 6c 65 2d 3e 6e 54 61 62   (--pTable->nTab
5240: 52 65 66 29 3e 30 29 20 29 20 72 65 74 75 72 6e  Ref)>0) ) return
5250: 3b 0a 20 20 64 65 6c 65 74 65 54 61 62 6c 65 28  ;.  deleteTable(
5260: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a  db, pTable);.}..
5270: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68  ./*.** Unlink th
5280: 65 20 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72  e given table fr
5290: 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  om the hash tabl
52a0: 65 73 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74  es and the delet
52b0: 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73  e the.** table s
52c0: 74 72 75 63 74 75 72 65 20 77 69 74 68 20 61 6c  tructure with al
52d0: 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e  l its indices an
52e0: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a  d foreign keys..
52f0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55  */.void sqlite3U
5300: 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61  nlinkAndDeleteTa
5310: 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ble(sqlite3 *db,
5320: 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20   int iDb, const 
5330: 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b  char *zTabName){
5340: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 44  .  Table *p;.  D
5350: 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72  b *pDb;..  asser
5360: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t( db!=0 );.  as
5370: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
5380: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
5390: 20 61 73 73 65 72 74 28 20 7a 54 61 62 4e 61 6d   assert( zTabNam
53a0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
53b0: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
53c0: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
53d0: 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ) );.  testcase(
53e0: 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20   zTabName[0]==0 
53f0: 29 3b 20 20 2f 2a 20 5a 65 72 6f 2d 6c 65 6e 67  );  /* Zero-leng
5400: 74 68 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 61  th table names a
5410: 72 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20  re allowed */.  
5420: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
5430: 44 62 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74  Db];.  p = sqlit
5440: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44  e3HashInsert(&pD
5450: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  b->pSchema->tblH
5460: 61 73 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 30  ash, zTabName, 0
5470: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65  );.  sqlite3Dele
5480: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a  teTable(db, p);.
5490: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
54a0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
54b0: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  ges;.}../*.** Gi
54c0: 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74  ven a token, ret
54d0: 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61  urn a string tha
54e0: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68  t consists of th
54f0: 65 20 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a  e text of that.*
5500: 2a 20 74 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20  * token.  Space 
5510: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
5520: 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69  rned string.** i
5530: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
5540: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
5550: 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
5560: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a   by the calling.
5570: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  ** function..**.
5580: 2a 2a 20 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e  ** Any quotation
5590: 20 6d 61 72 6b 73 20 28 65 78 3a 20 20 22 6e 61   marks (ex:  "na
55a0: 6d 65 22 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61  me", 'name', [na
55b0: 6d 65 5d 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20  me], or `name`) 
55c0: 74 68 61 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64  that.** surround
55d0: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
55e0: 20 74 6f 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76   token are remov
55f0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73  ed..**.** Tokens
5600: 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73 74 20   are often just 
5610: 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74 68  pointers into th
5620: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74  e original SQL t
5630: 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72  ext and so.** ar
5640: 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d 69  e not \000 termi
5650: 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20 6e 6f  nated and are no
5660: 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20 20 54  t persistent.  T
5670: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
5680: 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74 65  ng.** is \000 te
5690: 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69 73 20  rminated and is 
56a0: 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63  persistent..*/.c
56b0: 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65  har *sqlite3Name
56c0: 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65  FromToken(sqlite
56d0: 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e  3 *db, Token *pN
56e0: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
56f0: 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65  ame;.  if( pName
5700: 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
5710: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
5720: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d  (db, (char*)pNam
5730: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
5740: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75  .    sqlite3Dequ
5750: 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65  ote(zName);.  }e
5760: 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  lse{.    zName =
5770: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
5780: 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zName;.}../*.**
5790: 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65   Open the sqlite
57a0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73 74  _master table st
57b0: 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73 65  ored in database
57c0: 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72 0a   number iDb for.
57d0: 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65 20  ** writing. The 
57e0: 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 20  table is opened 
57f0: 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a  using cursor 0..
5800: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f  */.void sqlite3O
5810: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 50  penMasterTable(P
5820: 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44 62  arse *p, int iDb
5830: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
5840: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 29  qlite3GetVdbe(p)
5850: 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65  ;.  sqlite3Table
5860: 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53  Lock(p, iDb, MAS
5870: 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 4d 41 53  TER_ROOT, 1, MAS
5880: 54 45 52 5f 4e 41 4d 45 29 3b 0a 20 20 73 71 6c  TER_NAME);.  sql
5890: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
58a0: 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  t(v, OP_OpenWrit
58b0: 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  e, 0, MASTER_ROO
58c0: 54 2c 20 69 44 62 2c 20 35 29 3b 0a 20 20 69 66  T, iDb, 5);.  if
58d0: 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a  ( p->nTab==0 ){.
58e0: 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b      p->nTab = 1;
58f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  .  }.}../*.** Pa
5900: 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f  rameter zName po
5910: 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65  ints to a nul-te
5920: 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72 20  rminated buffer 
5930: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e  containing the n
5940: 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61  ame.** of a data
5950: 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74  base ("main", "t
5960: 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65  emp" or the name
5970: 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20   of an attached 
5980: 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  db). This.** fun
5990: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
59a0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  e index of the n
59b0: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
59c0: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a   db->aDb[], or.*
59d0: 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  * -1 if the name
59e0: 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 66  d db cannot be f
59f0: 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
5a00: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 73  ite3FindDbName(s
5a10: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
5a20: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
5a30: 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20    int i = -1;   
5a40: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
5a50: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66  e number */.  if
5a60: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44  ( zName ){.    D
5a70: 62 20 2a 70 44 62 3b 0a 20 20 20 20 66 6f 72 28  b *pDb;.    for(
5a80: 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70  i=(db->nDb-1), p
5a90: 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20  Db=&db->aDb[i]; 
5aa0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d  i>=0; i--, pDb--
5ab0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ){.      if( 0==
5ac0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
5ad0: 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a 4e  Db->zDbSName, zN
5ae0: 61 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ame) ) break;.  
5af0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
5b00: 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   i;.}../*.** The
5b10: 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f   token *pName co
5b20: 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20  ntains the name 
5b30: 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28 65  of a database (e
5b40: 69 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a  ither "main" or.
5b50: 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65  ** "temp" or the
5b60: 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61   name of an atta
5b70: 63 68 65 64 20 64 62 29 2e 20 54 68 69 73 20 72  ched db). This r
5b80: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
5b90: 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74  he.** index of t
5ba0: 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73  he named databas
5bb0: 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20  e in db->aDb[], 
5bc0: 6f 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d  or -1 if the nam
5bd0: 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e  ed db .** does n
5be0: 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74  ot exist..*/.int
5bf0: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73   sqlite3FindDb(s
5c00: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65  qlite3 *db, Toke
5c10: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  n *pName){.  int
5c20: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
5c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c40: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75    /* Database nu
5c50: 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  mber */.  char *
5c60: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5c80: 2a 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65  * Name we are se
5c90: 61 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20  arching for */. 
5ca0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
5cb0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
5cc0: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20  , pName);.  i = 
5cd0: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d  sqlite3FindDbNam
5ce0: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
5cf0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5d00: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  , zName);.  retu
5d10: 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  rn i;.}../* The 
5d20: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72  table or view or
5d30: 20 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73   trigger name is
5d40: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
5d50: 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65  routine via toke
5d60: 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64  ns.** pName1 and
5d70: 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20   pName2. If the 
5d80: 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66  table name was f
5d90: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
5da0: 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  for example:.**.
5db0: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
5dc0: 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a  xxx.yyy (...);.*
5dd0: 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  * .** Then pName
5de0: 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78  1 is set to "xxx
5df0: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79  " and pName2 "yy
5e00: 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  y". On the other
5e10: 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20   hand if.** the 
5e20: 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f  table name is no
5e30: 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  t fully qualifie
5e40: 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43  d, i.e.:.**.** C
5e50: 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28  REATE TABLE yyy(
5e60: 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  ...);.**.** Then
5e70: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
5e80: 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d  o "yyy" and pNam
5e90: 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20  e2 is ""..**.** 
5ea0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
5eb0: 73 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20  s the *ppUnqual 
5ec0: 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74  pointer to point
5ed0: 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70   at the token (p
5ee0: 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d  Name1 or.** pNam
5ef0: 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20  e2) that stores 
5f00: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
5f10: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65  table name.  The
5f20: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
5f30: 20 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20   database "xxx" 
5f40: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
5f50: 69 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61  int sqlite3TwoPa
5f60: 72 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20  rtName(.  Parse 
5f70: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
5f80: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
5f90: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
5fa0: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
5fb0: 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a  *pName1,      /*
5fc0: 20 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68   The "xxx" in th
5fd0: 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22  e name "xxx.yyy"
5fe0: 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54   or "xxx" */.  T
5ff0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
6000: 20 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20     /* The "yyy" 
6010: 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78  in the name "xxx
6020: 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e  .yyy" */.  Token
6030: 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f   **pUnqual     /
6040: 2a 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75  * Write the unqu
6050: 61 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e  alified object n
6060: 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ame here */.){. 
6070: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
6080: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6090: 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
60a0: 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   the object */. 
60b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
60c0: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73  Parse->db;..  as
60d0: 73 65 72 74 28 20 70 4e 61 6d 65 32 21 3d 30 20  sert( pName2!=0 
60e0: 29 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 32 2d  );.  if( pName2-
60f0: 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  >n>0 ){.    if( 
6100: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 20  db->init.busy ) 
6110: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
6120: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
6130: 22 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73  "corrupt databas
6140: 65 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  e");.      retur
6150: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n -1;.    }.    
6160: 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65  *pUnqual = pName
6170: 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  2;.    iDb = sql
6180: 69 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70  ite3FindDb(db, p
6190: 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20  Name1);.    if( 
61a0: 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73  iDb<0 ){.      s
61b0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
61c0: 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20  Parse, "unknown 
61d0: 64 61 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e  database %T", pN
61e0: 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 72 65 74  ame1);.      ret
61f0: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
6200: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
6210: 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d  t( db->init.iDb=
6220: 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62  =0 || db->init.b
6230: 75 73 79 20 7c 7c 20 28 64 62 2d 3e 66 6c 61 67  usy || (db->flag
6240: 73 20 26 20 53 51 4c 49 54 45 5f 56 61 63 75 75  s & SQLITE_Vacuu
6250: 6d 29 21 3d 30 29 3b 0a 20 20 20 20 69 44 62 20  m)!=0);.    iDb 
6260: 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a  = db->init.iDb;.
6270: 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70      *pUnqual = p
6280: 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74  Name1;.  }.  ret
6290: 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn iDb;.}../*.*
62a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
62b0: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
62c0: 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 74 72  if the UTF-8 str
62d0: 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c  ing zName is a l
62e0: 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66  egal.** unqualif
62f0: 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e  ied name for a n
6300: 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  ew schema object
6310: 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20   (table, index, 
6320: 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67  view or.** trigg
6330: 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61  er). All names a
6340: 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20  re legal except 
6350: 74 68 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e  those that begin
6360: 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67   with the string
6370: 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69  .** "sqlite_" (i
6380: 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f  n upper, lower o
6390: 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54  r mixed case). T
63a0: 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  his portion of t
63b0: 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20  he namespace.** 
63c0: 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  is reserved for 
63d0: 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f  internal use..*/
63e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
63f0: 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73  kObjectName(Pars
6400: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
6410: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
6420: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62   if( !pParse->db
6430: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70  ->init.busy && p
6440: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30  Parse->nested==0
6450: 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28   .          && (
6460: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
6470: 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74 65  s & SQLITE_Write
6480: 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20  Schema)==0.     
6490: 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74       && 0==sqlit
64a0: 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65  e3StrNICmp(zName
64b0: 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 20  , "sqlite_", 7) 
64c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
64d0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
64e0: 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73 65  object name rese
64f0: 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61  rved for interna
6500: 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d  l use: %s", zNam
6510: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
6520: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
6530: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6540: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
6550: 74 75 72 6e 20 74 68 65 20 50 52 49 4d 41 52 59  turn the PRIMARY
6560: 20 4b 45 59 20 69 6e 64 65 78 20 6f 66 20 61 20   KEY index of a 
6570: 74 61 62 6c 65 0a 2a 2f 0a 49 6e 64 65 78 20 2a  table.*/.Index *
6580: 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
6590: 79 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54  yIndex(Table *pT
65a0: 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b  ab){.  Index *p;
65b0: 0a 20 20 66 6f 72 28 70 3d 70 54 61 62 2d 3e 70  .  for(p=pTab->p
65c0: 49 6e 64 65 78 3b 20 70 20 26 26 20 21 49 73 50  Index; p && !IsP
65d0: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
65e0: 29 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d  ); p=p->pNext){}
65f0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
6600: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
6610: 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   column of index
6620: 20 70 49 64 78 20 74 68 61 74 20 63 6f 72 72 65   pIdx that corre
6630: 73 70 6f 6e 64 73 20 74 6f 20 74 61 62 6c 65 0a  sponds to table.
6640: 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 20  ** column iCol. 
6650: 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 6e 6f   Return -1 if no
6660: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 31 36 20  t found..*/.i16 
6670: 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49  sqlite3ColumnOfI
6680: 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64 78  ndex(Index *pIdx
6690: 2c 20 69 31 36 20 69 43 6f 6c 29 7b 0a 20 20 69  , i16 iCol){.  i
66a0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
66b0: 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   i<pIdx->nColumn
66c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
66d0: 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61 69 43 6f  iCol==pIdx->aiCo
66e0: 6c 75 6d 6e 5b 69 5d 20 29 20 72 65 74 75 72 6e  lumn[i] ) return
66f0: 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
6700: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65   -1;.}../*.** Be
6710: 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67  gin constructing
6720: 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70   a new table rep
6730: 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d  resentation in m
6740: 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a  emory.  This is.
6750: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66 20  ** the first of 
6760: 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72  several action r
6770: 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65 74  outines that get
6780: 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f   called in respo
6790: 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41  nse.** to a CREA
67a0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
67b0: 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c  nt.  In particul
67c0: 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ar, this routine
67d0: 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66   is called.** af
67e0: 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e  ter seeing token
67f0: 73 20 22 43 52 45 41 54 45 22 20 61 6e 64 20 22  s "CREATE" and "
6800: 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74  TABLE" and the t
6810: 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 69  able name. The i
6820: 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73  sTemp.** flag is
6830: 20 74 72 75 65 20 69 66 20 74 68 65 20 74 61 62   true if the tab
6840: 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f  le should be sto
6850: 72 65 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c  red in the auxil
6860: 69 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a  iary database.**
6870: 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
6880: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
6890: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69  abase file.  Thi
68a0: 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68  s is normally th
68b0: 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74  e case.** when t
68c0: 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45  he "TEMP" or "TE
68d0: 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64  MPORARY" keyword
68e0: 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65   occurs in betwe
68f0: 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64  en.** CREATE and
6900: 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68   TABLE..**.** Th
6910: 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f  e new table reco
6920: 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  rd is initialize
6930: 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61  d and put in pPa
6940: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a  rse->pNewTable..
6950: 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68  ** As more of th
6960: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
6970: 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73  tatement is pars
6980: 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61  ed, additional a
6990: 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65  ction.** routine
69a0: 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  s will be called
69b0: 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66   to add more inf
69c0: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73  ormation to this
69d0: 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74   record..** At t
69e0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52  he end of the CR
69f0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
6a00: 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65  ment, the sqlite
6a10: 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74  3EndTable() rout
6a20: 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
6a30: 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65   to complete the
6a40: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66   construction of
6a50: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   the new table r
6a60: 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ecord..*/.void s
6a70: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
6a80: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
6a90: 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63  e,   /* Parser c
6aa0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
6ab0: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20  n *pName1,   /* 
6ac0: 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 74 68  First part of th
6ad0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
6ae0: 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ble or view */. 
6af0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
6b00: 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74    /* Second part
6b10: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   of the name of 
6b20: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
6b30: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  w */.  int isTem
6b40: 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  p,      /* True 
6b50: 69 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  if this is a TEM
6b60: 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  P table */.  int
6b70: 20 69 73 56 69 65 77 2c 20 20 20 20 20 20 2f 2a   isView,      /*
6b80: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
6b90: 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74   a VIEW */.  int
6ba0: 20 69 73 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a   isVirtual,   /*
6bb0: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
6bc0: 20 61 20 56 49 52 54 55 41 4c 20 74 61 62 6c 65   a VIRTUAL table
6bd0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20   */.  int noErr 
6be0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
6bf0: 68 69 6e 67 20 69 66 20 74 61 62 6c 65 20 61 6c  hing if table al
6c00: 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
6c10: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
6c20: 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  le;.  char *zNam
6c30: 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61  e = 0; /* The na
6c40: 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  me of the new ta
6c50: 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
6c60: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
6c70: 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
6c80: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
6c90: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
6ca0: 62 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68  ber to create th
6cb0: 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20  e table in */.  
6cc0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20  Token *pName;   
6cd0: 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20   /* Unqualified 
6ce0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
6cf0: 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a  e to create */..
6d00: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
6d10: 75 73 79 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  usy && db->init.
6d20: 6e 65 77 54 6e 75 6d 3d 3d 31 20 29 7b 0a 20 20  newTnum==1 ){.  
6d30: 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73    /* Special cas
6d40: 65 3a 20 20 50 61 72 73 69 6e 67 20 74 68 65 20  e:  Parsing the 
6d50: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 6f 72  sqlite_master or
6d60: 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73   sqlite_temp_mas
6d70: 74 65 72 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20  ter schema */.  
6d80: 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74    iDb = db->init
6d90: 2e 69 44 62 3b 0a 20 20 20 20 7a 4e 61 6d 65 20  .iDb;.    zName 
6da0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
6db0: 70 28 64 62 2c 20 53 43 48 45 4d 41 5f 54 41 42  p(db, SCHEMA_TAB
6dc0: 4c 45 28 69 44 62 29 29 3b 0a 20 20 20 20 70 4e  LE(iDb));.    pN
6dd0: 61 6d 65 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20  ame = pName1;.  
6de0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
6df0: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f  e common case */
6e00: 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
6e10: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
6e20: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
6e30: 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
6e40: 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72     if( iDb<0 ) r
6e50: 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 21  eturn;.    if( !
6e60: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
6e70: 73 54 65 6d 70 20 26 26 20 70 4e 61 6d 65 32 2d  sTemp && pName2-
6e80: 3e 6e 3e 30 20 26 26 20 69 44 62 21 3d 31 20 29  >n>0 && iDb!=1 )
6e90: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 63 72  {.      /* If cr
6ea0: 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74 61  eating a temp ta
6eb0: 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61  ble, the name ma
6ec0: 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69  y not be qualifi
6ed0: 65 64 2e 20 55 6e 6c 65 73 73 20 0a 20 20 20 20  ed. Unless .    
6ee0: 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
6ef0: 65 20 6e 61 6d 65 20 69 73 20 22 74 65 6d 70 22  e name is "temp"
6f00: 20 61 6e 79 77 61 79 2e 20 20 2a 2f 0a 20 20 20   anyway.  */.   
6f10: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
6f20: 73 67 28 70 50 61 72 73 65 2c 20 22 74 65 6d 70  sg(pParse, "temp
6f30: 6f 72 61 72 79 20 74 61 62 6c 65 20 6e 61 6d 65  orary table name
6f40: 20 6d 75 73 74 20 62 65 20 75 6e 71 75 61 6c 69   must be unquali
6f50: 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 72 65  fied");.      re
6f60: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
6f70: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
6f80: 20 26 26 20 69 73 54 65 6d 70 20 29 20 69 44 62   && isTemp ) iDb
6f90: 20 3d 20 31 3b 0a 20 20 20 20 7a 4e 61 6d 65 20   = 1;.    zName 
6fa0: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
6fb0: 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65  mToken(db, pName
6fc0: 29 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d  );.  }.  pParse-
6fd0: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70  >sNameToken = *p
6fe0: 4e 61 6d 65 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  Name;.  if( zNam
6ff0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
7000: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
7010: 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
7020: 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a  ctName(pParse, z
7030: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  Name) ){.    got
7040: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
7050: 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  ror;.  }.  if( d
7060: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29  b->init.iDb==1 )
7070: 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66   isTemp = 1;.#if
7080: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7090: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
70a0: 20 61 73 73 65 72 74 28 20 69 73 54 65 6d 70 3d   assert( isTemp=
70b0: 3d 30 20 7c 7c 20 69 73 54 65 6d 70 3d 3d 31 20  =0 || isTemp==1 
70c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 56  );.  assert( isV
70d0: 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69 65 77  iew==0 || isView
70e0: 3d 3d 31 20 29 3b 0a 20 20 7b 0a 20 20 20 20 73  ==1 );.  {.    s
70f0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
7100: 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Code[] = {.     
7110: 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f    SQLITE_CREATE_
7120: 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 53 51  TABLE,.       SQ
7130: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
7140: 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 53  _TABLE,.       S
7150: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45  QLITE_CREATE_VIE
7160: 57 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45  W,.       SQLITE
7170: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45  _CREATE_TEMP_VIE
7180: 57 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 68 61  W.    };.    cha
7190: 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
71a0: 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a  [iDb].zDbSName;.
71b0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
71c0: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
71d0: 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
71e0: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54  SCHEMA_TABLE(isT
71f0: 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b  emp), 0, zDb) ){
7200: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
7210: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
7220: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73     }.    if( !is
7230: 56 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74  Virtual && sqlit
7240: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
7250: 73 65 2c 20 28 69 6e 74 29 61 43 6f 64 65 5b 69  se, (int)aCode[i
7260: 73 54 65 6d 70 2b 32 2a 69 73 56 69 65 77 5d 2c  sTemp+2*isView],
7270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7290: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 30          zName, 0
72a0: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
72b0: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
72c0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
72d0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d  }.#endif..  /* M
72e0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77  ake sure the new
72f0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73   table name does
7300: 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74   not collide wit
7310: 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20  h an existing.  
7320: 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
7330: 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 61  e name in the sa
7340: 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 73  me database.  Is
7350: 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  sue an error mes
7360: 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74 20  sage if.  ** it 
7370: 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70 74  does. The except
7380: 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73 74  ion is if the st
7390: 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70 61  atement being pa
73a0: 72 73 65 64 20 77 61 73 20 70 61 73 73 65 64 0a  rsed was passed.
73b0: 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74    ** to an sqlit
73c0: 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28  e3_declare_vtab(
73d0: 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20  ) call. In that 
73e0: 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f  case only the co
73f0: 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20  lumn names.  ** 
7400: 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20 62  and types will b
7410: 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72 65  e used, so there
7420: 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74   is no need to t
7430: 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61 63  est for namespac
7440: 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e  e.  ** collision
7450: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 49  s..  */.  if( !I
7460: 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
7470: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20  {.    char *zDb 
7480: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
7490: 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  DbSName;.    if(
74a0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
74b0: 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
74c0: 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67  arse) ){.      g
74d0: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
74e0: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
74f0: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
7500: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
7510: 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20 20  Name, zDb);.    
7520: 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20  if( pTable ){.  
7530: 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29      if( !noErr )
7540: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7550: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
7560: 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65  , "table %T alre
7570: 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61  ady exists", pNa
7580: 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
7590: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
75a0: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
75b0: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
75c0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
75d0: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
75e0: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
75f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
7600: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7610: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
7620: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49  if( sqlite3FindI
7630: 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
7640: 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  zDb)!=0 ){.     
7650: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7660: 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
7670: 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e  is already an in
7680: 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  dex named %s", z
7690: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
76a0: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
76b0: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ror;.    }.  }..
76c0: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
76d0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
76e0: 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
76f0: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  );.  if( pTable=
7700: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
7710: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
7720: 65 64 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65  ed );.    pParse
7730: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
7740: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 70 50  MEM_BKPT;.    pP
7750: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
7760: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
7770: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  le_error;.  }.  
7780: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20  pTable->zName = 
7790: 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d  zName;.  pTable-
77a0: 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70  >iPKey = -1;.  p
77b0: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d  Table->pSchema =
77c0: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
77d0: 63 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d  chema;.  pTable-
77e0: 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20 20  >nTabRef = 1;.  
77f0: 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45  pTable->nRowLogE
7800: 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74  st = 200; assert
7810: 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  ( 200==sqlite3Lo
7820: 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b  gEst(1048576) );
7830: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
7840: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20  e->pNewTable==0 
7850: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  );.  pParse->pNe
7860: 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b  wTable = pTable;
7870: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
7880: 73 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69  s the magic sqli
7890: 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
78a0: 65 20 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e  e used by autoin
78b0: 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68  crement,.  ** th
78c0: 65 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e  en record a poin
78d0: 74 65 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c  ter to this tabl
78e0: 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  e in the main da
78f0: 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
7900: 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e  .  ** so that IN
7910: 53 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68  SERT can find th
7920: 65 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a  e table easily..
7930: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
7940: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
7950: 52 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50  REMENT.  if( !pP
7960: 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20  arse->nested && 
7970: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  strcmp(zName, "s
7980: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29  qlite_sequence")
7990: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
79a0: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
79b0: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
79c0: 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 54 61  b, 0) );.    pTa
79d0: 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53  ble->pSchema->pS
79e0: 65 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a  eqTab = pTable;.
79f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
7a00: 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e   Begin generatin
7a10: 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  g the code that 
7a20: 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20  will insert the 
7a30: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74  table record int
7a40: 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54  o.  ** the SQLIT
7a50: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20  E_MASTER table. 
7a60: 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75   Note in particu
7a70: 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74  lar that we must
7a80: 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61   go ahead.  ** a
7a90: 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  nd allocate the 
7aa0: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f  record number fo
7ab0: 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72  r the table entr
7ac0: 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61  y now.  Before a
7ad0: 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20  ny.  ** PRIMARY 
7ae0: 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65  KEY or UNIQUE ke
7af0: 79 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65  ywords are parse
7b00: 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72  d.  Those keywor
7b10: 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20  ds will cause.  
7b20: 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65  ** indices to be
7b30: 20 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65   created and the
7b40: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75   table record mu
7b50: 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74  st come before t
7b60: 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73  he .  ** indices
7b70: 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65  .  Hence, the re
7b80: 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20  cord number for 
7b90: 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62  the table must b
7ba0: 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a  e allocated.  **
7bb0: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   now..  */.  if(
7bc0: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
7bd0: 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47  && (v = sqlite3G
7be0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21  etVdbe(pParse))!
7bf0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  =0 ){.    int ad
7c00: 64 72 31 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c  dr1;.    int fil
7c10: 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20 69 6e 74  eFormat;.    int
7c20: 20 72 65 67 31 2c 20 72 65 67 32 2c 20 72 65 67   reg1, reg2, reg
7c30: 33 3b 0a 20 20 20 20 2f 2a 20 6e 75 6c 6c 52 6f  3;.    /* nullRo
7c40: 77 5b 5d 20 69 73 20 61 6e 20 4f 50 5f 52 65 63  w[] is an OP_Rec
7c50: 6f 72 64 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  ord encoding of 
7c60: 61 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67  a row containing
7c70: 20 35 20 4e 55 4c 4c 73 20 2a 2f 0a 20 20 20 20   5 NULLs */.    
7c80: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
7c90: 72 20 6e 75 6c 6c 52 6f 77 5b 5d 20 3d 20 7b 20  r nullRow[] = { 
7ca0: 36 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  6, 0, 0, 0, 0, 0
7cb0: 20 7d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   };.    sqlite3B
7cc0: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
7cd0: 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
7ce0: 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  b);..#ifndef SQL
7cf0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
7d00: 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 69 73  TABLE.    if( is
7d10: 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20  Virtual ){.     
7d20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7d30: 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29  p0(v, OP_VBegin)
7d40: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
7d50: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
7d60: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e  le format and en
7d70: 63 6f 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61  coding in the da
7d80: 74 61 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20  tabase have not 
7d90: 62 65 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a  been set, .    *
7da0: 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a  * set them now..
7db0: 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 31 20      */.    reg1 
7dc0: 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77  = pParse->regRow
7dd0: 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  id = ++pParse->n
7de0: 4d 65 6d 3b 0a 20 20 20 20 72 65 67 32 20 3d 20  Mem;.    reg2 = 
7df0: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 20  pParse->regRoot 
7e00: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
7e10: 3b 0a 20 20 20 20 72 65 67 33 20 3d 20 2b 2b 70  ;.    reg3 = ++p
7e20: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
7e30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7e40: 70 33 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f  p3(v, OP_ReadCoo
7e50: 6b 69 65 2c 20 69 44 62 2c 20 72 65 67 33 2c 20  kie, iDb, reg3, 
7e60: 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41  BTREE_FILE_FORMA
7e70: 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  T);.    sqlite3V
7e80: 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20  dbeUsesBtree(v, 
7e90: 69 44 62 29 3b 0a 20 20 20 20 61 64 64 72 31 20  iDb);.    addr1 
7ea0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
7eb0: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op1(v, OP_If, re
7ec0: 67 33 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  g3); VdbeCoverag
7ed0: 65 28 76 29 3b 0a 20 20 20 20 66 69 6c 65 46 6f  e(v);.    fileFo
7ee0: 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61 67  rmat = (db->flag
7ef0: 73 20 26 20 53 51 4c 49 54 45 5f 4c 65 67 61 63  s & SQLITE_Legac
7f00: 79 46 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a 20  yFileFmt)!=0 ?. 
7f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f20: 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d 41 58 5f   1 : SQLITE_MAX_
7f30: 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20 20 20  FILE_FORMAT;.   
7f40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7f50: 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  p3(v, OP_SetCook
7f60: 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 46  ie, iDb, BTREE_F
7f70: 49 4c 45 5f 46 4f 52 4d 41 54 2c 20 66 69 6c 65  ILE_FORMAT, file
7f80: 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c  Format);.    sql
7f90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
7fa0: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
7fb0: 69 44 62 2c 20 42 54 52 45 45 5f 54 45 58 54 5f  iDb, BTREE_TEXT_
7fc0: 45 4e 43 4f 44 49 4e 47 2c 20 45 4e 43 28 64 62  ENCODING, ENC(db
7fd0: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
7fe0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
7ff0: 64 64 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  ddr1);..    /* T
8000: 68 69 73 20 6a 75 73 74 20 63 72 65 61 74 65 73  his just creates
8010: 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20   a place-holder 
8020: 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 73 71  record in the sq
8030: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
8040: 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  e..    ** The re
8050: 63 6f 72 64 20 63 72 65 61 74 65 64 20 64 6f 65  cord created doe
8060: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  s not contain an
8070: 79 74 68 69 6e 67 20 79 65 74 2e 20 20 49 74 20  ything yet.  It 
8080: 77 69 6c 6c 20 62 65 20 72 65 70 6c 61 63 65 64  will be replaced
8090: 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 72  .    ** by the r
80a0: 65 61 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f 64  eal entry in cod
80b0: 65 20 67 65 6e 65 72 61 74 65 64 20 61 74 20 73  e generated at s
80c0: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29  qlite3EndTable()
80d0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
80e0: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68  The rowid for th
80f0: 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6c  e new entry is l
8100: 65 66 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  eft in register 
8110: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64  pParse->regRowid
8120: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 6f  ..    ** The roo
8130: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
8140: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 69   the new table i
8150: 73 20 6c 65 66 74 20 69 6e 20 72 65 67 20 70 50  s left in reg pP
8160: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20  arse->regRoot.. 
8170: 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20     ** The rowid 
8180: 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  and root page nu
8190: 6d 62 65 72 20 76 61 6c 75 65 73 20 61 72 65 20  mber values are 
81a0: 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 63 6f  needed by the co
81b0: 64 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 73  de that.    ** s
81c0: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 20 77  qlite3EndTable w
81d0: 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20 20  ill generate..  
81e0: 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
81f0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
8200: 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  EW) || !defined(
8210: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
8220: 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 69 66  UALTABLE).    if
8230: 28 20 69 73 56 69 65 77 20 7c 7c 20 69 73 56 69  ( isView || isVi
8240: 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73  rtual ){.      s
8250: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
8260: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
8270: 30 2c 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 65  0, reg2);.    }e
8280: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b  lse.#endif.    {
8290: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61  .      pParse->a
82a0: 64 64 72 43 72 54 61 62 20 3d 20 73 71 6c 69 74  ddrCrTab = sqlit
82b0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
82c0: 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20  OP_CreateTable, 
82d0: 69 44 62 2c 20 72 65 67 32 29 3b 0a 20 20 20 20  iDb, reg2);.    
82e0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65  }.    sqlite3Ope
82f0: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50 61  nMasterTable(pPa
8300: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  rse, iDb);.    s
8310: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
8320: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
8330: 20 30 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73   0, reg1);.    s
8340: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
8350: 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 36 2c 20  (v, OP_Blob, 6, 
8360: 72 65 67 33 2c 20 30 2c 20 6e 75 6c 6c 52 6f 77  reg3, 0, nullRow
8370: 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P4_STATIC);.  
8380: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8390: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
83a0: 2c 20 30 2c 20 72 65 67 33 2c 20 72 65 67 31 29  , 0, reg3, reg1)
83b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
83c0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
83d0: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
83e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
83f0: 70 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b  p0(v, OP_Close);
8400: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61  .  }..  /* Norma
8410: 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65  l (non-error) re
8420: 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72  turn. */.  retur
8430: 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  n;..  /* If an e
8440: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20  rror occurs, we 
8450: 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67  jump here */.beg
8460: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a  in_table_error:.
8470: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8480: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  db, zName);.  re
8490: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 74 20  turn;.}../* Set 
84a0: 70 72 6f 70 65 72 74 69 65 73 20 6f 66 20 61 20  properties of a 
84b0: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 62 61 73  table column bas
84c0: 65 64 20 6f 6e 20 74 68 65 20 28 6d 61 67 69 63  ed on the (magic
84d0: 61 6c 29 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74  al).** name of t
84e0: 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 23 69  he column..*/.#i
84f0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8500: 48 49 44 44 45 4e 5f 43 4f 4c 55 4d 4e 53 0a 76  HIDDEN_COLUMNS.v
8510: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  oid sqlite3Colum
8520: 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e  nPropertiesFromN
8530: 61 6d 65 28 54 61 62 6c 65 20 2a 70 54 61 62 2c  ame(Table *pTab,
8540: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b 0a   Column *pCol){.
8550: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
8560: 72 6e 69 63 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61  rnicmp(pCol->zNa
8570: 6d 65 2c 20 22 5f 5f 68 69 64 64 65 6e 5f 5f 22  me, "__hidden__"
8580: 2c 20 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 10)==0 ){.    
8590: 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c  pCol->colFlags |
85a0: 3d 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e  = COLFLAG_HIDDEN
85b0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54  ;.  }else if( pT
85c0: 61 62 20 26 26 20 70 43 6f 6c 21 3d 70 54 61 62  ab && pCol!=pTab
85d0: 2d 3e 61 43 6f 6c 20 26 26 20 28 70 43 6f 6c 5b  ->aCol && (pCol[
85e0: 2d 31 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43  -1].colFlags & C
85f0: 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e 29 20 29  OLFLAG_HIDDEN) )
8600: 7b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46  {.    pTab->tabF
8610: 6c 61 67 73 20 7c 3d 20 54 46 5f 4f 4f 4f 48 69  lags |= TF_OOOHi
8620: 64 64 65 6e 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  dden;.  }.}.#end
8630: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  if.../*.** Add a
8640: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74   new column to t
8650: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
8660: 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
8670: 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cted..**.** The 
8680: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
8690: 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66  s routine once f
86a0: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64  or each column d
86b0: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e  eclaration.** in
86c0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
86d0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69  statement.  sqli
86e0: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29 20  te3StartTable() 
86f0: 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66  gets called.** f
8700: 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e  irst to get thin
8710: 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20  gs going.  Then 
8720: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
8730: 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a  called for each.
8740: 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f  ** column..*/.vo
8750: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
8760: 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  umn(Parse *pPars
8770: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  e, Token *pName,
8780: 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a   Token *pType){.
8790: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
87a0: 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  t i;.  char *z;.
87b0: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20    char *zType;. 
87c0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
87d0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
87e0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
87f0: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
8800: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
8810: 74 75 72 6e 3b 0a 23 69 66 20 53 51 4c 49 54 45  turn;.#if SQLITE
8820: 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66  _MAX_COLUMN.  if
8830: 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e  ( p->nCol+1>db->
8840: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
8850: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
8860: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8870: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
8880: 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20  many columns on 
8890: 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  %s", p->zName);.
88a0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
88b0: 23 65 6e 64 69 66 0a 20 20 7a 20 3d 20 73 71 6c  #endif.  z = sql
88c0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
88d0: 64 62 2c 20 70 4e 61 6d 65 2d 3e 6e 20 2b 20 70  db, pName->n + p
88e0: 54 79 70 65 2d 3e 6e 20 2b 20 32 29 3b 0a 20 20  Type->n + 2);.  
88f0: 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
8900: 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70  n;.  memcpy(z, p
8910: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
8920: 6e 29 3b 0a 20 20 7a 5b 70 4e 61 6d 65 2d 3e 6e  n);.  z[pName->n
8930: 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
8940: 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f  Dequote(z);.  fo
8950: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  r(i=0; i<p->nCol
8960: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
8970: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
8980: 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  z, p->aCol[i].zN
8990: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
89a0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
89b0: 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63  (pParse, "duplic
89c0: 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a  ate column name:
89d0: 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20   %s", z);.      
89e0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
89f0: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , z);.      retu
8a00: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rn;.    }.  }.  
8a10: 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30  if( (p->nCol & 0
8a20: 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f  x7)==0 ){.    Co
8a30: 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20  lumn *aNew;.    
8a40: 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  aNew = sqlite3Db
8a50: 52 65 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43  Realloc(db,p->aC
8a60: 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73  ol,(p->nCol+8)*s
8a70: 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d  izeof(p->aCol[0]
8a80: 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77  ));.    if( aNew
8a90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
8aa0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
8ab0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
8ac0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43  .    }.    p->aC
8ad0: 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20  ol = aNew;.  }. 
8ae0: 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c   pCol = &p->aCol
8af0: 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d  [p->nCol];.  mem
8b00: 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a  set(pCol, 0, siz
8b10: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
8b20: 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20  ;.  pCol->zName 
8b30: 3d 20 7a 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  = z;.  sqlite3Co
8b40: 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72  lumnPropertiesFr
8b50: 6f 6d 4e 61 6d 65 28 70 2c 20 70 43 6f 6c 29 3b  omName(p, pCol);
8b60: 0a 20 0a 20 20 69 66 28 20 70 54 79 70 65 2d 3e  . .  if( pType->
8b70: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  n==0 ){.    /* I
8b80: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79  f there is no ty
8b90: 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f  pe specified, co
8ba0: 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64  lumns have the d
8bb0: 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a  efault affinity.
8bc0: 20 20 20 20 2a 2a 20 27 42 4c 4f 42 27 2e 20 2a      ** 'BLOB'. *
8bd0: 2f 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69  /.    pCol->affi
8be0: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
8bf0: 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c  F_BLOB;.    pCol
8c00: 2d 3e 73 7a 45 73 74 20 3d 20 31 3b 0a 20 20 7d  ->szEst = 1;.  }
8c10: 65 6c 73 65 7b 0a 20 20 20 20 7a 54 79 70 65 20  else{.    zType 
8c20: 3d 20 7a 20 2b 20 73 71 6c 69 74 65 33 53 74 72  = z + sqlite3Str
8c30: 6c 65 6e 33 30 28 7a 29 20 2b 20 31 3b 0a 20 20  len30(z) + 1;.  
8c40: 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c 20    memcpy(zType, 
8c50: 70 54 79 70 65 2d 3e 7a 2c 20 70 54 79 70 65 2d  pType->z, pType-
8c60: 3e 6e 29 3b 0a 20 20 20 20 7a 54 79 70 65 5b 70  >n);.    zType[p
8c70: 54 79 70 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  Type->n] = 0;.  
8c80: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
8c90: 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 70 43 6f  (zType);.    pCo
8ca0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  l->affinity = sq
8cb0: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
8cc0: 65 28 7a 54 79 70 65 2c 20 26 70 43 6f 6c 2d 3e  e(zType, &pCol->
8cd0: 73 7a 45 73 74 29 3b 0a 20 20 20 20 70 43 6f 6c  szEst);.    pCol
8ce0: 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f  ->colFlags |= CO
8cf0: 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a 20  LFLAG_HASTYPE;. 
8d00: 20 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a   }.  p->nCol++;.
8d10: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72    pParse->constr
8d20: 61 69 6e 74 4e 61 6d 65 2e 6e 20 3d 20 30 3b 0a  aintName.n = 0;.
8d30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
8d40: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
8d50: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
8d60: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
8d70: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
8d80: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
8d90: 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f  tatement.  A "NO
8da0: 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69  T NULL" constrai
8db0: 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73  nt has.** been s
8dc0: 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e  een on a column.
8dd0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
8de0: 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20  ets the notNull 
8df0: 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  flag on.** the c
8e00: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
8e10: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
8e20: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
8e30: 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61  te3AddNotNull(Pa
8e40: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
8e50: 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62   onError){.  Tab
8e60: 6c 65 20 2a 70 3b 0a 20 20 70 20 3d 20 70 50 61  le *p;.  p = pPa
8e70: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
8e80: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45    if( p==0 || NE
8e90: 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29  VER(p->nCol<1) )
8ea0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 61 43   return;.  p->aC
8eb0: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 2e 6e 6f  ol[p->nCol-1].no
8ec0: 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45 72  tNull = (u8)onEr
8ed0: 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63  ror;.}../*.** Sc
8ee0: 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  an the column ty
8ef0: 70 65 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c  pe name zType (l
8f00: 65 6e 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64  ength nType) and
8f10: 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61   return the.** a
8f20: 73 73 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69  ssociated affini
8f30: 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54  ty type..**.** T
8f40: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
8f50: 20 61 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64   a case-independ
8f60: 65 6e 74 20 73 65 61 72 63 68 20 6f 66 20 7a 54  ent search of zT
8f70: 79 70 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  ype for the .** 
8f80: 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68  substrings in th
8f90: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
8fa0: 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65  e. If one of the
8fb0: 20 73 75 62 73 74 72 69 6e 67 73 20 69 73 0a 2a   substrings is.*
8fc0: 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72  * found, the cor
8fd0: 72 65 73 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e  responding affin
8fe0: 69 74 79 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ity is returned.
8ff0: 20 49 66 20 7a 54 79 70 65 20 63 6f 6e 74 61 69   If zType contai
9000: 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20  ns.** more than 
9010: 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74  one of the subst
9020: 72 69 6e 67 73 2c 20 65 6e 74 72 69 65 73 20 74  rings, entries t
9030: 6f 77 61 72 64 20 74 68 65 20 74 6f 70 20 6f 66  oward the top of
9040: 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74   .** the table t
9050: 61 6b 65 20 70 72 69 6f 72 69 74 79 2e 20 46 6f  ake priority. Fo
9060: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54  r example, if zT
9070: 79 70 65 20 69 73 20 27 42 4c 4f 42 49 4e 54 27  ype is 'BLOBINT'
9080: 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  , .** SQLITE_AFF
9090: 5f 49 4e 54 45 47 45 52 20 69 73 20 72 65 74 75  _INTEGER is retu
90a0: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73  rned..**.** Subs
90b0: 74 72 69 6e 67 20 20 20 20 20 7c 20 41 66 66 69  tring     | Affi
90c0: 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  nity.** --------
90d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90e0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54  --------.** 'INT
90f0: 27 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  '         | SQLI
9100: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a  TE_AFF_INTEGER.*
9110: 2a 20 27 43 48 41 52 27 20 20 20 20 20 20 20 20  * 'CHAR'        
9120: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  | SQLITE_AFF_TEX
9130: 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20 20  T.** 'CLOB'     
9140: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
9150: 54 45 58 54 0a 2a 2a 20 27 54 45 58 54 27 20 20  TEXT.** 'TEXT'  
9160: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
9170: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42  FF_TEXT.** 'BLOB
9180: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
9190: 45 5f 41 46 46 5f 42 4c 4f 42 0a 2a 2a 20 27 52  E_AFF_BLOB.** 'R
91a0: 45 41 4c 27 20 20 20 20 20 20 20 20 7c 20 53 51  EAL'        | SQ
91b0: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a  LITE_AFF_REAL.**
91c0: 20 27 46 4c 4f 41 27 20 20 20 20 20 20 20 20 7c   'FLOA'        |
91d0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
91e0: 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20 20 20 20  .** 'DOUB'      
91f0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52    | SQLITE_AFF_R
9200: 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e  EAL.**.** If non
9210: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
9220: 6e 67 73 20 69 6e 20 74 68 65 20 61 62 6f 76 65  ngs in the above
9230: 20 74 61 62 6c 65 20 61 72 65 20 66 6f 75 6e 64   table are found
9240: 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  ,.** SQLITE_AFF_
9250: 4e 55 4d 45 52 49 43 20 69 73 20 72 65 74 75 72  NUMERIC is retur
9260: 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c  ned..*/.char sql
9270: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
9280: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e  (const char *zIn
9290: 2c 20 75 38 20 2a 70 73 7a 45 73 74 29 7b 0a 20  , u8 *pszEst){. 
92a0: 20 75 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68   u32 h = 0;.  ch
92b0: 61 72 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f  ar aff = SQLITE_
92c0: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63  AFF_NUMERIC;.  c
92d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 61 72  onst char *zChar
92e0: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
92f0: 20 7a 49 6e 21 3d 30 20 29 3b 0a 20 20 77 68 69   zIn!=0 );.  whi
9300: 6c 65 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20  le( zIn[0] ){.  
9310: 20 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73    h = (h<<8) + s
9320: 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77  qlite3UpperToLow
9330: 65 72 5b 28 2a 7a 49 6e 29 26 30 78 66 66 5d 3b  er[(*zIn)&0xff];
9340: 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20  .    zIn++;.    
9350: 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34  if( h==(('c'<<24
9360: 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28 27 61 27  )+('h'<<16)+('a'
9370: 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20 20 20 20  <<8)+'r') ){    
9380: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 48 41 52           /* CHAR
9390: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
93a0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
93b0: 0a 20 20 20 20 20 20 7a 43 68 61 72 20 3d 20 7a  .      zChar = z
93c0: 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  In;.    }else if
93d0: 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b  ( h==(('c'<<24)+
93e0: 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c  ('l'<<16)+('o'<<
93f0: 38 29 2b 27 62 27 29 20 29 7b 20 20 20 20 20 20  8)+'b') ){      
9400: 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20 20   /* CLOB */.    
9410: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
9420: 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c  FF_TEXT;.    }el
9430: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 74 27 3c  se if( h==(('t'<
9440: 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28  <24)+('e'<<16)+(
9450: 27 78 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20  'x'<<8)+'t') ){ 
9460: 20 20 20 20 20 20 2f 2a 20 54 45 58 54 20 2a 2f        /* TEXT */
9470: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
9480: 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20  ITE_AFF_TEXT;.  
9490: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
94a0: 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c  ('b'<<24)+('l'<<
94b0: 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27  16)+('o'<<8)+'b'
94c0: 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c  )          /* BL
94d0: 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26  OB */.        &&
94e0: 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46   (aff==SQLITE_AF
94f0: 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66 66  F_NUMERIC || aff
9500: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
9510: 4c 29 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  L) ){.      aff 
9520: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  = SQLITE_AFF_BLO
9530: 42 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e  B;.      if( zIn
9540: 5b 30 5d 3d 3d 27 28 27 20 29 20 7a 43 68 61 72  [0]=='(' ) zChar
9550: 20 3d 20 7a 49 6e 3b 0a 23 69 66 6e 64 65 66 20   = zIn;.#ifndef 
9560: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
9570: 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d  TING_POINT.    }
9580: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 72  else if( h==(('r
9590: 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29  '<<24)+('e'<<16)
95a0: 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20  +('a'<<8)+'l')  
95b0: 20 20 20 20 20 20 20 20 2f 2a 20 52 45 41 4c 20          /* REAL 
95c0: 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66  */.        && af
95d0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
95e0: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61  MERIC ){.      a
95f0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
9600: 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  REAL;.    }else 
9610: 69 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34  if( h==(('f'<<24
9620: 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27  )+('l'<<16)+('o'
9630: 3c 3c 38 29 2b 27 61 27 29 20 20 20 20 20 20 20  <<8)+'a')       
9640: 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20     /* FLOA */.  
9650: 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51        && aff==SQ
9660: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
9670: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
9680: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b  SQLITE_AFF_REAL;
9690: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
96a0: 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f  ==(('d'<<24)+('o
96b0: 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b  '<<16)+('u'<<8)+
96c0: 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a  'b')          /*
96d0: 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20 20   DOUB */.       
96e0: 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   && aff==SQLITE_
96f0: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20  AFF_NUMERIC ){. 
9700: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
9710: 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64  E_AFF_REAL;.#end
9720: 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  if.    }else if(
9730: 20 28 68 26 30 78 30 30 46 46 46 46 46 46 29 3d   (h&0x00FFFFFF)=
9740: 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27  =(('i'<<16)+('n'
9750: 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20  <<8)+'t') ){    
9760: 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20  /* INT */.      
9770: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
9780: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20  _INTEGER;.      
9790: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
97a0: 0a 0a 20 20 2f 2a 20 49 66 20 70 73 7a 45 73 74  ..  /* If pszEst
97b0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 74   is not NULL, st
97c0: 6f 72 65 20 61 6e 20 65 73 74 69 6d 61 74 65 20  ore an estimate 
97d0: 6f 66 20 74 68 65 20 66 69 65 6c 64 20 73 69 7a  of the field siz
97e0: 65 2e 20 20 54 68 65 0a 20 20 2a 2a 20 65 73 74  e.  The.  ** est
97f0: 69 6d 61 74 65 20 69 73 20 73 63 61 6c 65 64 20  imate is scaled 
9800: 73 6f 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  so that the size
9810: 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 69   of an integer i
9820: 73 20 31 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  s 1.  */.  if( p
9830: 73 7a 45 73 74 20 29 7b 0a 20 20 20 20 2a 70 73  szEst ){.    *ps
9840: 7a 45 73 74 20 3d 20 31 3b 20 20 20 2f 2a 20 64  zEst = 1;   /* d
9850: 65 66 61 75 6c 74 20 73 69 7a 65 20 69 73 20 61  efault size is a
9860: 70 70 72 6f 78 20 34 20 62 79 74 65 73 20 2a 2f  pprox 4 bytes */
9870: 0a 20 20 20 20 69 66 28 20 61 66 66 3c 53 51 4c  .    if( aff<SQL
9880: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
9890: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 68  ){.      if( zCh
98a0: 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  ar ){.        wh
98b0: 69 6c 65 28 20 7a 43 68 61 72 5b 30 5d 20 29 7b  ile( zChar[0] ){
98c0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
98d0: 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 43  qlite3Isdigit(zC
98e0: 68 61 72 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  har[0]) ){.     
98f0: 20 20 20 20 20 20 20 69 6e 74 20 76 20 3d 20 30         int v = 0
9900: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
9910: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a 43  lite3GetInt32(zC
9920: 68 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20  har, &v);.      
9930: 20 20 20 20 20 20 76 20 3d 20 76 2f 34 20 2b 20        v = v/4 + 
9940: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  1;.            i
9950: 66 28 20 76 3e 32 35 35 20 29 20 76 20 3d 20 32  f( v>255 ) v = 2
9960: 35 35 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  55;.            
9970: 2a 70 73 7a 45 73 74 20 3d 20 76 3b 20 2f 2a 20  *pszEst = v; /* 
9980: 42 4c 4f 42 28 6b 29 2c 20 56 41 52 43 48 41 52  BLOB(k), VARCHAR
9990: 28 6b 29 2c 20 43 48 41 52 28 6b 29 20 2d 3e 20  (k), CHAR(k) -> 
99a0: 72 3d 28 6b 2f 34 2b 31 29 20 2a 2f 0a 20 20 20  r=(k/4+1) */.   
99b0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
99c0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
99d0: 20 20 20 20 20 20 7a 43 68 61 72 2b 2b 3b 0a 20        zChar++;. 
99e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
99f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70  else{.        *p
9a00: 73 7a 45 73 74 20 3d 20 35 3b 20 20 20 2f 2a 20  szEst = 5;   /* 
9a10: 42 4c 4f 42 2c 20 54 45 58 54 2c 20 43 4c 4f 42  BLOB, TEXT, CLOB
9a20: 20 2d 3e 20 72 3d 35 20 20 28 61 70 70 72 6f 78   -> r=5  (approx
9a30: 20 32 30 20 62 79 74 65 73 29 2a 2f 0a 20 20 20   20 bytes)*/.   
9a40: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
9a50: 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a   return aff;.}..
9a60: 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73  /*.** The expres
9a70: 73 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61  sion is the defa
9a80: 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
9a90: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
9aa0: 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  added column.** 
9ab0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  of the table cur
9ac0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
9ad0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
9ae0: 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65   Default value e
9af0: 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20  xpressions must 
9b00: 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61  be constant.  Ra
9b10: 69 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e  ise an exception
9b20: 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e   if this.** is n
9b30: 6f 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a  ot the case..**.
9b40: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9b50: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
9b60: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
9b70: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
9b80: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
9b90: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
9ba0: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
9bb0: 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c  te3AddDefaultVal
9bc0: 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ue(Parse *pParse
9bd0: 2c 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61  , ExprSpan *pSpa
9be0: 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  n){.  Table *p;.
9bf0: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
9c00: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
9c10: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20  pParse->db;.  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 21 3d 30 20  ble;.  if( p!=0 
9c40: 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28  ){.    pCol = &(
9c50: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d  p->aCol[p->nCol-
9c60: 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71  1]);.    if( !sq
9c70: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
9c80: 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 53  antOrFunction(pS
9c90: 70 61 6e 2d 3e 70 45 78 70 72 2c 20 64 62 2d 3e  pan->pExpr, db->
9ca0: 69 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20  init.busy) ){.  
9cb0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
9cc0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 65 66  Msg(pParse, "def
9cd0: 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f  ault value of co
9ce0: 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74  lumn [%s] is not
9cf0: 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20   constant",.    
9d00: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d        pCol->zNam
9d10: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
9d20: 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f       /* A copy o
9d30: 66 20 70 45 78 70 72 20 69 73 20 75 73 65 64 20  f pExpr is used 
9d40: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 6f  instead of the o
9d50: 72 69 67 69 6e 61 6c 2c 20 61 73 20 70 45 78 70  riginal, as pExp
9d60: 72 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20  r contains.     
9d70: 20 2a 2a 20 74 6f 6b 65 6e 73 20 74 68 61 74 20   ** tokens that 
9d80: 70 6f 69 6e 74 20 74 6f 20 76 6f 6c 61 74 69 6c  point to volatil
9d90: 65 20 6d 65 6d 6f 72 79 2e 20 54 68 65 20 27 73  e memory. The 's
9da0: 70 61 6e 27 20 6f 66 20 74 68 65 20 65 78 70 72  pan' of the expr
9db0: 65 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ession.      ** 
9dc0: 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20 70  is required by p
9dd0: 72 61 67 6d 61 20 74 61 62 6c 65 5f 69 6e 66 6f  ragma table_info
9de0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
9df0: 20 45 78 70 72 20 78 3b 0a 20 20 20 20 20 20 73   Expr x;.      s
9e00: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
9e10: 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74  (db, pCol->pDflt
9e20: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  );.      memset(
9e30: 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78 29  &x, 0, sizeof(x)
9e40: 29 3b 0a 20 20 20 20 20 20 78 2e 6f 70 20 3d 20  );.      x.op = 
9e50: 54 4b 5f 53 50 41 4e 3b 0a 20 20 20 20 20 20 78  TK_SPAN;.      x
9e60: 2e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 73 71 6c 69  .u.zToken = sqli
9e70: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
9e80: 20 28 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a   (char*)pSpan->z
9e90: 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20  Start,.         
9ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9eb0: 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
9ec0: 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70  (pSpan->zEnd - p
9ed0: 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a  Span->zStart));.
9ee0: 20 20 20 20 20 20 78 2e 70 4c 65 66 74 20 3d 20        x.pLeft = 
9ef0: 70 53 70 61 6e 2d 3e 70 45 78 70 72 3b 0a 20 20  pSpan->pExpr;.  
9f00: 20 20 20 20 78 2e 66 6c 61 67 73 20 3d 20 45 50      x.flags = EP
9f10: 5f 53 6b 69 70 3b 0a 20 20 20 20 20 20 70 43 6f  _Skip;.      pCo
9f20: 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74  l->pDflt = sqlit
9f30: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 26 78  e3ExprDup(db, &x
9f40: 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
9f50: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9f60: 44 62 46 72 65 65 28 64 62 2c 20 78 2e 75 2e 7a  DbFree(db, x.u.z
9f70: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  Token);.    }.  
9f80: 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
9f90: 65 6c 65 74 65 28 64 62 2c 20 70 53 70 61 6e 2d  elete(db, pSpan-
9fa0: 3e 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >pExpr);.}../*.*
9fb0: 2a 20 42 61 63 6b 77 61 72 64 73 20 43 6f 6d 70  * Backwards Comp
9fc0: 61 74 69 62 69 6c 69 74 79 20 48 61 63 6b 3a 0a  atibility Hack:.
9fd0: 2a 2a 20 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61  ** .** Historica
9fe0: 6c 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  l versions of SQ
9ff0: 4c 69 74 65 20 61 63 63 65 70 74 65 64 20 73 74  Lite accepted st
a000: 72 69 6e 67 73 20 61 73 20 63 6f 6c 75 6d 6e 20  rings as column 
a010: 6e 61 6d 65 73 20 69 6e 0a 2a 2a 20 69 6e 64 65  names in.** inde
a020: 78 65 73 20 61 6e 64 20 50 52 49 4d 41 52 59 20  xes and PRIMARY 
a030: 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  KEY constraints 
a040: 61 6e 64 20 69 6e 20 55 4e 49 51 55 45 20 63 6f  and in UNIQUE co
a050: 6e 73 74 72 61 69 6e 74 73 2e 20 20 45 78 61 6d  nstraints.  Exam
a060: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43  ple:.**.**     C
a070: 52 45 41 54 45 20 54 41 42 4c 45 20 78 79 7a 28  REATE TABLE xyz(
a080: 61 2c 62 2c 63 2c 64 2c 65 2c 50 52 49 4d 41 52  a,b,c,d,e,PRIMAR
a090: 59 20 4b 45 59 28 27 61 27 29 2c 55 4e 49 51 55  Y KEY('a'),UNIQU
a0a0: 45 28 27 62 27 2c 27 63 27 20 43 4f 4c 4c 41 54  E('b','c' COLLAT
a0b0: 45 20 74 72 69 6d 29 0a 2a 2a 20 20 20 20 20 43  E trim).**     C
a0c0: 52 45 41 54 45 20 49 4e 44 45 58 20 61 62 63 20  REATE INDEX abc 
a0d0: 4f 4e 20 78 79 7a 28 27 63 27 2c 27 64 27 20 44  ON xyz('c','d' D
a0e0: 45 53 43 2c 27 65 27 20 43 4f 4c 4c 41 54 45 20  ESC,'e' COLLATE 
a0f0: 6e 6f 63 61 73 65 20 44 45 53 43 29 3b 0a 2a 2a  nocase DESC);.**
a100: 0a 2a 2a 20 54 68 69 73 20 69 73 20 67 6f 6f 66  .** This is goof
a110: 79 2e 20 20 42 75 74 20 74 6f 20 70 72 65 73 65  y.  But to prese
a120: 72 76 65 20 62 61 63 6b 77 61 72 64 73 20 63 6f  rve backwards co
a130: 6d 70 61 74 69 62 69 6c 69 74 79 20 77 65 20 63  mpatibility we c
a140: 6f 6e 74 69 6e 75 65 20 74 6f 0a 2a 2a 20 61 63  ontinue to.** ac
a150: 63 65 70 74 20 69 74 2e 20 20 54 68 69 73 20 72  cept it.  This r
a160: 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
a170: 6e 65 63 65 73 73 61 72 79 20 63 6f 6e 76 65 72  necessary conver
a180: 73 69 6f 6e 2e 20 20 49 74 20 63 6f 6e 76 65 72  sion.  It conver
a190: 74 73 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73  ts.** the expres
a1a0: 73 69 6f 6e 20 67 69 76 65 6e 20 69 6e 20 69 74  sion given in it
a1b0: 73 20 61 72 67 75 6d 65 6e 74 20 66 72 6f 6d 20  s argument from 
a1c0: 61 20 54 4b 5f 53 54 52 49 4e 47 20 69 6e 74 6f  a TK_STRING into
a1d0: 20 61 20 54 4b 5f 49 44 0a 2a 2a 20 69 66 20 74   a TK_ID.** if t
a1e0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
a1f0: 20 6a 75 73 74 20 61 20 54 4b 5f 53 54 52 49 4e   just a TK_STRIN
a200: 47 20 77 69 74 68 20 61 6e 20 6f 70 74 69 6f 6e  G with an option
a210: 61 6c 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73  al COLLATE claus
a220: 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65 70 78  e..** If the epx
a230: 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 79 74 68  ression is anyth
a240: 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 54  ing other than T
a250: 4b 5f 53 54 52 49 4e 47 2c 20 74 68 65 20 65 78  K_STRING, the ex
a260: 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 75  pression is.** u
a270: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61  nchanged..*/.sta
a280: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
a290: 53 74 72 69 6e 67 54 6f 49 64 28 45 78 70 72 20  StringToId(Expr 
a2a0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 70  *p){.  if( p->op
a2b0: 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20  ==TK_STRING ){. 
a2c0: 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44     p->op = TK_ID
a2d0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
a2e0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
a2f0: 26 26 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  && p->pLeft->op=
a300: 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20  =TK_STRING ){.  
a310: 20 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 20 3d    p->pLeft->op =
a320: 20 54 4b 5f 49 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f   TK_ID;.  }.}../
a330: 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74  *.** Designate t
a340: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66  he PRIMARY KEY f
a350: 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70  or the table.  p
a360: 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  List is a list o
a370: 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63  f names .** of c
a380: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d  olumns that form
a390: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
a3a0: 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e  .  If pList is N
a3b0: 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ULL, then the.**
a3c0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
a3d0: 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  dded column of t
a3e0: 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  he table is the 
a3f0: 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a  primary key..**.
a400: 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68  ** A table can h
a410: 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  ave at most one 
a420: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66  primary key.  If
a430: 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61   the table alrea
a440: 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d  dy has.** a prim
a450: 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69  ary key (and thi
a460: 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20  s is the second 
a470: 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65  primary key) the
a480: 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65  n create an.** e
a490: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rror..**.** If t
a4a0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
a4b0: 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f  s on a single co
a4c0: 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74  lumn whose datat
a4d0: 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a  ype is INTEGER,.
a4e0: 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  ** then we will 
a4f0: 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20  try to use that 
a500: 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f  column as the ro
a510: 77 69 64 2e 20 20 53 65 74 20 74 68 65 20 54 61  wid.  Set the Ta
a520: 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65  ble.iPKey.** fie
a530: 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ld of the table 
a540: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
a550: 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64  on to be the ind
a560: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54  ex of the.** INT
a570: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
a580: 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e   column.  Table.
a590: 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20  iPKey is set to 
a5a0: 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a  -1 if there is.*
a5b0: 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49  * no INTEGER PRI
a5c0: 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20  MARY KEY..**.** 
a5d0: 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f  If the key is no
a5e0: 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  t an INTEGER PRI
a5f0: 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63  MARY KEY, then c
a600: 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a  reate a unique.*
a610: 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20  * index for the 
a620: 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69  key.  No index i
a630: 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e  s created for IN
a640: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
a650: 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  Ys..*/.void sqli
a660: 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79  te3AddPrimaryKey
a670: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
a680: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
a690: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
a6a0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
a6b0: 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64  /* List of field
a6c0: 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64   names to be ind
a6d0: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  exed */.  int on
a6e0: 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57  Error,      /* W
a6f0: 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61  hat to do with a
a700: 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66   uniqueness conf
a710: 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75  lict */.  int au
a720: 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54  toInc,      /* T
a730: 72 75 65 20 69 66 20 74 68 65 20 41 55 54 4f 49  rue if the AUTOI
a740: 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64  NCREMENT keyword
a750: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
a760: 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 20   int sortOrder  
a770: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f     /* SQLITE_SO_
a780: 41 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f  ASC or SQLITE_SO
a790: 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61  _DESC */.){.  Ta
a7a0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72  ble *pTab = pPar
a7b0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
a7c0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20   Column *pCol = 
a7d0: 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  0;.  int iCol = 
a7e0: 2d 31 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 54 65  -1, i;.  int nTe
a7f0: 72 6d 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  rm;.  if( pTab==
a800: 30 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79  0 ) goto primary
a810: 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28  _key_exit;.  if(
a820: 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
a830: 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b  & TF_HasPrimaryK
a840: 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
a850: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
a860: 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20  , .      "table 
a870: 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20  \"%s\" has more 
a880: 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79  than one primary
a890: 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61   key", pTab->zNa
a8a0: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72  me);.    goto pr
a8b0: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a  imary_key_exit;.
a8c0: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 74 61 62 46    }.  pTab->tabF
a8d0: 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 50 72  lags |= TF_HasPr
a8e0: 69 6d 61 72 79 4b 65 79 3b 0a 20 20 69 66 28 20  imaryKey;.  if( 
a8f0: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
a900: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f  iCol = pTab->nCo
a910: 6c 20 2d 20 31 3b 0a 20 20 20 20 70 43 6f 6c 20  l - 1;.    pCol 
a920: 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  = &pTab->aCol[iC
a930: 6f 6c 5d 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63  ol];.    pCol->c
a940: 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c  olFlags |= COLFL
a950: 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20  AG_PRIMKEY;.    
a960: 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c  nTerm = 1;.  }el
a970: 73 65 7b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20  se{.    nTerm = 
a980: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
a990: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65    for(i=0; i<nTe
a9a0: 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rm; i++){.      
a9b0: 45 78 70 72 20 2a 70 43 45 78 70 72 20 3d 20 73  Expr *pCExpr = s
a9c0: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
a9d0: 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  llate(pList->a[i
a9e0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
a9f0: 61 73 73 65 72 74 28 20 70 43 45 78 70 72 21 3d  assert( pCExpr!=
aa00: 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
aa10: 65 33 53 74 72 69 6e 67 54 6f 49 64 28 70 43 45  e3StringToId(pCE
aa20: 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
aa30: 70 43 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  pCExpr->op==TK_I
aa40: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  D ){.        con
aa50: 73 74 20 63 68 61 72 20 2a 7a 43 4e 61 6d 65 20  st char *zCName 
aa60: 3d 20 70 43 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  = pCExpr->u.zTok
aa70: 65 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  en;.        for(
aa80: 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61  iCol=0; iCol<pTa
aa90: 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  b->nCol; iCol++)
aaa0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
aab0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
aac0: 43 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f  CName, pTab->aCo
aad0: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d  l[iCol].zName)==
aae0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
aaf0: 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61   pCol = &pTab->a
ab00: 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20  Col[iCol];.     
ab10: 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c         pCol->col
ab20: 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
ab30: 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 20 20  _PRIMKEY;.      
ab40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ab50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ab60: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
ab70: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 54 65 72 6d  .  }.  if( nTerm
ab80: 3d 3d 31 0a 20 20 20 26 26 20 70 43 6f 6c 0a 20  ==1.   && pCol. 
ab90: 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49    && sqlite3StrI
aba0: 43 6d 70 28 73 71 6c 69 74 65 33 43 6f 6c 75 6d  Cmp(sqlite3Colum
abb0: 6e 54 79 70 65 28 70 43 6f 6c 2c 22 22 29 2c 20  nType(pCol,""), 
abc0: 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20  "INTEGER")==0.  
abd0: 20 26 26 20 73 6f 72 74 4f 72 64 65 72 21 3d 53   && sortOrder!=S
abe0: 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 0a 20 20  QLITE_SO_DESC.  
abf0: 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b  ){.    pTab->iPK
ac00: 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70  ey = iCol;.    p
ac10: 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28  Tab->keyConf = (
ac20: 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20  u8)onError;.    
ac30: 61 73 73 65 72 74 28 20 61 75 74 6f 49 6e 63 3d  assert( autoInc=
ac40: 3d 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31  =0 || autoInc==1
ac50: 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61   );.    pTab->ta
ac60: 62 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e  bFlags |= autoIn
ac70: 63 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  c*TF_Autoincreme
ac80: 6e 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  nt;.    if( pLis
ac90: 74 20 29 20 70 50 61 72 73 65 2d 3e 69 50 6b 53  t ) pParse->iPkS
aca0: 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74  ortOrder = pList
acb0: 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
acc0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75  ;.  }else if( au
acd0: 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66  toInc ){.#ifndef
ace0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
acf0: 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73  OINCREMENT.    s
ad00: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
ad10: 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52  Parse, "AUTOINCR
ad20: 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c  EMENT is only al
ad30: 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20  lowed on an ".  
ad40: 20 20 20 20 20 22 49 4e 54 45 47 45 52 20 50 52       "INTEGER PR
ad50: 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e  IMARY KEY");.#en
ad60: 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
ad70: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
ad80: 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30  dex(pParse, 0, 0
ad90: 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72  , 0, pList, onEr
ada0: 72 6f 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  ror, 0,.        
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adc0: 20 20 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c     0, sortOrder,
add0: 20 30 2c 20 53 51 4c 49 54 45 5f 49 44 58 54 59   0, SQLITE_IDXTY
ade0: 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 29 3b 0a  PE_PRIMARYKEY);.
adf0: 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20      pList = 0;. 
ae00: 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f   }..primary_key_
ae10: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45  exit:.  sqlite3E
ae20: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
ae30: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29  arse->db, pList)
ae40: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
ae50: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 43  *.** Add a new C
ae60: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
ae70: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
ae80: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
ae90: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
aea0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 68 65  id sqlite3AddChe
aeb0: 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  ckConstraint(.  
aec0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
aed0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
aee0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
aef0: 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20 54  pCheckExpr  /* T
af00: 68 65 20 63 68 65 63 6b 20 65 78 70 72 65 73 73  he check express
af10: 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  ion */.){.#ifnde
af20: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
af30: 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  ECK.  Table *pTa
af40: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
af50: 54 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33  Table;.  sqlite3
af60: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
af70: 62 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26 26  b;.  if( pTab &&
af80: 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41   !IN_DECLARE_VTA
af90: 42 0a 20 20 20 26 26 20 21 73 71 6c 69 74 65 33  B.   && !sqlite3
afa0: 42 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79 28  BtreeIsReadonly(
afb0: 64 62 2d 3e 61 44 62 5b 64 62 2d 3e 69 6e 69 74  db->aDb[db->init
afc0: 2e 69 44 62 5d 2e 70 42 74 29 0a 20 20 29 7b 0a  .iDb].pBt).  ){.
afd0: 20 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63 6b      pTab->pCheck
afe0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
aff0: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
b000: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 70   pTab->pCheck, p
b010: 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 20 20  CheckExpr);.    
b020: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73  if( pParse->cons
b030: 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a  traintName.n ){.
b040: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
b050: 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
b060: 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65 63  rse, pTab->pChec
b070: 6b 2c 20 26 70 50 61 72 73 65 2d 3e 63 6f 6e 73  k, &pParse->cons
b080: 74 72 61 69 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a  traintName, 1);.
b090: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65      }.  }else.#e
b0a0: 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ndif.  {.    sql
b0b0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
b0c0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 43 68 65 63  Parse->db, pChec
b0d0: 6b 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  kExpr);.  }.}../
b0e0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c  *.** Set the col
b0f0: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
b100: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
b110: 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c  ntly parsed tabl
b120: 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74  e column.** to t
b130: 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e  he CollSeq given
b140: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b150: 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28  3AddCollateType(
b160: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
b170: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
b180: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
b190: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c   i;.  char *zCol
b1a0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
b1b0: 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61 6d 65  /* Dequoted name
b1c0: 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65   of collation se
b1d0: 71 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69  quence */.  sqli
b1e0: 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
b1f0: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
b200: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
b210: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
b220: 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50 61  ol-1;.  db = pPa
b230: 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c  rse->db;.  zColl
b240: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
b250: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b  omToken(db, pTok
b260: 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c  en);.  if( !zCol
b270: 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69  l ) return;..  i
b280: 66 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  f( sqlite3Locate
b290: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
b2a0: 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 49 6e  zColl) ){.    In
b2b0: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 73  dex *pIdx;.    s
b2c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
b2d0: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c   p->aCol[i].zCol
b2e0: 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b  l);.    p->aCol[
b2f0: 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c  i].zColl = zColl
b300: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  ;.  .    /* If t
b310: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63  he column is dec
b320: 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e  lared as "<name>
b330: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c   PRIMARY KEY COL
b340: 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20  LATE <type>",.  
b350: 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64    ** then an ind
b360: 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ex may have been
b370: 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73   created on this
b380: 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74   column before t
b390: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74  he.    ** collat
b3a0: 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64  ion type was add
b3b0: 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73  ed. Correct this
b3c0: 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61   if it is the ca
b3d0: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  se..    */.    f
b3e0: 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65  or(pIdx=p->pInde
b3f0: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
b400: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
b410: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
b420: 6e 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20  nKeyCol==1 );.  
b430: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
b440: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a  Column[0]==i ){.
b450: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
b460: 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f  Coll[0] = p->aCo
b470: 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  l[i].zColl;.    
b480: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
b490: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  e{.    sqlite3Db
b4a0: 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
b4b0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
b4c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
b4d0: 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  rns the collatio
b4e0: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64  n sequence for d
b4f0: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74  atabase native t
b500: 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20  ext.** encoding 
b510: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
b520: 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20  e string zName, 
b530: 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a  length nName..**
b540: 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65  .** If the reque
b550: 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  sted collation s
b560: 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61  equence is not a
b570: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74  vailable, or not
b580: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e   available.** in
b590: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
b5a0: 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74  tive encoding, t
b5b0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
b5c0: 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20  tory is invoked 
b5d0: 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74  to.** request it
b5e0: 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  . If the collati
b5f0: 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20  on factory does 
b600: 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20  not supply such 
b610: 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61  a sequence,.** a
b620: 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  nd the sequence 
b630: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  is available in 
b640: 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63  another text enc
b650: 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74  oding, then that
b660: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
b670: 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
b680: 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66  f no versions of
b690: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
b6a0: 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e  ollations sequen
b6b0: 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ce are available
b6c0: 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20  , or.** another 
b6d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
b6e0: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
b6f0: 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nd an error mess
b700: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
b710: 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a  .** pParse..**.*
b720: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
b730: 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
b740: 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f  nd sqlite3FindCo
b750: 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20 72  llSeq().  This r
b760: 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65  outine.** invoke
b770: 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
b780: 66 61 63 74 6f 72 79 20 69 66 20 74 68 65 20 6e  factory if the n
b790: 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63  amed collation c
b7a0: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a  annot be found.*
b7b0: 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 20  * and generates 
b7c0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
b7d0: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
b7e0: 3a 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  : sqlite3FindCol
b7f0: 6c 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33 47  lSeq(), sqlite3G
b800: 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43  etCollSeq().*/.C
b810: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c  ollSeq *sqlite3L
b820: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72  ocateCollSeq(Par
b830: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
b840: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
b850: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
b860: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38  pParse->db;.  u8
b870: 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a   enc = ENC(db);.
b880: 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20    u8 initbusy = 
b890: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20  db->init.busy;. 
b8a0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
b8b0: 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
b8c0: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
b8d0: 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69  b, enc, zName, i
b8e0: 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20  nitbusy);.  if( 
b8f0: 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70  !initbusy && (!p
b900: 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e  Coll || !pColl->
b910: 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43 6f  xCmp) ){.    pCo
b920: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43  ll = sqlite3GetC
b930: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 65  ollSeq(pParse, e
b940: 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65  nc, pColl, zName
b950: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
b960: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   pColl;.}.../*.*
b970: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
b980: 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d  that will increm
b990: 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63  ent the schema c
b9a0: 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ookie..**.** The
b9b0: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69   schema cookie i
b9c0: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
b9d0: 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68  ine when the sch
b9e0: 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64  ema for the.** d
b9f0: 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e  atabase changes.
ba00: 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68    After each sch
ba10: 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20  ema change, the 
ba20: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20  cookie value.** 
ba30: 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61  changes.  When a
ba40: 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72   process first r
ba50: 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20  eads the schema 
ba60: 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a  it records the.*
ba70: 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65  * cookie.  There
ba80: 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20  after, whenever 
ba90: 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73  it goes to acces
baa0: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a  s the database,.
bab0: 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65  ** it checks the
bac0: 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20   cookie to make 
bad0: 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20  sure the schema 
bae0: 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a  has not changed.
baf0: 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20  ** since it was 
bb00: 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  last read..**.**
bb10: 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f   This plan is no
bb20: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c  t completely bul
bb30: 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69  let-proof.  It i
bb40: 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a  s possible for.*
bb50: 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20  * the schema to 
bb60: 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20  change multiple 
bb70: 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68  times and for th
bb80: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a  e cookie to be.*
bb90: 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72  * set back to pr
bba0: 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20  ior value.  But 
bbb0: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61  schema changes a
bbc0: 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a  re infrequent.**
bbd0: 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69   and the probabi
bbe0: 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20  lity of hitting 
bbf0: 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20  the same cookie 
bc00: 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a  value is only.**
bc10: 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33   1 chance in 2^3
bc20: 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66  2.  So we're saf
bc30: 65 20 65 6e 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20  e enough..**.** 
bc40: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
bc50: 46 3a 20 52 2d 33 34 32 33 30 2d 35 36 30 34 39  F: R-34230-56049
bc60: 20 53 51 4c 69 74 65 20 61 75 74 6f 6d 61 74 69   SQLite automati
bc70: 63 61 6c 6c 79 20 69 6e 63 72 65 6d 65 6e 74 73  cally increments
bc80: 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 2d 76  .** the schema-v
bc90: 65 72 73 69 6f 6e 20 77 68 65 6e 65 76 65 72 20  ersion whenever 
bca0: 74 68 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67  the schema chang
bcb0: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
bcc0: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
bcd0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
bce0: 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74  nt iDb){.  sqlit
bcf0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
bd00: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  >db;.  Vdbe *v =
bd10: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
bd20: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
bd30: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
bd40: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
bd50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bd60: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  Op3(v, OP_SetCoo
bd70: 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f  kie, iDb, BTREE_
bd80: 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20  SCHEMA_VERSION, 
bd90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bda0: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
bdb0: 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d  ].pSchema->schem
bdc0: 61 5f 63 6f 6f 6b 69 65 2b 31 29 3b 0a 7d 0a 0a  a_cookie+1);.}..
bdd0: 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68  /*.** Measure th
bde0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
bdf0: 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f  acters needed to
be00: 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   output the give
be10: 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e  n.** identifier.
be20: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74    The number ret
be30: 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61  urned includes a
be40: 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a  ny quotes used.*
be50: 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69  * but does not i
be60: 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20  nclude the null 
be70: 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a  terminator..**.*
be80: 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 20 69  * The estimate i
be90: 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20  s conservative. 
bea0: 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72   It might be lar
beb0: 67 65 72 20 74 68 61 74 20 77 68 61 74 20 69 73  ger that what is
bec0: 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65  .** really neede
bed0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
bee0: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e   identLength(con
bef0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
bf00: 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b  nt n;.  for(n=0;
bf10: 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a   *z; n++, z++){.
bf20: 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20      if( *z=='"' 
bf30: 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20  ){ n++; }.  }.  
bf40: 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a  return n + 2;.}.
bf50: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ./*.** The first
bf60: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
bf70: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75  pointer to an ou
bf80: 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 65  tput buffer. The
bf90: 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61   second .** para
bfa0: 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
bfb0: 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  er to an integer
bfc0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
bfd0: 68 65 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20  he offset at.** 
bfe0: 77 68 69 63 68 20 74 6f 20 77 72 69 74 65 20 69  which to write i
bff0: 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62  nto the output b
c000: 75 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63  uffer. This func
c010: 74 69 6f 6e 20 63 6f 70 69 65 73 20 74 68 65 0a  tion copies the.
c020: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  ** nul-terminate
c030: 64 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64  d string pointed
c040: 20 74 6f 20 62 79 20 74 68 65 20 74 68 69 72 64   to by the third
c050: 20 70 61 72 61 6d 65 74 65 72 2c 20 7a 53 69 67   parameter, zSig
c060: 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20  nedIdent,.** to 
c070: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 66  the specified of
c080: 66 73 65 74 20 69 6e 20 74 68 65 20 62 75 66 66  fset in the buff
c090: 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 20 2a  er and updates *
c0a0: 70 49 64 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a  pIdx to refer.**
c0b0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
c0c0: 74 65 20 61 66 74 65 72 20 74 68 65 20 6c 61 73  te after the las
c0d0: 74 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 62  t byte written b
c0e0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
c0f0: 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 73  .** .** If the s
c100: 74 72 69 6e 67 20 7a 53 69 67 6e 65 64 49 64 65  tring zSignedIde
c110: 6e 74 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69  nt consists enti
c120: 72 65 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75  rely of alpha-nu
c130: 6d 65 72 69 63 0a 2a 2a 20 63 68 61 72 61 63 74  meric.** charact
c140: 65 72 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65  ers, does not be
c150: 67 69 6e 20 77 69 74 68 20 61 20 64 69 67 69 74  gin with a digit
c160: 20 61 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20 53   and is not an S
c170: 51 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74  QL keyword,.** t
c180: 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64  hen it is copied
c190: 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62   to the output b
c1a0: 75 66 66 65 72 20 65 78 61 63 74 6c 79 20 61 73  uffer exactly as
c1b0: 20 69 74 20 69 73 2e 20 4f 74 68 65 72 77 69 73   it is. Otherwis
c1c0: 65 2c 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f 74  e,.** it is quot
c1d0: 65 64 20 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d  ed using double-
c1e0: 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  quotes..*/.stati
c1f0: 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28  c void identPut(
c200: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49  char *z, int *pI
c210: 64 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65  dx, char *zSigne
c220: 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67  dIdent){.  unsig
c230: 6e 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74  ned char *zIdent
c240: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
c250: 72 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b  r*)zSignedIdent;
c260: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65  .  int i, j, nee
c270: 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70  dQuote;.  i = *p
c280: 49 64 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b  Idx;..  for(j=0;
c290: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
c2a0: 7b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  {.    if( !sqlit
c2b0: 65 33 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74  e3Isalnum(zIdent
c2c0: 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a  [j]) && zIdent[j
c2d0: 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a  ]!='_' ) break;.
c2e0: 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20    }.  needQuote 
c2f0: 3d 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74  = sqlite3Isdigit
c300: 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20  (zIdent[0]).    
c310: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
c320: 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49  e3KeywordCode(zI
c330: 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a  dent, j)!=TK_ID.
c340: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 7a              || z
c350: 49 64 65 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20 20  Ident[j]!=0.    
c360: 20 20 20 20 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b          || j==0;
c370: 0a 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  ..  if( needQuot
c380: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  e ) z[i++] = '"'
c390: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
c3a0: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
c3b0: 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e    z[i++] = zIden
c3c0: 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49  t[j];.    if( zI
c3d0: 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a  dent[j]=='"' ) z
c3e0: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d  [i++] = '"';.  }
c3f0: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
c400: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
c410: 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a  .  z[i] = 0;.  *
c420: 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a  pIdx = i;.}../*.
c430: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52  ** Generate a CR
c440: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
c450: 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65  ment appropriate
c460: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a   for the given.*
c470: 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79  * table.  Memory
c480: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78   to hold the tex
c490: 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  t of the stateme
c4a0: 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a  nt is obtained.*
c4b0: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  * from sqliteMal
c4c0: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
c4d0: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
c4e0: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
c4f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
c500: 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74  *createTableStmt
c510: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
c520: 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ble *p){.  int i
c530: 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a  , k, n;.  char *
c540: 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a  zStmt;.  char *z
c550: 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45  Sep, *zSep2, *zE
c560: 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  nd;.  Column *pC
c570: 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66  ol;.  n = 0;.  f
c580: 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f  or(pCol = p->aCo
c590: 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  l, i=0; i<p->nCo
c5a0: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
c5b0: 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c  .    n += identL
c5c0: 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  ength(pCol->zNam
c5d0: 65 29 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20  e) + 5;.  }.  n 
c5e0: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
c5f0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
c600: 6e 3c 35 30 20 29 7b 20 0a 20 20 20 20 7a 53 65  n<50 ){ .    zSe
c610: 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70  p = "";.    zSep
c620: 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e  2 = ",";.    zEn
c630: 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65  d = ")";.  }else
c640: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e  {.    zSep = "\n
c650: 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d    ";.    zSep2 =
c660: 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45   ",\n  ";.    zE
c670: 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a  nd = "\n)";.  }.
c680: 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d    n += 35 + 6*p-
c690: 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d  >nCol;.  zStmt =
c6a0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
c6b0: 52 61 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28  Raw(0, n);.  if(
c6c0: 20 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20   zStmt==0 ){.   
c6d0: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
c6e0: 28 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  (db);.    return
c6f0: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
c700: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53  3_snprintf(n, zS
c710: 74 6d 74 2c 20 22 43 52 45 41 54 45 20 54 41 42  tmt, "CREATE TAB
c720: 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c  LE ");.  k = sql
c730: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74  ite3Strlen30(zSt
c740: 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28  mt);.  identPut(
c750: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e  zStmt, &k, p->zN
c760: 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b  ame);.  zStmt[k+
c770: 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28  +] = '(';.  for(
c780: 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d  pCol=p->aCol, i=
c790: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
c7a0: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
c7b0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
c7c0: 72 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65  r * const azType
c7d0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f  [] = {.        /
c7e0: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  * SQLITE_AFF_BLO
c7f0: 42 20 20 20 20 2a 2f 20 22 22 2c 0a 20 20 20 20  B    */ "",.    
c800: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
c810: 46 5f 54 45 58 54 20 20 20 20 2a 2f 20 22 20 54  F_TEXT    */ " T
c820: 45 58 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a  EXT",.        /*
c830: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
c840: 52 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20  RIC */ " NUM",. 
c850: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
c860: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20  _AFF_INTEGER */ 
c870: 22 20 49 4e 54 22 2c 0a 20 20 20 20 20 20 20 20  " INT",.        
c880: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  /* SQLITE_AFF_RE
c890: 41 4c 20 20 20 20 2a 2f 20 22 20 52 45 41 4c 22  AL    */ " REAL"
c8a0: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
c8b0: 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  len;.    const c
c8c0: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20  har *zType;..   
c8d0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
c8e0: 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d  f(n-k, &zStmt[k]
c8f0: 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b  , zSep);.    k +
c900: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
c910: 30 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20  0(&zStmt[k]);.  
c920: 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a    zSep = zSep2;.
c930: 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74      identPut(zSt
c940: 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e  mt, &k, pCol->zN
c950: 61 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ame);.    assert
c960: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
c970: 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  -SQLITE_AFF_BLOB
c980: 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73   >= 0 );.    ass
c990: 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ert( pCol->affin
c9a0: 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ity-SQLITE_AFF_B
c9b0: 4c 4f 42 20 3c 20 41 72 72 61 79 53 69 7a 65 28  LOB < ArraySize(
c9c0: 61 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20 74  azType) );.    t
c9d0: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
c9e0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
c9f0: 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20  AFF_BLOB );.    
ca00: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e  testcase( pCol->
ca10: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
ca20: 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20  _AFF_TEXT );.   
ca30: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
ca40: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
ca50: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b  E_AFF_NUMERIC );
ca60: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
ca70: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
ca80: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
ca90: 52 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  R );.    testcas
caa0: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
cab0: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  y==SQLITE_AFF_RE
cac0: 41 4c 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a  AL );.    .    z
cad0: 54 79 70 65 20 3d 20 61 7a 54 79 70 65 5b 70 43  Type = azType[pC
cae0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20 53  ol->affinity - S
caf0: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 3b  QLITE_AFF_BLOB];
cb00: 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74  .    len = sqlit
cb10: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65  e3Strlen30(zType
cb20: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
cb30: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
cb40: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 0a  QLITE_AFF_BLOB .
cb50: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
cb60: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73  Col->affinity==s
cb70: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
cb80: 70 65 28 7a 54 79 70 65 2c 20 30 29 20 29 3b 0a  pe(zType, 0) );.
cb90: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 53 74 6d      memcpy(&zStm
cba0: 74 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c 65 6e  t[k], zType, len
cbb0: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b  );.    k += len;
cbc0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 3d  .    assert( k<=
cbd0: 6e 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n );.  }.  sqlit
cbe0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c  e3_snprintf(n-k,
cbf0: 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22   &zStmt[k], "%s"
cc00: 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72  , zEnd);.  retur
cc10: 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zStmt;.}../*.*
cc20: 2a 20 52 65 73 69 7a 65 20 61 6e 20 49 6e 64 65  * Resize an Inde
cc30: 78 20 6f 62 6a 65 63 74 20 74 6f 20 68 6f 6c 64  x object to hold
cc40: 20 4e 20 63 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c   N columns total
cc50: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
cc60: 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
cc70: 73 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d  s and SQLITE_NOM
cc80: 45 4d 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72  EM on an OOM err
cc90: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
cca0: 74 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a  t resizeIndexObj
ccb0: 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ect(sqlite3 *db,
ccc0: 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e   Index *pIdx, in
ccd0: 74 20 4e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45  t N){.  char *zE
cce0: 78 74 72 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74  xtra;.  int nByt
ccf0: 65 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6e  e;.  if( pIdx->n
cd00: 43 6f 6c 75 6d 6e 3e 3d 4e 20 29 20 72 65 74 75  Column>=N ) retu
cd10: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
cd20: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 73  assert( pIdx->is
cd30: 52 65 73 69 7a 65 64 3d 3d 30 20 29 3b 0a 20 20  Resized==0 );.  
cd40: 6e 42 79 74 65 20 3d 20 28 73 69 7a 65 6f 66 28  nByte = (sizeof(
cd50: 63 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28  char*) + sizeof(
cd60: 69 31 36 29 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a  i16) + 1)*N;.  z
cd70: 45 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33 44  Extra = sqlite3D
cd80: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
cd90: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 7a 45  nByte);.  if( zE
cda0: 78 74 72 61 3d 3d 30 20 29 20 72 65 74 75 72 6e  xtra==0 ) return
cdb0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
cdc0: 50 54 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78  PT;.  memcpy(zEx
cdd0: 74 72 61 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  tra, pIdx->azCol
cde0: 6c 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  l, sizeof(char*)
cdf0: 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b  *pIdx->nColumn);
ce00: 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20  .  pIdx->azColl 
ce10: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29  = (const char**)
ce20: 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61  zExtra;.  zExtra
ce30: 20 2b 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 2a   += sizeof(char*
ce40: 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45  )*N;.  memcpy(zE
ce50: 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 69 43 6f  xtra, pIdx->aiCo
ce60: 6c 75 6d 6e 2c 20 73 69 7a 65 6f 66 28 69 31 36  lumn, sizeof(i16
ce70: 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  )*pIdx->nColumn)
ce80: 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  ;.  pIdx->aiColu
ce90: 6d 6e 20 3d 20 28 69 31 36 2a 29 7a 45 78 74 72  mn = (i16*)zExtr
cea0: 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73  a;.  zExtra += s
ceb0: 69 7a 65 6f 66 28 69 31 36 29 2a 4e 3b 0a 20 20  izeof(i16)*N;.  
cec0: 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70  memcpy(zExtra, p
ced0: 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  Idx->aSortOrder,
cee0: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b   pIdx->nColumn);
cef0: 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  .  pIdx->aSortOr
cf00: 64 65 72 20 3d 20 28 75 38 2a 29 7a 45 78 74 72  der = (u8*)zExtr
cf10: 61 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  a;.  pIdx->nColu
cf20: 6d 6e 20 3d 20 4e 3b 0a 20 20 70 49 64 78 2d 3e  mn = N;.  pIdx->
cf30: 69 73 52 65 73 69 7a 65 64 20 3d 20 31 3b 0a 20  isResized = 1;. 
cf40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
cf50: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69  K;.}../*.** Esti
cf60: 6d 61 74 65 20 74 68 65 20 74 6f 74 61 6c 20 72  mate the total r
cf70: 6f 77 20 77 69 64 74 68 20 66 6f 72 20 61 20 74  ow width for a t
cf80: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
cf90: 76 6f 69 64 20 65 73 74 69 6d 61 74 65 54 61 62  void estimateTab
cfa0: 6c 65 57 69 64 74 68 28 54 61 62 6c 65 20 2a 70  leWidth(Table *p
cfb0: 54 61 62 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Tab){.  unsigned
cfc0: 20 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 63   wTable = 0;.  c
cfd0: 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 70 54 61  onst Column *pTa
cfe0: 62 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  bCol;.  int i;. 
cff0: 20 66 6f 72 28 69 3d 70 54 61 62 2d 3e 6e 43 6f   for(i=pTab->nCo
d000: 6c 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d  l, pTabCol=pTab-
d010: 3e 61 43 6f 6c 3b 20 69 3e 30 3b 20 69 2d 2d 2c  >aCol; i>0; i--,
d020: 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20   pTabCol++){.   
d030: 20 77 54 61 62 6c 65 20 2b 3d 20 70 54 61 62 43   wTable += pTabC
d040: 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20  ol->szEst;.  }. 
d050: 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79   if( pTab->iPKey
d060: 3c 30 20 29 20 77 54 61 62 6c 65 2b 2b 3b 0a 20  <0 ) wTable++;. 
d070: 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20   pTab->szTabRow 
d080: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
d090: 77 54 61 62 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a  wTable*4);.}../*
d0a0: 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
d0b0: 20 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66   average size of
d0c0: 20 61 20 72 6f 77 20 66 6f 72 20 61 6e 20 69 6e   a row for an in
d0d0: 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
d0e0: 6f 69 64 20 65 73 74 69 6d 61 74 65 49 6e 64 65  oid estimateInde
d0f0: 78 57 69 64 74 68 28 49 6e 64 65 78 20 2a 70 49  xWidth(Index *pI
d100: 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  dx){.  unsigned 
d110: 77 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 69 6e  wIndex = 0;.  in
d120: 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c  t i;.  const Col
d130: 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 49 64 78  umn *aCol = pIdx
d140: 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a  ->pTable->aCol;.
d150: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
d160: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
d170: 7b 0a 20 20 20 20 69 31 36 20 78 20 3d 20 70 49  {.    i16 x = pI
d180: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  dx->aiColumn[i];
d190: 0a 20 20 20 20 61 73 73 65 72 74 28 20 78 3c 70  .    assert( x<p
d1a0: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43 6f  Idx->pTable->nCo
d1b0: 6c 20 29 3b 0a 20 20 20 20 77 49 6e 64 65 78 20  l );.    wIndex 
d1c0: 2b 3d 20 78 3c 30 20 3f 20 31 20 3a 20 61 43 6f  += x<0 ? 1 : aCo
d1d0: 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  l[pIdx->aiColumn
d1e0: 5b 69 5d 5d 2e 73 7a 45 73 74 3b 0a 20 20 7d 0a  [i]].szEst;.  }.
d1f0: 20 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77    pIdx->szIdxRow
d200: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
d210: 28 77 49 6e 64 65 78 2a 34 29 3b 0a 7d 0a 0a 2f  (wIndex*4);.}../
d220: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
d230: 20 76 61 6c 75 65 20 78 20 69 73 20 66 6f 75 6e   value x is foun
d240: 64 20 61 6e 79 20 6f 66 20 74 68 65 20 66 69 72  d any of the fir
d250: 73 74 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20  st nCol entries 
d260: 6f 66 20 61 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74  of aiCol[].*/.st
d270: 61 74 69 63 20 69 6e 74 20 68 61 73 43 6f 6c 75  atic int hasColu
d280: 6d 6e 28 63 6f 6e 73 74 20 69 31 36 20 2a 61 69  mn(const i16 *ai
d290: 43 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20 69  Col, int nCol, i
d2a0: 6e 74 20 78 29 7b 0a 20 20 77 68 69 6c 65 28 20  nt x){.  while( 
d2b0: 6e 43 6f 6c 2d 2d 20 3e 20 30 20 29 20 69 66 28  nCol-- > 0 ) if(
d2c0: 20 78 3d 3d 2a 28 61 69 43 6f 6c 2b 2b 29 20 29   x==*(aiCol++) )
d2d0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
d2e0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
d2f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  This routine run
d300: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
d310: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
d320: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
d330: 20 74 68 61 74 0a 2a 2a 20 68 61 73 20 61 20 57   that.** has a W
d340: 49 54 48 4f 55 54 20 52 4f 57 49 44 20 63 6c 61  ITHOUT ROWID cla
d350: 75 73 65 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66  use.  The job of
d360: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
d370: 20 74 6f 20 63 6f 6e 76 65 72 74 20 62 6f 74 68   to convert both
d380: 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  .** internal sch
d390: 65 6d 61 20 64 61 74 61 20 73 74 72 75 63 74 75  ema data structu
d3a0: 72 65 73 20 61 6e 64 20 74 68 65 20 67 65 6e 65  res and the gene
d3b0: 72 61 74 65 64 20 56 44 42 45 20 63 6f 64 65 20  rated VDBE code 
d3c0: 73 6f 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20  so that they.** 
d3d0: 61 72 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  are appropriate 
d3e0: 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f  for a WITHOUT RO
d3f0: 57 49 44 20 74 61 62 6c 65 20 69 6e 73 74 65 61  WID table instea
d400: 64 20 6f 66 20 61 20 72 6f 77 69 64 20 74 61 62  d of a rowid tab
d410: 6c 65 2e 0a 2a 2a 20 43 68 61 6e 67 65 73 20 69  le..** Changes i
d420: 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  nclude:.**.**   
d430: 20 20 28 31 29 20 20 53 65 74 20 61 6c 6c 20 63    (1)  Set all c
d440: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52  olumns of the PR
d450: 49 4d 41 52 59 20 4b 45 59 20 73 63 68 65 6d 61  IMARY KEY schema
d460: 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 4e 4f   object to be NO
d470: 54 20 4e 55 4c 4c 2e 0a 2a 2a 20 20 20 20 20 28  T NULL..**     (
d480: 32 29 20 20 43 6f 6e 76 65 72 74 20 74 68 65 20  2)  Convert the 
d490: 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 69  OP_CreateTable i
d4a0: 6e 74 6f 20 61 6e 20 4f 50 5f 43 72 65 61 74 65  nto an OP_Create
d4b0: 49 6e 64 65 78 2e 20 20 54 68 65 72 65 20 69 73  Index.  There is
d4c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 6e 6f 20  .**          no 
d4d0: 72 6f 77 69 64 20 62 74 72 65 65 20 66 6f 72 20  rowid btree for 
d4e0: 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 2e  a WITHOUT ROWID.
d4f0: 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 63    Instead, the c
d500: 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 20 20 20 20  anonical.**     
d510: 20 20 20 20 20 64 61 74 61 20 73 74 6f 72 61 67       data storag
d520: 65 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67 20  e is a covering 
d530: 69 6e 64 65 78 20 62 74 72 65 65 2e 0a 2a 2a 20  index btree..** 
d540: 20 20 20 20 28 33 29 20 20 42 79 70 61 73 73 20      (3)  Bypass 
d550: 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20  the creation of 
d560: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
d570: 72 20 74 61 62 6c 65 20 65 6e 74 72 79 0a 2a 2a  r table entry.**
d580: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 68            for th
d590: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 73  e PRIMARY KEY as
d5a0: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
d5b0: 20 69 6e 64 65 78 20 69 73 20 6e 6f 77 0a 2a 2a   index is now.**
d5c0: 20 20 20 20 20 20 20 20 20 20 69 64 65 6e 74 69            identi
d5d0: 66 69 65 64 20 62 79 20 74 68 65 20 73 71 6c 69  fied by the sqli
d5e0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
d5f0: 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62  entry of the tab
d600: 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 20 20  le itself..**   
d610: 20 20 28 34 29 20 20 53 65 74 20 74 68 65 20 49    (4)  Set the I
d620: 6e 64 65 78 2e 74 6e 75 6d 20 6f 66 20 74 68 65  ndex.tnum of the
d630: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64   PRIMARY KEY Ind
d640: 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  ex object in the
d650: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 68  .**          sch
d660: 65 6d 61 20 74 6f 20 74 68 65 20 72 6f 6f 74 70  ema to the rootp
d670: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  age from the mai
d680: 6e 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20  n table..**     
d690: 28 35 29 20 20 41 64 64 20 61 6c 6c 20 74 61 62  (5)  Add all tab
d6a0: 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68  le columns to th
d6b0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e  e PRIMARY KEY In
d6c0: 64 65 78 20 6f 62 6a 65 63 74 0a 2a 2a 20 20 20  dex object.**   
d6d0: 20 20 20 20 20 20 20 73 6f 20 74 68 61 74 20 74         so that t
d6e0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
d6f0: 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  s a covering ind
d700: 65 78 2e 20 20 54 68 65 20 73 75 72 70 6c 75 73  ex.  The surplus
d710: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6c  .**          col
d720: 75 6d 6e 73 20 61 72 65 20 70 61 72 74 20 6f 66  umns are part of
d730: 20 4b 65 79 49 6e 66 6f 2e 6e 58 46 69 65 6c 64   KeyInfo.nXField
d740: 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 75 73 65   and are not use
d750: 64 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20  d for.**        
d760: 20 20 73 6f 72 74 69 6e 67 20 6f 72 20 6c 6f 6f    sorting or loo
d770: 6b 75 70 20 6f 72 20 75 6e 69 71 75 65 6e 65 73  kup or uniquenes
d780: 73 20 63 68 65 63 6b 73 2e 0a 2a 2a 20 20 20 20  s checks..**    
d790: 20 28 36 29 20 20 52 65 70 6c 61 63 65 20 74 68   (6)  Replace th
d7a0: 65 20 72 6f 77 69 64 20 74 61 69 6c 20 6f 6e 20  e rowid tail on 
d7b0: 61 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  all automaticall
d7c0: 79 20 67 65 6e 65 72 61 74 65 64 20 55 4e 49 51  y generated UNIQ
d7d0: 55 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  UE.**          i
d7e0: 6e 64 69 63 65 73 20 77 69 74 68 20 74 68 65 20  ndices with the 
d7f0: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
d800: 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 76  mns..**.** For v
d810: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2c 20 6f  irtual tables, o
d820: 6e 6c 79 20 28 31 29 20 69 73 20 70 65 72 66 6f  nly (1) is perfo
d830: 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rmed..*/.static 
d840: 76 6f 69 64 20 63 6f 6e 76 65 72 74 54 6f 57 69  void convertToWi
d850: 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28  thoutRowidTable(
d860: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
d870: 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49  able *pTab){.  I
d880: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 49 6e  ndex *pIdx;.  In
d890: 64 65 78 20 2a 70 50 6b 3b 0a 20 20 69 6e 74 20  dex *pPk;.  int 
d8a0: 6e 50 6b 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  nPk;.  int i, j;
d8b0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
d8c0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56   pParse->db;.  V
d8d0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
d8e0: 3e 70 56 64 62 65 3b 0a 0a 20 20 2f 2a 20 4d 61  >pVdbe;..  /* Ma
d8f0: 72 6b 20 65 76 65 72 79 20 50 52 49 4d 41 52 59  rk every PRIMARY
d900: 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 61 73 20 4e   KEY column as N
d910: 4f 54 20 4e 55 4c 4c 20 28 65 78 63 65 70 74 20  OT NULL (except 
d920: 66 6f 72 20 69 6d 70 6f 73 74 65 72 20 74 61 62  for imposter tab
d930: 6c 65 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  les).  */.  if( 
d940: 21 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74  !db->init.impost
d950: 65 72 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 66  erTable ){.    f
d960: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e  or(i=0; i<pTab->
d970: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
d980: 20 20 69 66 28 20 28 70 54 61 62 2d 3e 61 43 6f    if( (pTab->aCo
d990: 6c 5b 69 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20  l[i].colFlags & 
d9a0: 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29  COLFLAG_PRIMKEY)
d9b0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
d9c0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74  Tab->aCol[i].not
d9d0: 4e 75 6c 6c 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  Null = OE_Abort;
d9e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d9f0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 6d   }..  /* The rem
da00: 61 69 6e 69 6e 67 20 74 72 61 6e 73 66 6f 72 6d  aining transform
da10: 61 74 69 6f 6e 73 20 6f 6e 6c 79 20 61 70 70 6c  ations only appl
da20: 79 20 74 6f 20 62 2d 74 72 65 65 20 74 61 62 6c  y to b-tree tabl
da30: 65 73 2c 20 6e 6f 74 20 74 6f 0a 20 20 2a 2a 20  es, not to.  ** 
da40: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 2a  virtual tables *
da50: 2f 0a 20 20 69 66 28 20 49 4e 5f 44 45 43 4c 41  /.  if( IN_DECLA
da60: 52 45 5f 56 54 41 42 20 29 20 72 65 74 75 72 6e  RE_VTAB ) return
da70: 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  ;..  /* Convert 
da80: 74 68 65 20 4f 50 5f 43 72 65 61 74 65 54 61 62  the OP_CreateTab
da90: 6c 65 20 6f 70 63 6f 64 65 20 74 68 61 74 20 77  le opcode that w
daa0: 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 63 72  ould normally cr
dab0: 65 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 72 6f  eate the.  ** ro
dac0: 6f 74 2d 70 61 67 65 20 66 6f 72 20 74 68 65 20  ot-page for the 
dad0: 74 61 62 6c 65 20 69 6e 74 6f 20 61 6e 20 4f 50  table into an OP
dae0: 5f 43 72 65 61 74 65 49 6e 64 65 78 20 6f 70 63  _CreateIndex opc
daf0: 6f 64 65 2e 20 20 54 68 65 20 69 6e 64 65 78 0a  ode.  The index.
db00: 20 20 2a 2a 20 63 72 65 61 74 65 64 20 77 69 6c    ** created wil
db10: 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 50 52 49  l become the PRI
db20: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 0a  MARY KEY index..
db30: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
db40: 65 2d 3e 61 64 64 72 43 72 54 61 62 20 29 7b 0a  e->addrCrTab ){.
db50: 20 20 20 20 61 73 73 65 72 74 28 20 76 20 29 3b      assert( v );
db60: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
db70: 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20  ChangeOpcode(v, 
db80: 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61  pParse->addrCrTa
db90: 62 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65  b, OP_CreateInde
dba0: 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  x);.  }..  /* Lo
dbb0: 63 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59  cate the PRIMARY
dbc0: 20 4b 45 59 20 69 6e 64 65 78 2e 20 20 4f 72 2c   KEY index.  Or,
dbd0: 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 77   if this table w
dbe0: 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20  as originally.  
dbf0: 2a 2a 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ** an INTEGER PR
dc00: 49 4d 41 52 59 20 4b 45 59 20 74 61 62 6c 65 2c  IMARY KEY table,
dc10: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 50 52   create a new PR
dc20: 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e  IMARY KEY index.
dc30: 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61   .  */.  if( pTa
dc40: 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20  b->iPKey>=0 ){. 
dc50: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
dc60: 73 74 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 69 70  st;.    Token ip
dc70: 6b 54 6f 6b 65 6e 3b 0a 20 20 20 20 73 71 6c 69  kToken;.    sqli
dc80: 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 69 70  te3TokenInit(&ip
dc90: 6b 54 6f 6b 65 6e 2c 20 70 54 61 62 2d 3e 61 43  kToken, pTab->aC
dca0: 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e  ol[pTab->iPKey].
dcb0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73  zName);.    pLis
dcc0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
dcd0: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
dce0: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
dcf0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
dd00: 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f  xprAlloc(db, TK_
dd10: 49 44 2c 20 26 69 70 6b 54 6f 6b 65 6e 2c 20 30  ID, &ipkToken, 0
dd20: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  ));.    if( pLis
dd30: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
dd40: 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73     pList->a[0].s
dd50: 6f 72 74 4f 72 64 65 72 20 3d 20 70 50 61 72 73  ortOrder = pPars
dd60: 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72 3b  e->iPkSortOrder;
dd70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
dd80: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d  rse->pNewTable==
dd90: 70 54 61 62 20 29 3b 0a 20 20 20 20 73 71 6c 69  pTab );.    sqli
dda0: 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70  te3CreateIndex(p
ddb0: 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20  Parse, 0, 0, 0, 
ddc0: 70 4c 69 73 74 2c 20 70 54 61 62 2d 3e 6b 65 79  pList, pTab->key
ddd0: 43 6f 6e 66 2c 20 30 2c 20 30 2c 20 30 2c 20 30  Conf, 0, 0, 0, 0
dde0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ddf0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
de00: 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b  IDXTYPE_PRIMARYK
de10: 45 59 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  EY);.    if( db-
de20: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
de30: 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 50 6b 20  return;.    pPk 
de40: 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
de50: 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
de60: 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
de70: 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = -1;.  }else{. 
de80: 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33     pPk = sqlite3
de90: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
dea0: 70 54 61 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 42  pTab);..    /* B
deb0: 79 70 61 73 73 20 74 68 65 20 63 72 65 61 74 69  ypass the creati
dec0: 6f 6e 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52  on of the PRIMAR
ded0: 59 20 4b 45 59 20 62 74 72 65 65 20 61 6e 64 20  Y KEY btree and 
dee0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
def0: 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 65  r.    ** table e
df00: 6e 74 72 79 2e 20 54 68 69 73 20 69 73 20 6f 6e  ntry. This is on
df10: 6c 79 20 72 65 71 75 69 72 65 64 20 69 66 20 63  ly required if c
df20: 75 72 72 65 6e 74 6c 79 20 67 65 6e 65 72 61 74  urrently generat
df30: 69 6e 67 20 56 44 42 45 0a 20 20 20 20 2a 2a 20  ing VDBE.    ** 
df40: 63 6f 64 65 20 66 6f 72 20 61 20 43 52 45 41 54  code for a CREAT
df50: 45 20 54 41 42 4c 45 20 28 6e 6f 74 20 77 68 65  E TABLE (not whe
df60: 6e 20 70 61 72 73 69 6e 67 20 6f 6e 65 20 61 73  n parsing one as
df70: 20 70 61 72 74 20 6f 66 20 72 65 61 64 69 6e 67   part of reading
df80: 0a 20 20 20 20 2a 2a 20 61 20 64 61 74 61 62 61  .    ** a databa
df90: 73 65 20 73 63 68 65 6d 61 29 2e 20 20 2a 2f 0a  se schema).  */.
dfa0: 20 20 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20      if( v ){.   
dfb0: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69     assert( db->i
dfc0: 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20  nit.busy==0 );. 
dfd0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dfe0: 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20  ChangeOpcode(v, 
dff0: 70 50 6b 2d 3e 74 6e 75 6d 2c 20 4f 50 5f 47 6f  pPk->tnum, OP_Go
e000: 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  to);.    }..    
e010: 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65  /*.    ** Remove
e020: 20 61 6c 6c 20 72 65 64 75 6e 64 61 6e 74 20 63   all redundant c
e030: 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20  olumns from the 
e040: 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f  PRIMARY KEY.  Fo
e050: 72 20 65 78 61 6d 70 6c 65 2c 20 63 68 61 6e 67  r example, chang
e060: 65 0a 20 20 20 20 2a 2a 20 22 50 52 49 4d 41 52  e.    ** "PRIMAR
e070: 59 20 4b 45 59 28 61 2c 62 2c 61 2c 62 2c 63 2c  Y KEY(a,b,a,b,c,
e080: 62 2c 63 2c 64 29 22 20 69 6e 74 6f 20 6a 75 73  b,c,d)" into jus
e090: 74 20 22 50 52 49 4d 41 52 59 20 4b 45 59 28 61  t "PRIMARY KEY(a
e0a0: 2c 62 2c 63 2c 64 29 22 2e 20 20 4c 61 74 65 72  ,b,c,d)".  Later
e0b0: 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 61 73 73  .    ** code ass
e0c0: 75 6d 65 73 20 74 68 65 20 50 52 49 4d 41 52 59  umes the PRIMARY
e0d0: 20 4b 45 59 20 63 6f 6e 74 61 69 6e 73 20 6e 6f   KEY contains no
e0e0: 20 72 65 70 65 61 74 65 64 20 63 6f 6c 75 6d 6e   repeated column
e0f0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
e100: 72 28 69 3d 6a 3d 31 3b 20 69 3c 70 50 6b 2d 3e  r(i=j=1; i<pPk->
e110: 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nKeyCol; i++){. 
e120: 20 20 20 20 20 69 66 28 20 68 61 73 43 6f 6c 75       if( hasColu
e130: 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e  mn(pPk->aiColumn
e140: 2c 20 6a 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  , j, pPk->aiColu
e150: 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  mn[i]) ){.      
e160: 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d    pPk->nColumn--
e170: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e180: 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f         pPk->aiCo
e190: 6c 75 6d 6e 5b 6a 2b 2b 5d 20 3d 20 70 50 6b 2d  lumn[j++] = pPk-
e1a0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
e1b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
e1c0: 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6a  pPk->nKeyCol = j
e1d0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
e1e0: 70 50 6b 21 3d 30 20 29 3b 0a 20 20 70 50 6b 2d  pPk!=0 );.  pPk-
e1f0: 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b  >isCovering = 1;
e200: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
e210: 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 29  .imposterTable )
e220: 20 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c   pPk->uniqNotNul
e230: 6c 20 3d 20 31 3b 0a 20 20 6e 50 6b 20 3d 20 70  l = 1;.  nPk = p
e240: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 0a 20 20  Pk->nKeyCol;..  
e250: 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  /* The root page
e260: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
e270: 4b 45 59 20 69 73 20 74 68 65 20 74 61 62 6c 65  KEY is the table
e280: 20 72 6f 6f 74 20 70 61 67 65 20 2a 2f 0a 20 20   root page */.  
e290: 70 50 6b 2d 3e 74 6e 75 6d 20 3d 20 70 54 61 62  pPk->tnum = pTab
e2a0: 2d 3e 74 6e 75 6d 3b 0a 0a 20 20 2f 2a 20 55 70  ->tnum;..  /* Up
e2b0: 64 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  date the in-memo
e2c0: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
e2d0: 6e 20 6f 66 20 61 6c 6c 20 55 4e 49 51 55 45 20  n of all UNIQUE 
e2e0: 69 6e 64 69 63 65 73 20 62 79 20 63 6f 6e 76 65  indices by conve
e2f0: 72 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66  rting.  ** the f
e300: 69 6e 61 6c 20 72 6f 77 69 64 20 63 6f 6c 75 6d  inal rowid colum
e310: 6e 20 69 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f  n into one or mo
e320: 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  re columns of th
e330: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 20  e PRIMARY KEY.. 
e340: 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d 70   */.  for(pIdx=p
e350: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
e360: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
e370: 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  ext){.    int n;
e380: 0a 20 20 20 20 69 66 28 20 49 73 50 72 69 6d 61  .    if( IsPrima
e390: 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29  ryKeyIndex(pIdx)
e3a0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
e3b0: 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c 6e 50   for(i=n=0; i<nP
e3c0: 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  k; i++){.      i
e3d0: 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49  f( !hasColumn(pI
e3e0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49  dx->aiColumn, pI
e3f0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b  dx->nKeyCol, pPk
e400: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29  ->aiColumn[i]) )
e410: 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20   n++;.    }.    
e420: 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
e430: 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20    /* This index 
e440: 69 73 20 61 20 73 75 70 65 72 73 65 74 20 6f 66  is a superset of
e450: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
e460: 20 2a 2f 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   */.      pIdx->
e470: 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e  nColumn = pIdx->
e480: 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 63  nKeyCol;.      c
e490: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
e4a0: 20 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64     if( resizeInd
e4b0: 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 49 64  exObject(db, pId
e4c0: 78 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  x, pIdx->nKeyCol
e4d0: 2b 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  +n) ) return;.  
e4e0: 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 49 64    for(i=0, j=pId
e4f0: 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 3c 6e 50  x->nKeyCol; i<nP
e500: 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  k; i++){.      i
e510: 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49  f( !hasColumn(pI
e520: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49  dx->aiColumn, pI
e530: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b  dx->nKeyCol, pPk
e540: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29  ->aiColumn[i]) )
e550: 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  {.        pIdx->
e560: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 50  aiColumn[j] = pP
e570: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  k->aiColumn[i];.
e580: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
e590: 43 6f 6c 6c 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61  Coll[j] = pPk->a
e5a0: 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  zColl[i];.      
e5b0: 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    j++;.      }. 
e5c0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
e5d0: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
e5e0: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 20  pIdx->nKeyCol+n 
e5f0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
e600: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20  Idx->nColumn>=j 
e610: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64  );.  }..  /* Add
e620: 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d   all table colum
e630: 6e 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52  ns to the PRIMAR
e640: 59 20 4b 45 59 20 69 6e 64 65 78 0a 20 20 2a 2f  Y KEY index.  */
e650: 0a 20 20 69 66 28 20 6e 50 6b 3c 70 54 61 62 2d  .  if( nPk<pTab-
e660: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28  >nCol ){.    if(
e670: 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65   resizeIndexObje
e680: 63 74 28 64 62 2c 20 70 50 6b 2c 20 70 54 61 62  ct(db, pPk, pTab
e690: 2d 3e 6e 43 6f 6c 29 20 29 20 72 65 74 75 72 6e  ->nCol) ) return
e6a0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a  ;.    for(i=0, j
e6b0: 3d 6e 50 6b 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  =nPk; i<pTab->nC
e6c0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
e6d0: 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70  if( !hasColumn(p
e6e0: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c  Pk->aiColumn, j,
e6f0: 20 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61   i) ){.        a
e700: 73 73 65 72 74 28 20 6a 3c 70 50 6b 2d 3e 6e 43  ssert( j<pPk->nC
e710: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20  olumn );.       
e720: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a   pPk->aiColumn[j
e730: 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70  ] = i;.        p
e740: 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20  Pk->azColl[j] = 
e750: 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
e760: 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  ;.        j++;. 
e770: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
e780: 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e 6e 43   assert( pPk->nC
e790: 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a 20 20 20 20  olumn==j );.    
e7a0: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
e7b0: 6f 6c 3d 3d 6a 20 29 3b 0a 20 20 7d 65 6c 73 65  ol==j );.  }else
e7c0: 7b 0a 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75  {.    pPk->nColu
e7d0: 6d 6e 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b  mn = pTab->nCol;
e7e0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
e7f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
e800: 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74  lled to report t
e810: 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61  he final ")" tha
e820: 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20  t terminates.** 
e830: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
e840: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
e850: 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74  The table struct
e860: 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61  ure that other a
e870: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68  ction routines h
e880: 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e  ave been buildin
e890: 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f  g.** is added to
e8a0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61   the internal ha
e8b0: 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d  sh tables, assum
e8c0: 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61  ing no errors ha
e8d0: 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a  ve.** occurred..
e8e0: 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66  **.** An entry f
e8f0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  or the table is 
e900: 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74  made in the mast
e910: 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b  er table on disk
e920: 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73  , unless.** this
e930: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
e940: 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69  table or db->ini
e950: 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e  t.busy==1.  When
e960: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
e970: 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65  1.** it means we
e980: 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
e990: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
e9a0: 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20  able because we 
e9b0: 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65  just.** connecte
e9c0: 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  d to the databas
e9d0: 65 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  e or because the
e9e0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
e9f0: 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65  able has.** rece
ea00: 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f  ntly changed, so
ea10: 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
ea20: 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64  his table alread
ea30: 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74  y exists in.** t
ea40: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
ea50: 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e   table.  We do n
ea60: 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74  ot want to creat
ea70: 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  e it again..**.*
ea80: 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74  * If the pSelect
ea90: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
eaa0: 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20   NULL, it means 
eab0: 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e  that this routin
eac0: 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20  e.** was called 
ead0: 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c  to create a tabl
eae0: 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d  e generated from
eaf0: 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54   a .** "CREATE T
eb00: 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45  ABLE ... AS SELE
eb10: 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e  CT ..." statemen
eb20: 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e  t.  The column n
eb30: 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ames of.** the n
eb40: 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61  ew table will ma
eb50: 74 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73  tch the result s
eb60: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
eb70: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
eb80: 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72  3EndTable(.  Par
eb90: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
eba0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
ebb0: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
ebc0: 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20   *pCons,        
ebd0: 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f     /* The ',' to
ebe0: 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61  ken after the la
ebf0: 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20  st column defn. 
ec00: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64  */.  Token *pEnd
ec10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
ec20: 54 68 65 20 27 29 27 20 62 65 66 6f 72 65 20 6f  The ')' before o
ec30: 70 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 43 52  ptions in the CR
ec40: 45 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20  EATE TABLE */.  
ec50: 75 38 20 74 61 62 4f 70 74 73 2c 20 20 20 20 20  u8 tabOpts,     
ec60: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
ec70: 20 74 61 62 6c 65 20 6f 70 74 69 6f 6e 73 2e 20   table options. 
ec80: 55 73 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a 20 20  Usually 0. */.  
ec90: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
eca0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63          /* Selec
ecb0: 74 20 66 72 6f 6d 20 61 20 22 43 52 45 41 54 45  t from a "CREATE
ecc0: 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 22 20   ... AS SELECT" 
ecd0: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
ece0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ecf0: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 74 61 62    /* The new tab
ed00: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  le */.  sqlite3 
ed10: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
ed20: 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73  ; /* The databas
ed30: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
ed40: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
ed50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
ed60: 61 74 61 62 61 73 65 20 69 6e 20 77 68 69 63 68  atabase in which
ed70: 20 74 68 65 20 74 61 62 6c 65 20 6c 69 76 65 73   the table lives
ed80: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
ed90: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
eda0: 2f 2a 20 41 6e 20 69 6d 70 6c 69 65 64 20 69 6e  /* An implied in
edb0: 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65  dex of the table
edc0: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 6e 64 3d   */..  if( pEnd=
edd0: 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30  =0 && pSelect==0
ede0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
edf0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 64    }.  assert( !d
ee00: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
ee10: 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  );.  p = pParse-
ee20: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
ee30: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
ee40: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ..  assert( !db-
ee50: 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70  >init.busy || !p
ee60: 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 2f 2a 20  Select );..  /* 
ee70: 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  If the db->init.
ee80: 62 75 73 79 20 69 73 20 31 20 69 74 20 6d 65 61  busy is 1 it mea
ee90: 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ns we are readin
eea0: 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68  g the SQL off th
eeb0: 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d  e.  ** "sqlite_m
eec0: 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74  aster" or "sqlit
eed0: 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74  e_temp_master" t
eee0: 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b  able on the disk
eef0: 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74  ..  ** So do not
ef00: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69   write to the di
ef10: 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61  sk again.  Extra
ef20: 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ct the root page
ef30: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72   number.  ** for
ef40: 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
ef50: 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  the db->init.new
ef60: 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68  Tnum field.  (Th
ef70: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  e page number.  
ef80: 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  ** should have b
ef90: 65 65 6e 20 70 75 74 20 74 68 65 72 65 20 62 79  een put there by
efa0: 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43   the sqliteOpenC
efb0: 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2a  b routine.).  **
efc0: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f  .  ** If the roo
efd0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  t page number is
efe0: 20 31 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74   1, that means t
eff0: 68 69 73 20 69 73 20 74 68 65 20 73 71 6c 69 74  his is the sqlit
f000: 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61  e_master.  ** ta
f010: 62 6c 65 20 69 74 73 65 6c 66 2e 20 20 53 6f 20  ble itself.  So 
f020: 6d 61 72 6b 20 69 74 20 72 65 61 64 2d 6f 6e 6c  mark it read-onl
f030: 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  y..  */.  if( db
f040: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
f050: 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d     p->tnum = db-
f060: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20  >init.newTnum;. 
f070: 20 20 20 69 66 28 20 70 2d 3e 74 6e 75 6d 3d 3d     if( p->tnum==
f080: 31 20 29 20 70 2d 3e 74 61 62 46 6c 61 67 73 20  1 ) p->tabFlags 
f090: 7c 3d 20 54 46 5f 52 65 61 64 6f 6e 6c 79 3b 0a  |= TF_Readonly;.
f0a0: 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61    }..  /* Specia
f0b0: 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  l processing for
f0c0: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 54   WITHOUT ROWID T
f0d0: 61 62 6c 65 73 20 2a 2f 0a 20 20 69 66 28 20 74  ables */.  if( t
f0e0: 61 62 4f 70 74 73 20 26 20 54 46 5f 57 69 74 68  abOpts & TF_With
f0f0: 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  outRowid ){.    
f100: 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73  if( (p->tabFlags
f110: 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
f120: 65 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ent) ){.      sq
f130: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
f140: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
f150: 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6e  "AUTOINCREMENT n
f160: 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 57 49  ot allowed on WI
f170: 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
f180: 65 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  es");.      retu
f190: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rn;.    }.    if
f1a0: 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26  ( (p->tabFlags &
f1b0: 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
f1c0: 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  y)==0 ){.      s
f1d0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
f1e0: 50 61 72 73 65 2c 20 22 50 52 49 4d 41 52 59 20  Parse, "PRIMARY 
f1f0: 4b 45 59 20 6d 69 73 73 69 6e 67 20 6f 6e 20 74  KEY missing on t
f200: 61 62 6c 65 20 25 73 22 2c 20 70 2d 3e 7a 4e 61  able %s", p->zNa
f210: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
f220: 20 20 20 20 20 20 70 2d 3e 74 61 62 46 6c 61 67        p->tabFlag
f230: 73 20 7c 3d 20 54 46 5f 57 69 74 68 6f 75 74 52  s |= TF_WithoutR
f240: 6f 77 69 64 20 7c 20 54 46 5f 4e 6f 56 69 73 69  owid | TF_NoVisi
f250: 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  bleRowid;.      
f260: 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74  convertToWithout
f270: 52 6f 77 69 64 54 61 62 6c 65 28 70 50 61 72 73  RowidTable(pPars
f280: 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, p);.    }.  }
f290: 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  ..  iDb = sqlite
f2a0: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
f2b0: 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  b, p->pSchema);.
f2c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f2d0: 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20  OMIT_CHECK.  /* 
f2e0: 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e  Resolve names in
f2f0: 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74   all CHECK const
f300: 72 61 69 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  raint expression
f310: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
f320: 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 73  >pCheck ){.    s
f330: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
f340: 66 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73  fReference(pPars
f350: 65 2c 20 70 2c 20 4e 43 5f 49 73 43 68 65 63 6b  e, p, NC_IsCheck
f360: 2c 20 30 2c 20 70 2d 3e 70 43 68 65 63 6b 29 3b  , 0, p->pCheck);
f370: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  .  }.#endif /* !
f380: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
f390: 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20  MIT_CHECK) */.. 
f3a0: 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65   /* Estimate the
f3b0: 20 61 76 65 72 61 67 65 20 72 6f 77 20 73 69 7a   average row siz
f3c0: 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  e for the table 
f3d0: 61 6e 64 20 66 6f 72 20 61 6c 6c 20 69 6d 70 6c  and for all impl
f3e0: 69 65 64 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20  ied indices */. 
f3f0: 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69   estimateTableWi
f400: 64 74 68 28 70 29 3b 0a 20 20 66 6f 72 28 70 49  dth(p);.  for(pI
f410: 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49  dx=p->pIndex; pI
f420: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
f430: 4e 65 78 74 29 7b 0a 20 20 20 20 65 73 74 69 6d  Next){.    estim
f440: 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 70 49  ateIndexWidth(pI
f450: 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  dx);.  }..  /* I
f460: 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69  f not initializi
f470: 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  ng, then create 
f480: 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65  a record for the
f490: 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20   new table.  ** 
f4a0: 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  in the SQLITE_MA
f4b0: 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68  STER table of th
f4c0: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a  e database..  **
f4d0: 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73  .  ** If this is
f4e0: 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62   a TEMPORARY tab
f4f0: 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e  le, write the en
f500: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78  try into the aux
f510: 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65  iliary.  ** file
f520: 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f   instead of into
f530: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
f540: 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  se file..  */.  
f550: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
f560: 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  sy ){.    int n;
f570: 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
f580: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20    char *zType;  
f590: 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72 20 22    /* "view" or "
f5a0: 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68  table" */.    ch
f5b0: 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a  ar *zType2;   /*
f5c0: 20 22 56 49 45 57 22 20 6f 72 20 22 54 41 42 4c   "VIEW" or "TABL
f5d0: 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  E" */.    char *
f5e0: 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78  zStmt;    /* Tex
f5f0: 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
f600: 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20  TABLE or CREATE 
f610: 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2a  VIEW statement *
f620: 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  /..    v = sqlit
f630: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
f640: 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  );.    if( NEVER
f650: 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  (v==0) ) return;
f660: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ..    sqlite3Vdb
f670: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
f680: 6f 73 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  ose, 0);..    /*
f690: 20 0a 20 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c   .    ** Initial
f6a0: 69 7a 65 20 7a 54 79 70 65 20 66 6f 72 20 74 68  ize zType for th
f6b0: 65 20 6e 65 77 20 76 69 65 77 20 6f 72 20 74 61  e new view or ta
f6c0: 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
f6d0: 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d  if( p->pSelect==
f6e0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  0 ){.      /* A 
f6f0: 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f  regular table */
f700: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
f710: 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54  table";.      zT
f720: 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a  ype2 = "TABLE";.
f730: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f740: 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c  MIT_VIEW.    }el
f750: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76  se{.      /* A v
f760: 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79  iew */.      zTy
f770: 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20 20  pe = "view";.   
f780: 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49 45     zType2 = "VIE
f790: 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  W";.#endif.    }
f7a0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
f7b0: 20 69 73 20 61 20 43 52 45 41 54 45 20 54 41 42   is a CREATE TAB
f7c0: 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43 54 20  LE xx AS SELECT 
f7d0: 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65  ..., execute the
f7e0: 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73   SELECT.    ** s
f7f0: 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75  tatement to popu
f800: 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74 61 62  late the new tab
f810: 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67  le. The root-pag
f820: 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  e number for the
f830: 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c  .    ** new tabl
f840: 65 20 69 73 20 69 6e 20 72 65 67 69 73 74 65 72  e is in register
f850: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
f860: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
f870: 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54 20  Once the SELECT 
f880: 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62  has been coded b
f890: 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  y sqlite3Select(
f8a0: 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20  ), it is in a.  
f8b0: 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74    ** suitable st
f8c0: 61 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72  ate to query for
f8d0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
f8e0: 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62  s and types to b
f8f0: 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79  e used.    ** by
f900: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a   the new table..
f910: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20      **.    ** A 
f920: 73 68 61 72 65 64 2d 63 61 63 68 65 20 77 72 69  shared-cache wri
f930: 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  te-lock is not r
f940: 65 71 75 69 72 65 64 20 74 6f 20 77 72 69 74 65  equired to write
f950: 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c   to the new tabl
f960: 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 73  e,.    ** as a s
f970: 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20  chema-lock must 
f980: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
f990: 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20 63 72  n obtained to cr
f9a0: 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65 0a 20  eate it. Since. 
f9b0: 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c     ** a schema-l
f9c0: 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61 6c 6c  ock excludes all
f9d0: 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
f9e0: 75 73 65 72 73 2c 20 74 68 65 20 77 72 69 74 65  users, the write
f9f0: 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20  -lock would.    
fa00: 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e 74 2e  ** be redundant.
fa10: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
fa20: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
fa30: 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
fa40: 3b 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 68  ;    /* Where th
fa50: 65 20 53 45 4c 45 43 54 20 73 68 6f 75 6c 64 20  e SELECT should 
fa60: 73 74 6f 72 65 20 72 65 73 75 6c 74 73 20 2a 2f  store results */
fa70: 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 59 69  .      int regYi
fa80: 65 6c 64 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  eld;       /* Re
fa90: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63  gister holding c
faa0: 6f 2d 72 6f 75 74 69 6e 65 20 65 6e 74 72 79 2d  o-routine entry-
fab0: 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69  point */.      i
fac0: 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20  nt addrTop;     
fad0: 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
fae0: 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   co-routine */. 
faf0: 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 3b       int regRec;
fb00: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65           /* A re
fb10: 63 6f 72 64 20 74 6f 20 62 65 20 69 6e 73 65 72  cord to be inser
fb20: 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 74  t into the new t
fb30: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  able */.      in
fb40: 74 20 72 65 67 52 6f 77 69 64 3b 20 20 20 20 20  t regRowid;     
fb50: 20 20 2f 2a 20 52 6f 77 69 64 20 6f 66 20 74 68    /* Rowid of th
fb60: 65 20 6e 65 78 74 20 72 6f 77 20 74 6f 20 69 6e  e next row to in
fb70: 73 65 72 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  sert */.      in
fb80: 74 20 61 64 64 72 49 6e 73 4c 6f 6f 70 3b 20 20  t addrInsLoop;  
fb90: 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
fba0: 6c 6f 6f 70 20 66 6f 72 20 69 6e 73 65 72 74 69  loop for inserti
fbb0: 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20  ng rows */.     
fbc0: 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b   Table *pSelTab;
fbd0: 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
fbe0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
fbf0: 68 65 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74  he SELECT result
fc00: 73 20 2a 2f 0a 0a 20 20 20 20 20 20 72 65 67 59  s */..      regY
fc10: 69 65 6c 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ield = ++pParse-
fc20: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67  >nMem;.      reg
fc30: 52 65 63 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Rec = ++pParse->
fc40: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52  nMem;.      regR
fc50: 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  owid = ++pParse-
fc60: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73 73  >nMem;.      ass
fc70: 65 72 74 28 70 50 61 72 73 65 2d 3e 6e 54 61 62  ert(pParse->nTab
fc80: 3d 3d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ==1);.      sqli
fc90: 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
fca0: 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
fcb0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
fcc0: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c  OP_OpenWrite, 1,
fcd0: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
fce0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
fcf0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
fd00: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 32 49 53  5(v, OPFLAG_P2IS
fd10: 52 45 47 29 3b 0a 20 20 20 20 20 20 70 50 61 72  REG);.      pPar
fd20: 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20  se->nTab = 2;.  
fd30: 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71      addrTop = sq
fd40: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
fd50: 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 20  Addr(v) + 1;.   
fd60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fd70: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
fd80: 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65  oroutine, regYie
fd90: 6c 64 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b  ld, 0, addrTop);
fda0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
fdb0: 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
fdc0: 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st, SRT_Coroutin
fdd0: 65 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20  e, regYield);.  
fde0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
fdf0: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
fe00: 74 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  t, &dest);.     
fe10: 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43   sqlite3VdbeEndC
fe20: 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 59  oroutine(v, regY
fe30: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  ield);.      sql
fe40: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
fe50: 28 76 2c 20 61 64 64 72 54 6f 70 20 2d 20 31 29  (v, addrTop - 1)
fe60: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
fe70: 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
fe80: 6e 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  n;.      pSelTab
fe90: 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
fea0: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
feb0: 73 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  se, pSelect);.  
fec0: 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d      if( pSelTab=
fed0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
fee0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43     assert( p->aC
fef0: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ol==0 );.      p
ff00: 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->nCol = pSelTab
ff10: 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 2d  ->nCol;.      p-
ff20: 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >aCol = pSelTab-
ff30: 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65  >aCol;.      pSe
ff40: 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  lTab->nCol = 0;.
ff50: 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61        pSelTab->a
ff60: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  Col = 0;.      s
ff70: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
ff80: 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a  e(db, pSelTab);.
ff90: 20 20 20 20 20 20 61 64 64 72 49 6e 73 4c 6f 6f        addrInsLoo
ffa0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
ffb0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
ffc0: 64 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29  d, dest.iSDParm)
ffd0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
ffe0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
fff0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10000 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
10010 64 2c 20 64 65 73 74 2e 69 53 64 73 74 2c 20 64  d, dest.iSdst, d
10020 65 73 74 2e 6e 53 64 73 74 2c 20 72 65 67 52 65  est.nSdst, regRe
10030 63 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  c);.      sqlite
10040 33 54 61 62 6c 65 41 66 66 69 6e 69 74 79 28 76  3TableAffinity(v
10050 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , p, 0);.      s
10060 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10070 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
10080 20 31 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20   1, regRowid);. 
10090 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
100a0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
100b0 65 72 74 2c 20 31 2c 20 72 65 67 52 65 63 2c 20  ert, 1, regRec, 
100c0 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
100d0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
100e0 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29  (v, addrInsLoop)
100f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10100 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
10110 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20  ddrInsLoop);.   
10120 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10130 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
10140 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 1);.    }..   
10150 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
10160 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
10170 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74   the CREATE stat
10180 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28  ement */.    if(
10190 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
101a0 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65    zStmt = create
101b0 54 61 62 6c 65 53 74 6d 74 28 64 62 2c 20 70 29  TableStmt(db, p)
101c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
101d0 20 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 32 20     Token *pEnd2 
101e0 3d 20 74 61 62 4f 70 74 73 20 3f 20 26 70 50 61  = tabOpts ? &pPa
101f0 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 20  rse->sLastToken 
10200 3a 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 6e 20  : pEnd;.      n 
10210 3d 20 28 69 6e 74 29 28 70 45 6e 64 32 2d 3e 7a  = (int)(pEnd2->z
10220 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65   - pParse->sName
10230 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20 20  Token.z);.      
10240 69 66 28 20 70 45 6e 64 32 2d 3e 7a 5b 30 5d 21  if( pEnd2->z[0]!
10250 3d 27 3b 27 20 29 20 6e 20 2b 3d 20 70 45 6e 64  =';' ) n += pEnd
10260 32 2d 3e 6e 3b 0a 20 20 20 20 20 20 7a 53 74 6d  2->n;.      zStm
10270 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
10280 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20  tf(db, .        
10290 20 20 22 43 52 45 41 54 45 20 25 73 20 25 2e 2a    "CREATE %s %.*
102a0 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70  s", zType2, n, p
102b0 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
102c0 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  n.z.      );.   
102d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f   }..    /* A slo
102e0 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64  t for the record
102f0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
10300 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74  n allocated in t
10310 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54  he .    ** SQLIT
10320 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20  E_MASTER table. 
10330 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f   We just need to
10340 20 75 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f   update that slo
10350 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a  t with all.    *
10360 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  * the informatio
10370 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65  n we've collecte
10380 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  d..    */.    sq
10390 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
103a0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22  (pParse,.      "
103b0 55 50 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20  UPDATE %Q.%s ". 
103c0 20 20 20 20 20 20 20 20 22 53 45 54 20 74 79 70          "SET typ
103d0 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c  e='%s', name=%Q,
103e0 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f   tbl_name=%Q, ro
103f0 6f 74 70 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d  otpage=#%d, sql=
10400 25 51 20 22 0a 20 20 20 20 20 20 20 22 57 48 45  %Q ".       "WHE
10410 52 45 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20  RE rowid=#%d",. 
10420 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
10430 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54  ].zDbSName, MAST
10440 45 52 5f 4e 41 4d 45 2c 0a 20 20 20 20 20 20 7a  ER_NAME,.      z
10450 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a  Type,.      p->z
10460 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a  Name,.      p->z
10470 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 50 61 72  Name,.      pPar
10480 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20  se->regRoot,.   
10490 20 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20     zStmt,.      
104a0 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64  pParse->regRowid
104b0 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
104c0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
104d0 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  tmt);.    sqlite
104e0 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
104f0 61 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66  arse, iDb);..#if
10500 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10510 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
10520 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
10530 65 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  ee if we need to
10540 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74   create an sqlit
10550 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
10560 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70   for.    ** keep
10570 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74  ing track of aut
10580 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e  oincrement keys.
10590 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
105a0 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  (p->tabFlags & T
105b0 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29  F_Autoincrement)
105c0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 44 62 20  !=0 ){.      Db 
105d0 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
105e0 69 44 62 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  iDb];.      asse
105f0 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
10600 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
10610 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20  Db, 0) );.      
10620 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
10630 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a  ->pSeqTab==0 ){.
10640 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e          sqlite3N
10650 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
10660 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43 52  e,.          "CR
10670 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71  EATE TABLE %Q.sq
10680 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61  lite_sequence(na
10690 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20  me,seq)",.      
106a0 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d      pDb->zDbSNam
106b0 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  e.        );.   
106c0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
106d0 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73  f..    /* Repars
106e0 65 20 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20  e everything to 
106f0 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72  update our inter
10700 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75  nal data structu
10710 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  res */.    sqlit
10720 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63  e3VdbeAddParseSc
10730 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20  hemaOp(v, iDb,. 
10740 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10750 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 74 62  3MPrintf(db, "tb
10760 6c 5f 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20  l_name='%q' AND 
10770 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27 22  type!='trigger'"
10780 2c 20 70 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  , p->zName));.  
10790 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  }...  /* Add the
107a0 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e   table to the in
107b0 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
107c0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61  tation of the da
107d0 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69  tabase..  */.  i
107e0 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
107f0 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
10800 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65 6d 61 20  Old;.    Schema 
10810 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53  *pSchema = p->pS
10820 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72  chema;.    asser
10830 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
10840 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
10850 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 4f 6c  b, 0) );.    pOl
10860 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  d = sqlite3HashI
10870 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e  nsert(&pSchema->
10880 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d  tblHash, p->zNam
10890 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  e, p);.    if( p
108a0 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Old ){.      ass
108b0 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20  ert( p==pOld ); 
108c0 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
108d0 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69  have failed insi
108e0 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20  de HashInsert() 
108f0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
10900 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20  OomFault(db);.  
10910 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
10920 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e  }.    pParse->pN
10930 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  ewTable = 0;.   
10940 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
10950 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
10960 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  es;..#ifndef SQL
10970 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41  ITE_OMIT_ALTERTA
10980 42 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  BLE.    if( !p->
10990 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
109a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
109b0 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
109c0 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65   *)pParse->sName
109d0 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69  Token.z;.      i
109e0 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20  nt nName;.      
109f0 61 73 73 65 72 74 28 20 21 70 53 65 6c 65 63 74  assert( !pSelect
10a00 20 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e   && pCons && pEn
10a10 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  d );.      if( p
10a20 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  Cons->z==0 ){.  
10a30 20 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70 45        pCons = pE
10a40 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
10a50 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29 28    nName = (int)(
10a60 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43  (const char *)pC
10a70 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b  ons->z - zName);
10a80 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c  .      p->addCol
10a90 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71  Offset = 13 + sq
10aa0 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e  lite3Utf8CharLen
10ab0 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a  (zName, nName);.
10ac0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
10ad0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
10ae0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
10af0 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
10b00 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
10b10 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
10b20 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a  ate a new VIEW.*
10b30 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
10b40 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73  eateView(.  Pars
10b50 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
10b60 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
10b70 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
10b80 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a   *pBegin,     /*
10b90 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
10ba0 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68  n that begins th
10bb0 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  e statement */. 
10bc0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
10bd0 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
10be0 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
10bf0 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
10c00 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
10c10 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me2,     /* The 
10c20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
10c30 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
10c40 20 76 69 65 77 20 2a 2f 0a 20 20 45 78 70 72 4c   view */.  ExprL
10c50 69 73 74 20 2a 70 43 4e 61 6d 65 73 2c 20 2f 2a  ist *pCNames, /*
10c60 20 4f 70 74 69 6f 6e 61 6c 20 6c 69 73 74 20 6f   Optional list o
10c70 66 20 76 69 65 77 20 63 6f 6c 75 6d 6e 20 6e 61  f view column na
10c80 6d 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  mes */.  Select 
10c90 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41  *pSelect,   /* A
10ca0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
10cb0 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f  t that will beco
10cc0 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20  me the new view 
10cd0 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c  */.  int isTemp,
10ce0 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
10cf0 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20  for a TEMPORARY 
10d00 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  view */.  int no
10d10 45 72 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Err          /* 
10d20 53 75 70 70 72 65 73 73 20 65 72 72 6f 72 20 6d  Suppress error m
10d30 65 73 73 61 67 65 73 20 69 66 20 56 49 45 57 20  essages if VIEW 
10d40 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
10d50 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
10d60 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73  .  int n;.  cons
10d70 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b  t char *z;.  Tok
10d80 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78  en sEnd;.  DbFix
10d90 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e  er sFix;.  Token
10da0 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69   *pName = 0;.  i
10db0 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65  nt iDb;.  sqlite
10dc0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
10dd0 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  db;..  if( pPars
10de0 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20  e->nVar>0 ){.   
10df0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
10e00 28 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65  (pParse, "parame
10e10 74 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c  ters are not all
10e20 6f 77 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b  owed in views");
10e30 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65  .    goto create
10e40 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20 7d 0a  _view_fail;.  }.
10e50 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61    sqlite3StartTa
10e60 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ble(pParse, pNam
10e70 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65  e1, pName2, isTe
10e80 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29  mp, 1, 0, noErr)
10e90 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
10ea0 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
10eb0 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p==0 || pParse-
10ec0 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 63 72 65  >nErr ) goto cre
10ed0 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 20  ate_view_fail;. 
10ee0 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
10ef0 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
10f00 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
10f10 6d 65 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c  me);.  iDb = sql
10f20 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
10f30 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61  x(db, p->pSchema
10f40 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 78 49  );.  sqlite3FixI
10f50 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73  nit(&sFix, pPars
10f60 65 2c 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20  e, iDb, "view", 
10f70 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71  pName);.  if( sq
10f80 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74 28 26  lite3FixSelect(&
10f90 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29 20 29  sFix, pSelect) )
10fa0 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65   goto create_vie
10fb0 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4d 61  w_fail;..  /* Ma
10fc0 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
10fd0 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73   entire SELECT s
10fe0 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
10ff0 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
11000 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66    ** This will f
11010 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70  orce all the Exp
11020 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73  r.token.z values
11030 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c   to be dynamical
11040 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
11050 64 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f  d rather than po
11060 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74  int to the input
11070 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20   string - which 
11080 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20  means that.  ** 
11090 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73  they will persis
110a0 74 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72  t after the curr
110b0 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ent sqlite3_exec
110c0 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e  () call returns.
110d0 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65  .  */.  p->pSele
110e0 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
110f0 63 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63  ctDup(db, pSelec
11100 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  t, EXPRDUP_REDUC
11110 45 29 3b 0a 20 20 70 2d 3e 70 43 68 65 63 6b 20  E);.  p->pCheck 
11120 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
11130 74 44 75 70 28 64 62 2c 20 70 43 4e 61 6d 65 73  tDup(db, pCNames
11140 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
11150 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
11160 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
11170 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69   create_view_fai
11180 6c 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20  l;..  /* Locate 
11190 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43  the end of the C
111a0 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65  REATE VIEW state
111b0 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64  ment.  Make sEnd
111c0 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74   point to.  ** t
111d0 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73  he end..  */.  s
111e0 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c  End = pParse->sL
111f0 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65  astToken;.  asse
11200 72 74 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30  rt( sEnd.z[0]!=0
11210 20 29 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a   );.  if( sEnd.z
11220 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20  [0]!=';' ){.    
11230 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e  sEnd.z += sEnd.n
11240 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d  ;.  }.  sEnd.n =
11250 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28   0;.  n = (int)(
11260 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d  sEnd.z - pBegin-
11270 3e 7a 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  >z);.  assert( n
11280 3e 30 20 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67  >0 );.  z = pBeg
11290 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20  in->z;.  while( 
112a0 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
112b0 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d  [n-1]) ){ n--; }
112c0 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e  .  sEnd.z = &z[n
112d0 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  -1];.  sEnd.n = 
112e0 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c  1;..  /* Use sql
112f0 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74  ite3EndTable() t
11300 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74  o add the view t
11310 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  o the SQLITE_MAS
11320 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  TER table */.  s
11330 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70  qlite3EndTable(p
11340 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c  Parse, 0, &sEnd,
11350 20 30 2c 20 30 29 3b 0a 0a 63 72 65 61 74 65 5f   0, 0);..create_
11360 76 69 65 77 5f 66 61 69 6c 3a 0a 20 20 73 71 6c  view_fail:.  sql
11370 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
11380 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  (db, pSelect);. 
11390 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
113a0 44 65 6c 65 74 65 28 64 62 2c 20 70 43 4e 61 6d  Delete(db, pCNam
113b0 65 73 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  es);.  return;.}
113c0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
113d0 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
113e0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
113f0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
11400 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
11410 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
11420 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54  BLE)./*.** The T
11430 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70  able structure p
11440 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20  Table is really 
11450 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e  a VIEW.  Fill in
11460 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a   the names of.**
11470 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
11480 74 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20  the view in the 
11490 70 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65  pTable structure
114a0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
114b0 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72  mber.** of error
114c0 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  s.  If an error 
114d0 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e  is seen leave an
114e0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
114f0 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
11500 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
11510 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
11520 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  mes(Parse *pPars
11530 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  e, Table *pTable
11540 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c  ){.  Table *pSel
11550 54 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65  Tab;   /* A fake
11560 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63   table from whic
11570 68 20 77 65 20 67 65 74 20 74 68 65 20 72 65 73  h we get the res
11580 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c  ult set */.  Sel
11590 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f  ect *pSel;     /
115a0 2a 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45  * Copy of the SE
115b0 4c 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d  LECT that implem
115c0 65 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f  ents the view */
115d0 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
115e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
115f0 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74  f errors encount
11600 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  ered */.  int n;
11610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11620 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73  emporarily holds
11630 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
11640 75 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20  ursors assigned 
11650 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
11660 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
11670 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
11680 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f  ection for mallo
11690 63 20 65 72 72 6f 72 73 20 2a 2f 0a 23 69 66 6e  c errors */.#ifn
116a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
116b0 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
116c0 73 71 6c 69 74 65 33 5f 78 61 75 74 68 20 78 41  sqlite3_xauth xA
116d0 75 74 68 3b 20 20 20 20 20 20 20 2f 2a 20 53 61  uth;       /* Sa
116e0 76 65 64 20 78 41 75 74 68 20 70 6f 69 6e 74 65  ved xAuth pointe
116f0 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61  r */.#endif..  a
11700 73 73 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b  ssert( pTable );
11710 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
11720 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
11730 4c 45 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  LE.  if( sqlite3
11740 56 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28  VtabCallConnect(
11750 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29 20  pParse, pTable) 
11760 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
11770 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
11780 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
11790 70 54 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e  pTable) ) return
117a0 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e   0;.#endif..#ifn
117b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
117c0 56 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69  VIEW.  /* A posi
117d0 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20  tive nCol means 
117e0 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65  the columns name
117f0 73 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20  s for this view 
11800 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79  are.  ** already
11810 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69   known..  */.  i
11820 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e  f( pTable->nCol>
11830 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
11840 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e   /* A negative n
11850 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c  Col is a special
11860 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20   marker meaning 
11870 74 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72  that we are curr
11880 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e  ently.  ** tryin
11890 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  g to compute the
118a0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20   column names.  
118b0 49 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73  If we enter this
118c0 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20   routine with.  
118d0 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43  ** a negative nC
118e0 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f  ol, it means two
118f0 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66   or more views f
11900 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65  orm a loop, like
11910 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   this:.  **.  **
11920 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
11930 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a   one AS SELECT *
11940 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20   FROM two;.  ** 
11950 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
11960 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20  two AS SELECT * 
11970 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20  FROM one;.  **. 
11980 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68   ** Actually, th
11990 65 20 65 72 72 6f 72 20 61 62 6f 76 65 20 69 73  e error above is
119a0 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f   now caught prio
119b0 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68  r to reaching th
119c0 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42  is point..  ** B
119d0 75 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ut the following
119e0 20 74 65 73 74 20 69 73 20 73 74 69 6c 6c 20 69   test is still i
119f0 6d 70 6f 72 74 61 6e 74 20 61 73 20 69 74 20 64  mportant as it d
11a00 6f 65 73 20 63 6f 6d 65 20 75 70 0a 20 20 2a 2a  oes come up.  **
11a10 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
11a20 67 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20  g:.  ** .  **   
11a30 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6d    CREATE TABLE m
11a40 61 69 6e 2e 65 78 31 28 61 29 3b 0a 20 20 2a 2a  ain.ex1(a);.  **
11a50 20 20 20 20 20 43 52 45 41 54 45 20 54 45 4d 50       CREATE TEMP
11a60 20 56 49 45 57 20 65 78 31 20 41 53 20 53 45 4c   VIEW ex1 AS SEL
11a70 45 43 54 20 61 20 46 52 4f 4d 20 65 78 31 3b 0a  ECT a FROM ex1;.
11a80 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
11a90 2a 20 46 52 4f 4d 20 74 65 6d 70 2e 65 78 31 3b  * FROM temp.ex1;
11aa0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
11ab0 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20  le->nCol<0 ){.  
11ac0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
11ad0 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 20  g(pParse, "view 
11ae0 25 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79  %s is circularly
11af0 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c   defined", pTabl
11b00 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  e->zName);.    r
11b10 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61  eturn 1;.  }.  a
11b20 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e  ssert( pTable->n
11b30 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Col>=0 );..  /* 
11b40 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
11b50 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20  ar, it means we 
11b60 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
11b70 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e  the table names.
11b80 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
11b90 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
11ba0 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
11bb0 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61  lect() will expa
11bc0 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20  nd any.  ** "*" 
11bd0 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
11be0 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74  results set of t
11bf0 68 65 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c  he view and will
11c00 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a   assign cursors.
11c10 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d    ** to the elem
11c20 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d  ents of the FROM
11c30 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65   clause.  But we
11c40 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65   do not want the
11c50 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20  se changes.  ** 
11c60 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e  to be permanent.
11c70 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61    So the computa
11c80 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20  tion is done on 
11c90 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45  a copy of the SE
11ca0 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d  LECT.  ** statem
11cb0 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
11cc0 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a   the view..  */.
11cd0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
11ce0 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70  ->pSelect );.  p
11cf0 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  Sel = sqlite3Sel
11d00 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 6c  ectDup(db, pTabl
11d10 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  e->pSelect, 0);.
11d20 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20    if( pSel ){.  
11d30 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54    n = pParse->nT
11d40 61 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  ab;.    sqlite3S
11d50 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
11d60 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ors(pParse, pSel
11d70 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 70 54 61  ->pSrc);.    pTa
11d80 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a  ble->nCol = -1;.
11d90 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
11da0 65 2e 62 44 69 73 61 62 6c 65 2b 2b 3b 0a 23 69  e.bDisable++;.#i
11db0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11dc0 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
11dd0 20 20 20 20 78 41 75 74 68 20 3d 20 64 62 2d 3e      xAuth = db->
11de0 78 41 75 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78  xAuth;.    db->x
11df0 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 70 53  Auth = 0;.    pS
11e00 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
11e10 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
11e20 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a  (pParse, pSel);.
11e30 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20      db->xAuth = 
11e40 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20  xAuth;.#else.   
11e50 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74   pSelTab = sqlit
11e60 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
11e70 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
11e80 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50  );.#endif.    pP
11e90 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a  arse->nTab = n;.
11ea0 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e      if( pTable->
11eb0 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20 20  pCheck ){.      
11ec0 2f 2a 20 43 52 45 41 54 45 20 56 49 45 57 20 6e  /* CREATE VIEW n
11ed0 61 6d 65 28 61 72 67 6c 69 73 74 29 20 41 53 20  ame(arglist) AS 
11ee0 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  ....      ** The
11ef0 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f   names of the co
11f00 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
11f10 6c 65 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f  le are taken fro
11f20 6d 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 6c 69  m.      ** argli
11f30 73 74 20 77 68 69 63 68 20 69 73 20 73 74 6f 72  st which is stor
11f40 65 64 20 69 6e 20 70 54 61 62 6c 65 2d 3e 70 43  ed in pTable->pC
11f50 68 65 63 6b 2e 20 20 54 68 65 20 70 43 68 65 63  heck.  The pChec
11f60 6b 20 66 69 65 6c 64 0a 20 20 20 20 20 20 2a 2a  k field.      **
11f70 20 6e 6f 72 6d 61 6c 6c 79 20 68 6f 6c 64 73 20   normally holds 
11f80 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
11f90 73 20 6f 6e 20 61 6e 20 6f 72 64 69 6e 61 72 79  s on an ordinary
11fa0 20 74 61 62 6c 65 2c 20 62 75 74 20 66 6f 72 0a   table, but for.
11fb0 20 20 20 20 20 20 2a 2a 20 61 20 56 49 45 57 20        ** a VIEW 
11fc0 69 74 20 68 6f 6c 64 73 20 74 68 65 20 6c 69 73  it holds the lis
11fd0 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  t of column name
11fe0 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
11ff0 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73    sqlite3Columns
12000 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
12010 72 73 65 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68  rse, pTable->pCh
12020 65 63 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20  eck, .          
12030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12040 20 20 20 20 20 20 20 26 70 54 61 62 6c 65 2d 3e         &pTable->
12050 6e 43 6f 6c 2c 20 26 70 54 61 62 6c 65 2d 3e 61  nCol, &pTable->a
12060 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Col);.      if( 
12070 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
12080 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70  ==0 .       && p
12090 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 0a 20  Parse->nErr==0. 
120a0 20 20 20 20 20 20 26 26 20 70 54 61 62 6c 65 2d        && pTable-
120b0 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 2d 3e 70 45 4c  >nCol==pSel->pEL
120c0 69 73 74 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20  ist->nExpr.     
120d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
120e0 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75  te3SelectAddColu
120f0 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69  mnTypeAndCollati
12100 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c  on(pParse, pTabl
12110 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20  e, pSel);.      
12120 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
12130 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20  pSelTab ){.     
12140 20 2f 2a 20 43 52 45 41 54 45 20 56 49 45 57 20   /* CREATE VIEW 
12150 6e 61 6d 65 20 41 53 2e 2e 2e 20 20 77 69 74 68  name AS...  with
12160 6f 75 74 20 61 6e 20 61 72 67 75 6d 65 6e 74 20  out an argument 
12170 6c 69 73 74 2e 20 20 43 6f 6e 73 74 72 75 63 74  list.  Construct
12180 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  .      ** the co
12190 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20  lumn names from 
121a0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
121b0 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
121c0 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 20 20  s the view..    
121d0 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
121e0 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d  t( pTable->aCol=
121f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  =0 );.      pTab
12200 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54  le->nCol = pSelT
12210 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->nCol;.      
12220 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70  pTable->aCol = p
12230 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  SelTab->aCol;.  
12240 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f      pSelTab->nCo
12250 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65  l = 0;.      pSe
12260 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  lTab->aCol = 0;.
12270 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
12280 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
12290 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 54 61 62  Held(db, 0, pTab
122a0 6c 65 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a  le->pSchema) );.
122b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
122c0 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
122d0 30 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b  0;.      nErr++;
122e0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
122f0 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
12300 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20  , pSelTab);.    
12310 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
12320 65 74 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20  ete(db, pSel);. 
12330 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
12340 2e 62 44 69 73 61 62 6c 65 2d 2d 3b 0a 20 20 7d  .bDisable--;.  }
12350 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72 72   else {.    nErr
12360 2b 2b 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65  ++;.  }.  pTable
12370 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d  ->pSchema->schem
12380 61 46 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72  aFlags |= DB_Unr
12390 65 73 65 74 56 69 65 77 73 3b 0a 23 65 6e 64 69  esetViews;.#endi
123a0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
123b0 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65 74 75 72  _VIEW */.  retur
123c0 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64  n nErr;  .}.#end
123d0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
123e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
123f0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
12400 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
12410 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64  TABLE) */..#ifnd
12420 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
12430 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  IEW./*.** Clear 
12440 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
12450 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57   from every VIEW
12460 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 64 78   in database idx
12470 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12480 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
12490 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  All(sqlite3 *db,
124a0 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73   int idx){.  Has
124b0 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 61 73 73 65  hElem *i;.  asse
124c0 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
124d0 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
124e0 64 78 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20  dx, 0) );.  if( 
124f0 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64  !DbHasProperty(d
12500 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73  b, idx, DB_Unres
12510 65 74 56 69 65 77 73 29 20 29 20 72 65 74 75 72  etViews) ) retur
12520 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  n;.  for(i=sqlit
12530 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
12540 61 44 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61  aDb[idx].pSchema
12550 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d  ->tblHash); i;i=
12560 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
12570 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  )){.    Table *p
12580 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
12590 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28  Data(i);.    if(
125a0 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
125b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
125c0 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
125d0 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
125e0 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30    pTab->aCol = 0
125f0 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43  ;.      pTab->nC
12600 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ol = 0;.    }.  
12610 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65  }.  DbClearPrope
12620 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
12630 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d  UnresetViews);.}
12640 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
12650 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
12660 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f  ll(A,B).#endif /
12670 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
12680 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  EW */../*.** Thi
12690 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
126a0 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44 42 45  lled by the VDBE
126b0 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69   to adjust the i
126c0 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a  nternal schema.*
126d0 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65  * used by SQLite
126e0 20 77 68 65 6e 20 74 68 65 20 62 74 72 65 65 20   when the btree 
126f0 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61  layer moves a ta
12700 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54  ble root page. T
12710 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20  he.** root-page 
12720 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  of a table or in
12730 64 65 78 20 69 6e 20 64 61 74 61 62 61 73 65 20  dex in database 
12740 69 44 62 20 68 61 73 20 63 68 61 6e 67 65 64 20  iDb has changed 
12750 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f  from iFrom.** to
12760 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b   iTo..**.** Tick
12770 65 74 20 23 31 37 32 38 3a 20 20 54 68 65 20 73  et #1728:  The s
12780 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68  ymbol table migh
12790 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20  t still contain 
127a0 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f  information.** o
127b0 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20  n tables and/or 
127c0 69 6e 64 69 63 65 73 20 74 68 61 74 20 61 72 65  indices that are
127d0 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20   the process of 
127e0 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a  being deleted..*
127f0 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 6e 6c  * If you are unl
12800 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f  ucky, one of tho
12810 73 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63  se deleted indic
12820 65 73 20 6f 72 20 74 61 62 6c 65 73 20 6d 69 67  es or tables mig
12830 68 74 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73  ht.** have the s
12840 61 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d  ame rootpage num
12850 62 65 72 20 61 73 20 74 68 65 20 72 65 61 6c 20  ber as the real 
12860 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
12870 68 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20  hat is.** being 
12880 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65 20 63 61  moved.  So we ca
12890 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61 72 63 68  nnot stop search
128a0 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 66 69  ing after the fi
128b0 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65  rst match .** be
128c0 63 61 75 73 65 20 74 68 65 20 66 69 72 73 74 20  cause the first 
128d0 6d 61 74 63 68 20 6d 69 67 68 74 20 62 65 20 66  match might be f
128e0 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 65  or one of the de
128f0 6c 65 74 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a  leted indices.**
12900 20 6f 72 20 74 61 62 6c 65 73 20 61 6e 64 20 6e   or tables and n
12910 6f 74 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64  ot the table/ind
12920 65 78 20 74 68 61 74 20 69 73 20 61 63 74 75 61  ex that is actua
12930 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e  lly being moved.
12940 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e 74  .** We must cont
12950 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74  inue looping unt
12960 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e  il all tables an
12970 64 20 69 6e 64 69 63 65 73 20 77 69 74 68 0a 2a  d indices with.*
12980 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f  * rootpage==iFro
12990 6d 20 68 61 76 65 20 62 65 65 6e 20 63 6f 6e 76  m have been conv
129a0 65 72 74 65 64 20 74 6f 20 68 61 76 65 20 61 20  erted to have a 
129b0 72 6f 6f 74 70 61 67 65 20 6f 66 20 69 54 6f 0a  rootpage of iTo.
129c0 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  ** in order to b
129d0 65 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 77  e certain that w
129e0 65 20 67 6f 74 20 74 68 65 20 72 69 67 68 74 20  e got the right 
129f0 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  one..*/.#ifndef 
12a00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
12a10 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69  VACUUM.void sqli
12a20 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64  te3RootPageMoved
12a30 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
12a40 74 20 69 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d  t iDb, int iFrom
12a50 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61  , int iTo){.  Ha
12a60 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20  shElem *pElem;. 
12a70 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 20 20   Hash *pHash;.  
12a80 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65  Db *pDb;..  asse
12a90 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
12aa0 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
12ab0 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 44 62 20  Db, 0) );.  pDb 
12ac0 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
12ad0 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d  .  pHash = &pDb-
12ae0 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
12af0 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  h;.  for(pElem=s
12b00 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70  qliteHashFirst(p
12b10 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
12b20 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
12b30 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
12b40 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
12b50 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
12b60 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  em);.    if( pTa
12b70 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29  b->tnum==iFrom )
12b80 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e  {.      pTab->tn
12b90 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a  um = iTo;.    }.
12ba0 20 20 7d 0a 20 20 70 48 61 73 68 20 3d 20 26 70    }.  pHash = &p
12bb0 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78  Db->pSchema->idx
12bc0 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65  Hash;.  for(pEle
12bd0 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
12be0 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b  t(pHash); pElem;
12bf0 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
12c00 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
12c10 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d     Index *pIdx =
12c20 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
12c30 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20  pElem);.    if( 
12c40 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f  pIdx->tnum==iFro
12c50 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  m ){.      pIdx-
12c60 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20  >tnum = iTo;.   
12c70 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
12c80 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64  ./*.** Write cod
12c90 65 20 74 6f 20 65 72 61 73 65 20 74 68 65 20 74  e to erase the t
12ca0 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
12cb0 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20  age iTable from 
12cc0 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a  database iDb..**
12cd0 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65   Also write code
12ce0 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73   to modify the s
12cf0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
12d00 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20  le and internal 
12d10 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72  schema.** if a r
12d20 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74  oot-page of anot
12d30 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76  her table is mov
12d40 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 2d  ed by the btree-
12d50 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20  layer whilst.** 
12d60 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28  erasing iTable (
12d70 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
12d80 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63  with an auto-vac
12d90 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a  uum database)..*
12da0 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  / .static void d
12db0 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50  estroyRootPage(P
12dc0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
12dd0 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44  t iTable, int iD
12de0 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  b){.  Vdbe *v = 
12df0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
12e00 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 31  Parse);.  int r1
12e10 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
12e20 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
12e30 61 73 73 65 72 74 28 20 69 54 61 62 6c 65 3e 31  assert( iTable>1
12e40 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
12e50 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65  eAddOp3(v, OP_De
12e60 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20 72  stroy, iTable, r
12e70 31 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74  1, iDb);.  sqlit
12e80 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  e3MayAbort(pPars
12e90 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
12ea0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
12eb0 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72  UM.  /* OP_Destr
12ec0 6f 79 20 73 74 6f 72 65 73 20 61 6e 20 69 6e 20  oy stores an in 
12ed0 69 6e 74 65 67 65 72 20 72 31 2e 20 49 66 20 74  integer r1. If t
12ee0 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a  his integer.  **
12ef0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
12f00 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f  en it is the roo
12f10 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
12f20 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74   a table moved t
12f30 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20  o.  ** location 
12f40 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c  iTable. The foll
12f50 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66  owing code modif
12f60 69 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ies the sqlite_m
12f70 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20  aster table to. 
12f80 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73   ** reflect this
12f90 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
12fa0 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20 53 51  "#NNN" in the SQ
12fb0 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 63  L is a special c
12fc0 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65 61  onstant that mea
12fd0 6e 73 20 77 68 61 74 65 76 65 72 20 76 61 6c 75  ns whatever valu
12fe0 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72 65 67  e.  ** is in reg
12ff0 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65 65 20  ister NNN.  See 
13000 67 72 61 6d 6d 61 72 20 72 75 6c 65 73 20 61 73  grammar rules as
13010 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
13020 65 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20  e TK_REGISTER.  
13030 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61 64 64  ** token for add
13040 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
13050 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ion..  */.  sqli
13060 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
13070 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22 55 50  Parse, .     "UP
13080 44 41 54 45 20 25 51 2e 25 73 20 53 45 54 20 72  DATE %Q.%s SET r
13090 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45 52 45  ootpage=%d WHERE
130a0 20 23 25 64 20 41 4e 44 20 72 6f 6f 74 70 61 67   #%d AND rootpag
130b0 65 3d 23 25 64 22 2c 0a 20 20 20 20 20 70 50 61  e=#%d",.     pPa
130c0 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
130d0 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54  ].zDbSName, MAST
130e0 45 52 5f 4e 41 4d 45 2c 20 69 54 61 62 6c 65 2c  ER_NAME, iTable,
130f0 20 72 31 2c 20 72 31 29 3b 0a 23 65 6e 64 69 66   r1, r1);.#endif
13100 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
13110 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
13120 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57   r1);.}../*.** W
13130 72 69 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rite VDBE code t
13140 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20 70 54  o erase table pT
13150 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63  ab and all assoc
13160 69 61 74 65 64 20 69 6e 64 69 63 65 73 20 6f 6e  iated indices on
13170 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74   disk..** Code t
13180 6f 20 75 70 64 61 74 65 20 74 68 65 20 73 71 6c  o update the sql
13190 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
131a0 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73  s and internal s
131b0 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e  chema definition
131c0 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61 20 72  s.** in case a r
131d0 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69  oot-page belongi
131e0 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20 74 61  ng to another ta
131f0 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20  ble is moved by 
13200 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 0a  the btree layer.
13210 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64 65 64  ** is also added
13220 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65   (this can happe
13230 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76  n with an auto-v
13240 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e  acuum database).
13250 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13260 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50 61 72  destroyTable(Par
13270 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
13280 65 20 2a 70 54 61 62 29 7b 0a 23 69 66 64 65 66  e *pTab){.#ifdef
13290 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
132a0 4f 56 41 43 55 55 4d 0a 20 20 49 6e 64 65 78 20  OVACUUM.  Index 
132b0 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 44 62  *pIdx;.  int iDb
132c0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
132d0 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
132e0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
132f0 61 29 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f  a);.  destroyRoo
13300 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 54  tPage(pParse, pT
13310 61 62 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  ab->tnum, iDb);.
13320 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
13330 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
13340 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
13350 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f  {.    destroyRoo
13360 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49  tPage(pParse, pI
13370 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  dx->tnum, iDb);.
13380 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49    }.#else.  /* I
13390 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  f the database m
133a0 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63 75 75  ay be auto-vacuu
133b0 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20 53 51  m capable (if SQ
133c0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
133d0 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  CUUM.  ** is not
133e0 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65 6e 20   defined), then 
133f0 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
13400 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72  to call OP_Destr
13410 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74  oy on the.  ** t
13420 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72  able and index r
13430 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f 72 64  oot-pages in ord
13440 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74  er, starting wit
13450 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c  h the numericall
13460 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20  y .  ** largest 
13470 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
13480 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65  . This guarantee
13490 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74  s that none of t
134a0 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20  he root-pages.  
134b0 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72 6f 79  ** to be destroy
134c0 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20  ed is relocated 
134d0 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 4f 50  by an earlier OP
134e0 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69  _Destroy. i.e. i
134f0 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f  f the.  ** follo
13500 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65 64 3a  wing were coded:
13510 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65  .  **.  ** OP_De
13520 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e  stroy 4 0.  ** .
13530 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72  ...  ** OP_Destr
13540 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a  oy 5 0.  **.  **
13550 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 35   and root page 5
13560 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62 65 20   happened to be 
13570 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74  the largest root
13580 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20  -page number in 
13590 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
135a0 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70 61 67  e, then root pag
135b0 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76  e 5 would be mov
135c0 65 64 20 74 6f 20 70 61 67 65 20 34 20 62 79 20  ed to page 4 by 
135d0 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65  the .  ** "OP_De
135e0 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63 6f 64  stroy 4 0" opcod
135f0 65 2e 20 54 68 65 20 73 75 62 73 65 71 75 65 6e  e. The subsequen
13600 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 35 20  t "OP_Destroy 5 
13610 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a  0" would hit.  *
13620 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20 70 61  * a free-list pa
13630 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69  ge..  */.  int i
13640 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d  Tab = pTab->tnum
13650 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72 6f 79  ;.  int iDestroy
13660 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65  ed = 0;..  while
13670 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ( 1 ){.    Index
13680 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e 74 20   *pIdx;.    int 
13690 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20  iLargest = 0;.. 
136a0 20 20 20 69 66 28 20 69 44 65 73 74 72 6f 79 65     if( iDestroye
136b0 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44 65  d==0 || iTab<iDe
136c0 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20 20 20  stroyed ){.     
136d0 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54 61 62   iLargest = iTab
136e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
136f0 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
13700 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
13710 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
13720 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 49 64    int iIdx = pId
13730 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61  x->tnum;.      a
13740 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63  ssert( pIdx->pSc
13750 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
13760 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ema );.      if(
13770 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20   (iDestroyed==0 
13780 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74 72 6f  || (iIdx<iDestro
13790 79 65 64 29 29 20 26 26 20 69 49 64 78 3e 69 4c  yed)) && iIdx>iL
137a0 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20 20 20  argest ){.      
137b0 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 49 64    iLargest = iId
137c0 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
137d0 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67 65 73  .    if( iLarges
137e0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  t==0 ){.      re
137f0 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  turn;.    }else{
13800 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d  .      int iDb =
13810 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
13820 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
13830 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
13840 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13850 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 70 50  iDb>=0 && iDb<pP
13860 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b  arse->db->nDb );
13870 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79 52 6f  .      destroyRo
13880 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 69  otPage(pParse, i
13890 4c 61 72 67 65 73 74 2c 20 69 44 62 29 3b 0a 20  Largest, iDb);. 
138a0 20 20 20 20 20 69 44 65 73 74 72 6f 79 65 64 20       iDestroyed 
138b0 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20 20 20 20  = iLargest;.    
138c0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  }.  }.#endif.}..
138d0 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 65 6e 74  /*.** Remove ent
138e0 72 69 65 73 20 66 72 6f 6d 20 74 68 65 20 73 71  ries from the sq
138f0 6c 69 74 65 5f 73 74 61 74 4e 20 74 61 62 6c 65  lite_statN table
13900 73 20 28 66 6f 72 20 4e 20 69 6e 20 28 31 2c 32  s (for N in (1,2
13910 2c 33 29 29 0a 2a 2a 20 61 66 74 65 72 20 61 20  ,3)).** after a 
13920 44 52 4f 50 20 49 4e 44 45 58 20 6f 72 20 44 52  DROP INDEX or DR
13930 4f 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64  OP TABLE command
13940 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
13950 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61   sqlite3ClearSta
13960 74 54 61 62 6c 65 73 28 0a 20 20 50 61 72 73 65  tTables(.  Parse
13970 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
13980 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
13990 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
139a0 74 20 69 44 62 2c 20 20 20 20 20 20 20 20 20 20  t iDb,          
139b0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
139c0 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  base number */. 
139d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
139e0 70 65 2c 20 20 20 20 20 2f 2a 20 22 69 64 78 22  pe,     /* "idx"
139f0 20 6f 72 20 22 74 62 6c 22 20 2a 2f 0a 20 20 63   or "tbl" */.  c
13a00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
13a10 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
13a20 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
13a30 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
13a40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
13a50 4e 61 6d 65 20 3d 20 70 50 61 72 73 65 2d 3e 64  Name = pParse->d
13a60 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
13a70 4e 61 6d 65 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  Name;.  for(i=1;
13a80 20 69 3c 3d 34 3b 20 69 2b 2b 29 7b 0a 20 20 20   i<=4; i++){.   
13a90 20 63 68 61 72 20 7a 54 61 62 5b 32 34 5d 3b 0a   char zTab[24];.
13aa0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
13ab0 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 61 62  intf(sizeof(zTab
13ac0 29 2c 7a 54 61 62 2c 22 73 71 6c 69 74 65 5f 73  ),zTab,"sqlite_s
13ad0 74 61 74 25 64 22 2c 69 29 3b 0a 20 20 20 20 69  tat%d",i);.    i
13ae0 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  f( sqlite3FindTa
13af0 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
13b00 7a 54 61 62 2c 20 7a 44 62 4e 61 6d 65 29 20 29  zTab, zDbName) )
13b10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e  {.      sqlite3N
13b20 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
13b30 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45  e,.        "DELE
13b40 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
13b50 45 52 45 20 25 73 3d 25 51 22 2c 0a 20 20 20 20  ERE %s=%Q",.    
13b60 20 20 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54 61      zDbName, zTa
13b70 62 2c 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65 0a  b, zType, zName.
13b80 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
13b90 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
13ba0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64 72 6f  rate code to dro
13bb0 70 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f  p a table..*/.vo
13bc0 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72  id sqlite3CodeDr
13bd0 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  opTable(Parse *p
13be0 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
13bf0 61 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74  ab, int iDb, int
13c00 20 69 73 56 69 65 77 29 7b 0a 20 20 56 64 62 65   isView){.  Vdbe
13c10 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *v;.  sqlite3 *
13c20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
13c30 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69  .  Trigger *pTri
13c40 67 67 65 72 3b 0a 20 20 44 62 20 2a 70 44 62 20  gger;.  Db *pDb 
13c50 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
13c60 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
13c70 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
13c80 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
13c90 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
13ca0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
13cb0 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a  Parse, 1, iDb);.
13cc0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13cd0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
13ce0 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  E.  if( IsVirtua
13cf0 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73  l(pTab) ){.    s
13d00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
13d10 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a  (v, OP_VBegin);.
13d20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
13d30 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65   Drop all trigge
13d40 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
13d50 74 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  th the table bei
13d60 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65  ng dropped. Code
13d70 0a 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74  .  ** is generat
13d80 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74  ed to remove ent
13d90 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65  ries from sqlite
13da0 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20  _master and/or. 
13db0 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f   ** sqlite_temp_
13dc0 6d 61 73 74 65 72 20 69 66 20 72 65 71 75 69 72  master if requir
13dd0 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 72 69 67  ed..  */.  pTrig
13de0 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69  ger = sqlite3Tri
13df0 67 67 65 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ggerList(pParse,
13e00 20 70 54 61 62 29 3b 0a 20 20 77 68 69 6c 65 28   pTab);.  while(
13e10 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20   pTrigger ){.   
13e20 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65   assert( pTrigge
13e30 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  r->pSchema==pTab
13e40 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20  ->pSchema || .  
13e50 20 20 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e        pTrigger->
13e60 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62  pSchema==db->aDb
13e70 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20  [1].pSchema );. 
13e80 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72     sqlite3DropTr
13e90 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c  iggerPtr(pParse,
13ea0 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20   pTrigger);.    
13eb0 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67  pTrigger = pTrig
13ec0 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ger->pNext;.  }.
13ed0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13ee0 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
13ef0 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61  NT.  /* Remove a
13f00 6e 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68  ny entries of th
13f10 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  e sqlite_sequenc
13f20 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74  e table associat
13f30 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65  ed with.  ** the
13f40 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f   table being dro
13f50 70 70 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f  pped. This is do
13f60 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 61  ne before the ta
13f70 62 6c 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20  ble is dropped. 
13f80 20 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65   ** at the btree
13f90 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20   level, in case 
13fa0 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65  the sqlite_seque
13fb0 6e 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20  nce table needs 
13fc0 74 6f 0a 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20  to.  ** move as 
13fd0 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  a result of the 
13fe0 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e  drop (can happen
13ff0 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   in auto-vacuum 
14000 6d 6f 64 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  mode)..  */.  if
14010 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73  ( pTab->tabFlags
14020 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
14030 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ent ){.    sqlit
14040 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
14050 61 72 73 65 2c 0a 20 20 20 20 20 20 22 44 45 4c  arse,.      "DEL
14060 45 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69  ETE FROM %Q.sqli
14070 74 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52  te_sequence WHER
14080 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20  E name=%Q",.    
14090 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c    pDb->zDbSName,
140a0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20   pTab->zName.   
140b0 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
140c0 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51    /* Drop all SQ
140d0 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
140e0 65 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72  e and index entr
140f0 69 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74  ies that refer t
14100 6f 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65  o the.  ** table
14110 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61  . The program na
14120 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  me loops through
14130 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
14140 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20  e and deletes.  
14150 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68 61  ** every row tha
14160 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  t refers to a ta
14170 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ble of the same 
14180 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20  name as the one 
14190 62 65 69 6e 67 0a 20 20 2a 2a 20 64 72 6f 70 70  being.  ** dropp
141a0 65 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65  ed. Triggers are
141b0 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74   handled separat
141c0 65 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72  ely because a tr
141d0 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 2a  igger can be.  *
141e0 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  * created in the
141f0 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 74   temp database t
14200 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20  hat refers to a 
14210 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72  table in another
14220 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a  .  ** database..
14230 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65    */.  sqlite3Ne
14240 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
14250 2c 20 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45  , .      "DELETE
14260 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
14270 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e  E tbl_name=%Q an
14280 64 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72  d type!='trigger
14290 27 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a  '",.      pDb->z
142a0 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f  DbSName, MASTER_
142b0 4e 41 4d 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  NAME, pTab->zNam
142c0 65 29 3b 0a 20 20 69 66 28 20 21 69 73 56 69 65  e);.  if( !isVie
142d0 77 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28  w && !IsVirtual(
142e0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 64 65 73  pTab) ){.    des
142f0 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65  troyTable(pParse
14300 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20  , pTab);.  }..  
14310 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61  /* Remove the ta
14320 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53  ble entry from S
14330 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c  QLite's internal
14340 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69   schema and modi
14350 66 79 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65  fy.  ** the sche
14360 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a 2f 0a  ma cookie..  */.
14370 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
14380 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  pTab) ){.    sql
14390 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
143a0 2c 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69  , OP_VDestroy, i
143b0 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e  Db, 0, 0, pTab->
143c0 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 20  zName, 0);.  }. 
143d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
143e0 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62  p4(v, OP_DropTab
143f0 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70  le, iDb, 0, 0, p
14400 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Tab->zName, 0);.
14410 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
14420 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
14430 62 29 3b 0a 20 20 73 71 6c 69 74 65 56 69 65 77  b);.  sqliteView
14440 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62  ResetAll(db, iDb
14450 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
14460 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
14470 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  ed to do the wor
14480 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c  k of a DROP TABL
14490 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  E statement..** 
144a0 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  pName is the nam
144b0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
144c0 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f  o be dropped..*/
144d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f  .void sqlite3Dro
144e0 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
144f0 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
14500 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77  Name, int isView
14510 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20  , int noErr){.  
14520 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56  Table *pTab;.  V
14530 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
14540 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
14550 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
14560 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
14570 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
14580 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
14590 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  le;.  }.  assert
145a0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
145b0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
145c0 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
145d0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65  .  if( sqlite3Re
145e0 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
145f0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f   ) goto exit_dro
14600 70 5f 74 61 62 6c 65 3b 0a 20 20 69 66 28 20 6e  p_table;.  if( n
14610 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72  oErr ) db->suppr
14620 65 73 73 45 72 72 2b 2b 3b 0a 20 20 61 73 73 65  essErr++;.  asse
14630 72 74 28 20 69 73 56 69 65 77 3d 3d 30 20 7c 7c  rt( isView==0 ||
14640 20 69 73 56 69 65 77 3d 3d 4c 4f 43 41 54 45 5f   isView==LOCATE_
14650 56 49 45 57 20 29 3b 0a 20 20 70 54 61 62 20 3d  VIEW );.  pTab =
14660 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
14670 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20  bleItem(pParse, 
14680 69 73 56 69 65 77 2c 20 26 70 4e 61 6d 65 2d 3e  isView, &pName->
14690 61 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 6f 45  a[0]);.  if( noE
146a0 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73  rr ) db->suppres
146b0 73 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20 70  sErr--;..  if( p
146c0 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Tab==0 ){.    if
146d0 28 20 6e 6f 45 72 72 20 29 20 73 71 6c 69 74 65  ( noErr ) sqlite
146e0 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64  3CodeVerifyNamed
146f0 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70  Schema(pParse, p
14700 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
14710 62 61 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  base);.    goto 
14720 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
14730 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
14740 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
14750 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
14760 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ema);.  assert( 
14770 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
14780 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 49  ->nDb );..  /* I
14790 66 20 70 54 61 62 20 69 73 20 61 20 76 69 72 74  f pTab is a virt
147a0 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20  ual table, call 
147b0 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
147c0 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a 20  es() to ensure. 
147d0 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69 61   ** it is initia
147e0 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  lized..  */.  if
147f0 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
14800 29 20 26 26 20 73 71 6c 69 74 65 33 56 69 65 77  ) && sqlite3View
14810 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
14820 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a  Parse, pTab) ){.
14830 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
14840 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69  op_table;.  }.#i
14850 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14860 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
14870 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
14880 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
14890 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f   *zTab = SCHEMA_
148a0 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20  TABLE(iDb);.    
148b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
148c0 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
148d0 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e  DbSName;.    con
148e0 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d  st char *zArg2 =
148f0 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
14900 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
14910 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
14920 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62  TE, zTab, 0, zDb
14930 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  )){.      goto e
14940 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
14950 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
14960 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66  View ){.      if
14970 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
14980 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  & iDb==1 ){.    
14990 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
149a0 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57  E_DROP_TEMP_VIEW
149b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
149c0 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
149d0 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a  LITE_DROP_VIEW;.
149e0 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
149f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
14a00 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c  UALTABLE.    }el
14a10 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  se if( IsVirtual
14a20 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
14a30 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
14a40 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20  OP_VTABLE;.     
14a50 20 7a 41 72 67 32 20 3d 20 73 71 6c 69 74 65 33   zArg2 = sqlite3
14a60 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54  GetVTable(db, pT
14a70 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65  ab)->pMod->zName
14a80 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
14a90 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f  se{.      if( !O
14aa0 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
14ab0 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
14ac0 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
14ad0 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20  OP_TEMP_TABLE;. 
14ae0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14af0 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
14b00 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20  E_DROP_TABLE;.  
14b10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
14b20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
14b30 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
14b40 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
14b50 7a 41 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20  zArg2, zDb) ){. 
14b60 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
14b70 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
14b80 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
14b90 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
14ba0 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
14bb0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c   pTab->zName, 0,
14bc0 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
14bd0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
14be0 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ble;.    }.  }.#
14bf0 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69  endif.  if( sqli
14c00 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62  te3StrNICmp(pTab
14c10 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  ->zName, "sqlite
14c20 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 26  _", 7)==0 .    &
14c30 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  & sqlite3StrNICm
14c40 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22  p(pTab->zName, "
14c50 73 71 6c 69 74 65 5f 73 74 61 74 22 2c 20 31 31  sqlite_stat", 11
14c60 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
14c70 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14c80 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61  se, "table %s ma
14c90 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  y not be dropped
14ca0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
14cb0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
14cc0 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a  rop_table;.  }..
14cd0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14ce0 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e  MIT_VIEW.  /* En
14cf0 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20  sure DROP TABLE 
14d00 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61  is not used on a
14d10 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20   view, and DROP 
14d20 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64  VIEW is not used
14d30 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65  .  ** on a table
14d40 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56  ..  */.  if( isV
14d50 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
14d60 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  lect==0 ){.    s
14d70 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
14d80 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50  Parse, "use DROP
14d90 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65   TABLE to delete
14da0 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62   table %s", pTab
14db0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
14dc0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
14dd0 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69  le;.  }.  if( !i
14de0 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70  sView && pTab->p
14df0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
14e00 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
14e10 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20  arse, "use DROP 
14e20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76  VIEW to delete v
14e30 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a  iew %s", pTab->z
14e40 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
14e50 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
14e60 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
14e70 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
14e80 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61  to remove the ta
14e90 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  ble from the mas
14ea0 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  ter table.  ** o
14eb0 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76  n disk..  */.  v
14ec0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
14ed0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
14ee0 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
14ef0 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
14f00 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
14f10 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
14f20 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73  3ClearStatTables
14f30 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74  (pParse, iDb, "t
14f40 62 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  bl", pTab->zName
14f50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 6b  );.    sqlite3Fk
14f60 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65  DropTable(pParse
14f70 2c 20 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b 0a  , pName, pTab);.
14f80 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 44      sqlite3CodeD
14f90 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ropTable(pParse,
14fa0 20 70 54 61 62 2c 20 69 44 62 2c 20 69 73 56 69   pTab, iDb, isVi
14fb0 65 77 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64  ew);.  }..exit_d
14fc0 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c  rop_table:.  sql
14fd0 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
14fe0 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a  e(db, pName);.}.
14ff0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
15000 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
15010 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f   create a new fo
15020 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65  reign key on the
15030 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e   table.** curren
15040 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
15050 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f  uction.  pFromCo
15060 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69  l determines whi
15070 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  ch columns.** in
15080 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
15090 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  le point to the 
150a0 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66  foreign key.  If
150b0 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65   pFromCol==0 the
150c0 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65  n.** connect the
150d0 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74   key to the last
150e0 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64   column inserted
150f0 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61  .  pTo is the na
15100 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62  me of.** the tab
15110 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 20 28  le referred to (
15120 61 2e 6b 2e 61 20 74 68 65 20 22 70 61 72 65 6e  a.k.a the "paren
15130 74 22 20 74 61 62 6c 65 29 2e 20 20 70 54 6f 43  t" table).  pToC
15140 6f 6c 20 69 73 20 61 20 6c 69 73 74 0a 2a 2a 20  ol is a list.** 
15150 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
15160 20 70 61 72 65 6e 74 20 70 54 6f 20 74 61 62 6c   parent pTo tabl
15170 65 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69  e.  flags contai
15180 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d  ns all.** inform
15190 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
151a0 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  conflict resolut
151b0 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73  ion algorithms s
151c0 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74  pecified.** in t
151d0 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e  he ON DELETE, ON
151e0 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49   UPDATE and ON I
151f0 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a  NSERT clauses..*
15200 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72  *.** An FKey str
15210 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65  ucture is create
15220 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74  d and added to t
15230 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
15240 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73  ly.** under cons
15250 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  truction in the 
15260 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
15270 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54  e field..**.** T
15280 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69  he foreign key i
15290 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49  s set for IMMEDI
152a0 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  ATE processing. 
152b0 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   A subsequent ca
152c0 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ll.** to sqlite3
152d0 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
152e0 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74  ) might change t
152f0 68 69 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e  his to DEFERRED.
15300 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
15310 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79  CreateForeignKey
15320 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
15330 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
15340 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
15350 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d   ExprList *pFrom
15360 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  Col,  /* Columns
15370 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74   in this table t
15380 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68  hat point to oth
15390 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f  er table */.  To
153a0 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20  ken *pTo,       
153b0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
153c0 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  e other table */
153d0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f  .  ExprList *pTo
153e0 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  Col,    /* Colum
153f0 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20  ns in the other 
15400 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66  table */.  int f
15410 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
15420 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f  /* Conflict reso
15430 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
15440 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  s. */.){.  sqlit
15450 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
15460 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  >db;.#ifndef SQL
15470 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
15480 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b  _KEY.  FKey *pFK
15490 65 79 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a  ey = 0;.  FKey *
154a0 70 4e 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65  pNextTo;.  Table
154b0 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   *p = pParse->pN
154c0 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e  ewTable;.  int n
154d0 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Byte;.  int i;. 
154e0 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61   int nCol;.  cha
154f0 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28  r *z;..  assert(
15500 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28   pTo!=0 );.  if(
15510 20 70 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c   p==0 || IN_DECL
15520 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20  ARE_VTAB ) goto 
15530 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46  fk_end;.  if( pF
15540 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  romCol==0 ){.   
15550 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e   int iCol = p->n
15560 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e  Col-1;.    if( N
15570 45 56 45 52 28 69 43 6f 6c 3c 30 29 20 29 20 67  EVER(iCol<0) ) g
15580 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
15590 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54  if( pToCol && pT
155a0 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29  oCol->nExpr!=1 )
155b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
155c0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
155d0 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20  "foreign key on 
155e0 25 73 22 0a 20 20 20 20 20 20 20 20 20 22 20 73  %s".         " s
155f0 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20  hould reference 
15600 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20  only one column 
15610 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20  of table %T",.  
15620 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69         p->aCol[i
15630 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29  Col].zName, pTo)
15640 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f  ;.      goto fk_
15650 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  end;.    }.    n
15660 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Col = 1;.  }else
15670 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70   if( pToCol && p
15680 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46  ToCol->nExpr!=pF
15690 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b  romCol->nExpr ){
156a0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
156b0 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
156c0 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20       "number of 
156d0 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69  columns in forei
156e0 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20  gn key does not 
156f0 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72  match the number
15700 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22 63   of ".        "c
15710 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
15720 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29  ferenced table")
15730 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  ;.    goto fk_en
15740 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
15750 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d  nCol = pFromCol-
15760 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42  >nExpr;.  }.  nB
15770 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46  yte = sizeof(*pF
15780 4b 65 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a  Key) + (nCol-1)*
15790 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43  sizeof(pFKey->aC
157a0 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20  ol[0]) + pTo->n 
157b0 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f  + 1;.  if( pToCo
157c0 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  l ){.    for(i=0
157d0 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70  ; i<pToCol->nExp
157e0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e  r; i++){.      n
157f0 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  Byte += sqlite3S
15800 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e  trlen30(pToCol->
15810 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b  a[i].zName) + 1;
15820 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
15830 65 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ey = sqlite3DbMa
15840 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
15850 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65  te );.  if( pFKe
15860 79 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  y==0 ){.    goto
15870 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70   fk_end;.  }.  p
15880 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b  FKey->pFrom = p;
15890 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46  .  pFKey->pNextF
158a0 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a  rom = p->pFKey;.
158b0 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46    z = (char*)&pF
158c0 4b 65 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b  Key->aCol[nCol];
158d0 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20  .  pFKey->zTo = 
158e0 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70  z;.  memcpy(z, p
158f0 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a  To->z, pTo->n);.
15900 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b    z[pTo->n] = 0;
15910 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74  .  sqlite3Dequot
15920 65 28 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f  e(z);.  z += pTo
15930 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e  ->n+1;.  pFKey->
15940 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69  nCol = nCol;.  i
15950 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29  f( pFromCol==0 )
15960 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f  {.    pFKey->aCo
15970 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e  l[0].iFrom = p->
15980 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  nCol-1;.  }else{
15990 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
159a0 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
159b0 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
159c0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f  or(j=0; j<p->nCo
159d0 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
159e0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
159f0 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  Cmp(p->aCol[j].z
15a00 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e  Name, pFromCol->
15a10 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  a[i].zName)==0 )
15a20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b 65  {.          pFKe
15a30 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d  y->aCol[i].iFrom
15a40 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
15a50 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
15a60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
15a70 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b  f( j>=p->nCol ){
15a80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15a90 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
15aa0 20 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b   .          "unk
15ab0 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73  nown column \"%s
15ac0 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  \" in foreign ke
15ad0 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a  y definition", .
15ae0 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43            pFromC
15af0 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ol->a[i].zName);
15b00 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b  .        goto fk
15b10 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
15b20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54    }.  }.  if( pT
15b30 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28  oCol ){.    for(
15b40 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
15b50 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ){.      int n =
15b60 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
15b70 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  (pToCol->a[i].zN
15b80 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65  ame);.      pFKe
15b90 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20  y->aCol[i].zCol 
15ba0 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  = z;.      memcp
15bb0 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69  y(z, pToCol->a[i
15bc0 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ].zName, n);.   
15bd0 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20     z[n] = 0;.   
15be0 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20     z += n+1;.   
15bf0 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e   }.  }.  pFKey->
15c00 69 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a  isDeferred = 0;.
15c10 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e    pFKey->aAction
15c20 5b 30 5d 20 3d 20 28 75 38 29 28 66 6c 61 67 73  [0] = (u8)(flags
15c30 20 26 20 30 78 66 66 29 3b 20 20 20 20 20 20 20   & 0xff);       
15c40 20 20 20 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54       /* ON DELET
15c50 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 46  E action */.  pF
15c60 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 20  Key->aAction[1] 
15c70 3d 20 28 75 38 29 28 28 66 6c 61 67 73 20 3e 3e  = (u8)((flags >>
15c80 20 38 20 29 20 26 20 30 78 66 66 29 3b 20 20 20   8 ) & 0xff);   
15c90 20 2f 2a 20 4f 4e 20 55 50 44 41 54 45 20 61 63   /* ON UPDATE ac
15ca0 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tion */..  asser
15cb0 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
15cc0 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c  MutexHeld(db, 0,
15cd0 20 70 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a   p->pSchema) );.
15ce0 20 20 70 4e 65 78 74 54 6f 20 3d 20 28 46 4b 65    pNextTo = (FKe
15cf0 79 20 2a 29 73 71 6c 69 74 65 33 48 61 73 68 49  y *)sqlite3HashI
15d00 6e 73 65 72 74 28 26 70 2d 3e 70 53 63 68 65 6d  nsert(&p->pSchem
15d10 61 2d 3e 66 6b 65 79 48 61 73 68 2c 20 0a 20 20  a->fkeyHash, .  
15d20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20      pFKey->zTo, 
15d30 28 76 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20 20  (void *)pFKey.  
15d40 29 3b 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f  );.  if( pNextTo
15d50 3d 3d 70 46 4b 65 79 20 29 7b 0a 20 20 20 20 73  ==pFKey ){.    s
15d60 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
15d70 62 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f  b);.    goto fk_
15d80 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  end;.  }.  if( p
15d90 4e 65 78 74 54 6f 20 29 7b 0a 20 20 20 20 61 73  NextTo ){.    as
15da0 73 65 72 74 28 20 70 4e 65 78 74 54 6f 2d 3e 70  sert( pNextTo->p
15db0 50 72 65 76 54 6f 3d 3d 30 20 29 3b 0a 20 20 20  PrevTo==0 );.   
15dc0 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20   pFKey->pNextTo 
15dd0 3d 20 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 70  = pNextTo;.    p
15de0 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 20  NextTo->pPrevTo 
15df0 3d 20 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20  = pFKey;.  }..  
15e00 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65  /* Link the fore
15e10 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74  ign key to the t
15e20 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74  able as the last
15e30 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d   step..  */.  p-
15e40 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a  >pFKey = pFKey;.
15e50 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b    pFKey = 0;..fk
15e60 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33 44  _end:.  sqlite3D
15e70 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65 79 29  bFree(db, pFKey)
15e80 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  ;.#endif /* !def
15e90 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
15ea0 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f  _FOREIGN_KEY) */
15eb0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
15ec0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 46 72  stDelete(db, pFr
15ed0 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  omCol);.  sqlite
15ee0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
15ef0 64 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a  db, pToCol);.}..
15f00 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
15f10 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
15f20 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49  n an INITIALLY I
15f30 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54  MMEDIATE or INIT
15f40 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a  IALLY DEFERRED.*
15f50 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e  * clause is seen
15f60 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f   as part of a fo
15f70 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
15f80 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66  tion.  The isDef
15f90 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74  erred.** paramet
15fa0 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54  er is 1 for INIT
15fb0 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61  IALLY DEFERRED a
15fc0 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c  nd 0 for INITIAL
15fd0 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a  LY IMMEDIATE..**
15fe0 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   The behavior of
15ff0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
16000 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65 69  ly created forei
16010 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74  gn key is adjust
16020 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c  ed.** accordingl
16030 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
16040 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
16050 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
16060 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64 29   int isDeferred)
16070 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
16080 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
16090 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  Y.  Table *pTab;
160a0 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a  .  FKey *pFKey;.
160b0 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 50    if( (pTab = pP
160c0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
160d0 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20  ==0 || (pFKey = 
160e0 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20  pTab->pFKey)==0 
160f0 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
16100 72 74 28 20 69 73 44 65 66 65 72 72 65 64 3d 3d  rt( isDeferred==
16110 30 20 7c 7c 20 69 73 44 65 66 65 72 72 65 64 3d  0 || isDeferred=
16120 3d 31 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33  =1 ); /* EV: R-3
16130 30 33 32 33 2d 32 31 39 31 37 20 2a 2f 0a 20 20  0323-21917 */.  
16140 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65  pFKey->isDeferre
16150 64 20 3d 20 28 75 38 29 69 73 44 65 66 65 72 72  d = (u8)isDeferr
16160 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  ed;.#endif.}../*
16170 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
16180 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73  e that will eras
16190 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64  e and refill ind
161a0 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20  ex *pIdx.  This 
161b0 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e  is.** used to in
161c0 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79  itialize a newly
161d0 20 63 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f   created index o
161e0 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74  r to recompute t
161f0 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  he.** content of
16200 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73   an index in res
16210 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44  ponse to a REIND
16220 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  EX command..**.*
16230 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65  * if memRootPage
16240 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65   is not negative
16250 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
16260 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77  the index is new
16270 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20  ly.** created.  
16280 54 68 65 20 72 65 67 69 73 74 65 72 20 73 70 65  The register spe
16290 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f  cified by memRoo
162a0 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74  tPage contains t
162b0 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  he.** root page 
162c0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
162d0 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74  dex.  If memRoot
162e0 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65  Page is negative
162f0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e  , then.** the in
16300 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
16310 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63  ts and must be c
16320 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 62 65  leared before be
16330 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64  ing refilled and
16340 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67  .** the root pag
16350 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
16360 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66  index is taken f
16370 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  rom pIndex->tnum
16380 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
16390 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
163a0 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
163b0 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  e, Index *pIndex
163c0 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67  , int memRootPag
163d0 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  e){.  Table *pTa
163e0 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  b = pIndex->pTab
163f0 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  le;  /* The tabl
16400 65 20 74 68 61 74 20 69 73 20 69 6e 64 65 78 65  e that is indexe
16410 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20  d */.  int iTab 
16420 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
16430 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63  ;     /* Btree c
16440 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70  ursor used for p
16450 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  Tab */.  int iId
16460 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  x = pParse->nTab
16470 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65  ++;     /* Btree
16480 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72   cursor used for
16490 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74   pIndex */.  int
164a0 20 69 53 6f 72 74 65 72 3b 20 20 20 20 20 20 20   iSorter;       
164b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
164c0 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 62 79 20  ursor opened by 
164d0 4f 70 65 6e 53 6f 72 74 65 72 20 28 69 66 20 69  OpenSorter (if i
164e0 6e 20 75 73 65 29 20 2a 2f 0a 20 20 69 6e 74 20  n use) */.  int 
164f0 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20  addr1;          
16500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
16510 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20  dress of top of 
16520 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
16530 64 72 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr2;            
16540 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
16550 65 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66  ess to jump to f
16560 6f 72 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  or next iteratio
16570 6e 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b  n */.  int tnum;
16580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16590 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
165a0 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20  ge of index */. 
165b0 20 69 6e 74 20 69 50 61 72 74 49 64 78 4c 61 62   int iPartIdxLab
165c0 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
165d0 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 69 73 20  /* Jump to this 
165e0 6c 61 62 65 6c 20 74 6f 20 73 6b 69 70 20 61 20  label to skip a 
165f0 72 6f 77 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  row */.  Vdbe *v
16600 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16610 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
16620 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
16630 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
16640 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  ne */.  KeyInfo 
16650 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20  *pKey;          
16660 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66         /* KeyInf
16670 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20  o for index */. 
16680 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20   int regRecord; 
16690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166a0 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
166b0 69 6e 67 20 61 73 73 65 6d 62 6c 65 64 20 69 6e  ing assembled in
166c0 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  dex record */.  
166d0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
166e0 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f  arse->db;      /
166f0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
16700 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
16710 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
16720 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
16730 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  , pIndex->pSchem
16740 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  a);..#ifndef SQL
16750 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
16760 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c  ZATION.  if( sql
16770 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
16780 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 49  arse, SQLITE_REI
16790 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  NDEX, pIndex->zN
167a0 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 64 62  ame, 0,.      db
167b0 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
167c0 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72 65 74  ame ) ){.    ret
167d0 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
167e0 0a 20 20 2f 2a 20 52 65 71 75 69 72 65 20 61 20  .  /* Require a 
167f0 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
16800 65 20 74 61 62 6c 65 20 74 6f 20 70 65 72 66 6f  e table to perfo
16810 72 6d 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  rm this operatio
16820 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54 61  n */.  sqlite3Ta
16830 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
16840 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
16850 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   1, pTab->zName)
16860 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
16870 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
16880 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
16890 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52  turn;.  if( memR
168a0 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20  ootPage>=0 ){.  
168b0 20 20 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74    tnum = memRoot
168c0 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Page;.  }else{. 
168d0 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78     tnum = pIndex
168e0 2d 3e 74 6e 75 6d 3b 0a 20 20 7d 0a 20 20 70 4b  ->tnum;.  }.  pK
168f0 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  ey = sqlite3KeyI
16900 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73  nfoOfIndex(pPars
16910 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 61 73  e, pIndex);.  as
16920 73 65 72 74 28 20 70 4b 65 79 21 3d 30 20 7c 7c  sert( pKey!=0 ||
16930 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
16940 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
16950 72 20 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  r );..  /* Open 
16960 74 68 65 20 73 6f 72 74 65 72 20 63 75 72 73 6f  the sorter curso
16970 72 20 69 66 20 77 65 20 61 72 65 20 74 6f 20 75  r if we are to u
16980 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 53 6f  se one. */.  iSo
16990 72 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rter = pParse->n
169a0 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  Tab++;.  sqlite3
169b0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
169c0 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 69 53 6f  _SorterOpen, iSo
169d0 72 74 65 72 2c 20 30 2c 20 70 49 6e 64 65 78 2d  rter, 0, pIndex-
169e0 3e 6e 4b 65 79 43 6f 6c 2c 20 28 63 68 61 72 2a  >nKeyCol, (char*
169f0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
16a00 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79        sqlite3Key
16a10 49 6e 66 6f 52 65 66 28 70 4b 65 79 29 2c 20 50  InfoRef(pKey), P
16a20 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 2f  4_KEYINFO);..  /
16a30 2a 20 4f 70 65 6e 20 74 68 65 20 74 61 62 6c 65  * Open the table
16a40 2e 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  . Loop through a
16a50 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74  ll rows of the t
16a60 61 62 6c 65 2c 20 69 6e 73 65 72 74 69 6e 67 20  able, inserting 
16a70 69 6e 64 65 78 0a 20 20 2a 2a 20 72 65 63 6f 72  index.  ** recor
16a80 64 73 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74  ds into the sort
16a90 65 72 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  er. */.  sqlite3
16aa0 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
16ab0 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61  , iTab, iDb, pTa
16ac0 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b  b, OP_OpenRead);
16ad0 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  .  addr1 = sqlit
16ae0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16af0 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
16b00 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   0); VdbeCoverag
16b10 65 28 76 29 3b 0a 20 20 72 65 67 52 65 63 6f 72  e(v);.  regRecor
16b20 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
16b30 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 0a  mpReg(pParse);..
16b40 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74    sqlite3Generat
16b50 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65  eIndexKey(pParse
16b60 2c 70 49 6e 64 65 78 2c 69 54 61 62 2c 72 65 67  ,pIndex,iTab,reg
16b70 52 65 63 6f 72 64 2c 30 2c 26 69 50 61 72 74 49  Record,0,&iPartI
16b80 64 78 4c 61 62 65 6c 2c 30 2c 30 29 3b 0a 20 20  dxLabel,0,0);.  
16b90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16ba0 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e  2(v, OP_SorterIn
16bb0 73 65 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 72  sert, iSorter, r
16bc0 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
16bd0 69 74 65 33 52 65 73 6f 6c 76 65 50 61 72 74 49  ite3ResolvePartI
16be0 64 78 4c 61 62 65 6c 28 70 50 61 72 73 65 2c 20  dxLabel(pParse, 
16bf0 69 50 61 72 74 49 64 78 4c 61 62 65 6c 29 3b 0a  iPartIdxLabel);.
16c00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16c10 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
16c20 69 54 61 62 2c 20 61 64 64 72 31 2b 31 29 3b 20  iTab, addr1+1); 
16c30 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
16c40 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
16c50 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
16c60 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50  ;.  if( memRootP
16c70 61 67 65 3c 30 20 29 20 73 71 6c 69 74 65 33 56  age<0 ) sqlite3V
16c80 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16c90 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62  Clear, tnum, iDb
16ca0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16cb0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
16cc0 6e 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e  nWrite, iIdx, tn
16cd0 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20 20 20 20  um, iDb, .      
16ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
16cf0 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b  har *)pKey, P4_K
16d00 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74  EYINFO);.  sqlit
16d10 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
16d20 2c 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52  , OPFLAG_BULKCSR
16d30 7c 28 28 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d  |((memRootPage>=
16d40 30 29 3f 4f 50 46 4c 41 47 5f 50 32 49 53 52 45  0)?OPFLAG_P2ISRE
16d50 47 3a 30 29 29 3b 0a 0a 20 20 61 64 64 72 31 20  G:0));..  addr1 
16d60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
16d70 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
16d80 53 6f 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 30  Sort, iSorter, 0
16d90 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
16da0 76 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71  v);.  if( IsUniq
16db0 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20  ueIndex(pIndex) 
16dc0 29 7b 0a 20 20 20 20 69 6e 74 20 6a 32 20 3d 20  ){.    int j2 = 
16dd0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
16de0 6e 74 41 64 64 72 28 76 29 20 2b 20 33 3b 0a 20  ntAddr(v) + 3;. 
16df0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
16e00 74 6f 28 76 2c 20 6a 32 29 3b 0a 20 20 20 20 61  to(v, j2);.    a
16e10 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
16e20 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
16e30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
16e40 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
16e50 5f 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 2c 20  _SorterCompare, 
16e60 69 53 6f 72 74 65 72 2c 20 6a 32 2c 20 72 65 67  iSorter, j2, reg
16e70 52 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 20 20  Record,.        
16e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e90 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c   pIndex->nKeyCol
16ea0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
16eb0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 55  v);.    sqlite3U
16ec0 6e 69 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28  niqueConstraint(
16ed0 70 50 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72 74  pParse, OE_Abort
16ee0 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 65 6c  , pIndex);.  }el
16ef0 73 65 7b 0a 20 20 20 20 61 64 64 72 32 20 3d 20  se{.    addr2 = 
16f00 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
16f10 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 7d 0a 20  ntAddr(v);.  }. 
16f20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16f30 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44  p3(v, OP_SorterD
16f40 61 74 61 2c 20 69 53 6f 72 74 65 72 2c 20 72 65  ata, iSorter, re
16f50 67 52 65 63 6f 72 64 2c 20 69 49 64 78 29 3b 0a  gRecord, iIdx);.
16f60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16f70 4f 70 33 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20  Op3(v, OP_Last, 
16f80 69 49 64 78 2c 20 30 2c 20 2d 31 29 3b 0a 20 20  iIdx, 0, -1);.  
16f90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16fa0 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
16fb0 74 2c 20 69 49 64 78 2c 20 72 65 67 52 65 63 6f  t, iIdx, regReco
16fc0 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rd);.  sqlite3Vd
16fd0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
16fe0 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
16ff0 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  LT);.  sqlite3Re
17000 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
17010 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  rse, regRecord);
17020 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
17030 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
17040 72 4e 65 78 74 2c 20 69 53 6f 72 74 65 72 2c 20  rNext, iSorter, 
17050 61 64 64 72 32 29 3b 20 56 64 62 65 43 6f 76 65  addr2); VdbeCove
17060 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
17070 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
17080 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 73 71 6c  , addr1);..  sql
17090 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
170a0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62  , OP_Close, iTab
170b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
170c0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
170d0 73 65 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c  se, iIdx);.  sql
170e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
170f0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 53 6f 72  , OP_Close, iSor
17100 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ter);.}../*.** A
17110 6c 6c 6f 63 61 74 65 20 68 65 61 70 20 73 70 61  llocate heap spa
17120 63 65 20 74 6f 20 68 6f 6c 64 20 61 6e 20 49 6e  ce to hold an In
17130 64 65 78 20 6f 62 6a 65 63 74 20 77 69 74 68 20  dex object with 
17140 6e 43 6f 6c 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a  nCol columns..**
17150 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65  .** Increase the
17160 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65   allocation size
17170 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 65   to provide an e
17180 78 74 72 61 20 6e 45 78 74 72 61 20 62 79 74 65  xtra nExtra byte
17190 73 0a 2a 2a 20 6f 66 20 38 2d 62 79 74 65 20 61  s.** of 8-byte a
171a0 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 66 74  ligned space aft
171b0 65 72 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  er the Index obj
171c0 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ect and return a
171d0 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  .** pointer to t
171e0 68 69 73 20 65 78 74 72 61 20 73 70 61 63 65 20  his extra space 
171f0 69 6e 20 2a 70 70 45 78 74 72 61 2e 0a 2a 2f 0a  in *ppExtra..*/.
17200 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 41 6c  Index *sqlite3Al
17210 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63  locateIndexObjec
17220 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
17230 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ,         /* Dat
17240 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
17250 20 2a 2f 0a 20 20 69 31 36 20 6e 43 6f 6c 2c 20   */.  i16 nCol, 
17260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
17270 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  tal number of co
17280 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64  lumns in the ind
17290 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  ex */.  int nExt
172a0 72 61 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ra,          /* 
172b0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
172c0 6f 66 20 65 78 74 72 61 20 73 70 61 63 65 20 74  of extra space t
172d0 6f 20 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61  o alloc */.  cha
172e0 72 20 2a 2a 70 70 45 78 74 72 61 20 20 20 20 20  r **ppExtra     
172f0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
17300 74 68 65 20 22 65 78 74 72 61 22 20 73 70 61 63  the "extra" spac
17310 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20  e */.){.  Index 
17320 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p;            /
17330 2a 20 41 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65  * Allocated inde
17340 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  x object */.  in
17350 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
17360 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
17370 70 61 63 65 20 66 6f 72 20 49 6e 64 65 78 20 6f  pace for Index o
17380 62 6a 65 63 74 20 2b 20 61 72 72 61 79 73 20 2a  bject + arrays *
17390 2f 0a 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55  /..  nByte = ROU
173a0 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65 78  ND8(sizeof(Index
173b0 29 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20  )) +            
173c0 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63    /* Index struc
173d0 74 75 72 65 20 20 2a 2f 0a 20 20 20 20 20 20 20  ture  */.       
173e0 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66     ROUND8(sizeof
173f0 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 20 2b 20  (char*)*nCol) + 
17400 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
17410 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20  .azColl     */. 
17420 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38 28           ROUND8(
17430 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28  sizeof(LogEst)*(
17440 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20 2f 2a  nCol+1) +     /*
17450 20 49 6e 64 65 78 2e 61 69 52 6f 77 4c 6f 67 45   Index.aiRowLogE
17460 73 74 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  st   */.        
17470 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
17480 69 31 36 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20  i16)*nCol +     
17490 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
174a0 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20  aiColumn   */.  
174b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
174c0 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 29 3b  izeof(u8)*nCol);
174d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
174e0 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72  Index.aSortOrder
174f0 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   */.  p = sqlite
17500 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
17510 2c 20 6e 42 79 74 65 20 2b 20 6e 45 78 74 72 61  , nByte + nExtra
17520 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
17530 20 20 63 68 61 72 20 2a 70 45 78 74 72 61 20 3d    char *pExtra =
17540 20 28 28 63 68 61 72 2a 29 70 29 2b 52 4f 55 4e   ((char*)p)+ROUN
17550 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29  D8(sizeof(Index)
17560 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 43 6f 6c 6c  );.    p->azColl
17570 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a   = (const char**
17580 29 70 45 78 74 72 61 3b 20 70 45 78 74 72 61 20  )pExtra; pExtra 
17590 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  += ROUND8(sizeof
175a0 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 3b 0a 20  (char*)*nCol);. 
175b0 20 20 20 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73     p->aiRowLogEs
175c0 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70 45 78  t = (LogEst*)pEx
175d0 74 72 61 3b 20 70 45 78 74 72 61 20 2b 3d 20 73  tra; pExtra += s
175e0 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e  izeof(LogEst)*(n
175f0 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 70 2d 3e 61  Col+1);.    p->a
17600 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29  iColumn = (i16*)
17610 70 45 78 74 72 61 3b 20 20 20 20 20 20 20 70 45  pExtra;       pE
17620 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69  xtra += sizeof(i
17630 31 36 29 2a 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d  16)*nCol;.    p-
17640 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
17650 38 2a 29 70 45 78 74 72 61 3b 0a 20 20 20 20 70  8*)pExtra;.    p
17660 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c  ->nColumn = nCol
17670 3b 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 43 6f 6c  ;.    p->nKeyCol
17680 20 3d 20 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20   = nCol - 1;.   
17690 20 2a 70 70 45 78 74 72 61 20 3d 20 28 28 63 68   *ppExtra = ((ch
176a0 61 72 2a 29 70 29 20 2b 20 6e 42 79 74 65 3b 0a  ar*)p) + nByte;.
176b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
176c0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
176d0 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20  a new index for 
176e0 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70  an SQL table.  p
176f0 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73 20  Name1.pName2 is 
17700 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
17710 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54  index .** and pT
17720 62 6c 4c 69 73 74 20 69 73 20 74 68 65 20 6e 61  blList is the na
17730 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
17740 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
17750 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c  dexed.  Both wil
17760 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f  l .** be NULL fo
17770 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  r a primary key 
17780 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  or an index that
17790 20 69 73 20 63 72 65 61 74 65 64 20 74 6f 20 73   is created to s
177a0 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51  atisfy a.** UNIQ
177b0 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20  UE constraint.  
177c0 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49  If pTable and pI
177d0 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75  ndex are NULL, u
177e0 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
177f0 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74  able.** as the t
17800 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
17810 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  ed.  pParse->pNe
17820 77 54 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c  wTable is a tabl
17830 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72  e that is.** cur
17840 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e  rently being con
17850 73 74 72 75 63 74 65 64 20 62 79 20 61 20 43 52  structed by a CR
17860 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
17870 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73  ment..**.** pLis
17880 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63  t is a list of c
17890 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
178a0 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c  exed.  pList wil
178b0 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69  l be NULL if thi
178c0 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72  s.** is a primar
178d0 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d  y key or unique-
178e0 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68  constraint on th
178f0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f  e most recent co
17900 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f  lumn added.** to
17910 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
17920 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
17930 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f  ruction.  .*/.vo
17940 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
17950 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
17960 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 41  pParse,     /* A
17970 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ll information a
17980 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20  bout this parse 
17990 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
179a0 65 31 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74  e1,     /* First
179b0 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e   part of index n
179c0 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ame. May be NULL
179d0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
179e0 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f  me2,     /* Seco
179f0 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78  nd part of index
17a00 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55   name. May be NU
17a10 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  LL */.  SrcList 
17a20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61  *pTblName, /* Ta
17a30 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73  ble to index. Us
17a40 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
17a50 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78  ble if 0 */.  Ex
17a60 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
17a70 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f   /* A list of co
17a80 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65  lumns to be inde
17a90 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  xed */.  int onE
17aa0 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f  rror,       /* O
17ab0 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f  E_Abort, OE_Igno
17ac0 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20  re, OE_Replace, 
17ad0 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20  or OE_None */.  
17ae0 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20  Token *pStart,  
17af0 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
17b00 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
17b10 6e 73 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  ns this statemen
17b20 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 50 49  t */.  Expr *pPI
17b30 57 68 65 72 65 2c 20 20 20 20 2f 2a 20 57 48 45  Where,    /* WHE
17b40 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 70 61  RE clause for pa
17b50 72 74 69 61 6c 20 69 6e 64 69 63 65 73 20 2a 2f  rtial indices */
17b60 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72  .  int sortOrder
17b70 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72  ,     /* Sort or
17b80 64 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b  der of primary k
17b90 65 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e  ey when pList==N
17ba0 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e  ULL */.  int ifN
17bb0 6f 74 45 78 69 73 74 2c 20 20 20 20 2f 2a 20 4f  otExist,    /* O
17bc0 6d 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e 64  mit error if ind
17bd0 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ex already exist
17be0 73 20 2a 2f 0a 20 20 75 38 20 69 64 78 54 79 70  s */.  u8 idxTyp
17bf0 65 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e         /* The
17c00 20 69 6e 64 65 78 20 74 79 70 65 20 2a 2f 0a 29   index type */.)
17c10 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
17c20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c  = 0;     /* Tabl
17c30 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  e to be indexed 
17c40 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
17c50 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65  ex = 0;   /* The
17c60 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65   index to be cre
17c70 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ated */.  char *
17c80 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f  zName = 0;     /
17c90 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  * Name of the in
17ca0 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  dex */.  int nNa
17cb0 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me;           /*
17cc0 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   Number of chara
17cd0 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a  cters in zName *
17ce0 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  /.  int i, j;.  
17cf0 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20  DbFixer sFix;   
17d00 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69       /* For assi
17d10 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e  gning database n
17d20 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a  ames to pTable *
17d30 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
17d40 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f  rMask;   /* 1 to
17d50 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69   honor DESC in i
17d60 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f  ndex.  0 to igno
17d70 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  re. */.  sqlite3
17d80 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
17d90 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20  b;.  Db *pDb;   
17da0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17db0 20 73 70 65 63 69 66 69 63 20 74 61 62 6c 65 20   specific table 
17dc0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69  containing the i
17dd0 6e 64 65 78 65 64 20 64 61 74 61 62 61 73 65 20  ndexed database 
17de0 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
17df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
17e00 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
17e10 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  se that is being
17e20 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f   written */.  To
17e30 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20  ken *pName = 0; 
17e40 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65     /* Unqualifie
17e50 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  d name of the in
17e60 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f  dex to create */
17e70 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
17e80 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74  st_item *pListIt
17e90 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  em; /* For loopi
17ea0 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f  ng over pList */
17eb0 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20  .  int nExtra = 
17ec0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
17ed0 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c      /* Space all
17ee0 6f 63 61 74 65 64 20 66 6f 72 20 7a 45 78 74 72  ocated for zExtr
17ef0 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  a[] */.  int nEx
17f00 74 72 61 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  traCol;         
17f10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
17f20 62 65 72 20 6f 66 20 65 78 74 72 61 20 63 6f 6c  ber of extra col
17f30 75 6d 6e 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20  umns needed */. 
17f40 20 63 68 61 72 20 2a 7a 45 78 74 72 61 20 3d 20   char *zExtra = 
17f50 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
17f60 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65    /* Extra space
17f70 20 61 66 74 65 72 20 74 68 65 20 49 6e 64 65 78   after the Index
17f80 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 49 6e 64   object */.  Ind
17f90 65 78 20 2a 70 50 6b 20 3d 20 30 3b 20 20 20 20  ex *pPk = 0;    
17fa0 20 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45 59    /* PRIMARY KEY
17fb0 20 69 6e 64 65 78 20 66 6f 72 20 57 49 54 48 4f   index for WITHO
17fc0 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20  UT ROWID tables 
17fd0 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  */..  if( db->ma
17fe0 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
17ff0 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a  arse->nErr>0 ){.
18000 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
18010 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
18020 20 20 69 66 28 20 49 4e 5f 44 45 43 4c 41 52 45    if( IN_DECLARE
18030 5f 56 54 41 42 20 26 26 20 69 64 78 54 79 70 65  _VTAB && idxType
18040 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  !=SQLITE_IDXTYPE
18050 5f 50 52 49 4d 41 52 59 4b 45 59 20 29 7b 0a 20  _PRIMARYKEY ){. 
18060 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
18070 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
18080 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
18090 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
180a0 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
180b0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
180c0 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  e_index;.  }..  
180d0 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
180e0 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
180f0 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52  o be indexed.  R
18100 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e  eturn early if n
18110 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20  ot found..  */. 
18120 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
18130 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20   ){..    /* Use 
18140 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64  the two-part ind
18150 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72  ex name to deter
18160 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62 61 73  mine the databas
18170 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61  e .    ** to sea
18180 72 63 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c  rch for the tabl
18190 65 2e 20 27 46 69 78 27 20 74 68 65 20 74 61 62  e. 'Fix' the tab
181a0 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20  le name to this 
181b0 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  db.    ** before
181c0 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20   looking up the 
181d0 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
181e0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31    assert( pName1
181f0 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20   && pName2 );.  
18200 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
18210 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
18220 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
18230 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20  2, &pName);.    
18240 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f  if( iDb<0 ) goto
18250 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18260 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
18270 70 4e 61 6d 65 20 26 26 20 70 4e 61 6d 65 2d 3e  pName && pName->
18280 7a 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  z );..#ifndef SQ
18290 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42  LITE_OMIT_TEMPDB
182a0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69  .    /* If the i
182b0 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e  ndex name was un
182c0 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b  qualified, check
182d0 20 69 66 20 74 68 65 20 74 61 62 6c 65 0a 20 20   if the table.  
182e0 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74    ** is a temp t
182f0 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74  able. If so, set
18300 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
18310 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68   1. Do not do th
18320 69 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e 69  is.    ** if ini
18330 74 69 61 6c 69 73 69 6e 67 20 61 20 64 61 74 61  tialising a data
18340 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20  base schema..   
18350 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 64 62 2d   */.    if( !db-
18360 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
18370 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
18380 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28  e3SrcListLookup(
18390 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65  pParse, pTblName
183a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61  );.      if( pNa
183b0 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61  me2->n==0 && pTa
183c0 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65  b && pTab->pSche
183d0 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ma==db->aDb[1].p
183e0 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
183f0 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 20    iDb = 1;.     
18400 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
18410 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 78 49  .    sqlite3FixI
18420 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73  nit(&sFix, pPars
18430 65 2c 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c  e, iDb, "index",
18440 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   pName);.    if(
18450 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69   sqlite3FixSrcLi
18460 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61  st(&sFix, pTblNa
18470 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  me) ){.      /* 
18480 42 65 63 61 75 73 65 20 74 68 65 20 70 61 72 73  Because the pars
18490 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54  er constructs pT
184a0 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69  blName from a si
184b0 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c  ngle identifier,
184c0 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
184d0 33 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20  3FixSrcList can 
184e0 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20  never fail. */. 
184f0 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a       assert(0);.
18500 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d      }.    pTab =
18510 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
18520 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20  bleItem(pParse, 
18530 30 2c 20 26 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b  0, &pTblName->a[
18540 30 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0]);.    assert(
18550 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
18560 64 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d 30 20  d==0 || pTab==0 
18570 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d  );.    if( pTab=
18580 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
18590 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
185a0 20 69 66 28 20 69 44 62 3d 3d 31 20 26 26 20 64   if( iDb==1 && d
185b0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
185c0 65 6d 61 21 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema!=pTab->pSche
185d0 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ma ){.      sqli
185e0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
185f0 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
18600 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 61  "cannot create a
18610 20 54 45 4d 50 20 69 6e 64 65 78 20 6f 6e 20 6e   TEMP index on n
18620 6f 6e 2d 54 45 4d 50 20 74 61 62 6c 65 20 5c 22  on-TEMP table \"
18630 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\"",.         
18640 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a    pTab->zName);.
18650 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
18660 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
18670 20 20 7d 0a 20 20 20 20 69 66 28 20 21 48 61 73    }.    if( !Has
18680 52 6f 77 69 64 28 70 54 61 62 29 20 29 20 70 50  Rowid(pTab) ) pP
18690 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  k = sqlite3Prima
186a0 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
186b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
186c0 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20  ssert( pName==0 
186d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
186e0 53 74 61 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Start==0 );.    
186f0 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
18700 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 66  NewTable;.    if
18710 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65  ( !pTab ) goto e
18720 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18730 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
18740 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
18750 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
18760 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d  ma);.  }.  pDb =
18770 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
18780 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21  .  assert( pTab!
18790 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
187a0 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
187b0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
187c0 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a  StrNICmp(pTab->z
187d0 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
187e0 20 37 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26   7)==0 .       &
187f0 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  & db->init.busy=
18800 3d 30 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53  =0.#if SQLITE_US
18810 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ER_AUTHENTICATIO
18820 4e 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  N.       && sqli
18830 74 65 33 55 73 65 72 41 75 74 68 54 61 62 6c 65  te3UserAuthTable
18840 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3d 3d 30  (pTab->zName)==0
18850 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 26  .#endif.       &
18860 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  & sqlite3StrNICm
18870 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37  p(&pTab->zName[7
18880 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c 39 29  ],"altertab_",9)
18890 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
188a0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
188b0 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79  e, "table %s may
188c0 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22   not be indexed"
188d0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
188e0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
188f0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
18900 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18910 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70  MIT_VIEW.  if( p
18920 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
18930 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
18940 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65  Msg(pParse, "vie
18950 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  ws may not be in
18960 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74  dexed");.    got
18970 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
18980 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  dex;.  }.#endif.
18990 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
189a0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
189b0 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
189c0 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71  (pTab) ){.    sq
189d0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
189e0 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c 20 74  arse, "virtual t
189f0 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65  ables may not be
18a00 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20   indexed");.    
18a10 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
18a20 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64  _index;.  }.#end
18a30 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69  if..  /*.  ** Fi
18a40 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  nd the name of t
18a50 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20  he index.  Make 
18a60 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
18a70 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65  t already anothe
18a80 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20  r.  ** index or 
18a90 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  table with the s
18aa0 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a  ame name.  .  **
18ab0 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a  .  ** Exception:
18ac0 20 20 49 66 20 77 65 20 61 72 65 20 72 65 61 64    If we are read
18ad0 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ing the names of
18ae0 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63   permanent indic
18af0 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a  es from the.  **
18b00 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
18b10 61 62 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f  able (because so
18b20 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
18b30 20 63 68 61 6e 67 65 64 20 74 68 65 20 73 63 68   changed the sch
18b40 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e  ema) and.  ** on
18b50 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e  e of the index n
18b60 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69  ames collides wi
18b70 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  th the name of a
18b80 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
18b90 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20   or.  ** index, 
18ba0 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e  then we will con
18bb0 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73  tinue to process
18bc0 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a   this index..  *
18bd0 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d  *.  ** If pName=
18be0 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  =0 it means that
18bf0 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61   we are.  ** dea
18c00 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d  ling with a prim
18c10 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55  ary key or UNIQU
18c20 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57  E constraint.  W
18c30 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74  e have to invent
18c40 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61   our.  ** own na
18c50 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  me..  */.  if( p
18c60 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d  Name ){.    zNam
18c70 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
18c80 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61  romToken(db, pNa
18c90 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61  me);.    if( zNa
18ca0 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  me==0 ) goto exi
18cb0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
18cc0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
18cd0 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 69  e->z!=0 );.    i
18ce0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
18cf0 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74  lite3CheckObject
18d00 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61  Name(pParse, zNa
18d10 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  me) ){.      got
18d20 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
18d30 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
18d40 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
18d50 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  y ){.      if( s
18d60 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
18d70 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30  db, zName, 0)!=0
18d80 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
18d90 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
18da0 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  se, "there is al
18db0 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61  ready a table na
18dc0 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  med %s", zName);
18dd0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
18de0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
18df0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18e00 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
18e10 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
18e20 65 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65  e, pDb->zDbSName
18e30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
18e40 28 20 21 69 66 4e 6f 74 45 78 69 73 74 20 29 7b  ( !ifNotExist ){
18e50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18e60 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
18e70 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61   "index %s alrea
18e80 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d  dy exists", zNam
18e90 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
18ea0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
18eb0 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
18ec0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
18ed0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
18ee0 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
18ef0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
18f00 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
18f10 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
18f20 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  else{.    int n;
18f30 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f  .    Index *pLoo
18f40 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  p;.    for(pLoop
18f50 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e  =pTab->pIndex, n
18f60 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =1; pLoop; pLoop
18f70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e  =pLoop->pNext, n
18f80 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 20  ++){}.    zName 
18f90 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
18fa0 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 61 75 74  (db, "sqlite_aut
18fb0 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22 2c 20 70  oindex_%s_%d", p
18fc0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a  Tab->zName, n);.
18fd0 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
18fe0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
18ff0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
19000 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
19010 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  Automatic index 
19020 6e 61 6d 65 73 20 67 65 6e 65 72 61 74 65 64 20  names generated 
19030 66 72 6f 6d 20 77 69 74 68 69 6e 20 73 71 6c 69  from within sqli
19040 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
19050 28 29 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20 68  ().    ** must h
19060 61 76 65 20 6e 61 6d 65 73 20 74 68 61 74 20 61  ave names that a
19070 72 65 20 64 69 73 74 69 6e 63 74 20 66 72 6f 6d  re distinct from
19080 20 6e 6f 72 6d 61 6c 20 61 75 74 6f 6d 61 74 69   normal automati
19090 63 20 69 6e 64 65 78 20 6e 61 6d 65 73 2e 0a 20  c index names.. 
190a0 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
190b0 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  ing statement co
190c0 6e 76 65 72 74 73 20 22 73 71 6c 69 74 65 33 5f  nverts "sqlite3_
190d0 61 75 74 6f 69 6e 64 65 78 2e 2e 2e 22 20 69 6e  autoindex..." in
190e0 74 6f 0a 20 20 20 20 2a 2a 20 22 73 71 6c 69 74  to.    ** "sqlit
190f0 65 33 5f 62 75 74 6f 69 6e 64 65 78 2e 2e 2e 22  e3_butoindex..."
19100 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b   in order to mak
19110 65 20 74 68 65 20 6e 61 6d 65 73 20 64 69 73 74  e the names dist
19120 69 6e 63 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65  inct..    ** The
19130 20 22 76 74 61 62 5f 65 72 72 2e 74 65 73 74 22   "vtab_err.test"
19140 20 74 65 73 74 20 64 65 6d 6f 6e 73 74 72 61 74   test demonstrat
19150 65 73 20 74 68 65 20 6e 65 65 64 20 6f 66 20 74  es the need of t
19160 68 69 73 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a  his statement. *
19170 2f 0a 20 20 20 20 69 66 28 20 49 4e 5f 44 45 43  /.    if( IN_DEC
19180 4c 41 52 45 5f 56 54 41 42 20 29 20 7a 4e 61 6d  LARE_VTAB ) zNam
19190 65 5b 37 5d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f  e[7]++;.  }..  /
191a0 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68  * Check for auth
191b0 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65  orization to cre
191c0 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20  ate an index..  
191d0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
191e0 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
191f0 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e  TION.  {.    con
19200 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 70  st char *zDb = p
19210 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20  Db->zDbSName;.  
19220 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
19230 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
19240 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
19250 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
19260 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
19270 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
19280 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
19290 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43      i = SQLITE_C
192a0 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20  REATE_INDEX;.   
192b0 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
192c0 42 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20  B && iDb==1 ) i 
192d0 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
192e0 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  TEMP_INDEX;.    
192f0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
19300 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20  heck(pParse, i, 
19310 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
19320 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  me, zDb) ){.    
19330 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
19340 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
19350 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
19360 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74   If pList==0, it
19370 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74   means this rout
19380 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74  ine was called t
19390 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79  o make a primary
193a0 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66  .  ** key out of
193b0 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
193c0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
193d0 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
193e0 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20  uction..  ** So 
193f0 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69  create a fake li
19400 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74  st to simulate t
19410 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  his..  */.  if( 
19420 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
19430 54 6f 6b 65 6e 20 70 72 65 76 43 6f 6c 3b 0a 20  Token prevCol;. 
19440 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49     sqlite3TokenI
19450 6e 69 74 28 26 70 72 65 76 43 6f 6c 2c 20 70 54  nit(&prevCol, pT
19460 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e  ab->aCol[pTab->n
19470 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  Col-1].zName);. 
19480 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
19490 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
194a0 28 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20  (pParse, 0,.    
194b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
194c0 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
194d0 4b 5f 49 44 2c 20 26 70 72 65 76 43 6f 6c 2c 20  K_ID, &prevCol, 
194e0 30 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  0));.    if( pLi
194f0 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  st==0 ) goto exi
19500 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
19510 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
19520 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20  t->nExpr==1 );. 
19530 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
19540 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28 70  stSetSortOrder(p
19550 4c 69 73 74 2c 20 73 6f 72 74 4f 72 64 65 72 29  List, sortOrder)
19560 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
19570 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68  qlite3ExprListCh
19580 65 63 6b 4c 65 6e 67 74 68 28 70 50 61 72 73 65  eckLength(pParse
19590 2c 20 70 4c 69 73 74 2c 20 22 69 6e 64 65 78 22  , pList, "index"
195a0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67  );.  }..  /* Fig
195b0 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
195c0 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
195d0 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20  are required to 
195e0 73 74 6f 72 65 20 65 78 70 6c 69 63 69 74 6c 79  store explicitly
195f0 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20  .  ** specified 
19600 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
19610 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20  ce names..  */. 
19620 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
19630 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
19640 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
19650 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  = pList->a[i].pE
19660 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
19670 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20   pExpr!=0 );.   
19680 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
19690 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20  TK_COLLATE ){.  
196a0 20 20 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31      nExtra += (1
196b0 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   + sqlite3Strlen
196c0 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  30(pExpr->u.zTok
196d0 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  en));.    }.  }.
196e0 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f  .  /* .  ** Allo
196f0 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73  cate the index s
19700 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a  tructure. .  */.
19710 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
19720 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
19730 3b 0a 20 20 6e 45 78 74 72 61 43 6f 6c 20 3d 20  ;.  nExtraCol = 
19740 70 50 6b 20 3f 20 70 50 6b 2d 3e 6e 4b 65 79 43  pPk ? pPk->nKeyC
19750 6f 6c 20 3a 20 31 3b 0a 20 20 70 49 6e 64 65 78  ol : 1;.  pIndex
19760 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61   = sqlite3Alloca
19770 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62  teIndexObject(db
19780 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b  , pList->nExpr +
19790 20 6e 45 78 74 72 61 43 6f 6c 2c 0a 20 20 20 20   nExtraCol,.    
197a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197c0 20 20 6e 4e 61 6d 65 20 2b 20 6e 45 78 74 72 61    nName + nExtra
197d0 20 2b 20 31 2c 20 26 7a 45 78 74 72 61 29 3b 0a   + 1, &zExtra);.
197e0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
197f0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
19800 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
19810 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ndex;.  }.  asse
19820 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
19830 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d  LIGNMENT(pIndex-
19840 3e 61 69 52 6f 77 4c 6f 67 45 73 74 29 20 29 3b  >aiRowLogEst) );
19850 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
19860 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
19870 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20  pIndex->azColl) 
19880 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  );.  pIndex->zNa
19890 6d 65 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 7a  me = zExtra;.  z
198a0 45 78 74 72 61 20 2b 3d 20 6e 4e 61 6d 65 20 2b  Extra += nName +
198b0 20 31 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e   1;.  memcpy(pIn
198c0 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  dex->zName, zNam
198d0 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70  e, nName+1);.  p
198e0 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20  Index->pTable = 
198f0 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  pTab;.  pIndex->
19900 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e  onError = (u8)on
19910 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d  Error;.  pIndex-
19920 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f  >uniqNotNull = o
19930 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b  nError!=OE_None;
19940 0a 20 20 70 49 6e 64 65 78 2d 3e 69 64 78 54 79  .  pIndex->idxTy
19950 70 65 20 3d 20 69 64 78 54 79 70 65 3b 0a 20 20  pe = idxType;.  
19960 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 20  pIndex->pSchema 
19970 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
19980 53 63 68 65 6d 61 3b 0a 20 20 70 49 6e 64 65 78  Schema;.  pIndex
19990 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 70 4c 69 73  ->nKeyCol = pLis
199a0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20  t->nExpr;.  if( 
199b0 70 50 49 57 68 65 72 65 20 29 7b 0a 20 20 20 20  pPIWhere ){.    
199c0 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65  sqlite3ResolveSe
199d0 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61 72  lfReference(pPar
199e0 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f 50 61 72  se, pTab, NC_Par
199f0 74 49 64 78 2c 20 70 50 49 57 68 65 72 65 2c 20  tIdx, pPIWhere, 
19a00 30 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  0);.    pIndex->
19a10 70 50 61 72 74 49 64 78 57 68 65 72 65 20 3d 20  pPartIdxWhere = 
19a20 70 50 49 57 68 65 72 65 3b 0a 20 20 20 20 70 50  pPIWhere;.    pP
19a30 49 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a  IWhere = 0;.  }.
19a40 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
19a50 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
19a60 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
19a70 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
19a80 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c 64 20  ee if we should 
19a90 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71 75 65  honor DESC reque
19aa0 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c  sts on index col
19ab0 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  umns.  */.  if( 
19ac0 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69  pDb->pSchema->fi
19ad0 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a  le_format>=4 ){.
19ae0 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73      sortOrderMas
19af0 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e  k = -1;   /* Hon
19b00 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c  or DESC */.  }el
19b10 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65  se{.    sortOrde
19b20 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a  rMask = 0;    /*
19b30 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a   Ignore DESC */.
19b40 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a    }..  /* Analyz
19b50 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78  e the list of ex
19b60 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 66  pressions that f
19b70 6f 72 6d 20 74 68 65 20 74 65 72 6d 73 20 6f 66  orm the terms of
19b80 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 0a 20   the index and. 
19b90 20 2a 2a 20 72 65 70 6f 72 74 20 61 6e 79 20 65   ** report any e
19ba0 72 72 6f 72 73 2e 20 20 49 6e 20 74 68 65 20 63  rrors.  In the c
19bb0 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
19bc0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
19bd0 69 73 20 65 78 61 63 74 6c 79 0a 20 20 2a 2a 20  is exactly.  ** 
19be0 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20  a table column, 
19bf0 73 74 6f 72 65 20 74 68 61 74 20 63 6f 6c 75 6d  store that colum
19c00 6e 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e  n in aiColumn[].
19c10 20 20 46 6f 72 20 67 65 6e 65 72 61 6c 20 65 78    For general ex
19c20 70 72 65 73 73 69 6f 6e 73 2c 0a 20 20 2a 2a 20  pressions,.  ** 
19c30 70 6f 70 75 6c 61 74 65 20 70 49 6e 64 65 78 2d  populate pIndex-
19c40 3e 61 43 6f 6c 45 78 70 72 20 61 6e 64 20 73 74  >aColExpr and st
19c50 6f 72 65 20 58 4e 5f 45 58 50 52 20 28 2d 32 29  ore XN_EXPR (-2)
19c60 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 0a   in aiColumn[]..
19c70 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20    **.  ** TODO: 
19c80 49 73 73 75 65 20 61 20 77 61 72 6e 69 6e 67 20  Issue a warning 
19c90 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63  if two or more c
19ca0 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
19cb0 64 65 78 20 61 72 65 20 69 64 65 6e 74 69 63 61  dex are identica
19cc0 6c 2e 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73  l..  ** TODO: Is
19cd0 73 75 65 20 61 20 77 61 72 6e 69 6e 67 20 69 66  sue a warning if
19ce0 20 74 68 65 20 74 61 62 6c 65 20 70 72 69 6d 61   the table prima
19cf0 72 79 20 6b 65 79 20 69 73 20 75 73 65 64 20 61  ry key is used a
19d00 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20  s part of the.  
19d10 2a 2a 20 69 6e 64 65 78 20 6b 65 79 2e 0a 20 20  ** index key..  
19d20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c  */.  for(i=0, pL
19d30 69 73 74 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  istItem=pList->a
19d40 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
19d50 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d  ; i++, pListItem
19d60 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
19d70 43 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  CExpr;          
19d80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
19d90 2d 74 68 20 69 6e 64 65 78 20 65 78 70 72 65 73  -th index expres
19da0 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  sion */.    int 
19db0 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
19dc0 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 53  er;        /* AS
19dd0 43 20 6f 72 20 44 45 53 43 20 6f 6e 20 74 68 65  C or DESC on the
19de0 20 69 2d 74 68 20 65 78 70 72 65 73 73 69 6f 6e   i-th expression
19df0 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
19e00 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20  ar *zColl;      
19e10 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
19e20 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
19e30 65 20 2a 2f 0a 0a 20 20 20 20 73 71 6c 69 74 65  e */..    sqlite
19e40 33 53 74 72 69 6e 67 54 6f 49 64 28 70 4c 69 73  3StringToId(pLis
19e50 74 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  tItem->pExpr);. 
19e60 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
19e70 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70  eSelfReference(p
19e80 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f  Parse, pTab, NC_
19e90 49 64 78 45 78 70 72 2c 20 70 4c 69 73 74 49 74  IdxExpr, pListIt
19ea0 65 6d 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20  em->pExpr, 0);. 
19eb0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
19ec0 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  Err ) goto exit_
19ed0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
19ee0 20 20 70 43 45 78 70 72 20 3d 20 73 71 6c 69 74    pCExpr = sqlit
19ef0 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
19f00 65 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  e(pListItem->pEx
19f10 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 45  pr);.    if( pCE
19f20 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
19f30 4d 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  MN ){.      if( 
19f40 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e  pTab==pParse->pN
19f50 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  ewTable ){.     
19f60 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
19f70 73 67 28 70 50 61 72 73 65 2c 20 22 65 78 70 72  sg(pParse, "expr
19f80 65 73 73 69 6f 6e 73 20 70 72 6f 68 69 62 69 74  essions prohibit
19f90 65 64 20 69 6e 20 50 52 49 4d 41 52 59 20 4b 45  ed in PRIMARY KE
19fa0 59 20 61 6e 64 20 22 0a 20 20 20 20 20 20 20 20  Y and ".        
19fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fc0 20 20 20 20 20 20 20 20 22 55 4e 49 51 55 45 20          "UNIQUE 
19fd0 63 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a 20  constraints");. 
19fe0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
19ff0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1a000 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1a010 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70   pIndex->aColExp
1a020 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r==0 ){.        
1a030 45 78 70 72 4c 69 73 74 20 2a 70 43 6f 70 79 20  ExprList *pCopy 
1a040 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1a050 74 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2c 20  tDup(db, pList, 
1a060 30 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64  0);.        pInd
1a070 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20 3d 20 70  ex->aColExpr = p
1a080 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 69 66  Copy;.        if
1a090 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
1a0a0 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  led ){.         
1a0b0 20 61 73 73 65 72 74 28 20 70 43 6f 70 79 21 3d   assert( pCopy!=
1a0c0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
1a0d0 4c 69 73 74 49 74 65 6d 20 3d 20 26 70 43 6f 70  ListItem = &pCop
1a0e0 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20  y->a[i];.       
1a0f0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1a100 20 6a 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20   j = XN_EXPR;.  
1a110 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
1a120 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 45 58 50  lumn[i] = XN_EXP
1a130 52 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  R;.      pIndex-
1a140 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30  >uniqNotNull = 0
1a150 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a160 20 20 20 6a 20 3d 20 70 43 45 78 70 72 2d 3e 69     j = pCExpr->i
1a170 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 61 73  Column;.      as
1a180 73 65 72 74 28 20 6a 3c 3d 30 78 37 66 66 66 20  sert( j<=0x7fff 
1a190 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 30  );.      if( j<0
1a1a0 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20   ){.        j = 
1a1b0 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
1a1c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61     }else if( pTa
1a1d0 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75  b->aCol[j].notNu
1a1e0 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ll==0 ){.       
1a1f0 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74   pIndex->uniqNot
1a200 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Null = 0;.      
1a210 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  }.      pIndex->
1a220 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 28 69  aiColumn[i] = (i
1a230 31 36 29 6a 3b 0a 20 20 20 20 7d 0a 20 20 20 20  16)j;.    }.    
1a240 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69  zColl = 0;.    i
1a250 66 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45  f( pListItem->pE
1a260 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c  xpr->op==TK_COLL
1a270 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ATE ){.      int
1a280 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7a 43   nColl;.      zC
1a290 6f 6c 6c 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d  oll = pListItem-
1a2a0 3e 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  >pExpr->u.zToken
1a2b0 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 6c 20 3d 20  ;.      nColl = 
1a2c0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1a2d0 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20 20 20  zColl) + 1;.    
1a2e0 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61    assert( nExtra
1a2f0 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20  >=nColl );.     
1a300 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20   memcpy(zExtra, 
1a310 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20  zColl, nColl);. 
1a320 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78       zColl = zEx
1a330 74 72 61 3b 0a 20 20 20 20 20 20 7a 45 78 74 72  tra;.      zExtr
1a340 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20  a += nColl;.    
1a350 20 20 6e 45 78 74 72 61 20 2d 3d 20 6e 43 6f 6c    nExtra -= nCol
1a360 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  l;.    }else if(
1a370 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a   j>=0 ){.      z
1a380 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Coll = pTab->aCo
1a390 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  l[j].zColl;.    
1a3a0 7d 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c  }.    if( !zColl
1a3b0 20 29 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74   ) zColl = sqlit
1a3c0 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20  e3StrBINARY;.   
1a3d0 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
1a3e0 75 73 79 20 26 26 20 21 73 71 6c 69 74 65 33 4c  usy && !sqlite3L
1a3f0 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
1a400 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20  rse, zColl) ){. 
1a410 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
1a420 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
1a430 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61   }.    pIndex->a
1a440 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c  zColl[i] = zColl
1a450 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65 64 53  ;.    requestedS
1a460 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74  ortOrder = pList
1a470 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20  Item->sortOrder 
1a480 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b  & sortOrderMask;
1a490 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f  .    pIndex->aSo
1a4a0 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 28 75 38  rtOrder[i] = (u8
1a4b0 29 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72  )requestedSortOr
1a4c0 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  der;.  }..  /* A
1a4d0 70 70 65 6e 64 20 74 68 65 20 74 61 62 6c 65 20  ppend the table 
1a4e0 6b 65 79 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  key to the end o
1a4f0 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 46 6f  f the index.  Fo
1a500 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a  r WITHOUT ROWID.
1a510 20 20 2a 2a 20 74 61 62 6c 65 73 20 28 77 68 65    ** tables (whe
1a520 6e 20 70 50 6b 21 3d 30 29 20 74 68 69 73 20 77  n pPk!=0) this w
1a530 69 6c 6c 20 62 65 20 74 68 65 20 64 65 63 6c 61  ill be the decla
1a540 72 65 64 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  red PRIMARY KEY.
1a550 20 20 46 6f 72 0a 20 20 2a 2a 20 6e 6f 72 6d 61    For.  ** norma
1a560 6c 20 74 61 62 6c 65 73 20 28 77 68 65 6e 20 70  l tables (when p
1a570 50 6b 3d 3d 30 29 20 74 68 69 73 20 77 69 6c 6c  Pk==0) this will
1a580 20 62 65 20 74 68 65 20 72 6f 77 69 64 2e 0a 20   be the rowid.. 
1a590 20 2a 2f 0a 20 20 69 66 28 20 70 50 6b 20 29 7b   */.  if( pPk ){
1a5a0 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
1a5b0 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b  pPk->nKeyCol; j+
1a5c0 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20  +){.      int x 
1a5d0 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  = pPk->aiColumn[
1a5e0 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  j];.      assert
1a5f0 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( x>=0 );.      
1a600 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70 49  if( hasColumn(pI
1a610 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20  ndex->aiColumn, 
1a620 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c  pIndex->nKeyCol,
1a630 20 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70   x) ){.        p
1a640 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d  Index->nColumn--
1a650 3b 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ; .      }else{.
1a660 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
1a670 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 78 3b  aiColumn[i] = x;
1a680 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
1a690 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50 6b  >azColl[i] = pPk
1a6a0 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20  ->azColl[j];.   
1a6b0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f       pIndex->aSo
1a6c0 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 50 6b  rtOrder[i] = pPk
1a6d0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b  ->aSortOrder[j];
1a6e0 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  .        i++;.  
1a6f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1a700 61 73 73 65 72 74 28 20 69 3d 3d 70 49 6e 64 65  assert( i==pInde
1a710 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  x->nColumn );.  
1a720 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 64 65  }else{.    pInde
1a730 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d  x->aiColumn[i] =
1a740 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20 70   XN_ROWID;.    p
1a750 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  Index->azColl[i]
1a760 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e   = sqlite3StrBIN
1a770 41 52 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ARY;.  }.  sqlit
1a780 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28  e3DefaultRowEst(
1a790 70 49 6e 64 65 78 29 3b 0a 20 20 69 66 28 20 70  pIndex);.  if( p
1a7a0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
1a7b0 3d 3d 30 20 29 20 65 73 74 69 6d 61 74 65 49 6e  ==0 ) estimateIn
1a7c0 64 65 78 57 69 64 74 68 28 70 49 6e 64 65 78 29  dexWidth(pIndex)
1a7d0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1a7e0 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e 73 20 65  index contains e
1a7f0 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69  very column of i
1a800 74 73 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d  ts table, then m
1a810 61 72 6b 0a 20 20 2a 2a 20 69 74 20 61 73 20 61  ark.  ** it as a
1a820 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
1a830 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 48 61 73  */.  assert( Has
1a840 52 6f 77 69 64 28 70 54 61 62 29 20 0a 20 20 20  Rowid(pTab) .   
1a850 20 20 20 7c 7c 20 70 54 61 62 2d 3e 69 50 4b 65     || pTab->iPKe
1a860 79 3c 30 20 7c 7c 20 73 71 6c 69 74 65 33 43 6f  y<0 || sqlite3Co
1a870 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 6e 64  lumnOfIndex(pInd
1a880 65 78 2c 20 70 54 61 62 2d 3e 69 50 4b 65 79 29  ex, pTab->iPKey)
1a890 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 54 62  >=0 );.  if( pTb
1a8a0 6c 4e 61 6d 65 21 3d 30 20 26 26 20 70 49 6e 64  lName!=0 && pInd
1a8b0 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 54 61  ex->nColumn>=pTa
1a8c0 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 70  b->nCol ){.    p
1a8d0 49 6e 64 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e  Index->isCoverin
1a8e0 67 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 6a  g = 1;.    for(j
1a8f0 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; j<pTab->nCol
1a900 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
1a910 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79  ( j==pTab->iPKey
1a920 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1a930 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f     if( sqlite3Co
1a940 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 6e 64  lumnOfIndex(pInd
1a950 65 78 2c 6a 29 3e 3d 30 20 29 20 63 6f 6e 74 69  ex,j)>=0 ) conti
1a960 6e 75 65 3b 0a 20 20 20 20 20 20 70 49 6e 64 65  nue;.      pInde
1a970 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20  x->isCovering = 
1a980 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
1a990 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1a9a0 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70   pTab==pParse->p
1a9b0 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  NewTable ){.    
1a9c0 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
1a9d0 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  has been called 
1a9e0 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75 74  to create an aut
1a9f0 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73 20  omatic index as 
1aa00 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20  a.    ** result 
1aa10 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  of a PRIMARY KEY
1aa20 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73   or UNIQUE claus
1aa30 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65  e on a column de
1aa40 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20  finition, or.   
1aa50 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45   ** a PRIMARY KE
1aa60 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75  Y or UNIQUE clau
1aa70 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  se following the
1aa80 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69   column definiti
1aa90 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e  ons..    ** i.e.
1aaa0 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a   one of:.    **.
1aab0 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41      ** CREATE TA
1aac0 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59 20  BLE t(x PRIMARY 
1aad0 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20  KEY, y);.    ** 
1aae0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78  CREATE TABLE t(x
1aaf0 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79  , y, UNIQUE(x, y
1ab00 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ));.    **.    *
1ab10 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 68  * Either way, ch
1ab20 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
1ab30 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  e table already 
1ab40 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65  has such an inde
1ab50 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c  x. If.    ** so,
1ab60 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72   don't bother cr
1ab70 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e  eating this one.
1ab80 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69   This only appli
1ab90 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74  es to.    ** aut
1aba0 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74  omatically creat
1abb0 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72  ed indices. User
1abc0 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79  s can do as they
1abd0 20 77 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a   wish with.    *
1abe0 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63  * explicit indic
1abf0 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  es..    **.    *
1ac00 2a 20 54 77 6f 20 55 4e 49 51 55 45 20 6f 72 20  * Two UNIQUE or 
1ac10 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
1ac20 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 6e 73  traints are cons
1ac30 69 64 65 72 65 64 20 65 71 75 69 76 61 6c 65 6e  idered equivalen
1ac40 74 0a 20 20 20 20 2a 2a 20 28 61 6e 64 20 74 68  t.    ** (and th
1ac50 75 73 20 73 75 70 70 72 65 73 73 69 6e 67 20 74  us suppressing t
1ac60 68 65 20 73 65 63 6f 6e 64 20 6f 6e 65 29 20 65  he second one) e
1ac70 76 65 6e 20 69 66 20 74 68 65 79 20 68 61 76 65  ven if they have
1ac80 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20 2a   different.    *
1ac90 2a 20 73 6f 72 74 20 6f 72 64 65 72 73 2e 0a 20  * sort orders.. 
1aca0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
1acb0 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72  there are differ
1acc0 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ent collating se
1acd0 71 75 65 6e 63 65 73 20 6f 72 20 69 66 20 74 68  quences or if th
1ace0 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20  e columns of.   
1acf0 20 2a 2a 20 74 68 65 20 63 6f 6e 73 74 72 61 69   ** the constrai
1ad00 6e 74 20 6f 63 63 75 72 20 69 6e 20 64 69 66 66  nt occur in diff
1ad10 65 72 65 6e 74 20 6f 72 64 65 72 73 2c 20 74 68  erent orders, th
1ad20 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  en the constrain
1ad30 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 63 6f  ts are.    ** co
1ad40 6e 73 69 64 65 72 65 64 20 64 69 73 74 69 6e 63  nsidered distinc
1ad50 74 20 61 6e 64 20 62 6f 74 68 20 72 65 73 75 6c  t and both resul
1ad60 74 20 69 6e 20 73 65 70 61 72 61 74 65 20 69 6e  t in separate in
1ad70 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  dices..    */.  
1ad80 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
1ad90 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
1ada0 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
1adb0 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
1adc0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a  ){.      int k;.
1add0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49 73        assert( Is
1ade0 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78  UniqueIndex(pIdx
1adf0 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
1ae00 74 28 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65  t( pIdx->idxType
1ae10 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  !=SQLITE_IDXTYPE
1ae20 5f 41 50 50 44 45 46 20 29 3b 0a 20 20 20 20 20  _APPDEF );.     
1ae30 20 61 73 73 65 72 74 28 20 49 73 55 6e 69 71 75   assert( IsUniqu
1ae40 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20 29  eIndex(pIndex) )
1ae50 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  ;..      if( pId
1ae60 78 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e 64  x->nKeyCol!=pInd
1ae70 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f  ex->nKeyCol ) co
1ae80 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f  ntinue;.      fo
1ae90 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e  r(k=0; k<pIdx->n
1aea0 4b 65 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20 20  KeyCol; k++){.  
1aeb0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1aec0 20 2a 7a 31 3b 0a 20 20 20 20 20 20 20 20 63 6f   *z1;.        co
1aed0 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20  nst char *z2;.  
1aee0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1aef0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 3e  dx->aiColumn[k]>
1af00 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
1af10 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
1af20 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43  [k]!=pIndex->aiC
1af30 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b  olumn[k] ) break
1af40 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70  ;.        z1 = p
1af50 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a  Idx->azColl[k];.
1af60 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70 49 6e          z2 = pIn
1af70 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a  dex->azColl[k];.
1af80 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1af90 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a  te3StrICmp(z1, z
1afa0 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  2) ) break;.    
1afb0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d    }.      if( k=
1afc0 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29  =pIdx->nKeyCol )
1afd0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
1afe0 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e  dx->onError!=pIn
1aff0 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a  dex->onError ){.
1b000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
1b010 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65  s constraint cre
1b020 61 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e  ates the same in
1b030 64 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75  dex as a previou
1b040 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  s.          ** c
1b050 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66  onstraint specif
1b060 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e  ied somewhere in
1b070 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
1b080 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  E statement..   
1b090 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65         ** Howeve
1b0a0 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43  r the ON CONFLIC
1b0b0 54 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69  T clauses are di
1b0c0 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68  fferent. If both
1b0d0 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20   this .         
1b0e0 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61   ** constraint a
1b0f0 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  nd the previous 
1b100 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74  equivalent const
1b110 72 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69  raint have expli
1b120 63 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  cit.          **
1b130 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
1b140 75 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20  uses this is an 
1b150 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65  error. Otherwise
1b160 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20  , use the.      
1b170 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c      ** explicitl
1b180 79 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61  y specified beha
1b190 76 69 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64  vior for the ind
1b1a0 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ex..          */
1b1b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
1b1c0 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  (pIdx->onError==
1b1d0 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49  OE_Default || pI
1b1e0 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
1b1f0 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20  E_Default) ){.  
1b200 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1b210 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1b220 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1b230 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20     "conflicting 
1b240 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
1b250 73 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20  ses specified", 
1b260 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
1b270 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
1b280 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
1b290 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
1b2a0 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45         pIdx->onE
1b2b0 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f  rror = pIndex->o
1b2c0 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  nError;.        
1b2d0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1b2e0 20 20 20 20 20 20 69 66 28 20 69 64 78 54 79 70        if( idxTyp
1b2f0 65 3d 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50  e==SQLITE_IDXTYP
1b300 45 5f 50 52 49 4d 41 52 59 4b 45 59 20 29 20 70  E_PRIMARYKEY ) p
1b310 49 64 78 2d 3e 69 64 78 54 79 70 65 20 3d 20 69  Idx->idxType = i
1b320 64 78 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20  dxType;.        
1b330 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1b340 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
1b350 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1b360 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64  Link the new Ind
1b370 65 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  ex structure to 
1b380 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f  its table and to
1b390 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20   the other.  ** 
1b3a0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1b3b0 73 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a  se structures. .
1b3c0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
1b3d0 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
1b3e0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  ;.  if( db->init
1b3f0 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64  .busy ){.    Ind
1b400 65 78 20 2a 70 3b 0a 20 20 20 20 61 73 73 65 72  ex *p;.    asser
1b410 74 28 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56  t( !IN_DECLARE_V
1b420 54 41 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72  TAB );.    asser
1b430 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
1b440 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c  MutexHeld(db, 0,
1b450 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
1b460 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  ) );.    p = sql
1b470 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
1b480 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d  pIndex->pSchema-
1b490 3e 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20  >idxHash, .     
1b4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4b0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
1b4c0 6d 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20  me, pIndex);.   
1b4d0 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
1b4e0 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65  assert( p==pInde
1b4f0 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  x );  /* Malloc 
1b500 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
1b510 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1b520 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
1b530 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
1b540 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
1b550 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73   }.    db->flags
1b560 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
1b570 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69 66  nChanges;.    if
1b580 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  ( pTblName!=0 ){
1b590 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74  .      pIndex->t
1b5a0 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e  num = db->init.n
1b5b0 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20  ewTnum;.    }.  
1b5c0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
1b5d0 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 43  is the initial C
1b5e0 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
1b5f0 65 6d 65 6e 74 20 28 6f 72 20 43 52 45 41 54 45  ement (or CREATE
1b600 20 54 41 42 4c 45 20 69 66 20 74 68 65 0a 20 20   TABLE if the.  
1b610 2a 2a 20 69 6e 64 65 78 20 69 73 20 61 6e 20 69  ** index is an i
1b620 6d 70 6c 69 65 64 20 69 6e 64 65 78 20 66 6f 72  mplied index for
1b630 20 61 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49   a UNIQUE or PRI
1b640 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61  MARY KEY constra
1b650 69 6e 74 29 20 74 68 65 6e 0a 20 20 2a 2a 20 65  int) then.  ** e
1b660 6d 69 74 20 63 6f 64 65 20 74 6f 20 61 6c 6c 6f  mit code to allo
1b670 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 72  cate the index r
1b680 6f 6f 74 70 61 67 65 20 6f 6e 20 64 69 73 6b 20  ootpage on disk 
1b690 61 6e 64 20 6d 61 6b 65 20 61 6e 20 65 6e 74 72  and make an entr
1b6a0 79 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 69  y for.  ** the i
1b6b0 6e 64 65 78 20 69 6e 20 74 68 65 20 73 71 6c 69  ndex in the sqli
1b6c0 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
1b6d0 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65  and populate the
1b6e0 20 69 6e 64 65 78 20 77 69 74 68 0a 20 20 2a 2a   index with.  **
1b6f0 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75 74 2c 20   content.  But, 
1b700 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 69  do not do this i
1b710 66 20 77 65 20 61 72 65 20 73 69 6d 70 6c 79 20  f we are simply 
1b720 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69  reading the sqli
1b730 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74  te_master.  ** t
1b740 61 62 6c 65 20 74 6f 20 70 61 72 73 65 20 74 68  able to parse th
1b750 65 20 73 63 68 65 6d 61 2c 20 6f 72 20 69 66 20  e schema, or if 
1b760 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 74 68  this index is th
1b770 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  e PRIMARY KEY in
1b780 64 65 78 0a 20 20 2a 2a 20 6f 66 20 61 20 57 49  dex.  ** of a WI
1b790 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
1b7a0 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e..  **.  ** If 
1b7b0 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d  pTblName==0 it m
1b7c0 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20  eans this index 
1b7d0 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20  is generated as 
1b7e0 61 6e 20 69 6d 70 6c 69 65 64 20 50 52 49 4d 41  an implied PRIMA
1b7f0 52 59 20 4b 45 59 0a 20 20 2a 2a 20 6f 72 20 55  RY KEY.  ** or U
1b800 4e 49 51 55 45 20 69 6e 64 65 78 20 69 6e 20 61  NIQUE index in a
1b810 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
1b820 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20  atement.  Since 
1b830 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68  the table.  ** h
1b840 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65  as just been cre
1b850 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e  ated, it contain
1b860 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68  s no data and th
1b870 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69  e index initiali
1b880 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70  zation.  ** step
1b890 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e   can be skipped.
1b8a0 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28  .  */.  else if(
1b8b0 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
1b8c0 7c 7c 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  || pTblName!=0 )
1b8d0 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20  {.    Vdbe *v;. 
1b8e0 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a     char *zStmt;.
1b8f0 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b      int iMem = +
1b900 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a  +pParse->nMem;..
1b910 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
1b920 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
1b930 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67      if( v==0 ) g
1b940 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1b950 69 6e 64 65 78 3b 0a 0a 20 20 20 20 73 71 6c 69  index;..    sqli
1b960 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
1b970 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
1b980 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20 2f 2a 20  , iDb);..    /* 
1b990 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70  Create the rootp
1b9a0 61 67 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65  age for the inde
1b9b0 78 20 75 73 69 6e 67 20 43 72 65 61 74 65 49 6e  x using CreateIn
1b9c0 64 65 78 2e 20 42 75 74 20 62 65 66 6f 72 65 0a  dex. But before.
1b9d0 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 73 6f 2c      ** doing so,
1b9e0 20 63 6f 64 65 20 61 20 4e 6f 6f 70 20 69 6e 73   code a Noop ins
1b9f0 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 73 74 6f  truction and sto
1ba00 72 65 20 69 74 73 20 61 64 64 72 65 73 73 20 69  re its address i
1ba10 6e 20 0a 20 20 20 20 2a 2a 20 49 6e 64 65 78 2e  n .    ** Index.
1ba20 74 6e 75 6d 2e 20 54 68 69 73 20 69 73 20 72 65  tnum. This is re
1ba30 71 75 69 72 65 64 20 69 6e 20 63 61 73 65 20 74  quired in case t
1ba40 68 69 73 20 69 6e 64 65 78 20 69 73 20 61 63 74  his index is act
1ba50 75 61 6c 6c 79 20 61 20 0a 20 20 20 20 2a 2a 20  ually a .    ** 
1ba60 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64 20  PRIMARY KEY and 
1ba70 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 63 74  the table is act
1ba80 75 61 6c 6c 79 20 61 20 57 49 54 48 4f 55 54 20  ually a WITHOUT 
1ba90 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 49 6e 20  ROWID table. In 
1baa0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61 73  .    ** that cas
1bab0 65 20 74 68 65 20 63 6f 6e 76 65 72 74 54 6f 57  e the convertToW
1bac0 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65  ithoutRowidTable
1bad0 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  () routine will 
1bae0 72 65 70 6c 61 63 65 0a 20 20 20 20 2a 2a 20 74  replace.    ** t
1baf0 68 65 20 4e 6f 6f 70 20 77 69 74 68 20 61 20 47  he Noop with a G
1bb00 6f 74 6f 20 74 6f 20 6a 75 6d 70 20 6f 76 65 72  oto to jump over
1bb10 20 74 68 65 20 56 44 42 45 20 63 6f 64 65 20 67   the VDBE code g
1bb20 65 6e 65 72 61 74 65 64 20 62 65 6c 6f 77 2e 20  enerated below. 
1bb30 2a 2f 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 74  */.    pIndex->t
1bb40 6e 75 6d 20 3d 20 73 71 6c 69 74 65 33 56 64 62  num = sqlite3Vdb
1bb50 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4e 6f  eAddOp0(v, OP_No
1bb60 6f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  op);.    sqlite3
1bb70 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1bb80 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20 69 44  _CreateIndex, iD
1bb90 62 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20 20 20 2f  b, iMem);..    /
1bba0 2a 20 47 61 74 68 65 72 20 74 68 65 20 63 6f 6d  * Gather the com
1bbb0 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
1bbc0 65 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  e CREATE INDEX s
1bbd0 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20  tatement into.  
1bbe0 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76    ** the zStmt v
1bbf0 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20  ariable.    */. 
1bc00 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b     if( pStart ){
1bc10 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 28  .      int n = (
1bc20 69 6e 74 29 28 70 50 61 72 73 65 2d 3e 73 4c 61  int)(pParse->sLa
1bc30 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20 70 4e 61 6d  stToken.z - pNam
1bc40 65 2d 3e 7a 29 20 2b 20 70 50 61 72 73 65 2d 3e  e->z) + pParse->
1bc50 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a 20 20  sLastToken.n;.  
1bc60 20 20 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e 7a      if( pName->z
1bc70 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29 20 6e 2d 2d  [n-1]==';' ) n--
1bc80 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d  ;.      /* A nam
1bc90 65 64 20 69 6e 64 65 78 20 77 69 74 68 20 61 6e  ed index with an
1bca0 20 65 78 70 6c 69 63 69 74 20 43 52 45 41 54 45   explicit CREATE
1bcb0 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
1bcc0 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   */.      zStmt 
1bcd0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
1bce0 28 64 62 2c 20 22 43 52 45 41 54 45 25 73 20 49  (db, "CREATE%s I
1bcf0 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20  NDEX %.*s",.    
1bd00 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f      onError==OE_
1bd10 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e  None ? "" : " UN
1bd20 49 51 55 45 22 2c 20 6e 2c 20 70 4e 61 6d 65 2d  IQUE", n, pName-
1bd30 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  >z);.    }else{.
1bd40 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f        /* An auto
1bd50 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72 65 61  matic index crea
1bd60 74 65 64 20 62 79 20 61 20 50 52 49 4d 41 52 59  ted by a PRIMARY
1bd70 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63   KEY or UNIQUE c
1bd80 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
1bd90 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71     /* zStmt = sq
1bda0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29  lite3MPrintf("")
1bdb0 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74  ; */.      zStmt
1bdc0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
1bdd0 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79   /* Add an entry
1bde0 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   in sqlite_maste
1bdf0 72 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78  r for this index
1be00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
1be10 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
1be20 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
1be30 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e  "INSERT INTO %Q.
1be40 25 73 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78  %s VALUES('index
1be50 27 2c 25 51 2c 25 51 2c 23 25 64 2c 25 51 29 3b  ',%Q,%Q,#%d,%Q);
1be60 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61  ",.        db->a
1be70 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
1be80 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a 20  , MASTER_NAME,. 
1be90 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
1bea0 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 70 54  Name,.        pT
1beb0 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
1bec0 20 20 20 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20     iMem,.       
1bed0 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20   zStmt.    );.  
1bee0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1bef0 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20  db, zStmt);..   
1bf00 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64   /* Fill the ind
1bf10 65 78 20 77 69 74 68 20 64 61 74 61 20 61 6e 64  ex with data and
1bf20 20 72 65 70 61 72 73 65 20 74 68 65 20 73 63 68   reparse the sch
1bf30 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f  ema. Code an OP_
1bf40 45 78 70 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f  Expire.    ** to
1bf50 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
1bf60 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61  pre-compiled sta
1bf70 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a  tements..    */.
1bf80 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65      if( pTblName
1bf90 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1bfa0 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
1bfb0 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65  rse, pIndex, iMe
1bfc0 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
1bfd0 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
1bfe0 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
1bff0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c000 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c  ParseSchemaOp(v,
1c010 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 73   iDb,.         s
1c020 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
1c030 2c 20 22 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44  , "name='%q' AND
1c040 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 20   type='index'", 
1c050 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b  pIndex->zName));
1c060 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1c070 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 45  beAddOp0(v, OP_E
1c080 78 70 69 72 65 29 3b 0a 20 20 20 20 7d 0a 0a 20  xpire);.    }.. 
1c090 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1c0a0 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 64 65 78  mpHere(v, pIndex
1c0b0 2d 3e 74 6e 75 6d 29 3b 0a 20 20 7d 0a 0a 20 20  ->tnum);.  }..  
1c0c0 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61  /* When adding a
1c0d0 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c  n index to the l
1c0e0 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66  ist of indices f
1c0f0 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65  or a table, make
1c100 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69  .  ** sure all i
1c110 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f  ndices labeled O
1c120 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61  E_Replace come a
1c130 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c  fter all those l
1c140 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49  abeled.  ** OE_I
1c150 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20  gnore.  This is 
1c160 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 74 68  necessary for th
1c170 65 20 63 6f 72 72 65 63 74 20 63 6f 6e 73 74 72  e correct constr
1c180 61 69 6e 74 20 63 68 65 63 6b 0a 20 20 2a 2a 20  aint check.  ** 
1c190 70 72 6f 63 65 73 73 69 6e 67 20 28 69 6e 20 73  processing (in s
1c1a0 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43 6f  qlite3GenerateCo
1c1b0 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28 29  nstraintChecks()
1c1c0 29 20 61 73 20 70 61 72 74 20 6f 66 0a 20 20 2a  ) as part of.  *
1c1d0 2a 20 55 50 44 41 54 45 20 61 6e 64 20 49 4e 53  * UPDATE and INS
1c1e0 45 52 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ERT statements. 
1c1f0 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d   .  */.  if( db-
1c200 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54  >init.busy || pT
1c210 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  blName==0 ){.   
1c220 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45   if( onError!=OE
1c230 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62  _Replace || pTab
1c240 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20  ->pIndex==0.    
1c250 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49       || pTab->pI
1c260 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
1c270 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20  E_Replace){.    
1c280 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20    pIndex->pNext 
1c290 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
1c2a0 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64        pTab->pInd
1c2b0 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  ex = pIndex;.   
1c2c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e   }else{.      In
1c2d0 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54  dex *pOther = pT
1c2e0 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
1c2f0 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d    while( pOther-
1c300 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72  >pNext && pOther
1c310 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72  ->pNext->onError
1c320 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a  !=OE_Replace ){.
1c330 20 20 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d          pOther =
1c340 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
1c350 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
1c360 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f  ndex->pNext = pO
1c370 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
1c380 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74     pOther->pNext
1c390 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d   = pIndex;.    }
1c3a0 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b  .    pIndex = 0;
1c3b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e  .  }..  /* Clean
1c3c0 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69   up before exiti
1c3d0 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74  ng */.exit_creat
1c3e0 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70  e_index:.  if( p
1c3f0 49 6e 64 65 78 20 29 20 66 72 65 65 49 6e 64 65  Index ) freeInde
1c400 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
1c410 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1c420 74 65 28 64 62 2c 20 70 50 49 57 68 65 72 65 29  te(db, pPIWhere)
1c430 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
1c440 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
1c450 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
1c460 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
1c470 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71   pTblName);.  sq
1c480 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1c490 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zName);.}../*.**
1c4a0 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e   Fill the Index.
1c4b0 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61 79  aiRowEst[] array
1c4c0 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 69 6e   with default in
1c4d0 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f  formation - info
1c4e0 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65  rmation.** to be
1c4f0 20 75 73 65 64 20 77 68 65 6e 20 77 65 20 68 61   used when we ha
1c500 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 41  ve not run the A
1c510 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a  NALYZE command..
1c520 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30  **.** aiRowEst[0
1c530 5d 20 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f  ] is supposed to
1c540 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d   contain the num
1c550 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
1c560 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a  in the index..**
1c570 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74   Since we do not
1c580 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d   know, guess 1 m
1c590 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73  illion.  aiRowEs
1c5a0 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d  t[1] is an estim
1c5b0 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75  ate of the.** nu
1c5c0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
1c5d0 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d  the table that m
1c5e0 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75  atch any particu
1c5f0 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65  lar value of the
1c600 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  .** first column
1c610 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
1c620 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61  aiRowEst[2] is a
1c630 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
1c640 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72  e number.** of r
1c650 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68 20 61  ows that match a
1c660 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f  ny particular co
1c670 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  mbination of the
1c680 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73   first 2 columns
1c690 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78  .** of the index
1c6a0 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  .  And so forth.
1c6b0 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79 73    It must always
1c6c0 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
1c6d0 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  t.*.**          
1c6e0 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69   aiRowEst[N]<=ai
1c6f0 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20  RowEst[N-1].**  
1c700 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73           aiRowEs
1c710 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70  t[N]>=1.**.** Ap
1c720 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 77  art from that, w
1c730 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74 6f  e have little to
1c740 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 69   go on besides i
1c750 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a  ntuition as to.*
1c760 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d  * how aiRowEst[]
1c770 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69   should be initi
1c780 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d  alized.  The num
1c790 62 65 72 73 20 67 65 6e 65 72 61 74 65 64 20 68  bers generated h
1c7a0 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 64  ere.** are based
1c7b0 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c 75   on typical valu
1c7c0 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 75  es found in actu
1c7d0 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76  al indices..*/.v
1c7e0 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 61 75  oid sqlite3Defau
1c7f0 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20 2a  ltRowEst(Index *
1c800 70 49 64 78 29 7b 0a 20 20 2f 2a 20 20 20 20 20  pIdx){.  /*     
1c810 20 20 20 20 20 20 20 20 20 20 20 31 30 2c 20 20             10,  
1c820 39 2c 20 20 38 2c 20 20 37 2c 20 20 36 20 2a 2f  9,  8,  7,  6 */
1c830 0a 20 20 4c 6f 67 45 73 74 20 61 56 61 6c 5b 5d  .  LogEst aVal[]
1c840 20 3d 20 7b 20 33 33 2c 20 33 32 2c 20 33 30 2c   = { 33, 32, 30,
1c850 20 32 38 2c 20 32 36 20 7d 3b 0a 20 20 4c 6f 67   28, 26 };.  Log
1c860 45 73 74 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61  Est *a = pIdx->a
1c870 69 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69 6e  iRowLogEst;.  in
1c880 74 20 6e 43 6f 70 79 20 3d 20 4d 49 4e 28 41 72  t nCopy = MIN(Ar
1c890 72 61 79 53 69 7a 65 28 61 56 61 6c 29 2c 20 70  raySize(aVal), p
1c8a0 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20  Idx->nKeyCol);. 
1c8b0 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 65   int i;..  /* Se
1c8c0 74 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  t the first entr
1c8d0 79 20 28 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  y (number of row
1c8e0 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 29 20  s in the index) 
1c8f0 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  to the estimated
1c900 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66   .  ** number of
1c910 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
1c920 6c 65 2c 20 6f 72 20 68 61 6c 66 20 74 68 65 20  le, or half the 
1c930 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
1c940 6e 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a  n the table.  **
1c950 20 66 6f 72 20 61 20 70 61 72 74 69 61 6c 20 69   for a partial i
1c960 6e 64 65 78 2e 20 20 20 42 75 74 20 64 6f 20 6e  ndex.   But do n
1c970 6f 74 20 6c 65 74 20 74 68 65 20 65 73 74 69 6d  ot let the estim
1c980 61 74 65 20 64 72 6f 70 20 62 65 6c 6f 77 20 31  ate drop below 1
1c990 30 2e 20 2a 2f 0a 20 20 61 5b 30 5d 20 3d 20 70  0. */.  a[0] = p
1c9a0 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52 6f  Idx->pTable->nRo
1c9b0 77 4c 6f 67 45 73 74 3b 0a 20 20 69 66 28 20 70  wLogEst;.  if( p
1c9c0 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  Idx->pPartIdxWhe
1c9d0 72 65 21 3d 30 20 29 20 61 5b 30 5d 20 2d 3d 20  re!=0 ) a[0] -= 
1c9e0 31 30 3b 20 20 61 73 73 65 72 74 28 20 31 30 3d  10;  assert( 10=
1c9f0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32  =sqlite3LogEst(2
1ca00 29 20 29 3b 0a 20 20 69 66 28 20 61 5b 30 5d 3c  ) );.  if( a[0]<
1ca10 33 33 20 29 20 61 5b 30 5d 20 3d 20 33 33 3b 20  33 ) a[0] = 33; 
1ca20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca30 20 61 73 73 65 72 74 28 20 33 33 3d 3d 73 71 6c   assert( 33==sql
1ca40 69 74 65 33 4c 6f 67 45 73 74 28 31 30 29 20 29  ite3LogEst(10) )
1ca50 3b 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74 65  ;..  /* Estimate
1ca60 20 74 68 61 74 20 61 5b 31 5d 20 69 73 20 31 30   that a[1] is 10
1ca70 2c 20 61 5b 32 5d 20 69 73 20 39 2c 20 61 5b 33  , a[2] is 9, a[3
1ca80 5d 20 69 73 20 38 2c 20 61 5b 34 5d 20 69 73 20  ] is 8, a[4] is 
1ca90 37 2c 20 61 5b 35 5d 20 69 73 0a 20 20 2a 2a 20  7, a[5] is.  ** 
1caa0 36 20 61 6e 64 20 65 61 63 68 20 73 75 62 73 65  6 and each subse
1cab0 71 75 65 6e 74 20 76 61 6c 75 65 20 28 69 66 20  quent value (if 
1cac0 61 6e 79 29 20 69 73 20 35 2e 20 20 2a 2f 0a 20  any) is 5.  */. 
1cad0 20 6d 65 6d 63 70 79 28 26 61 5b 31 5d 2c 20 61   memcpy(&a[1], a
1cae0 56 61 6c 2c 20 6e 43 6f 70 79 2a 73 69 7a 65 6f  Val, nCopy*sizeo
1caf0 66 28 4c 6f 67 45 73 74 29 29 3b 0a 20 20 66 6f  f(LogEst));.  fo
1cb00 72 28 69 3d 6e 43 6f 70 79 2b 31 3b 20 69 3c 3d  r(i=nCopy+1; i<=
1cb10 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69  pIdx->nKeyCol; i
1cb20 2b 2b 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20  ++){.    a[i] = 
1cb30 32 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  23;             
1cb40 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 32         assert( 2
1cb50 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  3==sqlite3LogEst
1cb60 28 35 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  (5) );.  }..  as
1cb70 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33  sert( 0==sqlite3
1cb80 4c 6f 67 45 73 74 28 31 29 20 29 3b 0a 20 20 69  LogEst(1) );.  i
1cb90 66 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78  f( IsUniqueIndex
1cba0 28 70 49 64 78 29 20 29 20 61 5b 70 49 64 78 2d  (pIdx) ) a[pIdx-
1cbb0 3e 6e 4b 65 79 43 6f 6c 5d 20 3d 20 30 3b 0a 7d  >nKeyCol] = 0;.}
1cbc0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1cbd0 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61  tine will drop a
1cbe0 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64  n existing named
1cbf0 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f   index.  This ro
1cc00 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  utine.** impleme
1cc10 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44  nts the DROP IND
1cc20 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  EX statement..*/
1cc30 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f  .void sqlite3Dro
1cc40 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  pIndex(Parse *pP
1cc50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
1cc60 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45 78 69 73  Name, int ifExis
1cc70 74 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ts){.  Index *pI
1cc80 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ndex;.  Vdbe *v;
1cc90 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1cca0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
1ccb0 6e 74 20 69 44 62 3b 0a 0a 20 20 61 73 73 65 72  nt iDb;..  asser
1ccc0 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  t( pParse->nErr=
1ccd0 3d 30 20 29 3b 20 20 20 2f 2a 20 4e 65 76 65 72  =0 );   /* Never
1cce0 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 72 69   called with pri
1ccf0 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  or errors */.  i
1cd00 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
1cd10 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
1cd20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1cd30 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1cd40 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
1cd50 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
1cd60 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
1cd70 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
1cd80 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1cd90 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70  p_index;.  }.  p
1cda0 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46  Index = sqlite3F
1cdb0 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61  indIndex(db, pNa
1cdc0 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  me->a[0].zName, 
1cdd0 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
1cde0 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49  abase);.  if( pI
1cdf0 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ndex==0 ){.    i
1ce00 66 28 20 21 69 66 45 78 69 73 74 73 20 29 7b 0a  f( !ifExists ){.
1ce10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1ce20 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
1ce30 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53  o such index: %S
1ce40 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  ", pName, 0);.  
1ce50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1ce60 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
1ce70 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61 72  NamedSchema(pPar
1ce80 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  se, pName->a[0].
1ce90 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
1cea0 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68  }.    pParse->ch
1ceb0 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
1cec0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1ced0 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  p_index;.  }.  i
1cee0 66 28 20 70 49 6e 64 65 78 2d 3e 69 64 78 54 79  f( pIndex->idxTy
1cef0 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59  pe!=SQLITE_IDXTY
1cf00 50 45 5f 41 50 50 44 45 46 20 29 7b 0a 20 20 20  PE_APPDEF ){.   
1cf10 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1cf20 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20  (pParse, "index 
1cf30 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1cf40 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20 22  UNIQUE ".      "
1cf50 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
1cf60 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74  onstraint cannot
1cf70 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29   be dropped", 0)
1cf80 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
1cf90 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
1cfa0 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
1cfb0 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
1cfc0 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
1cfd0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
1cfe0 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
1cff0 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
1d000 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
1d010 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54  ROP_INDEX;.    T
1d020 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
1d030 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20  dex->pTable;.   
1d040 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1d050 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
1d060 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63 6f  zDbSName;.    co
1d070 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  nst char *zTab =
1d080 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
1d090 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  b);.    if( sqli
1d0a0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1d0b0 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
1d0c0 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62  TE, zTab, 0, zDb
1d0d0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
1d0e0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1d0f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
1d100 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
1d110 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49  Db ) code = SQLI
1d120 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44  TE_DROP_TEMP_IND
1d130 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  EX;.    if( sqli
1d140 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1d150 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65  rse, code, pInde
1d160 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  x->zName, pTab->
1d170 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
1d180 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
1d190 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  rop_index;.    }
1d1a0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1d1b0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1d1c0 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e  to remove the in
1d1d0 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65  dex and from the
1d1e0 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f   master table */
1d1f0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
1d200 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1d210 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
1d220 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
1d230 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
1d240 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71   1, iDb);.    sq
1d250 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
1d260 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
1d270 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
1d280 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  %s WHERE name=%Q
1d290 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78   AND type='index
1d2a0 27 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61  '",.       db->a
1d2b0 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
1d2c0 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 70  , MASTER_NAME, p
1d2d0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20  Index->zName.   
1d2e0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   );.    sqlite3C
1d2f0 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 70  learStatTables(p
1d300 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69 64 78  Parse, iDb, "idx
1d310 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ", pIndex->zName
1d320 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
1d330 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
1d340 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73  e, iDb);.    des
1d350 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
1d360 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75  rse, pIndex->tnu
1d370 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  m, iDb);.    sql
1d380 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1d390 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20  , OP_DropIndex, 
1d3a0 69 44 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65  iDb, 0, 0, pInde
1d3b0 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  x->zName, 0);.  
1d3c0 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  }..exit_drop_ind
1d3d0 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63  ex:.  sqlite3Src
1d3e0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1d3f0 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
1d400 70 41 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e  pArray is a poin
1d410 74 65 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20  ter to an array 
1d420 6f 66 20 6f 62 6a 65 63 74 73 2e 20 45 61 63 68  of objects. Each
1d430 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a   object in the.*
1d440 2a 20 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74  * array is szEnt
1d450 72 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ry bytes in size
1d460 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75  . This routine u
1d470 73 65 73 20 73 71 6c 69 74 65 33 44 62 52 65 61  ses sqlite3DbRea
1d480 6c 6c 6f 63 28 29 0a 2a 2a 20 74 6f 20 65 78 74  lloc().** to ext
1d490 65 6e 64 20 74 68 65 20 61 72 72 61 79 20 73 6f  end the array so
1d4a0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73   that there is s
1d4b0 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20 6f  pace for a new o
1d4c0 62 6a 65 63 74 20 61 74 20 74 68 65 20 65 6e 64  bject at the end
1d4d0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
1d4e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1d4f0 6c 6c 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 63  lled, *pnEntry c
1d500 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 75 72 72  ontains the curr
1d510 65 6e 74 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74  ent size of.** t
1d520 68 65 20 61 72 72 61 79 20 28 69 6e 20 65 6e 74  he array (in ent
1d530 72 69 65 73 20 2d 20 73 6f 20 74 68 65 20 61 6c  ries - so the al
1d540 6c 6f 63 61 74 69 6f 6e 20 69 73 20 28 28 2a 70  location is ((*p
1d550 6e 45 6e 74 72 79 29 20 2a 20 73 7a 45 6e 74 72  nEntry) * szEntr
1d560 79 29 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20 74  y) bytes.** in t
1d570 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  otal)..**.** If 
1d580 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 69 73  the realloc() is
1d590 20 73 75 63 63 65 73 73 66 75 6c 20 28 69 2e 65   successful (i.e
1d5a0 2e 20 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f 6e 64  . if no OOM cond
1d5b0 69 74 69 6f 6e 20 6f 63 63 75 72 73 29 2c 20 74  ition occurs), t
1d5c0 68 65 0a 2a 2a 20 73 70 61 63 65 20 61 6c 6c 6f  he.** space allo
1d5d0 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 6e 65  cated for the ne
1d5e0 77 20 6f 62 6a 65 63 74 20 69 73 20 7a 65 72 6f  w object is zero
1d5f0 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 75 70 64  ed, *pnEntry upd
1d600 61 74 65 64 20 74 6f 0a 2a 2a 20 72 65 66 6c 65  ated to.** refle
1d610 63 74 20 74 68 65 20 6e 65 77 20 73 69 7a 65 20  ct the new size 
1d620 6f 66 20 74 68 65 20 61 72 72 61 79 20 61 6e 64  of the array and
1d630 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1d640 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
1d650 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 2a 70  .** returned. *p
1d660 49 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  Idx is set to th
1d670 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  e index of the n
1d680 65 77 20 61 72 72 61 79 20 65 6e 74 72 79 20 69  ew array entry i
1d690 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
1d6a0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
1d6b0 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 66   the realloc() f
1d6c0 61 69 6c 73 2c 20 2a 70 49 64 78 20 69 73 20 73  ails, *pIdx is s
1d6d0 65 74 20 74 6f 20 2d 31 2c 20 2a 70 6e 45 6e 74  et to -1, *pnEnt
1d6e0 72 79 20 72 65 6d 61 69 6e 73 0a 2a 2a 20 75 6e  ry remains.** un
1d6f0 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 63 6f  changed and a co
1d700 70 79 20 6f 66 20 70 41 72 72 61 79 20 72 65 74  py of pArray ret
1d710 75 72 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  urned..*/.void *
1d720 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
1d730 63 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20  cate(.  sqlite3 
1d740 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e  *db,      /* Con
1d750 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66  nection to notif
1d760 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  y of malloc fail
1d770 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  ures */.  void *
1d780 70 41 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41  pArray,     /* A
1d790 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e  rray of objects.
1d7a0 20 20 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c    Might be reall
1d7b0 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ocated */.  int 
1d7c0 73 7a 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a  szEntry,      /*
1d7d0 20 53 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62   Size of each ob
1d7e0 6a 65 63 74 20 69 6e 20 74 68 65 20 61 72 72 61  ject in the arra
1d7f0 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e  y */.  int *pnEn
1d800 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62  try,     /* Numb
1d810 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 63 75  er of objects cu
1d820 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a  rrently in use *
1d830 2f 0a 20 20 69 6e 74 20 2a 70 49 64 78 20 20 20  /.  int *pIdx   
1d840 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
1d850 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 6e 65  he index of a ne
1d860 77 20 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29  w slot here */.)
1d870 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  {.  char *z;.  i
1d880 6e 74 20 6e 20 3d 20 2a 70 6e 45 6e 74 72 79 3b  nt n = *pnEntry;
1d890 0a 20 20 69 66 28 20 28 6e 20 26 20 28 6e 2d 31  .  if( (n & (n-1
1d8a0 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ))==0 ){.    int
1d8b0 20 73 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f 20 31   sz = (n==0) ? 1
1d8c0 20 3a 20 32 2a 6e 3b 0a 20 20 20 20 76 6f 69 64   : 2*n;.    void
1d8d0 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
1d8e0 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41  DbRealloc(db, pA
1d8f0 72 72 61 79 2c 20 73 7a 2a 73 7a 45 6e 74 72 79  rray, sz*szEntry
1d900 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
1d910 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 49 64  =0 ){.      *pId
1d920 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  x = -1;.      re
1d930 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 20 20 20  turn pArray;.   
1d940 20 7d 0a 20 20 20 20 70 41 72 72 61 79 20 3d 20   }.    pArray = 
1d950 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  pNew;.  }.  z = 
1d960 28 63 68 61 72 2a 29 70 41 72 72 61 79 3b 0a 20  (char*)pArray;. 
1d970 20 6d 65 6d 73 65 74 28 26 7a 5b 6e 20 2a 20 73   memset(&z[n * s
1d980 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e  zEntry], 0, szEn
1d990 74 72 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  try);.  *pIdx = 
1d9a0 6e 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b  n;.  ++*pnEntry;
1d9b0 0a 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79  .  return pArray
1d9c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
1d9d0 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
1d9e0 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c  to the given IdL
1d9f0 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
1da00 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20  ew IdList if.** 
1da10 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41  need be..**.** A
1da20 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72   new IdList is r
1da30 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
1da40 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   if malloc() fai
1da50 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73  ls..*/.IdList *s
1da60 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65  qlite3IdListAppe
1da70 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nd(sqlite3 *db, 
1da80 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  IdList *pList, T
1da90 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
1daa0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
1dab0 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
1dac0 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
1dad0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
1dae0 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a  zeof(IdList) );.
1daf0 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
1db00 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
1db10 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71  .  pList->a = sq
1db20 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
1db30 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a 20 20  te(.      db,.  
1db40 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20      pList->a,.  
1db50 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69 73 74      sizeof(pList
1db60 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20 26  ->a[0]),.      &
1db70 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20  pList->nId,.    
1db80 20 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28 20    &i.  );.  if( 
1db90 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  i<0 ){.    sqlit
1dba0 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
1dbb0 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72  b, pList);.    r
1dbc0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1dbd0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
1dbe0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1dbf0 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b  omToken(db, pTok
1dc00 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  en);.  return pL
1dc10 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ist;.}../*.** De
1dc20 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a  lete an IdList..
1dc30 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49  */.void sqlite3I
1dc40 64 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  dListDelete(sqli
1dc50 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
1dc60 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
1dc70 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
1dc80 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
1dc90 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
1dca0 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  Id; i++){.    sq
1dcb0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1dcc0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1dcd0 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
1dce0 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
1dcf0 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  t->a);.  sqlite3
1dd00 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
1dd10 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
1dd20 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  rn the index in 
1dd30 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65  pList of the ide
1dd40 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49  ntifier named zI
1dd50 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a  d.  Return -1.**
1dd60 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
1dd70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c  /.int sqlite3IdL
1dd80 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20  istIndex(IdList 
1dd90 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68  *pList, const ch
1dda0 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
1ddb0 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
1ddc0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  ==0 ) return -1;
1ddd0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
1dde0 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
1ddf0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1de00 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
1de10 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  i].zName, zName)
1de20 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
1de30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
1de40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64  .}../*.** Expand
1de50 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63   the space alloc
1de60 61 74 65 64 20 66 6f 72 20 74 68 65 20 67 69 76  ated for the giv
1de70 65 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63  en SrcList objec
1de80 74 20 62 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67  t by.** creating
1de90 20 6e 45 78 74 72 61 20 6e 65 77 20 73 6c 6f 74   nExtra new slot
1dea0 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 69  s beginning at i
1deb0 53 74 61 72 74 2e 20 20 69 53 74 61 72 74 20 69  Start.  iStart i
1dec0 73 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a  s zero based..**
1ded0 20 4e 65 77 20 73 6c 6f 74 73 20 61 72 65 20 7a   New slots are z
1dee0 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  eroed..**.** For
1def0 20 65 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73   example, suppos
1df00 65 20 61 20 53 72 63 4c 69 73 74 20 69 6e 69 74  e a SrcList init
1df10 69 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74  ially contains t
1df20 77 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e  wo entries: A,B.
1df30 0a 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20 33 20  .** To append 3 
1df40 6e 65 77 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f  new entries onto
1df50 20 74 68 65 20 65 6e 64 2c 20 64 6f 20 74 68 69   the end, do thi
1df60 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69  s:.**.**    sqli
1df70 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
1df80 65 28 64 62 2c 20 70 53 72 63 6c 69 73 74 2c 20  e(db, pSrclist, 
1df90 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74  3, 2);.**.** Aft
1dfa0 65 72 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76  er the call abov
1dfb0 65 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61  e it would conta
1dfc0 69 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20  in:  A, B, nil, 
1dfd0 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20  nil, nil..** If 
1dfe0 74 68 65 20 69 53 74 61 72 74 20 61 72 67 75 6d  the iStart argum
1dff0 65 6e 74 20 68 61 64 20 62 65 65 6e 20 31 20 69  ent had been 1 i
1e000 6e 73 74 65 61 64 20 6f 66 20 32 2c 20 74 68 65  nstead of 2, the
1e010 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  n the result.** 
1e020 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 3a  would have been:
1e030 20 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e    A, nil, nil, n
1e040 69 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65 70 65  il, B.  To prepe
1e050 6e 64 20 74 68 65 20 6e 65 77 20 73 6c 6f 74 73  nd the new slots
1e060 2c 0a 2a 2a 20 74 68 65 20 69 53 74 61 72 74 20  ,.** the iStart 
1e070 76 61 6c 75 65 20 77 6f 75 6c 64 20 62 65 20 30  value would be 0
1e080 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 74 68  .  The result th
1e090 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20  en would.** be: 
1e0a0 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41  nil, nil, nil, A
1e0b0 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  , B..**.** If a 
1e0c0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1e0d0 6e 20 66 61 69 6c 73 20 74 68 65 20 53 72 63 4c  n fails the SrcL
1e0e0 69 73 74 20 69 73 20 75 6e 63 68 61 6e 67 65 64  ist is unchanged
1e0f0 2e 20 20 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61  .  The.** db->ma
1e100 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
1e110 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74  will be set to t
1e120 72 75 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  rue..*/.SrcList 
1e130 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45  *sqlite3SrcListE
1e140 6e 6c 61 72 67 65 28 0a 20 20 73 71 6c 69 74 65  nlarge(.  sqlite
1e150 33 20 2a 64 62 2c 20 20 20 20 20 20 20 2f 2a 20  3 *db,       /* 
1e160 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
1e170 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66  ion to notify of
1e180 20 4f 4f 4d 20 65 72 72 6f 72 73 20 2a 2f 0a 20   OOM errors */. 
1e190 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
1e1a0 20 20 20 20 2f 2a 20 54 68 65 20 53 72 63 4c 69      /* The SrcLi
1e1b0 73 74 20 74 6f 20 62 65 20 65 6e 6c 61 72 67 65  st to be enlarge
1e1c0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  d */.  int nExtr
1e1d0 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  a,        /* Num
1e1e0 62 65 72 20 6f 66 20 6e 65 77 20 73 6c 6f 74 73  ber of new slots
1e1f0 20 74 6f 20 61 64 64 20 74 6f 20 70 53 72 63 2d   to add to pSrc-
1e200 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53  >a[] */.  int iS
1e210 74 61 72 74 20 20 20 20 20 20 20 20 20 2f 2a 20  tart         /* 
1e220 49 6e 64 65 78 20 69 6e 20 70 53 72 63 2d 3e 61  Index in pSrc->a
1e230 5b 5d 20 6f 66 20 66 69 72 73 74 20 6e 65 77 20  [] of first new 
1e240 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  slot */.){.  int
1e250 20 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79   i;..  /* Sanity
1e260 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 63 61 6c   checking on cal
1e270 6c 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  ling parameters 
1e280 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  */.  assert( iSt
1e290 61 72 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  art>=0 );.  asse
1e2a0 72 74 28 20 6e 45 78 74 72 61 3e 3d 31 20 29 3b  rt( nExtra>=1 );
1e2b0 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21  .  assert( pSrc!
1e2c0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1e2d0 69 53 74 61 72 74 3c 3d 70 53 72 63 2d 3e 6e 53  iStart<=pSrc->nS
1e2e0 72 63 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  rc );..  /* Allo
1e2f0 63 61 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  cate additional 
1e300 73 70 61 63 65 20 69 66 20 6e 65 65 64 65 64 20  space if needed 
1e310 2a 2f 0a 20 20 69 66 28 20 28 75 33 32 29 70 53  */.  if( (u32)pS
1e320 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3e  rc->nSrc+nExtra>
1e330 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  pSrc->nAlloc ){.
1e340 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65      SrcList *pNe
1e350 77 3b 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f  w;.    int nAllo
1e360 63 20 3d 20 70 53 72 63 2d 3e 6e 53 72 63 2a 32  c = pSrc->nSrc*2
1e370 2b 6e 45 78 74 72 61 3b 0a 20 20 20 20 69 6e 74  +nExtra;.    int
1e380 20 6e 47 6f 74 3b 0a 20 20 20 20 70 4e 65 77 20   nGot;.    pNew 
1e390 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
1e3a0 6f 63 28 64 62 2c 20 70 53 72 63 2c 0a 20 20 20  oc(db, pSrc,.   
1e3b0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
1e3c0 6f 66 28 2a 70 53 72 63 29 20 2b 20 28 6e 41 6c  of(*pSrc) + (nAl
1e3d0 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 53  loc-1)*sizeof(pS
1e3e0 72 63 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20  rc->a[0]) );.   
1e3f0 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
1e400 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
1e410 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1e420 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
1e430 53 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  Src;.    }.    p
1e440 53 72 63 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  Src = pNew;.    
1e450 6e 47 6f 74 20 3d 20 28 73 71 6c 69 74 65 33 44  nGot = (sqlite3D
1e460 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20  bMallocSize(db, 
1e470 70 4e 65 77 29 20 2d 20 73 69 7a 65 6f 66 28 2a  pNew) - sizeof(*
1e480 70 53 72 63 29 29 2f 73 69 7a 65 6f 66 28 70 53  pSrc))/sizeof(pS
1e490 72 63 2d 3e 61 5b 30 5d 29 2b 31 3b 0a 20 20 20  rc->a[0])+1;.   
1e4a0 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pSrc->nAlloc = 
1e4b0 6e 47 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nGot;.  }..  /* 
1e4c0 4d 6f 76 65 20 65 78 69 73 74 69 6e 67 20 73 6c  Move existing sl
1e4d0 6f 74 73 20 74 68 61 74 20 63 6f 6d 65 20 61 66  ots that come af
1e4e0 74 65 72 20 74 68 65 20 6e 65 77 6c 79 20 69 6e  ter the newly in
1e4f0 73 65 72 74 65 64 20 73 6c 6f 74 73 0a 20 20 2a  serted slots.  *
1e500 2a 20 6f 75 74 20 6f 66 20 74 68 65 20 77 61 79  * out of the way
1e510 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 53 72 63   */.  for(i=pSrc
1e520 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 69 53 74  ->nSrc-1; i>=iSt
1e530 61 72 74 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70  art; i--){.    p
1e540 53 72 63 2d 3e 61 5b 69 2b 6e 45 78 74 72 61 5d  Src->a[i+nExtra]
1e550 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20   = pSrc->a[i];. 
1e560 20 7d 0a 20 20 70 53 72 63 2d 3e 6e 53 72 63 20   }.  pSrc->nSrc 
1e570 2b 3d 20 6e 45 78 74 72 61 3b 0a 0a 20 20 2f 2a  += nExtra;..  /*
1e580 20 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c 79 20   Zero the newly 
1e590 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73 20  allocated slots 
1e5a0 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 72  */.  memset(&pSr
1e5b0 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c  c->a[iStart], 0,
1e5c0 20 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b   sizeof(pSrc->a[
1e5d0 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20 66  0])*nExtra);.  f
1e5e0 6f 72 28 69 3d 69 53 74 61 72 74 3b 20 69 3c 69  or(i=iStart; i<i
1e5f0 53 74 61 72 74 2b 6e 45 78 74 72 61 3b 20 69 2b  Start+nExtra; i+
1e600 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b  +){.    pSrc->a[
1e610 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b  i].iCursor = -1;
1e620 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72  .  }..  /* Retur
1e630 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
1e640 68 65 20 65 6e 6c 61 72 67 65 64 20 53 72 63 4c  he enlarged SrcL
1e650 69 73 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ist */.  return 
1e660 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  pSrc;.}.../*.** 
1e670 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62  Append a new tab
1e680 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67  le name to the g
1e690 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43  iven SrcList.  C
1e6a0 72 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c  reate a new SrcL
1e6b0 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
1e6c0 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20  e.  A new entry 
1e6d0 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  is created in th
1e6e0 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69  e SrcList even i
1e6f0 66 20 70 54 61 62 6c 65 20 69 73 20 4e 55 4c 4c  f pTable is NULL
1e700 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69 73  ..**.** A SrcLis
1e710 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
1e720 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20  r NULL if there 
1e730 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  is an OOM error.
1e740 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 0a 2a    The returned.*
1e750 2a 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20  * SrcList might 
1e760 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
1e770 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
1e780 77 61 73 20 69 6e 70 75 74 20 6f 72 20 69 74 20  was input or it 
1e790 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e 65  might be.** a ne
1e7a0 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f 4f  w one.  If an OO
1e7b0 4d 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63  M error does occ
1e7c0 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 70 72  urs, then the pr
1e7d0 69 6f 72 20 76 61 6c 75 65 20 6f 66 20 70 4c 69  ior value of pLi
1e7e0 73 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 69 6e  st.** that is in
1e7f0 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74  put to this rout
1e800 69 6e 65 20 69 73 20 61 75 74 6f 6d 61 74 69 63  ine is automatic
1e810 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a  ally freed..**.*
1e820 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20 69  * If pDatabase i
1e830 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d  s not null, it m
1e840 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74 61  eans that the ta
1e850 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f  ble has an optio
1e860 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  nal.** database 
1e870 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69  name prefix.  Li
1e880 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61 62  ke this:  "datab
1e890 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65  ase.table".  The
1e8a0 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f   pDatabase.** po
1e8b0 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c  ints to the tabl
1e8c0 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70  e name and the p
1e8d0 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20  Table points to 
1e8e0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1e8f0 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73  e..** The SrcLis
1e900 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c  t.a[].zName fiel
1e910 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  d is filled with
1e920 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
1e930 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63  which might.** c
1e940 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20  ome from pTable 
1e950 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69 73  (if pDatabase is
1e960 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70   NULL) or from p
1e970 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53  Database.  .** S
1e980 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61  rcList.a[].zData
1e990 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77  base is filled w
1e9a0 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
1e9b0 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   name from pTabl
1e9c0 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55  e,.** or with NU
1e9d0 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73  LL if no databas
1e9e0 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a  e is specified..
1e9f0 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  **.** In other w
1ea00 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69  ords, if call li
1ea10 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
1ea20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
1ea30 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c  cListAppend(D,A,
1ea40 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  B,0);.**.** Then
1ea50 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61   B is a table na
1ea60 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  me and the datab
1ea70 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70  ase name is unsp
1ea80 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c  ecified.  If cal
1ea90 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73  led.** like this
1eaa0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1eab0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1eac0 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a  pend(D,A,B,C);.*
1ead0 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74  *.** Then C is t
1eae0 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  he table name an
1eaf0 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61 62  d B is the datab
1eb00 61 73 65 20 6e 61 6d 65 2e 20 20 49 66 20 43 20  ase name.  If C 
1eb10 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74 68  is defined.** th
1eb20 65 6e 20 73 6f 20 69 73 20 42 2e 20 20 49 6e 20  en so is B.  In 
1eb30 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 65 20  other words, we 
1eb40 6e 65 76 65 72 20 68 61 76 65 20 61 20 63 61 73  never have a cas
1eb50 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20  e where:.**.**  
1eb60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
1eb70 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c  cListAppend(D,A,
1eb80 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74 68  0,C);.**.** Both
1eb90 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74   pTable and pDat
1eba0 61 62 61 73 65 20 61 72 65 20 61 73 73 75 6d 65  abase are assume
1ebb0 64 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e 20  d to be quoted. 
1ebc0 20 54 68 65 79 20 61 72 65 20 64 65 71 75 6f 74   They are dequot
1ebd0 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62 65 69  ed.** before bei
1ebe0 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ng added to the 
1ebf0 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72 63 4c  SrcList..*/.SrcL
1ec00 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
1ec10 69 73 74 41 70 70 65 6e 64 28 0a 20 20 73 71 6c  istAppend(.  sql
1ec20 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
1ec30 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74   /* Connection t
1ec40 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c  o notify of mall
1ec50 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20  oc failures */. 
1ec60 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c   SrcList *pList,
1ec70 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74       /* Append t
1ec80 6f 20 74 68 69 73 20 53 72 63 4c 69 73 74 2e 20  o this SrcList. 
1ec90 4e 55 4c 4c 20 63 72 65 61 74 65 73 20 61 20 6e  NULL creates a n
1eca0 65 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  ew SrcList */.  
1ecb0 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20  Token *pTable,  
1ecc0 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
1ecd0 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65  append */.  Toke
1ece0 6e 20 2a 70 44 61 74 61 62 61 73 65 20 20 20 20  n *pDatabase    
1ecf0 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 66 20 74  /* Database of t
1ed00 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  he table */.){. 
1ed10 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1ed20 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61  item *pItem;.  a
1ed30 73 73 65 72 74 28 20 70 44 61 74 61 62 61 73 65  ssert( pDatabase
1ed40 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65 21 3d 30  ==0 || pTable!=0
1ed50 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68   );  /* Cannot h
1ed60 61 76 65 20 43 20 77 69 74 68 6f 75 74 20 42 20  ave C without B 
1ed70 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  */.  assert( db!
1ed80 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  =0 );.  if( pLis
1ed90 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
1eda0 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
1edb0 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
1edc0 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a  eof(SrcList) );.
1edd0 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
1ede0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
1edf0 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
1ee00 20 31 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   1;.    pList->n
1ee10 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d  Src = 1;.    mem
1ee20 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 30 5d  set(&pList->a[0]
1ee30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73  , 0, sizeof(pLis
1ee40 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 70  t->a[0]));.    p
1ee50 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  List->a[0].iCurs
1ee60 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65  or = -1;.  }else
1ee70 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
1ee80 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
1ee90 72 67 65 28 64 62 2c 20 70 4c 69 73 74 2c 20 31  rge(db, pList, 1
1eea0 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a  , pList->nSrc);.
1eeb0 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61    }.  if( db->ma
1eec0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
1eed0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1eee0 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
1eef0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
1ef00 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26  .  }.  pItem = &
1ef10 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
1ef20 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70  nSrc-1];.  if( p
1ef30 44 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74  Database && pDat
1ef40 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  abase->z==0 ){. 
1ef50 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30     pDatabase = 0
1ef60 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74  ;.  }.  if( pDat
1ef70 61 62 61 73 65 20 29 7b 0a 20 20 20 20 54 6f 6b  abase ){.    Tok
1ef80 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74  en *pTemp = pDat
1ef90 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61  abase;.    pData
1efa0 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20  base = pTable;. 
1efb0 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d     pTable = pTem
1efc0 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e  p;.  }.  pItem->
1efd0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
1efe0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
1eff0 20 70 54 61 62 6c 65 29 3b 0a 20 20 70 49 74 65   pTable);.  pIte
1f000 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  m->zDatabase = s
1f010 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1f020 6b 65 6e 28 64 62 2c 20 70 44 61 74 61 62 61 73  ken(db, pDatabas
1f030 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69  e);.  return pLi
1f040 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  st;.}../*.** Ass
1f050 69 67 6e 20 56 64 62 65 43 75 72 73 6f 72 20 69  ign VdbeCursor i
1f060 6e 64 65 78 20 6e 75 6d 62 65 72 73 20 74 6f 20  ndex numbers to 
1f070 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20  all tables in a 
1f080 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20  SrcList.*/.void 
1f090 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
1f0a0 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73  signCursors(Pars
1f0b0 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
1f0c0 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
1f0d0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72  t i;.  struct Sr
1f0e0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1f0f0 6d 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69 73  m;.  assert(pLis
1f100 74 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  t || pParse->db-
1f110 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1f120 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
1f130 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74      for(i=0, pIt
1f140 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  em=pList->a; i<p
1f150 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
1f160 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
1f170 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72   if( pItem->iCur
1f180 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a  sor>=0 ) break;.
1f190 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 75        pItem->iCu
1f1a0 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
1f1b0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  Tab++;.      if(
1f1c0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
1f1d0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1f1e0 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
1f1f0 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70  ursors(pParse, p
1f200 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  Item->pSelect->p
1f210 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Src);.      }.  
1f220 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1f230 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
1f240 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64  e SrcList includ
1f250 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73  ing all its subs
1f260 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69  tructure..*/.voi
1f270 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
1f280 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
1f290 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69  db, SrcList *pLi
1f2a0 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
1f2b0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1f2c0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66  tem *pItem;.  if
1f2d0 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
1f2e0 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  urn;.  for(pItem
1f2f0 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
1f300 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  i<pList->nSrc; i
1f310 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1f320 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1f330 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  db, pItem->zData
1f340 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  base);.    sqlit
1f350 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
1f360 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
1f370 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1f380 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  , pItem->zAlias)
1f390 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  ;.    if( pItem-
1f3a0 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20  >fg.isIndexedBy 
1f3b0 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
1f3c0 64 62 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49  db, pItem->u1.zI
1f3d0 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20 69  ndexedBy);.    i
1f3e0 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54  f( pItem->fg.isT
1f3f0 61 62 46 75 6e 63 20 29 20 73 71 6c 69 74 65 33  abFunc ) sqlite3
1f400 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
1f410 62 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75  b, pItem->u1.pFu
1f420 6e 63 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69  ncArg);.    sqli
1f430 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
1f440 62 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b  b, pItem->pTab);
1f450 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
1f460 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  ctDelete(db, pIt
1f470 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  em->pSelect);.  
1f480 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1f490 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
1f4a0 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  On);.    sqlite3
1f4b0 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
1f4c0 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b   pItem->pUsing);
1f4d0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
1f4e0 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  Free(db, pList);
1f4f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1f500 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1f510 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 74   by the parser t
1f520 6f 20 61 64 64 20 61 20 6e 65 77 20 74 65 72 6d  o add a new term
1f530 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
1f540 66 20 61 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d  f a growing FROM
1f550 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 22 70   clause.  The "p
1f560 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  " parameter is t
1f570 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68  he part of.** th
1f580 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68  e FROM clause th
1f590 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  at has already b
1f5a0 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2e  een constructed.
1f5b0 20 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a    "p" is NULL.**
1f5c0 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
1f5d0 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68  first term of th
1f5e0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
1f5f0 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61  pTable and pData
1f600 62 61 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20  base.** are the 
1f610 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
1f620 65 20 61 6e 64 20 64 61 74 61 62 61 73 65 20 6e  e and database n
1f630 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d  amed in the FROM
1f640 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a   clause term..**
1f650 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55   pDatabase is NU
1f660 4c 4c 20 69 66 20 74 68 65 20 64 61 74 61 62 61  LL if the databa
1f670 73 65 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65  se name qualifie
1f680 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 74  r is missing - t
1f690 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 65  he.** usual case
1f6a0 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 68  .  If the term h
1f6b0 61 73 20 61 6e 20 61 6c 69 61 73 2c 20 74 68 65  as an alias, the
1f6c0 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20  n pAlias points 
1f6d0 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20  to the.** alias 
1f6e0 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74  token.  If the t
1f6f0 65 72 6d 20 69 73 20 61 20 73 75 62 71 75 65 72  erm is a subquer
1f700 79 2c 20 74 68 65 6e 20 70 53 75 62 71 75 65 72  y, then pSubquer
1f710 79 20 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45  y is the.** SELE
1f720 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
1f730 74 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65  t the subquery e
1f740 6e 63 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61  ncodes.  The pTa
1f750 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61  ble and.** pData
1f760 62 61 73 65 20 70 61 72 61 6d 65 74 65 72 73 20  base parameters 
1f770 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62  are NULL for sub
1f780 71 75 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f  queries.  The pO
1f790 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20  n and pUsing.** 
1f7a0 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 74  parameters are t
1f7b0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
1f7c0 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  e ON and USING c
1f7d0 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  lauses..**.** Re
1f7e0 74 75 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69  turn a new SrcLi
1f7f0 73 74 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73  st which encodes
1f800 20 69 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74   is the FROM wit
1f810 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72  h the new.** ter
1f820 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c  m added..*/.SrcL
1f830 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
1f840 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72  istAppendFromTer
1f850 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
1f860 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
1f870 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
1f880 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c  */.  SrcList *p,
1f890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f8a0 54 68 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66  The left part of
1f8b0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1f8c0 20 61 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f   already seen */
1f8d0 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  .  Token *pTable
1f8e0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ,          /* Na
1f8f0 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
1f900 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20 46 52  to add to the FR
1f910 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54  OM clause */.  T
1f920 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c  oken *pDatabase,
1f930 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1f940 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  f the database c
1f950 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65  ontaining pTable
1f960 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c   */.  Token *pAl
1f970 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ias,          /*
1f980 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
1f990 73 69 64 65 20 6f 66 20 74 68 65 20 41 53 20 73  side of the AS s
1f9a0 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  ubexpression */.
1f9b0 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75    Select *pSubqu
1f9c0 65 72 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73  ery,      /* A s
1f9d0 75 62 71 75 65 72 79 20 75 73 65 64 20 69 6e 20  ubquery used in 
1f9e0 70 6c 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65  place of a table
1f9f0 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20   name */.  Expr 
1fa00 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  *pOn,           
1fa10 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61     /* The ON cla
1fa20 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f  use of a join */
1fa30 0a 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e  .  IdList *pUsin
1fa40 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  g          /* Th
1fa50 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  e USING clause o
1fa60 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20  f a join */.){. 
1fa70 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1fa80 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73  item *pItem;.  s
1fa90 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1faa0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21  rse->db;.  if( !
1fab0 70 20 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73  p && (pOn || pUs
1fac0 69 6e 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ing) ){.    sqli
1fad0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1fae0 73 65 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75  se, "a JOIN clau
1faf0 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62  se is required b
1fb00 65 66 6f 72 65 20 25 73 22 2c 20 0a 20 20 20 20  efore %s", .    
1fb10 20 20 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20    (pOn ? "ON" : 
1fb20 22 55 53 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a  "USING").    );.
1fb30 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f      goto append_
1fb40 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  from_error;.  }.
1fb50 20 20 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63    p = sqlite3Src
1fb60 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 70  ListAppend(db, p
1fb70 2c 20 70 54 61 62 6c 65 2c 20 70 44 61 74 61 62  , pTable, pDatab
1fb80 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ase);.  if( p==0
1fb90 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 53 72   || NEVER(p->nSr
1fba0 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 67 6f 74  c==0) ){.    got
1fbb0 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72  o append_from_er
1fbc0 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  ror;.  }.  pItem
1fbd0 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63   = &p->a[p->nSrc
1fbe0 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  -1];.  assert( p
1fbf0 41 6c 69 61 73 21 3d 30 20 29 3b 0a 20 20 69 66  Alias!=0 );.  if
1fc00 28 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20  ( pAlias->n ){. 
1fc10 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73     pItem->zAlias
1fc20 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1fc30 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69  omToken(db, pAli
1fc40 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  as);.  }.  pItem
1fc50 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62  ->pSelect = pSub
1fc60 71 75 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e  query;.  pItem->
1fc70 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74  pOn = pOn;.  pIt
1fc80 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55 73  em->pUsing = pUs
1fc90 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  ing;.  return p;
1fca0 0a 0a 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65  .. append_from_e
1fcb0 72 72 6f 72 3a 0a 20 20 61 73 73 65 72 74 28 20  rror:.  assert( 
1fcc0 70 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  p==0 );.  sqlite
1fcd0 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
1fce0 70 4f 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 49  pOn);.  sqlite3I
1fcf0 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
1fd00 70 55 73 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74  pUsing);.  sqlit
1fd10 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
1fd20 62 2c 20 70 53 75 62 71 75 65 72 79 29 3b 0a 20  b, pSubquery);. 
1fd30 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1fd40 0a 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44 45 58  .** Add an INDEX
1fd50 45 44 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44  ED BY or NOT IND
1fd60 45 58 45 44 20 63 6c 61 75 73 65 20 74 6f 20 74  EXED clause to t
1fd70 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
1fd80 20 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65   added .** eleme
1fd90 6e 74 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65  nt of the source
1fda0 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20  -list passed as 
1fdb0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1fdc0 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
1fdd0 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78  ite3SrcListIndex
1fde0 65 64 42 79 28 50 61 72 73 65 20 2a 70 50 61 72  edBy(Parse *pPar
1fdf0 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20  se, SrcList *p, 
1fe00 54 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64 42  Token *pIndexedB
1fe10 79 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49  y){.  assert( pI
1fe20 6e 64 65 78 65 64 42 79 21 3d 30 20 29 3b 0a 20  ndexedBy!=0 );. 
1fe30 20 69 66 28 20 70 20 26 26 20 41 4c 57 41 59 53   if( p && ALWAYS
1fe40 28 70 2d 3e 6e 53 72 63 3e 30 29 20 29 7b 0a 20  (p->nSrc>0) ){. 
1fe50 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
1fe60 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
1fe70 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d  &p->a[p->nSrc-1]
1fe80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
1fe90 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78  tem->fg.notIndex
1fea0 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ed==0 );.    ass
1feb0 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69  ert( pItem->fg.i
1fec0 73 49 6e 64 65 78 65 64 42 79 3d 3d 30 20 29 3b  sIndexedBy==0 );
1fed0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
1fee0 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  em->fg.isTabFunc
1fef0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
1ff00 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20  IndexedBy->n==1 
1ff10 26 26 20 21 70 49 6e 64 65 78 65 64 42 79 2d 3e  && !pIndexedBy->
1ff20 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  z ){.      /* A 
1ff30 22 4e 4f 54 20 49 4e 44 45 58 45 44 22 20 63 6c  "NOT INDEXED" cl
1ff40 61 75 73 65 20 77 61 73 20 73 75 70 70 6c 69 65  ause was supplie
1ff50 64 2e 20 53 65 65 20 70 61 72 73 65 2e 79 20 0a  d. See parse.y .
1ff60 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75        ** constru
1ff70 63 74 20 22 69 6e 64 65 78 65 64 5f 6f 70 74 22  ct "indexed_opt"
1ff80 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f   for details. */
1ff90 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67  .      pItem->fg
1ffa0 2e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 31 3b  .notIndexed = 1;
1ffb0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1ffc0 20 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64    pItem->u1.zInd
1ffd0 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65 33  exedBy = sqlite3
1ffe0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  NameFromToken(pP
1fff0 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78  arse->db, pIndex
20000 65 64 42 79 29 3b 0a 20 20 20 20 20 20 70 49 74  edBy);.      pIt
20010 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64  em->fg.isIndexed
20020 42 79 20 3d 20 28 70 49 74 65 6d 2d 3e 75 31 2e  By = (pItem->u1.
20030 7a 49 6e 64 65 78 65 64 42 79 21 3d 30 29 3b 0a  zIndexedBy!=0);.
20040 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
20050 2a 2a 20 41 64 64 20 74 68 65 20 6c 69 73 74 20  ** Add the list 
20060 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
20070 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 53 72 63  ments to the Src
20080 4c 69 73 74 20 65 6e 74 72 79 20 66 6f 72 20 61  List entry for a
20090 0a 2a 2a 20 74 61 62 6c 65 2d 76 61 6c 75 65 64  .** table-valued
200a0 2d 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  -function..*/.vo
200b0 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
200c0 74 46 75 6e 63 41 72 67 73 28 50 61 72 73 65 20  tFuncArgs(Parse 
200d0 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
200e0 20 2a 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70   *p, ExprList *p
200f0 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70 20 29  List){.  if( p )
20100 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
20110 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
20120 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63   = &p->a[p->nSrc
20130 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
20140 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e   pItem->fg.notIn
20150 64 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20  dexed==0 );.    
20160 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66  assert( pItem->f
20170 67 2e 69 73 49 6e 64 65 78 65 64 42 79 3d 3d 30  g.isIndexedBy==0
20180 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
20190 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46  pItem->fg.isTabF
201a0 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49  unc==0 );.    pI
201b0 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67  tem->u1.pFuncArg
201c0 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 70 49   = pList;.    pI
201d0 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  tem->fg.isTabFun
201e0 63 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 1;.  }else{.
201f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
20200 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
20210 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  ->db, pList);.  
20220 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  }.}../*.** When 
20230 62 75 69 6c 64 69 6e 67 20 75 70 20 61 20 46 52  building up a FR
20240 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65  OM clause in the
20250 20 70 61 72 73 65 72 2c 20 74 68 65 20 6a 6f 69   parser, the joi
20260 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73  n operator.** is
20270 20 69 6e 69 74 69 61 6c 6c 79 20 61 74 74 61 63   initially attac
20280 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20  hed to the left 
20290 6f 70 65 72 61 6e 64 2e 20 20 42 75 74 20 74 68  operand.  But th
202a0 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
202b0 0a 2a 2a 20 65 78 70 65 63 74 73 20 74 68 65 20  .** expects the 
202c0 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 74 6f  join operator to
202d0 20 62 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74   be on the right
202e0 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20   operand.  This 
202f0 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69 66 74  routine.** Shift
20300 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72 61  s all join opera
20310 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74 20 74  tors from left t
20320 6f 20 72 69 67 68 74 20 66 6f 72 20 61 6e 20 65  o right for an e
20330 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c  ntire FROM.** cl
20340 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d  ause..**.** Exam
20350 70 6c 65 3a 20 53 75 70 70 6f 73 65 20 74 68 65  ple: Suppose the
20360 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20 74 68   join is like th
20370 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
20380 20 20 20 20 41 20 6e 61 74 75 72 61 6c 20 63 72      A natural cr
20390 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a  oss join B.**.**
203a0 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73   The operator is
203b0 20 22 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20   "natural cross 
203c0 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41 20 61 6e  join".  The A an
203d0 64 20 42 20 6f 70 65 72 61 6e 64 73 20 61 72 65  d B operands are
203e0 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70 2d   stored.** in p-
203f0 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61 5b 31  >a[0] and p->a[1
20400 5d 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  ], respectively.
20410 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 69    The parser ini
20420 74 69 61 6c 6c 79 20 73 74 6f 72 65 73 20 74 68  tially stores th
20430 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 77 69  e.** operator wi
20440 74 68 20 41 2e 20 20 54 68 69 73 20 72 6f 75 74  th A.  This rout
20450 69 6e 65 20 73 68 69 66 74 73 20 74 68 61 74 20  ine shifts that 
20460 6f 70 65 72 61 74 6f 72 20 6f 76 65 72 20 74 6f  operator over to
20470 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69   B..*/.void sqli
20480 74 65 33 53 72 63 4c 69 73 74 53 68 69 66 74 4a  te3SrcListShiftJ
20490 6f 69 6e 54 79 70 65 28 53 72 63 4c 69 73 74 20  oinType(SrcList 
204a0 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *p){.  if( p ){.
204b0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
204c0 6f 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20  or(i=p->nSrc-1; 
204d0 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  i>0; i--){.     
204e0 20 70 2d 3e 61 5b 69 5d 2e 66 67 2e 6a 6f 69 6e   p->a[i].fg.join
204f0 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d  type = p->a[i-1]
20500 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  .fg.jointype;.  
20510 20 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e    }.    p->a[0].
20520 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b  fg.jointype = 0;
20530 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
20540 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
20550 20 66 6f 72 20 61 20 42 45 47 49 4e 20 73 74 61   for a BEGIN sta
20560 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
20570 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e  sqlite3BeginTran
20580 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
20590 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70 65 29  Parse, int type)
205a0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
205b0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
205c0 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t i;..  assert( 
205d0 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 64  pParse!=0 );.  d
205e0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
205f0 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
20600 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
20610 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
20620 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
20630 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30  TION, "BEGIN", 0
20640 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , 0) ){.    retu
20650 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71  rn;.  }.  v = sq
20660 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
20670 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29  rse);.  if( !v )
20680 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74   return;.  if( t
20690 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45 44  ype!=TK_DEFERRED
206a0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
206b0 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
206c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
206d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
206e0 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20  Transaction, i, 
206f0 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53  (type==TK_EXCLUS
20700 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 20 20 73  IVE)+1);.      s
20710 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
20720 72 65 65 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d  ree(v, i);.    }
20730 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
20740 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 41  beAddOp0(v, OP_A
20750 75 74 6f 43 6f 6d 6d 69 74 29 3b 0a 7d 0a 0a 2f  utoCommit);.}../
20760 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
20770 42 45 20 63 6f 64 65 20 66 6f 72 20 61 20 43 4f  BE code for a CO
20780 4d 4d 49 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  MMIT statement..
20790 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
207a0 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e  ommitTransaction
207b0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
207c0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
207d0 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30  ssert( pParse!=0
207e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
207f0 61 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  arse->db!=0 );. 
20800 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
20810 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
20820 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
20830 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  , "COMMIT", 0, 0
20840 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
20850 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74  .  }.  v = sqlit
20860 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
20870 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
20880 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20890 4f 70 31 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  Op1(v, OP_AutoCo
208a0 6d 6d 69 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a  mmit, 1);.  }.}.
208b0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
208c0 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20 61 20  VDBE code for a 
208d0 52 4f 4c 4c 42 41 43 4b 20 73 74 61 74 65 6d 65  ROLLBACK stateme
208e0 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
208f0 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73  te3RollbackTrans
20900 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
20910 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
20920 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
20930 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rse!=0 );.  asse
20940 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d  rt( pParse->db!=
20950 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0 );.  if( sqlit
20960 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
20970 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
20980 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43  ACTION, "ROLLBAC
20990 4b 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20  K", 0, 0) ){.   
209a0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76   return;.  }.  v
209b0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
209c0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
209d0 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
209e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
209f0 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c  P_AutoCommit, 1,
20a00 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   1);.  }.}../*.*
20a10 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
20a20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
20a30 20 70 61 72 73 65 72 20 77 68 65 6e 20 69 74 20   parser when it 
20a40 70 61 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e 64  parses a command
20a50 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20 72   to create,.** r
20a60 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61  elease or rollba
20a70 63 6b 20 61 6e 20 53 51 4c 20 73 61 76 65 70 6f  ck an SQL savepo
20a80 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  int. .*/.void sq
20a90 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28 50  lite3Savepoint(P
20aa0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
20ab0 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  t op, Token *pNa
20ac0 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  me){.  char *zNa
20ad0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
20ae0 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
20af0 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  ->db, pName);.  
20b00 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
20b10 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
20b20 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
20b30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
20b40 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
20b50 54 49 4f 4e 0a 20 20 20 20 73 74 61 74 69 63 20  TION.    static 
20b60 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e  const char * con
20b70 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45 47  st az[] = { "BEG
20b80 49 4e 22 2c 20 22 52 45 4c 45 41 53 45 22 2c 20  IN", "RELEASE", 
20b90 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20 20  "ROLLBACK" };.  
20ba0 20 20 61 73 73 65 72 74 28 20 21 53 41 56 45 50    assert( !SAVEP
20bb0 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26 20 53 41  OINT_BEGIN && SA
20bc0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3d  VEPOINT_RELEASE=
20bd0 3d 31 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f  =1 && SAVEPOINT_
20be0 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a 23  ROLLBACK==2 );.#
20bf0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 21 76  endif.    if( !v
20c00 20 7c 7c 20 73 71 6c 69 74 65 33 41 75 74 68 43   || sqlite3AuthC
20c10 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
20c20 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20 61  ITE_SAVEPOINT, a
20c30 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29  z[op], zName, 0)
20c40 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
20c50 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
20c60 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
20c70 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
20c80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20c90 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76 65  ddOp4(v, OP_Save
20ca0 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30 2c  point, op, 0, 0,
20cb0 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d   zName, P4_DYNAM
20cc0 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  IC);.  }.}../*.*
20cd0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
20ce0 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 69 73  TEMP database is
20cf0 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61   open and availa
20d00 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65  ble for use.  Re
20d10 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  turn.** the numb
20d20 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c  er of errors.  L
20d30 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  eave any error m
20d40 65 73 73 61 67 65 73 20 69 6e 20 74 68 65 20 70  essages in the p
20d50 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
20d60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f  .*/.int sqlite3O
20d70 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28  penTempDatabase(
20d80 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
20d90 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
20da0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
20db0 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  ( db->aDb[1].pBt
20dc0 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ==0 && !pParse->
20dd0 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69  explain ){.    i
20de0 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72 65 65  nt rc;.    Btree
20df0 20 2a 70 42 74 3b 0a 20 20 20 20 73 74 61 74 69   *pBt;.    stati
20e00 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67  c const int flag
20e10 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 53  s = .          S
20e20 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
20e30 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20  RITE |.         
20e40 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
20e50 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ATE |.          
20e60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
20e70 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20  USIVE |.        
20e80 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45    SQLITE_OPEN_DE
20e90 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20  LETEONCLOSE |.  
20ea0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
20eb0 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20  PEN_TEMP_DB;..  
20ec0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
20ed0 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73  reeOpen(db->pVfs
20ee0 2c 20 30 2c 20 64 62 2c 20 26 70 42 74 2c 20 30  , 0, db, &pBt, 0
20ef0 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  , flags);.    if
20f00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20f10 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
20f20 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
20f30 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   "unable to open
20f40 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74   a temporary dat
20f50 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20  abase ".        
20f60 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e  "file for storin
20f70 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  g temporary tabl
20f80 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72  es");.      pPar
20f90 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20  se->rc = rc;.   
20fa0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
20fb0 20 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b 31   }.    db->aDb[1
20fc0 5d 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ].pBt = pBt;.   
20fd0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
20fe0 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20  [1].pSchema );. 
20ff0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f     if( SQLITE_NO
21000 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65  MEM==sqlite3Btre
21010 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 42 74  eSetPageSize(pBt
21020 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69  , db->nextPagesi
21030 7a 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a 20 20  ze, -1, 0) ){.  
21040 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
21050 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 72  ult(db);.      r
21060 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
21070 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
21080 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74  ../*.** Record t
21090 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65  he fact that the
210a0 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 77   schema cookie w
210b0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 76  ill need to be v
210c0 65 72 69 66 69 65 64 0a 2a 2a 20 66 6f 72 20 64  erified.** for d
210d0 61 74 61 62 61 73 65 20 69 44 62 2e 20 20 54 68  atabase iDb.  Th
210e0 65 20 63 6f 64 65 20 74 6f 20 61 63 74 75 61 6c  e code to actual
210f0 6c 79 20 76 65 72 69 66 79 20 74 68 65 20 73 63  ly verify the sc
21100 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a 20 77  hema cookie.** w
21110 69 6c 6c 20 6f 63 63 75 72 20 61 74 20 74 68 65  ill occur at the
21120 20 65 6e 64 20 6f 66 20 74 68 65 20 74 6f 70 2d   end of the top-
21130 6c 65 76 65 6c 20 56 44 42 45 20 61 6e 64 20 77  level VDBE and w
21140 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64  ill be generated
21150 0a 2a 2a 20 6c 61 74 65 72 2c 20 62 79 20 73 71  .** later, by sq
21160 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
21170 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  g()..*/.void sql
21180 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
21190 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72  hema(Parse *pPar
211a0 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
211b0 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
211c0 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
211d0 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
211e0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ..  assert( iDb>
211f0 3d 30 20 26 26 20 69 44 62 3c 70 50 61 72 73 65  =0 && iDb<pParse
21200 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  ->db->nDb );.  a
21210 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
21220 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21  b->aDb[iDb].pBt!
21230 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a  =0 || iDb==1 );.
21240 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 53 51    assert( iDb<SQ
21250 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
21260 44 2b 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  D+2 );.  assert(
21270 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
21280 74 65 78 48 65 6c 64 28 70 50 61 72 73 65 2d 3e  texHeld(pParse->
21290 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
212a0 20 69 66 28 20 44 62 4d 61 73 6b 54 65 73 74 28   if( DbMaskTest(
212b0 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69  pToplevel->cooki
212c0 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20 29  eMask, iDb)==0 )
212d0 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28  {.    DbMaskSet(
212e0 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69  pToplevel->cooki
212f0 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 20  eMask, iDb);.   
21300 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
21310 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
21320 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
21330 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 54 6f  TempDatabase(pTo
21340 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  plevel);.    }. 
21350 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61   }.}../*.** If a
21360 72 67 75 6d 65 6e 74 20 7a 44 62 20 69 73 20 4e  rgument zDb is N
21370 55 4c 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20 73  ULL, then call s
21380 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
21390 53 63 68 65 6d 61 28 29 20 66 6f 72 20 65 61 63  Schema() for eac
213a0 68 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64  h .** attached d
213b0 61 74 61 62 61 73 65 2e 20 4f 74 68 65 72 77 69  atabase. Otherwi
213c0 73 65 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66 6f  se, invoke it fo
213d0 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  r the database n
213e0 61 6d 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a  amed zDb only..*
213f0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
21400 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68  deVerifyNamedSch
21410 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  ema(Parse *pPars
21420 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
21430 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Db){.  sqlite3 *
21440 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
21450 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
21460 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
21470 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44  i++){.    Db *pD
21480 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
21490 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
214a0 74 20 26 26 20 28 21 7a 44 62 20 7c 7c 20 30 3d  t && (!zDb || 0=
214b0 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
214c0 7a 44 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61  zDb, pDb->zDbSNa
214d0 6d 65 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71  me)) ){.      sq
214e0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
214f0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29  chema(pParse, i)
21500 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
21510 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
21520 42 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65  BE code that pre
21530 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20  pares for doing 
21540 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61  an operation tha
21550 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67  t.** might chang
21560 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  e the database..
21570 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
21580 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65 77 20  ne starts a new 
21590 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77  transaction if w
215a0 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64  e are not alread
215b0 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72  y within.** a tr
215c0 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77  ansaction.  If w
215d0 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69  e are already wi
215e0 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
215f0 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b  on, then a check
21600 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20  point.** is set 
21610 69 66 20 74 68 65 20 73 65 74 53 74 61 74 65 6d  if the setStatem
21620 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  ent parameter is
21630 20 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70   true.  A checkp
21640 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  oint should.** b
21650 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74  e set for operat
21660 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20  ions that might 
21670 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63  fail (due to a c
21680 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20  onstraint) part 
21690 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68  of.** the way th
216a0 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20  rough and which 
216b0 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64  will need to und
216c0 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69  o some writes wi
216d0 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a  thout having to.
216e0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** rollback the 
216f0 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f  whole transactio
21700 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f  n.  For operatio
21710 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e  ns where all con
21720 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20  straints.** can 
21730 62 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72  be checked befor
21740 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72  e any changes ar
21750 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  e made to the da
21760 74 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65  tabase, it is ne
21770 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79  ver.** necessary
21780 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65   to undo a write
21790 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f   and the checkpo
217a0 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  int should not b
217b0 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  e set..*/.void s
217c0 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
217d0 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20  Operation(Parse 
217e0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74  *pParse, int set
217f0 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69  Statement, int i
21800 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54  Db){.  Parse *pT
21810 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
21820 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
21830 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
21840 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
21850 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
21860 20 20 44 62 4d 61 73 6b 53 65 74 28 70 54 6f 70    DbMaskSet(pTop
21870 6c 65 76 65 6c 2d 3e 77 72 69 74 65 4d 61 73 6b  level->writeMask
21880 2c 20 69 44 62 29 3b 0a 20 20 70 54 6f 70 6c 65  , iDb);.  pTople
21890 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74  vel->isMultiWrit
218a0 65 20 7c 3d 20 73 65 74 53 74 61 74 65 6d 65 6e  e |= setStatemen
218b0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69  t;.}../*.** Indi
218c0 63 61 74 65 20 74 68 61 74 20 74 68 65 20 73 74  cate that the st
218d0 61 74 65 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c  atement currentl
218e0 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
218f0 74 69 6f 6e 20 6d 69 67 68 74 20 77 72 69 74 65  tion might write
21900 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  .** more than on
21910 65 20 65 6e 74 72 79 20 28 65 78 61 6d 70 6c 65  e entry (example
21920 3a 20 64 65 6c 65 74 69 6e 67 20 6f 6e 65 20 72  : deleting one r
21930 6f 77 20 74 68 65 6e 20 69 6e 73 65 72 74 69 6e  ow then insertin
21940 67 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e  g another,.** in
21950 73 65 72 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65  serting multiple
21960 20 72 6f 77 73 20 69 6e 20 61 20 74 61 62 6c 65   rows in a table
21970 2c 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 61  , or inserting a
21980 20 72 6f 77 20 61 6e 64 20 69 6e 64 65 78 20 65   row and index e
21990 6e 74 72 69 65 73 2e 29 0a 2a 2a 20 49 66 20 61  ntries.).** If a
219a0 6e 20 61 62 6f 72 74 20 6f 63 63 75 72 73 20 61  n abort occurs a
219b0 66 74 65 72 20 73 6f 6d 65 20 6f 66 20 74 68 65  fter some of the
219c0 73 65 20 77 72 69 74 65 73 20 68 61 76 65 20 63  se writes have c
219d0 6f 6d 70 6c 65 74 65 64 2c 20 74 68 65 6e 20 69  ompleted, then i
219e0 74 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63  t will.** be nec
219f0 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 74  essary to undo t
21a00 68 65 20 63 6f 6d 70 6c 65 74 65 64 20 77 72 69  he completed wri
21a10 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tes..*/.void sql
21a20 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28 50  ite3MultiWrite(P
21a30 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
21a40 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
21a50 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
21a60 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
21a70 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69  ;.  pToplevel->i
21a80 73 4d 75 6c 74 69 57 72 69 74 65 20 3d 20 31 3b  sMultiWrite = 1;
21a90 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 63  .}../* .** The c
21aa0 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 63 61  ode generator ca
21ab0 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
21ac0 20 69 66 20 69 73 20 64 69 73 63 6f 76 65 72 73   if is discovers
21ad0 20 74 68 61 74 20 69 74 20 69 73 0a 2a 2a 20 70   that it is.** p
21ae0 6f 73 73 69 62 6c 65 20 74 6f 20 61 62 6f 72 74  ossible to abort
21af0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 70 72 69   a statement pri
21b00 6f 72 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  or to completion
21b10 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 0a  .  In order to .
21b20 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20  ** perform this 
21b30 61 62 6f 72 74 20 77 69 74 68 6f 75 74 20 63 6f  abort without co
21b40 72 72 75 70 74 69 6e 67 20 74 68 65 20 64 61 74  rrupting the dat
21b50 61 62 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74  abase, we need t
21b60 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 74  o make.** sure t
21b70 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hat the statemen
21b80 74 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62  t is protected b
21b90 79 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  y a statement tr
21ba0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
21bb0 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65   Technically, we
21bc0 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 65   only need to se
21bd0 74 20 74 68 65 20 6d 61 79 41 62 6f 72 74 20 66  t the mayAbort f
21be0 6c 61 67 20 69 66 20 74 68 65 0a 2a 2a 20 69 73  lag if the.** is
21bf0 4d 75 6c 74 69 57 72 69 74 65 20 66 6c 61 67 20  MultiWrite flag 
21c00 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73  was previously s
21c10 65 74 2e 20 20 54 68 65 72 65 20 69 73 20 61 20  et.  There is a 
21c20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a  time dependency.
21c30 2a 2a 20 73 75 63 68 20 74 68 61 74 20 74 68 65  ** such that the
21c40 20 61 62 6f 72 74 20 6d 75 73 74 20 6f 63 63 75   abort must occu
21c50 72 20 61 66 74 65 72 20 74 68 65 20 6d 75 6c 74  r after the mult
21c60 69 77 72 69 74 65 2e 20 20 54 68 69 73 20 6d 61  iwrite.  This ma
21c70 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 61 74  kes.** some stat
21c80 65 6d 65 6e 74 73 20 69 6e 76 6f 6c 76 69 6e 67  ements involving
21c90 20 74 68 65 20 52 45 50 4c 41 43 45 20 63 6f 6e   the REPLACE con
21ca0 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
21cb0 20 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f   algorithm.** go
21cc0 20 61 20 6c 69 74 74 6c 65 20 66 61 73 74 65 72   a little faster
21cd0 2e 20 20 42 75 74 20 74 61 6b 69 6e 67 20 61 64  .  But taking ad
21ce0 76 61 6e 74 61 67 65 20 6f 66 20 74 68 69 73 20  vantage of this 
21cf0 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a  time dependency.
21d00 2a 2a 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72 65  ** makes it more
21d10 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 70 72   difficult to pr
21d20 6f 76 65 20 74 68 61 74 20 74 68 65 20 63 6f 64  ove that the cod
21d30 65 20 69 73 20 63 6f 72 72 65 63 74 20 28 69 6e  e is correct (in
21d40 20 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 2c   .** particular,
21d50 20 69 74 20 70 72 65 76 65 6e 74 73 20 75 73 20   it prevents us 
21d60 66 72 6f 6d 20 77 72 69 74 69 6e 67 20 61 6e 20  from writing an 
21d70 65 66 66 65 63 74 69 76 65 0a 2a 2a 20 69 6d 70  effective.** imp
21d80 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73  lementation of s
21d90 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
21da0 62 6f 72 74 28 29 29 20 61 6e 64 20 73 6f 20 77  bort()) and so w
21db0 65 20 68 61 76 65 20 63 68 6f 73 65 6e 0a 2a 2a  e have chosen.**
21dc0 20 74 6f 20 74 61 6b 65 20 74 68 65 20 73 61 66   to take the saf
21dd0 65 20 72 6f 75 74 65 20 61 6e 64 20 73 6b 69 70  e route and skip
21de0 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
21df0 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
21e00 65 33 4d 61 79 41 62 6f 72 74 28 50 61 72 73 65  e3MayAbort(Parse
21e10 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72   *pParse){.  Par
21e20 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
21e30 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
21e40 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
21e50 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41 62  pToplevel->mayAb
21e60 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  ort = 1;.}../*.*
21e70 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c  * Code an OP_Hal
21e80 74 20 74 68 61 74 20 63 61 75 73 65 73 20 74 68  t that causes th
21e90 65 20 76 64 62 65 20 74 6f 20 72 65 74 75 72 6e  e vdbe to return
21ea0 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   an SQLITE_CONST
21eb0 52 41 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e 20  RAINT.** error. 
21ec0 54 68 65 20 6f 6e 45 72 72 6f 72 20 70 61 72 61  The onError para
21ed0 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73  meter determines
21ee0 20 77 68 69 63 68 20 28 69 66 20 61 6e 79 29 20   which (if any) 
21ef0 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
21f00 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72 65  .** and/or curre
21f10 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
21f20 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
21f30 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 48 61  /.void sqlite3Ha
21f40 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  ltConstraint(.  
21f50 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
21f60 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
21f70 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65 72  text */.  int er
21f80 72 43 6f 64 65 2c 20 20 20 20 20 20 2f 2a 20 65  rCode,      /* e
21f90 78 74 65 6e 64 65 64 20 65 72 72 6f 72 20 63 6f  xtended error co
21fa0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  de */.  int onEr
21fb0 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e  ror,      /* Con
21fc0 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a  straint type */.
21fd0 20 20 63 68 61 72 20 2a 70 34 2c 20 20 20 20 20    char *p4,     
21fe0 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73      /* Error mes
21ff0 73 61 67 65 20 2a 2f 0a 20 20 69 38 20 70 34 74  sage */.  i8 p4t
22000 79 70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ype,        /* P
22010 34 5f 53 54 41 54 49 43 20 6f 72 20 50 34 5f 54  4_STATIC or P4_T
22020 52 41 4e 53 49 45 4e 54 20 2a 2f 0a 20 20 75 38  RANSIENT */.  u8
22030 20 70 35 45 72 72 6d 73 67 20 20 20 20 20 20 20   p5Errmsg       
22040 2f 2a 20 50 35 5f 45 72 72 4d 73 67 20 74 79 70  /* P5_ErrMsg typ
22050 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  e */.){.  Vdbe *
22060 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
22070 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  be(pParse);.  as
22080 73 65 72 74 28 20 28 65 72 72 43 6f 64 65 26 30  sert( (errCode&0
22090 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  xff)==SQLITE_CON
220a0 53 54 52 41 49 4e 54 20 29 3b 0a 20 20 69 66 28  STRAINT );.  if(
220b0 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f   onError==OE_Abo
220c0 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rt ){.    sqlite
220d0 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65  3MayAbort(pParse
220e0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
220f0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
22100 5f 48 61 6c 74 2c 20 65 72 72 43 6f 64 65 2c 20  _Halt, errCode, 
22110 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20  onError, 0, p4, 
22120 70 34 74 79 70 65 29 3b 0a 20 20 73 71 6c 69 74  p4type);.  sqlit
22130 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
22140 2c 20 70 35 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a  , p5Errmsg);.}..
22150 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50  /*.** Code an OP
22160 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 55 4e 49  _Halt due to UNI
22170 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b  QUE or PRIMARY K
22180 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69  EY constraint vi
22190 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  olation..*/.void
221a0 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f   sqlite3UniqueCo
221b0 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
221c0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
221d0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
221e0 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
221f0 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74  r,      /* Const
22200 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20  raint type */.  
22210 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20  Index *pIdx     
22220 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
22230 68 61 74 20 74 72 69 67 67 65 72 73 20 74 68 65  hat triggers the
22240 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29   constraint */.)
22250 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a  {.  char *zErr;.
22260 20 20 69 6e 74 20 6a 3b 0a 20 20 53 74 72 41 63    int j;.  StrAc
22270 63 75 6d 20 65 72 72 4d 73 67 3b 0a 20 20 54 61  cum errMsg;.  Ta
22280 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 64 78  ble *pTab = pIdx
22290 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 73 71 6c  ->pTable;..  sql
222a0 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74  ite3StrAccumInit
222b0 28 26 65 72 72 4d 73 67 2c 20 70 50 61 72 73 65  (&errMsg, pParse
222c0 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 32 30 30 29  ->db, 0, 0, 200)
222d0 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 61 43  ;.  if( pIdx->aC
222e0 6f 6c 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71  olExpr ){.    sq
222f0 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 65 72  lite3XPrintf(&er
22300 72 4d 73 67 2c 20 22 69 6e 64 65 78 20 27 25 71  rMsg, "index '%q
22310 27 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  '", pIdx->zName)
22320 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
22330 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e  or(j=0; j<pIdx->
22340 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  nKeyCol; j++){. 
22350 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b       char *zCol;
22360 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22370 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
22380 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f  >=0 );.      zCo
22390 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  l = pTab->aCol[p
223a0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
223b0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69  ].zName;.      i
223c0 66 28 20 6a 20 29 20 73 71 6c 69 74 65 33 53 74  f( j ) sqlite3St
223d0 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 65 72  rAccumAppend(&er
223e0 72 4d 73 67 2c 20 22 2c 20 22 2c 20 32 29 3b 0a  rMsg, ", ", 2);.
223f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
22400 69 6e 74 66 28 26 65 72 72 4d 73 67 2c 20 22 25  intf(&errMsg, "%
22410 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  s.%s", pTab->zNa
22420 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d  me, zCol);.    }
22430 0a 20 20 7d 0a 20 20 7a 45 72 72 20 3d 20 73 71  .  }.  zErr = sq
22440 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e  lite3StrAccumFin
22450 69 73 68 28 26 65 72 72 4d 73 67 29 3b 0a 20 20  ish(&errMsg);.  
22460 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
22470 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 0a 20  raint(pParse, . 
22480 20 20 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49     IsPrimaryKeyI
22490 6e 64 65 78 28 70 49 64 78 29 20 3f 20 53 51 4c  ndex(pIdx) ? SQL
224a0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50  ITE_CONSTRAINT_P
224b0 52 49 4d 41 52 59 4b 45 59 20 0a 20 20 20 20 20  RIMARYKEY .     
224c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224d0 20 20 20 20 20 20 20 3a 20 53 51 4c 49 54 45 5f         : SQLITE_
224e0 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55  CONSTRAINT_UNIQU
224f0 45 2c 0a 20 20 20 20 6f 6e 45 72 72 6f 72 2c 20  E,.    onError, 
22500 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zErr, P4_DYNAMIC
22510 2c 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55  , P5_ConstraintU
22520 6e 69 71 75 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  nique);.}.../*.*
22530 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c  * Code an OP_Hal
22540 74 20 64 75 65 20 74 6f 20 6e 6f 6e 2d 75 6e 69  t due to non-uni
22550 71 75 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f  que rowid..*/.vo
22560 69 64 20 73 71 6c 69 74 65 33 52 6f 77 69 64 43  id sqlite3RowidC
22570 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72  onstraint(.  Par
22580 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
22590 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
225a0 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  t */.  int onErr
225b0 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66  or,      /* Conf
225c0 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
225d0 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 54  algorithm */.  T
225e0 61 62 6c 65 20 2a 70 54 61 62 20 20 20 20 20 20  able *pTab      
225f0 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 77 69   /* The table wi
22600 74 68 20 74 68 65 20 6e 6f 6e 2d 75 6e 69 71 75  th the non-uniqu
22610 65 20 72 6f 77 69 64 20 2a 2f 20 0a 29 7b 0a 20  e rowid */ .){. 
22620 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 69   char *zMsg;.  i
22630 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 54 61  nt rc;.  if( pTa
22640 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20  b->iPKey>=0 ){. 
22650 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
22660 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
22670 3e 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54  >db, "%s.%s", pT
22680 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
22690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226a0 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
226b0 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61  pTab->iPKey].zNa
226c0 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  me);.    rc = SQ
226d0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
226e0 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20 7d 65  PRIMARYKEY;.  }e
226f0 6c 73 65 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20  lse{.    zMsg = 
22700 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
22710 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 72  Parse->db, "%s.r
22720 6f 77 69 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  owid", pTab->zNa
22730 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  me);.    rc = SQ
22740 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
22750 52 4f 57 49 44 3b 0a 20 20 7d 0a 20 20 73 71 6c  ROWID;.  }.  sql
22760 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69  ite3HaltConstrai
22770 6e 74 28 70 50 61 72 73 65 2c 20 72 63 2c 20 6f  nt(pParse, rc, o
22780 6e 45 72 72 6f 72 2c 20 7a 4d 73 67 2c 20 50 34  nError, zMsg, P4
22790 5f 44 59 4e 41 4d 49 43 2c 0a 20 20 20 20 20 20  _DYNAMIC,.      
227a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227b0 20 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55    P5_ConstraintU
227c0 6e 69 71 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nique);.}../*.**
227d0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
227e0 20 70 49 6e 64 65 78 20 75 73 65 73 20 74 68 65   pIndex uses the
227f0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
22800 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75  nce pColl.  Retu
22810 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74  rn.** true if it
22820 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20   does and false 
22830 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a  if it does not..
22840 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
22850 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
22860 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74  tatic int collat
22870 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63  ionMatch(const c
22880 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65  har *zColl, Inde
22890 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e  x *pIndex){.  in
228a0 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  t i;.  assert( z
228b0 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72  Coll!=0 );.  for
228c0 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e  (i=0; i<pIndex->
228d0 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
228e0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
228f0 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c   = pIndex->azCol
22900 6c 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  l[i];.    assert
22910 28 20 7a 21 3d 30 20 7c 7c 20 70 49 6e 64 65 78  ( z!=0 || pIndex
22920 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3c 30 20  ->aiColumn[i]<0 
22930 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  );.    if( pInde
22940 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d  x->aiColumn[i]>=
22950 30 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53  0 && 0==sqlite3S
22960 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29  trICmp(z, zColl)
22970 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
22980 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
22990 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
229a0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70  if../*.** Recomp
229b0 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
229c0 6f 66 20 70 54 61 62 20 74 68 61 74 20 75 73 65  of pTab that use
229d0 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
229e0 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a  equence pColl..*
229f0 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68  * If pColl==0 th
22a00 65 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c  en recompute all
22a10 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62   indices of pTab
22a20 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
22a30 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
22a40 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69  .static void rei
22a50 6e 64 65 78 54 61 62 6c 65 28 50 61 72 73 65 20  ndexTable(Parse 
22a60 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
22a70 70 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73 74  pTab, char const
22a80 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65   *zColl){.  Inde
22a90 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20  x *pIndex;      
22aa0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
22ab0 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
22ac0 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66  ith pTab */..  f
22ad0 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e  or(pIndex=pTab->
22ae0 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20  pIndex; pIndex; 
22af0 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70  pIndex=pIndex->p
22b00 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 7a  Next){.    if( z
22b10 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61  Coll==0 || colla
22b20 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c  tionMatch(zColl,
22b30 20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20   pIndex) ){.    
22b40 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
22b50 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
22b60 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
22b70 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
22b80 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
22b90 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
22ba0 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
22bb0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69       sqlite3Refi
22bc0 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
22bd0 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20  pIndex, -1);.   
22be0 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
22bf0 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65  ./*.** Recompute
22c00 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
22c10 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c  all tables in al
22c20 6c 20 64 61 74 61 62 61 73 65 73 20 77 68 65 72  l databases wher
22c30 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73  e the.** indices
22c40 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69   use the collati
22c50 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ng sequence pCol
22c60 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20  l.  If pColl==0 
22c70 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a  then recompute.*
22c80 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76  * all indices ev
22c90 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66  erywhere..*/.#if
22ca0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
22cb0 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20  _REINDEX.static 
22cc0 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74 61  void reindexData
22cd0 62 61 73 65 73 28 50 61 72 73 65 20 2a 70 50 61  bases(Parse *pPa
22ce0 72 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74 20  rse, char const 
22cf0 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70  *zColl){.  Db *p
22d00 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
22d10 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
22d20 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  le database */. 
22d30 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
22d40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22d50 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64  The database ind
22d60 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73  ex number */.  s
22d70 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
22d80 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68  rse->db;   /* Th
22d90 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
22da0 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45  ction */.  HashE
22db0 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20  lem *k;         
22dc0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
22dd0 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65  oping over table
22de0 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61  s in pDb */.  Ta
22df0 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
22e00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74            /* A t
22e10 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61  able in the data
22e20 62 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  base */..  asser
22e30 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
22e40 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64  oldsAllMutexes(d
22e50 62 29 20 29 3b 20 20 2f 2a 20 4e 65 65 64 65 64  b) );  /* Needed
22e60 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65   for schema acce
22e70 73 73 20 2a 2f 0a 20 20 66 6f 72 28 69 44 62 3d  ss */.  for(iDb=
22e80 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20  0, pDb=db->aDb; 
22e90 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62  iDb<db->nDb; iDb
22ea0 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20  ++, pDb++){.    
22eb0 61 73 73 65 72 74 28 20 70 44 62 21 3d 30 20 29  assert( pDb!=0 )
22ec0 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69  ;.    for(k=sqli
22ed0 74 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62  teHashFirst(&pDb
22ee0 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ->pSchema->tblHa
22ef0 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74  sh);  k; k=sqlit
22f00 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20  eHashNext(k)){. 
22f10 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62       pTab = (Tab
22f20 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  le*)sqliteHashDa
22f30 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72 65 69  ta(k);.      rei
22f40 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65  ndexTable(pParse
22f50 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  , pTab, zColl);.
22f60 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
22f70 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  if../*.** Genera
22f80 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
22f90 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e  REINDEX command.
22fa0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  .**.**        RE
22fb0 49 4e 44 45 58 20 20 20 20 20 20 20 20 20 20 20  INDEX           
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fd0 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20   -- 1.**        
22fe0 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74  REINDEX  <collat
22ff0 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20 20 20  ion>            
23000 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20     -- 2.**      
23010 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74    REINDEX  ?<dat
23020 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61  abase>.?<tablena
23030 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20  me>  -- 3.**    
23040 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64      REINDEX  ?<d
23050 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78  atabase>.?<index
23060 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a  name>  -- 4.**.*
23070 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20  * Form 1 causes 
23080 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61  all indices in a
23090 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
230a0 62 61 73 65 73 20 74 6f 20 62 65 20 72 65 62 75  bases to be rebu
230b0 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72  ilt..** Form 2 r
230c0 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69  ebuilds all indi
230d0 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62  ces in all datab
230e0 61 73 65 73 20 74 68 61 74 20 75 73 65 20 74 68  ases that use th
230f0 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61  e named.** colla
23100 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20  ting function.  
23110 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20 72 65  Forms 3 and 4 re
23120 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65 64 20  build the named 
23130 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20  index or all.** 
23140 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
23150 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  ed with the name
23160 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e  d table..*/.#ifn
23170 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
23180 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c  REINDEX.void sql
23190 69 74 65 33 52 65 69 6e 64 65 78 28 50 61 72 73  ite3Reindex(Pars
231a0 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
231b0 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20   *pName1, Token 
231c0 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c  *pName2){.  Coll
231d0 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20  Seq *pColl;     
231e0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
231f0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f  ting sequence to
23200 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f   be reindexed, o
23210 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72  r NULL */.  char
23220 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   *z;            
23230 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
23240 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  of a table or in
23250 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dex */.  const c
23260 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20  har *zDb;       
23270 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
23280 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
23290 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
232a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
232b0 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   A table in the 
232c0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e  database */.  In
232d0 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
232e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
232f0 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
23300 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20   with pTab */.  
23310 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
23320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
23330 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  he database inde
23340 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71  x number */.  sq
23350 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
23360 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65  se->db;   /* The
23370 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
23380 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  tion */.  Token 
23390 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20  *pObjName;      
233a0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
233b0 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e   the table or in
233c0 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65  dex to be reinde
233d0 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61  xed */..  /* Rea
233e0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
233f0 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72  chema. If an err
23400 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65  or occurs, leave
23410 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
23420 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20  e.  ** and code 
23430 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
23440 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  turn NULL. */.  
23450 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
23460 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
23470 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
23480 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69  return;.  }..  i
23490 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a  f( pName1==0 ){.
234a0 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62      reindexDatab
234b0 61 73 65 73 28 70 50 61 72 73 65 2c 20 30 29 3b  ases(pParse, 0);
234c0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
234d0 65 6c 73 65 20 69 66 28 20 4e 45 56 45 52 28 70  else if( NEVER(p
234e0 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c 20 70 4e 61  Name2==0) || pNa
234f0 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  me2->z==0 ){.   
23500 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20   char *zColl;.  
23510 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31    assert( pName1
23520 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c  ->z );.    zColl
23530 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
23540 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
23550 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20  db, pName1);.   
23560 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65   if( !zColl ) re
23570 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  turn;.    pColl 
23580 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
23590 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29  lSeq(db, ENC(db)
235a0 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20  , zColl, 0);.   
235b0 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
235c0 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62      reindexDatab
235d0 61 73 65 73 28 70 50 61 72 73 65 2c 20 7a 43 6f  ases(pParse, zCo
235e0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
235f0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f  e3DbFree(db, zCo
23600 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ll);.      retur
23610 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  n;.    }.    sql
23620 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
23630 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44 62  Coll);.  }.  iDb
23640 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72   = sqlite3TwoPar
23650 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
23660 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
23670 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ObjName);.  if( 
23680 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  iDb<0 ) return;.
23690 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d    z = sqlite3Nam
236a0 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
236b0 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ObjName);.  if( 
236c0 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  z==0 ) return;. 
236d0 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69   zDb = db->aDb[i
236e0 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20  Db].zDbSName;.  
236f0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69  pTab = sqlite3Fi
23700 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a  ndTable(db, z, z
23710 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20  Db);.  if( pTab 
23720 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61  ){.    reindexTa
23730 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
23740 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
23750 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a  3DbFree(db, z);.
23760 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
23770 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
23780 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
23790 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74  z, zDb);.  sqlit
237a0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
237b0 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b  .  if( pIndex ){
237c0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
237d0 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
237e0 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
237f0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69  .    sqlite3Refi
23800 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
23810 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20  pIndex, -1);.   
23820 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
23830 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
23840 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74  Parse, "unable t
23850 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65 20 6f  o identify the o
23860 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69 6e  bject to be rein
23870 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69  dexed");.}.#endi
23880 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
23890 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
238a0 75 72 65 20 74 68 61 74 20 69 73 20 61 70 70 72  ure that is appr
238b0 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20  opriate for the 
238c0 67 69 76 65 6e 20 49 6e 64 65 78 2e 0a 2a 2a 0a  given Index..**.
238d0 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68  ** The caller sh
238e0 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69  ould invoke sqli
238f0 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
23900 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65  ) on the returne
23910 64 20 6f 62 6a 65 63 74 0a 2a 2a 20 77 68 65 6e  d object.** when
23920 20 69 74 20 68 61 73 20 66 69 6e 69 73 68 65 64   it has finished
23930 20 75 73 69 6e 67 20 69 74 2e 0a 2a 2f 0a 4b 65   using it..*/.Ke
23940 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65  yInfo *sqlite3Ke
23950 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 50 61 72  yInfoOfIndex(Par
23960 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65  se *pParse, Inde
23970 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74 20  x *pIdx){.  int 
23980 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20  i;.  int nCol = 
23990 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  pIdx->nColumn;. 
239a0 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 49 64 78   int nKey = pIdx
239b0 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 4b 65 79  ->nKeyCol;.  Key
239c0 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a 20 20 69 66  Info *pKey;.  if
239d0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
239e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
239f0 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75   pIdx->uniqNotNu
23a00 6c 6c 20 29 7b 0a 20 20 20 20 70 4b 65 79 20 3d  ll ){.    pKey =
23a10 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
23a20 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
23a30 20 6e 4b 65 79 2c 20 6e 43 6f 6c 2d 6e 4b 65 79   nKey, nCol-nKey
23a40 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
23a50 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65  pKey = sqlite3Ke
23a60 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73  yInfoAlloc(pPars
23a70 65 2d 3e 64 62 2c 20 6e 43 6f 6c 2c 20 30 29 3b  e->db, nCol, 0);
23a80 0a 20 20 7d 0a 20 20 69 66 28 20 70 4b 65 79 20  .  }.  if( pKey 
23a90 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
23aa0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
23ab0 72 69 74 65 61 62 6c 65 28 70 4b 65 79 29 20 29  riteable(pKey) )
23ac0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
23ad0 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
23ae0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
23af0 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Coll = pIdx->azC
23b00 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 70 4b  oll[i];.      pK
23b10 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 7a  ey->aColl[i] = z
23b20 43 6f 6c 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72  Coll==sqlite3Str
23b30 42 49 4e 41 52 59 20 3f 20 30 20 3a 0a 20 20 20  BINARY ? 0 :.   
23b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b50 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61       sqlite3Loca
23b60 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
23b70 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , zColl);.      
23b80 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pKey->aSortOrder
23b90 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72  [i] = pIdx->aSor
23ba0 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d  tOrder[i];.    }
23bb0 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
23bc0 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73  >nErr ){.      s
23bd0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
23be0 65 66 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  ef(pKey);.      
23bf0 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pKey = 0;.    }.
23c00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65    }.  return pKe
23c10 79 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  y;.}..#ifndef SQ
23c20 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a  LITE_OMIT_CTE./*
23c30 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
23c40 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63  e is invoked onc
23c50 65 20 70 65 72 20 43 54 45 20 62 79 20 74 68 65  e per CTE by the
23c60 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 70 61   parser while pa
23c70 72 73 69 6e 67 20 61 20 0a 2a 2a 20 57 49 54 48  rsing a .** WITH
23c80 20 63 6c 61 75 73 65 2e 20 0a 2a 2f 0a 57 69 74   clause. .*/.Wit
23c90 68 20 2a 73 71 6c 69 74 65 33 57 69 74 68 41 64  h *sqlite3WithAd
23ca0 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  d(.  Parse *pPar
23cb0 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
23cc0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
23cd0 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68  */.  With *pWith
23ce0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
23cf0 45 78 69 73 74 69 6e 67 20 57 49 54 48 20 63 6c  Existing WITH cl
23d00 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  ause, or NULL */
23d10 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  .  Token *pName,
23d20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
23d30 6d 65 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e  me of the common
23d40 2d 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72  -table */.  Expr
23d50 4c 69 73 74 20 2a 70 41 72 67 6c 69 73 74 2c 20  List *pArglist, 
23d60 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20      /* Optional 
23d70 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6c 69 73 74  column name list
23d80 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a   for the table *
23d90 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 51 75 65  /.  Select *pQue
23da0 72 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51  ry          /* Q
23db0 75 65 72 79 20 75 73 65 64 20 74 6f 20 69 6e 69  uery used to ini
23dc0 74 69 61 6c 69 7a 65 20 74 68 65 20 74 61 62 6c  tialize the tabl
23dd0 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  e */.){.  sqlite
23de0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
23df0 64 62 3b 0a 20 20 57 69 74 68 20 2a 70 4e 65 77  db;.  With *pNew
23e00 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  ;.  char *zName;
23e10 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
23e20 74 20 74 68 65 20 43 54 45 20 6e 61 6d 65 20 69  t the CTE name i
23e30 73 20 75 6e 69 71 75 65 20 77 69 74 68 69 6e 20  s unique within 
23e40 74 68 69 73 20 57 49 54 48 20 63 6c 61 75 73 65  this WITH clause
23e50 2e 20 49 66 0a 20 20 2a 2a 20 6e 6f 74 2c 20 73  . If.  ** not, s
23e60 74 6f 72 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  tore an error in
23e70 20 74 68 65 20 50 61 72 73 65 20 73 74 72 75 63   the Parse struc
23e80 74 75 72 65 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65  ture. */.  zName
23e90 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
23ea0 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
23eb0 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  db, pName);.  if
23ec0 28 20 7a 4e 61 6d 65 20 26 26 20 70 57 69 74 68  ( zName && pWith
23ed0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
23ee0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57     for(i=0; i<pW
23ef0 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b  ith->nCte; i++){
23f00 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
23f10 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c  e3StrICmp(zName,
23f20 20 70 57 69 74 68 2d 3e 61 5b 69 5d 2e 7a 4e 61   pWith->a[i].zNa
23f30 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
23f40 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
23f50 67 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69  g(pParse, "dupli
23f60 63 61 74 65 20 57 49 54 48 20 74 61 62 6c 65 20  cate WITH table 
23f70 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65  name: %s", zName
23f80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
23f90 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 57 69 74  .  }..  if( pWit
23fa0 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79  h ){.    int nBy
23fb0 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 57 69  te = sizeof(*pWi
23fc0 74 68 29 20 2b 20 28 73 69 7a 65 6f 66 28 70 57  th) + (sizeof(pW
23fd0 69 74 68 2d 3e 61 5b 31 5d 29 20 2a 20 70 57 69  ith->a[1]) * pWi
23fe0 74 68 2d 3e 6e 43 74 65 29 3b 0a 20 20 20 20 70  th->nCte);.    p
23ff0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
24000 65 61 6c 6c 6f 63 28 64 62 2c 20 70 57 69 74 68  ealloc(db, pWith
24010 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73  , nByte);.  }els
24020 65 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  e{.    pNew = sq
24030 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
24040 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 57  o(db, sizeof(*pW
24050 69 74 68 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ith));.  }.  ass
24060 65 72 74 28 20 28 70 4e 65 77 21 3d 30 20 26 26  ert( (pNew!=0 &&
24070 20 7a 4e 61 6d 65 21 3d 30 29 20 7c 7c 20 64 62   zName!=0) || db
24080 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
24090 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  ;..  if( db->mal
240a0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
240b0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
240c0 44 65 6c 65 74 65 28 64 62 2c 20 70 41 72 67 6c  Delete(db, pArgl
240d0 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
240e0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
240f0 2c 20 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73  , pQuery);.    s
24100 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
24110 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65   zName);.    pNe
24120 77 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d 65 6c  w = pWith;.  }el
24130 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b  se{.    pNew->a[
24140 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c  pNew->nCte].pSel
24150 65 63 74 20 3d 20 70 51 75 65 72 79 3b 0a 20 20  ect = pQuery;.  
24160 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
24170 6e 43 74 65 5d 2e 70 43 6f 6c 73 20 3d 20 70 41  nCte].pCols = pA
24180 72 67 6c 69 73 74 3b 0a 20 20 20 20 70 4e 65 77  rglist;.    pNew
24190 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e  ->a[pNew->nCte].
241a0 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zName = zName;. 
241b0 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
241c0 3e 6e 43 74 65 5d 2e 7a 43 74 65 45 72 72 20 3d  >nCte].zCteErr =
241d0 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 43   0;.    pNew->nC
241e0 74 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  te++;.  }..  ret
241f0 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
24200 2a 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 74  ** Free the cont
24210 65 6e 74 73 20 6f 66 20 74 68 65 20 57 69 74 68  ents of the With
24220 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
24230 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
24240 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ument..*/.void s
24250 71 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74 65  qlite3WithDelete
24260 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69  (sqlite3 *db, Wi
24270 74 68 20 2a 70 57 69 74 68 29 7b 0a 20 20 69 66  th *pWith){.  if
24280 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69  ( pWith ){.    i
24290 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
242a0 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65  0; i<pWith->nCte
242b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
242c0 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 20 3d  ruct Cte *pCte =
242d0 20 26 70 57 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20   &pWith->a[i];. 
242e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
242f0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
24300 43 74 65 2d 3e 70 43 6f 6c 73 29 3b 0a 20 20 20  Cte->pCols);.   
24310 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
24320 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d  Delete(db, pCte-
24330 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
24340 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
24350 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b  b, pCte->zName);
24360 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
24370 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 69  e3DbFree(db, pWi
24380 74 68 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  th);.  }.}.#endi
24390 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
243a0 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 29 20 2a  LITE_OMIT_CTE) *
243b0 2f 0a                                            /.