/ Hex Artifact Content
Login

Artifact 5b857c4302cb4b333beabfca7f4e79aa9705984cc77a3f09d2bd9cea4a58f855:


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 6d 44 62 46 6c 61 67   }.  db->mDbFlag
3e40: 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65  s |= DBFLAG_Sche
3e50: 6d 61 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a  maChange;.}../*.
3e60: 2a 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20  ** Look through 
3e70: 74 68 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e  the list of open
3e80: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
3e90: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e 64  in db->aDb[] and
3ea0: 20 69 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65 20   if.** any have 
3eb0: 62 65 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65 6d  been closed, rem
3ec0: 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68  ove them from th
3ed0: 65 20 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f 63  e list.  Realloc
3ee0: 61 74 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 61  ate the.** db->a
3ef0: 44 62 5b 5d 20 73 74 72 75 63 74 75 72 65 20 74  Db[] structure t
3f00: 6f 20 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65  o a smaller size
3f10: 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a  , if possible..*
3f20: 2a 0a 2a 2a 20 45 6e 74 72 79 20 30 20 28 74 68  *.** Entry 0 (th
3f30: 65 20 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73  e "main" databas
3f40: 65 29 20 61 6e 64 20 65 6e 74 72 79 20 31 20 28  e) and entry 1 (
3f50: 74 68 65 20 22 74 65 6d 70 22 20 64 61 74 61 62  the "temp" datab
3f60: 61 73 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76 65  ase).** are neve
3f70: 72 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72  r candidates for
3f80: 20 62 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65 64   being collapsed
3f90: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3fa0: 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73  3CollapseDatabas
3fb0: 65 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  eArray(sqlite3 *
3fc0: 64 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  db){.  int i, j;
3fd0: 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c  .  for(i=j=2; i<
3fe0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
3ff0: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
4000: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
4010: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
4020: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t==0 ){.      sq
4030: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4040: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 3b 0a  pDb->zDbSName);.
4050: 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e        pDb->zDbSN
4060: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  ame = 0;.      c
4070: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
4080: 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20     if( j<i ){.  
4090: 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d      db->aDb[j] =
40a0: 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20   db->aDb[i];.   
40b0: 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a   }.    j++;.  }.
40c0: 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20    db->nDb = j;. 
40d0: 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20   if( db->nDb<=2 
40e0: 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e  && db->aDb!=db->
40f0: 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20  aDbStatic ){.   
4100: 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53   memcpy(db->aDbS
4110: 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20  tatic, db->aDb, 
4120: 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62  2*sizeof(db->aDb
4130: 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  [0]));.    sqlit
4140: 65 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d  e3DbFree(db, db-
4150: 3e 61 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61  >aDb);.    db->a
4160: 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74  Db = db->aDbStat
4170: 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ic;.  }.}../*.**
4180: 20 52 65 73 65 74 20 74 68 65 20 73 63 68 65 6d   Reset the schem
4190: 61 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  a for the databa
41a0: 73 65 20 61 74 20 69 6e 64 65 78 20 69 44 62 2e  se at index iDb.
41b0: 20 20 41 6c 73 6f 20 72 65 73 65 74 20 74 68 65    Also reset the
41c0: 0a 2a 2a 20 54 45 4d 50 20 73 63 68 65 6d 61 2e  .** TEMP schema.
41d0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
41e0: 52 65 73 65 74 4f 6e 65 53 63 68 65 6d 61 28 73  ResetOneSchema(s
41f0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
4200: 69 44 62 29 7b 0a 20 20 2f 2a 20 49 66 20 61 6e  iDb){.  /* If an
4210: 79 20 64 61 74 61 62 61 73 65 20 6f 74 68 65 72  y database other
4220: 20 74 68 61 6e 20 54 45 4d 50 20 69 73 20 72 65   than TEMP is re
4230: 73 65 74 2c 20 74 68 65 6e 20 61 6c 73 6f 20 72  set, then also r
4240: 65 73 65 74 20 54 45 4d 50 0a 20 20 2a 2a 20 73  eset TEMP.  ** s
4250: 69 6e 63 65 20 54 45 4d 50 20 6d 69 67 68 74 20  ince TEMP might 
4260: 62 65 20 68 6f 6c 64 69 6e 67 20 74 72 69 67 67  be holding trigg
4270: 65 72 73 20 74 68 61 74 20 72 65 66 65 72 65 6e  ers that referen
4280: 63 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ce tables in the
4290: 0a 20 20 2a 2a 20 6f 74 68 65 72 20 64 61 74 61  .  ** other data
42a0: 62 61 73 65 2e 20 20 2a 2f 0a 20 20 44 62 20 2a  base.  */.  Db *
42b0: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 31  pDb = &db->aDb[1
42c0: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  ];.  assert( pDb
42d0: 2d 3e 70 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a  ->pSchema!=0 );.
42e0: 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43    sqlite3SchemaC
42f0: 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d  lear(pDb->pSchem
4300: 61 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  a);..  assert( i
4310: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
4320: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
4330: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
4340: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
4350: 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
4360: 69 44 62 5d 2e 70 53 63 68 65 6d 61 21 3d 30 20  iDb].pSchema!=0 
4370: 29 3b 0a 0a 20 20 69 66 28 20 69 44 62 21 3d 31  );..  if( iDb!=1
4380: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
4390: 63 68 65 6d 61 55 6e 75 73 65 28 64 62 2c 20 69  chemaUnuse(db, i
43a0: 44 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Db);.  }.  retur
43b0: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73  n;.}../*.** Eras
43c0: 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66  e all schema inf
43d0: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 6c  ormation from al
43e0: 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  l attached datab
43f0: 61 73 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 0a  ases (including.
4400: 2a 2a 20 22 6d 61 69 6e 22 20 61 6e 64 20 22 74  ** "main" and "t
4410: 65 6d 70 22 29 20 66 6f 72 20 61 20 73 69 6e 67  emp") for a sing
4420: 6c 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  le database conn
4430: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
4440: 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53  sqlite3ResetAllS
4450: 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69  chemasOfConnecti
4460: 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  on(sqlite3 *db){
4470: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
4480: 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c  te3BtreeEnterAll
4490: 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  (db);.  for(i=0;
44a0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 20 3d 20   i<db->nDb; i = 
44b0: 28 69 3f 69 2b 31 3a 32 29 29 7b 0a 20 20 20 20  (i?i+1:2)){.    
44c0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 55 6e 75  sqlite3SchemaUnu
44d0: 73 65 28 64 62 2c 20 69 29 3b 0a 20 20 7d 0a 20  se(db, i);.  }. 
44e0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c   sqlite3SchemaCl
44f0: 65 61 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ear(db->aDb[1].p
4500: 53 63 68 65 6d 61 29 3b 0a 0a 20 20 64 62 2d 3e  Schema);..  db->
4510: 6d 44 62 46 6c 61 67 73 20 26 3d 20 7e 44 42 46  mDbFlags &= ~DBF
4520: 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65  LAG_SchemaChange
4530: 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55  ;.  sqlite3VtabU
4540: 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20  nlockList(db);. 
4550: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
4560: 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c  veAll(db);.  sql
4570: 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61  ite3CollapseData
4580: 62 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a 7d  baseArray(db);.}
4590: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
45a0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
45b0: 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63  hen a commit occ
45c0: 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  urs..*/.void sql
45d0: 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e  ite3CommitIntern
45e0: 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  alChanges(sqlite
45f0: 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 6d 44  3 *db){.  db->mD
4600: 62 46 6c 61 67 73 20 26 3d 20 7e 44 42 46 4c 41  bFlags &= ~DBFLA
4610: 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a  G_SchemaChange;.
4620: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
4630: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64  memory allocated
4640: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
4650: 6e 61 6d 65 73 20 6f 66 20 61 20 74 61 62 6c 65  names of a table
4660: 20 6f 72 20 76 69 65 77 20 28 74 68 65 0a 2a 2a   or view (the.**
4670: 20 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20 61 72   Table.aCol[] ar
4680: 72 61 79 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ray)..*/.void sq
4690: 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d  lite3DeleteColum
46a0: 6e 4e 61 6d 65 73 28 73 71 6c 69 74 65 33 20 2a  nNames(sqlite3 *
46b0: 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  db, Table *pTabl
46c0: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43  e){.  int i;.  C
46d0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61  olumn *pCol;.  a
46e0: 73 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30  ssert( pTable!=0
46f0: 20 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20   );.  if( (pCol 
4700: 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21  = pTable->aCol)!
4710: 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  =0 ){.    for(i=
4720: 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f  0; i<pTable->nCo
4730: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
4740: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
4750: 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a  Free(db, pCol->z
4760: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Name);.      sql
4770: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
4780: 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b  b, pCol->pDflt);
4790: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
47a0: 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a  Free(db, pCol->z
47b0: 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Coll);.    }.   
47c0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
47d0: 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29  b, pTable->aCol)
47e0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
47f0: 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79  emove the memory
4800: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
4810: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
4820: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61   the given.** Ta
4830: 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73  ble.  No changes
4840: 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73   are made to dis
4850: 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  k by this routin
4860: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
4870: 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74  utine just delet
4880: 65 73 20 74 68 65 20 64 61 74 61 20 73 74 72 75  es the data stru
4890: 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20  cture.  It does 
48a0: 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68  not unlink.** th
48b0: 65 20 74 61 62 6c 65 20 64 61 74 61 20 73 74 72  e table data str
48c0: 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
48d0: 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74  hash table.  But
48e0: 20 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79   it does destroy
48f0: 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  .** memory struc
4900: 74 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64  tures of the ind
4910: 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e  ices and foreign
4920: 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64   keys associated
4930: 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61   with .** the ta
4940: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ble..**.** The d
4950: 62 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f  b parameter is o
4960: 70 74 69 6f 6e 61 6c 2e 20 20 49 74 20 69 73 20  ptional.  It is 
4970: 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 54 61  needed if the Ta
4980: 62 6c 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63  ble object .** c
4990: 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61 73 69 64  ontains lookasid
49a0: 65 20 6d 65 6d 6f 72 79 2e 20 20 28 54 61 62 6c  e memory.  (Tabl
49b0: 65 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65  e objects in the
49c0: 20 73 63 68 65 6d 61 20 64 6f 20 6e 6f 74 20 75   schema do not u
49d0: 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 20  se.** lookaside 
49e0: 6d 65 6d 6f 72 79 2c 20 62 75 74 20 73 6f 6d 65  memory, but some
49f0: 20 65 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65   ephemeral Table
4a00: 20 6f 62 6a 65 63 74 73 20 64 6f 2e 29 20 20 4f   objects do.)  O
4a10: 72 20 74 68 65 0a 2a 2a 20 64 62 20 70 61 72 61  r the.** db para
4a20: 6d 65 74 65 72 20 63 61 6e 20 62 65 20 75 73 65  meter can be use
4a30: 64 20 77 69 74 68 20 64 62 2d 3e 70 6e 42 79 74  d with db->pnByt
4a40: 65 73 46 72 65 65 64 20 74 6f 20 6d 65 61 73 75  esFreed to measu
4a50: 72 65 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a  re the memory.**
4a60: 20 75 73 65 64 20 62 79 20 74 68 65 20 54 61 62   used by the Tab
4a70: 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  le object..*/.st
4a80: 61 74 69 63 20 76 6f 69 64 20 53 51 4c 49 54 45  atic void SQLITE
4a90: 5f 4e 4f 49 4e 4c 49 4e 45 20 64 65 6c 65 74 65  _NOINLINE delete
4aa0: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
4ab0: 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  b, Table *pTable
4ac0: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
4ad0: 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 54 45  ex, *pNext;.  TE
4ae0: 53 54 4f 4e 4c 59 28 20 69 6e 74 20 6e 4c 6f 6f  STONLY( int nLoo
4af0: 6b 61 73 69 64 65 3b 20 29 20 2f 2a 20 55 73 65  kaside; ) /* Use
4b00: 64 20 74 6f 20 76 65 72 69 66 79 20 6c 6f 6f 6b  d to verify look
4b10: 61 73 69 64 65 20 6e 6f 74 20 75 73 65 64 20 66  aside not used f
4b20: 6f 72 20 73 63 68 65 6d 61 20 2a 2f 0a 0a 20 20  or schema */..  
4b30: 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75  /* Record the nu
4b40: 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64  mber of outstand
4b50: 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20 61 6c  ing lookaside al
4b60: 6c 6f 63 61 74 69 6f 6e 73 20 69 6e 20 73 63 68  locations in sch
4b70: 65 6d 61 20 54 61 62 6c 65 73 0a 20 20 2a 2a 20  ema Tables.  ** 
4b80: 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61  prior to doing a
4b90: 6e 79 20 66 72 65 65 28 29 20 6f 70 65 72 61 74  ny free() operat
4ba0: 69 6f 6e 73 2e 20 20 53 69 6e 63 65 20 73 63 68  ions.  Since sch
4bb0: 65 6d 61 20 54 61 62 6c 65 73 20 64 6f 20 6e 6f  ema Tables do no
4bc0: 74 20 75 73 65 0a 20 20 2a 2a 20 6c 6f 6f 6b 61  t use.  ** looka
4bd0: 73 69 64 65 2c 20 74 68 69 73 20 6e 75 6d 62 65  side, this numbe
4be0: 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63 68 61  r should not cha
4bf0: 6e 67 65 2e 20 2a 2f 0a 20 20 54 45 53 54 4f 4e  nge. */.  TESTON
4c00: 4c 59 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d  LY( nLookaside =
4c10: 20 28 64 62 20 26 26 20 28 70 54 61 62 6c 65 2d   (db && (pTable-
4c20: 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
4c30: 70 68 65 6d 65 72 61 6c 29 3d 3d 30 29 20 3f 0a  phemeral)==0) ?.
4c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c50: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f           db->loo
4c60: 6b 61 73 69 64 65 2e 6e 4f 75 74 20 3a 20 30 20  kaside.nOut : 0 
4c70: 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  );..  /* Delete 
4c80: 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f  all indices asso
4c90: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
4ca0: 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72   table. */.  for
4cb0: 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65  (pIndex = pTable
4cc0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ->pIndex; pIndex
4cd0: 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b  ; pIndex=pNext){
4ce0: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e  .    pNext = pIn
4cf0: 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  dex->pNext;.    
4d00: 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e  assert( pIndex->
4d10: 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65 2d  pSchema==pTable-
4d20: 3e 70 53 63 68 65 6d 61 0a 20 20 20 20 20 20 20  >pSchema.       
4d30: 20 20 7c 7c 20 28 49 73 56 69 72 74 75 61 6c 28    || (IsVirtual(
4d40: 70 54 61 62 6c 65 29 20 26 26 20 70 49 6e 64 65  pTable) && pInde
4d50: 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49  x->idxType!=SQLI
4d60: 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45  TE_IDXTYPE_APPDE
4d70: 46 29 20 29 3b 0a 20 20 20 20 69 66 28 20 28 64  F) );.    if( (d
4d80: 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 6e 42 79  b==0 || db->pnBy
4d90: 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26 20  tesFreed==0) && 
4da0: 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c  !IsVirtual(pTabl
4db0: 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  e) ){.      char
4dc0: 20 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e 64 65 78   *zName = pIndex
4dd0: 2d 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20 20 20 20  ->zName; .      
4de0: 54 45 53 54 4f 4e 4c 59 20 28 20 49 6e 64 65 78  TESTONLY ( Index
4df0: 20 2a 70 4f 6c 64 20 3d 20 29 20 73 71 6c 69 74   *pOld = ) sqlit
4e00: 65 33 48 61 73 68 49 6e 73 65 72 74 28 0a 20 20  e3HashInsert(.  
4e10: 20 20 20 20 20 20 20 26 70 49 6e 64 65 78 2d 3e         &pIndex->
4e20: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
4e30: 2c 20 7a 4e 61 6d 65 2c 20 30 0a 20 20 20 20 20  , zName, 0.     
4e40: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
4e50: 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ( db==0 || sqlit
4e60: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
4e70: 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d  d(db, 0, pIndex-
4e80: 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20  >pSchema) );.   
4e90: 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d     assert( pOld=
4ea0: 3d 70 49 6e 64 65 78 20 7c 7c 20 70 4f 6c 64 3d  =pIndex || pOld=
4eb0: 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =0 );.    }.    
4ec0: 66 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49  freeIndex(db, pI
4ed0: 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ndex);.  }..  /*
4ee0: 20 44 65 6c 65 74 65 20 61 6e 79 20 66 6f 72 65   Delete any fore
4ef0: 69 67 6e 20 6b 65 79 73 20 61 74 74 61 63 68 65  ign keys attache
4f00: 64 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 2e  d to this table.
4f10: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46 6b 44   */.  sqlite3FkD
4f20: 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65  elete(db, pTable
4f30: 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  );..  /* Delete 
4f40: 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
4f50: 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f  ure itself..  */
4f60: 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  .  sqlite3Delete
4f70: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20  ColumnNames(db, 
4f80: 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74  pTable);.  sqlit
4f90: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
4fa0: 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73  ble->zName);.  s
4fb0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4fc0: 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66   pTable->zColAff
4fd0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
4fe0: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61  ctDelete(db, pTa
4ff0: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  ble->pSelect);. 
5000: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
5010: 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c  Delete(db, pTabl
5020: 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 69 66 6e  e->pCheck);.#ifn
5030: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5040: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73  VIRTUALTABLE.  s
5050: 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61 72 28  qlite3VtabClear(
5060: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 23 65 6e  db, pTable);.#en
5070: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44 62 46  dif.  sqlite3DbF
5080: 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  ree(db, pTable);
5090: 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68  ..  /* Verify th
50a0: 61 74 20 6e 6f 20 6c 6f 6f 6b 61 73 69 64 65 20  at no lookaside 
50b0: 6d 65 6d 6f 72 79 20 77 61 73 20 75 73 65 64 20  memory was used 
50c0: 62 79 20 73 63 68 65 6d 61 20 74 61 62 6c 65 73  by schema tables
50d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 4c   */.  assert( nL
50e0: 6f 6f 6b 61 73 69 64 65 3d 3d 30 20 7c 7c 20 6e  ookaside==0 || n
50f0: 4c 6f 6f 6b 61 73 69 64 65 3d 3d 64 62 2d 3e 6c  Lookaside==db->l
5100: 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20 29 3b  ookaside.nOut );
5110: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  .}.void sqlite3D
5120: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
5130: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
5140: 54 61 62 6c 65 29 7b 0a 20 20 2f 2a 20 44 6f 20  Table){.  /* Do 
5150: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 74  not delete the t
5160: 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 72  able until the r
5170: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72  eference count r
5180: 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a  eaches zero. */.
5190: 20 20 69 66 28 20 21 70 54 61 62 6c 65 20 29 20    if( !pTable ) 
51a0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 28  return;.  if( ((
51b0: 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74  !db || db->pnByt
51c0: 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26 20 28  esFreed==0) && (
51d0: 2d 2d 70 54 61 62 6c 65 2d 3e 6e 54 61 62 52 65  --pTable->nTabRe
51e0: 66 29 3e 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  f)>0) ) return;.
51f0: 20 20 64 65 6c 65 74 65 54 61 62 6c 65 28 64 62    deleteTable(db
5200: 2c 20 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f  , pTable);.}.../
5210: 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20  *.** Unlink the 
5220: 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d  given table from
5230: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 73   the hash tables
5240: 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65 20   and the delete 
5250: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72  the.** table str
5260: 75 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c 20  ucture with all 
5270: 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64 20  its indices and 
5280: 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f  foreign keys..*/
5290: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c  .void sqlite3Unl
52a0: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c  inkAndDeleteTabl
52b0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  e(sqlite3 *db, i
52c0: 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68  nt iDb, const ch
52d0: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20  ar *zTabName){. 
52e0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20   Table *p;.  Db 
52f0: 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pDb;..  assert(
5300: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
5310: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
5320: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  b<db->nDb );.  a
5330: 73 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20  ssert( zTabName 
5340: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
5350: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
5360: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
5370: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 7a  );.  testcase( z
5380: 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b  TabName[0]==0 );
5390: 20 20 2f 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68    /* Zero-length
53a0: 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 61 72 65   table names are
53b0: 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44   allowed */.  pD
53c0: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
53d0: 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  ];.  p = sqlite3
53e0: 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d  HashInsert(&pDb-
53f0: 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
5400: 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 30 29 3b  h, zTabName, 0);
5410: 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  .  sqlite3Delete
5420: 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20  Table(db, p);.  
5430: 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20  db->mDbFlags |= 
5440: 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61  DBFLAG_SchemaCha
5450: 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  nge;.}../*.** Gi
5460: 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74  ven a token, ret
5470: 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61  urn a string tha
5480: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68  t consists of th
5490: 65 20 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a  e text of that.*
54a0: 2a 20 74 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20  * token.  Space 
54b0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
54c0: 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69  rned string.** i
54d0: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
54e0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
54f0: 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
5500: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a   by the calling.
5510: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  ** function..**.
5520: 2a 2a 20 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e  ** Any quotation
5530: 20 6d 61 72 6b 73 20 28 65 78 3a 20 20 22 6e 61   marks (ex:  "na
5540: 6d 65 22 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61  me", 'name', [na
5550: 6d 65 5d 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20  me], or `name`) 
5560: 74 68 61 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64  that.** surround
5570: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
5580: 20 74 6f 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76   token are remov
5590: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73  ed..**.** Tokens
55a0: 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73 74 20   are often just 
55b0: 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74 68  pointers into th
55c0: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74  e original SQL t
55d0: 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72  ext and so.** ar
55e0: 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d 69  e not \000 termi
55f0: 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20 6e 6f  nated and are no
5600: 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20 20 54  t persistent.  T
5610: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
5620: 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74 65  ng.** is \000 te
5630: 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69 73 20  rminated and is 
5640: 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63  persistent..*/.c
5650: 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65  har *sqlite3Name
5660: 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65  FromToken(sqlite
5670: 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e  3 *db, Token *pN
5680: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
5690: 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65  ame;.  if( pName
56a0: 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
56b0: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
56c0: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d  (db, (char*)pNam
56d0: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
56e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75  .    sqlite3Dequ
56f0: 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65  ote(zName);.  }e
5700: 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  lse{.    zName =
5710: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
5720: 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zName;.}../*.**
5730: 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65   Open the sqlite
5740: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73 74  _master table st
5750: 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73 65  ored in database
5760: 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72 0a   number iDb for.
5770: 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65 20  ** writing. The 
5780: 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 20  table is opened 
5790: 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a  using cursor 0..
57a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f  */.void sqlite3O
57b0: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 50  penMasterTable(P
57c0: 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44 62  arse *p, int iDb
57d0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
57e0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 29  qlite3GetVdbe(p)
57f0: 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65  ;.  sqlite3Table
5800: 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53  Lock(p, iDb, MAS
5810: 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 4d 41 53  TER_ROOT, 1, MAS
5820: 54 45 52 5f 4e 41 4d 45 29 3b 0a 20 20 73 71 6c  TER_NAME);.  sql
5830: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
5840: 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  t(v, OP_OpenWrit
5850: 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  e, 0, MASTER_ROO
5860: 54 2c 20 69 44 62 2c 20 35 29 3b 0a 20 20 69 66  T, iDb, 5);.  if
5870: 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a  ( p->nTab==0 ){.
5880: 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b      p->nTab = 1;
5890: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  .  }.}../*.** Pa
58a0: 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f  rameter zName po
58b0: 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65  ints to a nul-te
58c0: 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72 20  rminated buffer 
58d0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e  containing the n
58e0: 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61  ame.** of a data
58f0: 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74  base ("main", "t
5900: 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65  emp" or the name
5910: 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20   of an attached 
5920: 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  db). This.** fun
5930: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
5940: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  e index of the n
5950: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
5960: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a   db->aDb[], or.*
5970: 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  * -1 if the name
5980: 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 66  d db cannot be f
5990: 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
59a0: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 73  ite3FindDbName(s
59b0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
59c0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
59d0: 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20    int i = -1;   
59e0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
59f0: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66  e number */.  if
5a00: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44  ( zName ){.    D
5a10: 62 20 2a 70 44 62 3b 0a 20 20 20 20 66 6f 72 28  b *pDb;.    for(
5a20: 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70  i=(db->nDb-1), p
5a30: 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20  Db=&db->aDb[i]; 
5a40: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d  i>=0; i--, pDb--
5a50: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ){.      if( 0==
5a60: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
5a70: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a  pDb->zDbSName, z
5a80: 4e 61 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a 20  Name) ) break;. 
5a90: 20 20 20 20 20 2f 2a 20 22 6d 61 69 6e 22 20 69       /* "main" i
5aa0: 73 20 61 6c 77 61 79 73 20 61 6e 20 61 63 63 65  s always an acce
5ab0: 70 74 61 62 6c 65 20 61 6c 69 61 73 20 66 6f 72  ptable alias for
5ac0: 20 74 68 65 20 70 72 69 6d 61 72 79 20 64 61 74   the primary dat
5ad0: 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 65  abase.      ** e
5ae0: 76 65 6e 20 69 66 20 69 74 20 68 61 73 20 62 65  ven if it has be
5af0: 65 6e 20 72 65 6e 61 6d 65 64 20 75 73 69 6e 67  en renamed using
5b00: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
5b10: 5f 4d 41 49 4e 44 42 4e 41 4d 45 2e 20 2a 2f 0a  _MAINDBNAME. */.
5b20: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20 26        if( i==0 &
5b30: 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  & 0==sqlite3_str
5b40: 69 63 6d 70 28 22 6d 61 69 6e 22 2c 20 7a 4e 61  icmp("main", zNa
5b50: 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  me) ) break;.   
5b60: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
5b70: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  i;.}../*.** The 
5b80: 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e  token *pName con
5b90: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f  tains the name o
5ba0: 66 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69  f a database (ei
5bb0: 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a  ther "main" or.*
5bc0: 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20  * "temp" or the 
5bd0: 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63  name of an attac
5be0: 68 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f  hed db). This ro
5bf0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
5c00: 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68  e.** index of th
5c10: 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  e named database
5c20: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f   in db->aDb[], o
5c30: 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  r -1 if the name
5c40: 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f  d db .** does no
5c50: 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20  t exist..*/.int 
5c60: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71  sqlite3FindDb(sq
5c70: 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e  lite3 *db, Token
5c80: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *pName){.  int 
5c90: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
5ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cb0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
5cc0: 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ber */.  char *z
5cd0: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
5ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5cf0: 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65 61   Name we are sea
5d00: 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20  rching for */.  
5d10: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
5d20: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
5d30: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73   pName);.  i = s
5d40: 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
5d50: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73  (db, zName);.  s
5d60: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5d70: 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
5d80: 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74  n i;.}../* The t
5d90: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20  able or view or 
5da0: 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20  trigger name is 
5db0: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72  passed to this r
5dc0: 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e  outine via token
5dd0: 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20  s.** pName1 and 
5de0: 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74  pName2. If the t
5df0: 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75  able name was fu
5e00: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66  lly qualified, f
5e10: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
5e20: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  * CREATE TABLE x
5e30: 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a  xx.yyy (...);.**
5e40: 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31   .** Then pName1
5e50: 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22   is set to "xxx"
5e60: 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79   and pName2 "yyy
5e70: 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ". On the other 
5e80: 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74  hand if.** the t
5e90: 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74  able name is not
5ea0: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
5eb0: 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52  , i.e.:.**.** CR
5ec0: 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e  EATE TABLE yyy(.
5ed0: 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ..);.**.** Then 
5ee0: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
5ef0: 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65   "yyy" and pName
5f00: 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54  2 is ""..**.** T
5f10: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
5f20: 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70   the *ppUnqual p
5f30: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20  ointer to point 
5f40: 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e  at the token (pN
5f50: 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65  ame1 or.** pName
5f60: 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74  2) that stores t
5f70: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74  he unqualified t
5f80: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20  able name.  The 
5f90: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
5fa0: 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69  database "xxx" i
5fb0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
5fc0: 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72  nt sqlite3TwoPar
5fd0: 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  tName(.  Parse *
5fe0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
5ff0: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
6000: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
6010: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
6020: 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20  pName1,      /* 
6030: 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65  The "xxx" in the
6040: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
6050: 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f  or "xxx" */.  To
6060: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
6070: 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69    /* The "yyy" i
6080: 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e  n the name "xxx.
6090: 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  yyy" */.  Token 
60a0: 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a  **pUnqual     /*
60b0: 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61   Write the unqua
60c0: 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61  lified object na
60d0: 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  me here */.){.  
60e0: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
6100: 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
6110: 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  the object */.  
6120: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
6130: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73  arse->db;..  ass
6140: 65 72 74 28 20 70 4e 61 6d 65 32 21 3d 30 20 29  ert( pName2!=0 )
6150: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e  ;.  if( pName2->
6160: 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64  n>0 ){.    if( d
6170: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 20 7b  b->init.busy ) {
6180: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
6190: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
61a0: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
61b0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
61c0: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a   -1;.    }.    *
61d0: 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32  pUnqual = pName2
61e0: 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
61f0: 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e  te3FindDb(db, pN
6200: 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69  ame1);.    if( i
6210: 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71  Db<0 ){.      sq
6220: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
6230: 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64  arse, "unknown d
6240: 61 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61  atabase %T", pNa
6250: 6d 65 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75  me1);.      retu
6260: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn -1;.    }.  }
6270: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
6280: 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d  ( db->init.iDb==
6290: 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75  0 || db->init.bu
62a0: 73 79 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  sy.             
62b0: 7c 7c 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73  || (db->mDbFlags
62c0: 20 26 20 44 42 46 4c 41 47 5f 56 61 63 75 75 6d   & DBFLAG_Vacuum
62d0: 29 21 3d 30 29 3b 0a 20 20 20 20 69 44 62 20 3d  )!=0);.    iDb =
62e0: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20   db->init.iDb;. 
62f0: 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e     *pUnqual = pN
6300: 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ame1;.  }.  retu
6310: 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn iDb;.}../*.**
6320: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
6330: 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69   used to check i
6340: 66 20 74 68 65 20 55 54 46 2d 38 20 73 74 72 69  f the UTF-8 stri
6350: 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65  ng zName is a le
6360: 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69  gal.** unqualifi
6370: 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65  ed name for a ne
6380: 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20  w schema object 
6390: 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76  (table, index, v
63a0: 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65  iew or.** trigge
63b0: 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72  r). All names ar
63c0: 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20 74  e legal except t
63d0: 68 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e 20  hose that begin 
63e0: 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67 0a  with the string.
63f0: 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69 6e  ** "sqlite_" (in
6400: 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72   upper, lower or
6410: 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54 68   mixed case). Th
6420: 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  is portion of th
6430: 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69  e namespace.** i
6440: 73 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69  s reserved for i
6450: 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a  nternal use..*/.
6460: 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b  int sqlite3Check
6470: 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65  ObjectName(Parse
6480: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
6490: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
64a0: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d  if( !pParse->db-
64b0: 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50  >init.busy && pP
64c0: 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20  arse->nested==0 
64d0: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70  .          && (p
64e0: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
64f0: 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53   & SQLITE_WriteS
6500: 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20  chema)==0.      
6510: 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65      && 0==sqlite
6520: 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c  3StrNICmp(zName,
6530: 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 20 29   "sqlite_", 7) )
6540: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
6550: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
6560: 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73 65 72  bject name reser
6570: 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  ved for internal
6580: 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65   use: %s", zName
6590: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
65a0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
65b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
65c0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
65d0: 75 72 6e 20 74 68 65 20 50 52 49 4d 41 52 59 20  urn the PRIMARY 
65e0: 4b 45 59 20 69 6e 64 65 78 20 6f 66 20 61 20 74  KEY index of a t
65f0: 61 62 6c 65 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73  able.*/.Index *s
6600: 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
6610: 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61  Index(Table *pTa
6620: 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 0a  b){.  Index *p;.
6630: 20 20 66 6f 72 28 70 3d 70 54 61 62 2d 3e 70 49    for(p=pTab->pI
6640: 6e 64 65 78 3b 20 70 20 26 26 20 21 49 73 50 72  ndex; p && !IsPr
6650: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 29  imaryKeyIndex(p)
6660: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a  ; p=p->pNext){}.
6670: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
6680: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
6690: 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  column of index 
66a0: 70 49 64 78 20 74 68 61 74 20 63 6f 72 72 65 73  pIdx that corres
66b0: 70 6f 6e 64 73 20 74 6f 20 74 61 62 6c 65 0a 2a  ponds to table.*
66c0: 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 20 20  * column iCol.  
66d0: 52 65 74 75 72 6e 20 2d 31 20 69 66 20 6e 6f 74  Return -1 if not
66e0: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 31 36 20 73   found..*/.i16 s
66f0: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
6700: 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64 78 2c  dex(Index *pIdx,
6710: 20 69 31 36 20 69 43 6f 6c 29 7b 0a 20 20 69 6e   i16 iCol){.  in
6720: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
6730: 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  i<pIdx->nColumn;
6740: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69   i++){.    if( i
6750: 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  Col==pIdx->aiCol
6760: 75 6d 6e 5b 69 5d 20 29 20 72 65 74 75 72 6e 20  umn[i] ) return 
6770: 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
6780: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  -1;.}../*.** Beg
6790: 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20  in constructing 
67a0: 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72  a new table repr
67b0: 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65  esentation in me
67c0: 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a  mory.  This is.*
67d0: 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 73  * the first of s
67e0: 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f  everal action ro
67f0: 75 74 69 6e 65 73 20 74 68 61 74 20 67 65 74 20  utines that get 
6800: 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e  called in respon
6810: 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54  se.** to a CREAT
6820: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
6830: 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61  t.  In particula
6840: 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  r, this routine 
6850: 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74  is called.** aft
6860: 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73  er seeing tokens
6870: 20 22 43 52 45 41 54 45 22 20 61 6e 64 20 22 54   "CREATE" and "T
6880: 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61  ABLE" and the ta
6890: 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 69 73  ble name. The is
68a0: 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20  Temp.** flag is 
68b0: 74 72 75 65 20 69 66 20 74 68 65 20 74 61 62 6c  true if the tabl
68c0: 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72  e should be stor
68d0: 65 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69  ed in the auxili
68e0: 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ary database.** 
68f0: 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
6900: 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
6910: 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
6920: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65   is normally the
6930: 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68   case.** when th
6940: 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d  e "TEMP" or "TEM
6950: 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20  PORARY" keyword 
6960: 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65  occurs in betwee
6970: 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20  n.** CREATE and 
6980: 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TABLE..**.** The
6990: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
69a0: 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  d is initialized
69b0: 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72   and put in pPar
69c0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a  se->pNewTable..*
69d0: 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65  * As more of the
69e0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
69f0: 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
6a00: 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63  d, additional ac
6a10: 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73  tion.** routines
6a20: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
6a30: 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f  to add more info
6a40: 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  rmation to this 
6a50: 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68  record..** At th
6a60: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45  e end of the CRE
6a70: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
6a80: 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33  ent, the sqlite3
6a90: 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69  EndTable() routi
6aa0: 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  ne.** is called 
6ab0: 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
6ac0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20  construction of 
6ad0: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65  the new table re
6ae0: 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  cord..*/.void sq
6af0: 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
6b00: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
6b10: 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f  ,   /* Parser co
6b20: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
6b30: 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46   *pName1,   /* F
6b40: 69 72 73 74 20 70 61 72 74 20 6f 66 20 74 68 65  irst part of the
6b50: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
6b60: 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20  le or view */.  
6b70: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
6b80: 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20   /* Second part 
6b90: 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  of the name of t
6ba0: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
6bb0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70   */.  int isTemp
6bc0: 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ,      /* True i
6bd0: 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50  f this is a TEMP
6be0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
6bf0: 69 73 56 69 65 77 2c 20 20 20 20 20 20 2f 2a 20  isView,      /* 
6c00: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
6c10: 61 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20  a VIEW */.  int 
6c20: 69 73 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20  isVirtual,   /* 
6c30: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
6c40: 61 20 56 49 52 54 55 41 4c 20 74 61 62 6c 65 20  a VIRTUAL table 
6c50: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20  */.  int noErr  
6c60: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
6c70: 69 6e 67 20 69 66 20 74 61 62 6c 65 20 61 6c 72  ing if table alr
6c80: 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29  eady exists */.)
6c90: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  {.  Table *pTabl
6ca0: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  e;.  char *zName
6cb0: 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d   = 0; /* The nam
6cc0: 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  e of the new tab
6cd0: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  le */.  sqlite3 
6ce0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
6cf0: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
6d00: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
6d10: 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62  /* Database numb
6d20: 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  er to create the
6d30: 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54   table in */.  T
6d40: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20  oken *pName;    
6d50: 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e  /* Unqualified n
6d60: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
6d70: 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20   to create */.. 
6d80: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
6d90: 73 79 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e  sy && db->init.n
6da0: 65 77 54 6e 75 6d 3d 3d 31 20 29 7b 0a 20 20 20  ewTnum==1 ){.   
6db0: 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
6dc0: 3a 20 20 50 61 72 73 69 6e 67 20 74 68 65 20 73  :  Parsing the s
6dd0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 6f 72 20  qlite_master or 
6de0: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
6df0: 65 72 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20  er schema */.   
6e00: 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e   iDb = db->init.
6e10: 69 44 62 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  iDb;.    zName =
6e20: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
6e30: 28 64 62 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  (db, SCHEMA_TABL
6e40: 45 28 69 44 62 29 29 3b 0a 20 20 20 20 70 4e 61  E(iDb));.    pNa
6e50: 6d 65 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d  me = pName1;.  }
6e60: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
6e70: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a   common case */.
6e80: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
6e90: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
6ea0: 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
6eb0: 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
6ec0: 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
6ed0: 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 21 4f  turn;.    if( !O
6ee0: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73  MIT_TEMPDB && is
6ef0: 54 65 6d 70 20 26 26 20 70 4e 61 6d 65 32 2d 3e  Temp && pName2->
6f00: 6e 3e 30 20 26 26 20 69 44 62 21 3d 31 20 29 7b  n>0 && iDb!=1 ){
6f10: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 63 72 65  .      /* If cre
6f20: 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74 61 62  ating a temp tab
6f30: 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61 79  le, the name may
6f40: 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69 65   not be qualifie
6f50: 64 2e 20 55 6e 6c 65 73 73 20 0a 20 20 20 20 20  d. Unless .     
6f60: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
6f70: 20 6e 61 6d 65 20 69 73 20 22 74 65 6d 70 22 20   name is "temp" 
6f80: 61 6e 79 77 61 79 2e 20 20 2a 2f 0a 20 20 20 20  anyway.  */.    
6f90: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
6fa0: 67 28 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f  g(pParse, "tempo
6fb0: 72 61 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20  rary table name 
6fc0: 6d 75 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66  must be unqualif
6fd0: 69 65 64 22 29 3b 0a 20 20 20 20 20 20 72 65 74  ied");.      ret
6fe0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  urn;.    }.    i
6ff0: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
7000: 26 26 20 69 73 54 65 6d 70 20 29 20 69 44 62 20  && isTemp ) iDb 
7010: 3d 20 31 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  = 1;.    zName =
7020: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
7030: 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29  Token(db, pName)
7040: 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  ;.  }.  pParse->
7050: 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e  sNameToken = *pN
7060: 61 6d 65 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ame;.  if( zName
7070: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
7080: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
7090: 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63  qlite3CheckObjec
70a0: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e  tName(pParse, zN
70b0: 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ame) ){.    goto
70c0: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
70d0: 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  or;.  }.  if( db
70e0: 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20  ->init.iDb==1 ) 
70f0: 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e  isTemp = 1;.#ifn
7100: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7110: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
7120: 61 73 73 65 72 74 28 20 69 73 54 65 6d 70 3d 3d  assert( isTemp==
7130: 30 20 7c 7c 20 69 73 54 65 6d 70 3d 3d 31 20 29  0 || isTemp==1 )
7140: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 56 69  ;.  assert( isVi
7150: 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69 65 77 3d  ew==0 || isView=
7160: 3d 31 20 29 3b 0a 20 20 7b 0a 20 20 20 20 73 74  =1 );.  {.    st
7170: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 43  atic const u8 aC
7180: 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ode[] = {.      
7190: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
71a0: 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 53 51 4c  ABLE,.       SQL
71b0: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
71c0: 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 53 51  TABLE,.       SQ
71d0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57  LITE_CREATE_VIEW
71e0: 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ,.       SQLITE_
71f0: 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57  CREATE_TEMP_VIEW
7200: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 68 61 72  .    };.    char
7210: 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
7220: 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20  iDb].zDbSName;. 
7230: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
7240: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
7250: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53  SQLITE_INSERT, S
7260: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65  CHEMA_TABLE(isTe
7270: 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  mp), 0, zDb) ){.
7280: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
7290: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
72a0: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 56    }.    if( !isV
72b0: 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74 65  irtual && sqlite
72c0: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
72d0: 65 2c 20 28 69 6e 74 29 61 43 6f 64 65 5b 69 73  e, (int)aCode[is
72e0: 54 65 6d 70 2b 32 2a 69 73 56 69 65 77 5d 2c 0a  Temp+2*isView],.
72f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7310: 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 30 2c         zName, 0,
7320: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
7330: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
7340: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  error;.    }.  }
7350: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61  .#endif..  /* Ma
7360: 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20  ke sure the new 
7370: 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20  table name does 
7380: 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68  not collide with
7390: 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a   an existing.  *
73a0: 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  * index or table
73b0: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 61 6d   name in the sam
73c0: 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 73 73  e database.  Iss
73d0: 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ue an error mess
73e0: 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74 20 64  age if.  ** it d
73f0: 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70 74 69  oes. The excepti
7400: 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73 74 61  on is if the sta
7410: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70 61 72  tement being par
7420: 73 65 64 20 77 61 73 20 70 61 73 73 65 64 0a 20  sed was passed. 
7430: 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74 65   ** to an sqlite
7440: 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29  3_declare_vtab()
7450: 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63   call. In that c
7460: 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c  ase only the col
7470: 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61  umn names.  ** a
7480: 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20 62 65  nd types will be
7490: 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72 65 20   used, so there 
74a0: 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65  is no need to te
74b0: 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61 63 65  st for namespace
74c0: 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73  .  ** collisions
74d0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e  ..  */.  if( !IN
74e0: 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b  _DECLARE_VTAB ){
74f0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d  .    char *zDb =
7500: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44   db->aDb[iDb].zD
7510: 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  bSName;.    if( 
7520: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
7530: 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
7540: 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  rse) ){.      go
7550: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7560: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
7570: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  pTable = sqlite3
7580: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
7590: 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69  ame, zDb);.    i
75a0: 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  f( pTable ){.   
75b0: 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b     if( !noErr ){
75c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
75d0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
75e0: 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61   "table %T alrea
75f0: 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d  dy exists", pNam
7600: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
7610: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7620: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
7630: 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
7640: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7650: 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
7660: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
7670: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
7680: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
7690: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ror;.    }.    i
76a0: 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  f( sqlite3FindIn
76b0: 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a  dex(db, zName, z
76c0: 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Db)!=0 ){.      
76d0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
76e0: 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69  pParse, "there i
76f0: 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64  s already an ind
7700: 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e  ex named %s", zN
7710: 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
7720: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
7730: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  or;.    }.  }.. 
7740: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
7750: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
7760: 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29  , sizeof(Table))
7770: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d  ;.  if( pTable==
7780: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
7790: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
77a0: 64 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  d );.    pParse-
77b0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
77c0: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 70 50 61  EM_BKPT;.    pPa
77d0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
77e0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
77f0: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  e_error;.  }.  p
7800: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a  Table->zName = z
7810: 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Name;.  pTable->
7820: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54  iPKey = -1;.  pT
7830: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20  able->pSchema = 
7840: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
7850: 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  hema;.  pTable->
7860: 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 23 69 66  nTabRef = 1;.#if
7870: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  def SQLITE_DEFAU
7880: 4c 54 5f 52 4f 57 45 53 54 0a 20 20 70 54 61 62  LT_ROWEST.  pTab
7890: 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  le->nRowLogEst =
78a0: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 53   sqlite3LogEst(S
78b0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 52 4f  QLITE_DEFAULT_RO
78c0: 57 45 53 54 29 3b 0a 23 65 6c 73 65 0a 20 20 70  WEST);.#else.  p
78d0: 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73  Table->nRowLogEs
78e0: 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28  t = 200; assert(
78f0: 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67   200==sqlite3Log
7900: 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a  Est(1048576) );.
7910: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
7920: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
7930: 6c 65 3d 3d 30 20 29 3b 0a 20 20 70 50 61 72 73  le==0 );.  pPars
7940: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70  e->pNewTable = p
7950: 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  Table;..  /* If 
7960: 74 68 69 73 20 69 73 20 74 68 65 20 6d 61 67 69  this is the magi
7970: 63 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  c sqlite_sequenc
7980: 65 20 74 61 62 6c 65 20 75 73 65 64 20 62 79 20  e table used by 
7990: 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20  autoincrement,. 
79a0: 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72 64 20   ** then record 
79b0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  a pointer to thi
79c0: 73 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d  s table in the m
79d0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72  ain database str
79e0: 75 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74  ucture.  ** so t
79f0: 68 61 74 20 49 4e 53 45 52 54 20 63 61 6e 20 66  hat INSERT can f
7a00: 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 65 61  ind the table ea
7a10: 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  sily..  */.#ifnd
7a20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
7a30: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69  UTOINCREMENT.  i
7a40: 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65 73 74  f( !pParse->nest
7a50: 65 64 20 26 26 20 73 74 72 63 6d 70 28 7a 4e 61  ed && strcmp(zNa
7a60: 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75  me, "sqlite_sequ
7a70: 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ence")==0 ){.   
7a80: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7a90: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
7aa0: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
7ab0: 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65     pTable->pSche
7ac0: 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d 20 70 54  ma->pSeqTab = pT
7ad0: 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  able;.  }.#endif
7ae0: 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
7af0: 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65  erating the code
7b00: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72   that will inser
7b10: 74 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f  t the table reco
7b20: 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65  rd into.  ** the
7b30: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
7b40: 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70  able.  Note in p
7b50: 61 72 74 69 63 75 6c 61 72 20 74 68 61 74 20 77  articular that w
7b60: 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a  e must go ahead.
7b70: 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74    ** and allocat
7b80: 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  e the record num
7b90: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
7ba0: 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65  e entry now.  Be
7bb0: 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52  fore any.  ** PR
7bc0: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
7bd0: 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65  QUE keywords are
7be0: 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20   parsed.  Those 
7bf0: 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61  keywords will ca
7c00: 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73  use.  ** indices
7c10: 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 61   to be created a
7c20: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72 65 63  nd the table rec
7c30: 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65  ord must come be
7c40: 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69  fore the .  ** i
7c50: 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20  ndices.  Hence, 
7c60: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
7c70: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
7c80: 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
7c90: 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f  d.  ** now..  */
7ca0: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
7cb0: 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20 73 71  .busy && (v = sq
7cc0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
7cd0: 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  rse))!=0 ){.    
7ce0: 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 20 20 69  int addr1;.    i
7cf0: 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20  nt fileFormat;. 
7d00: 20 20 20 69 6e 74 20 72 65 67 31 2c 20 72 65 67     int reg1, reg
7d10: 32 2c 20 72 65 67 33 3b 0a 20 20 20 20 2f 2a 20  2, reg3;.    /* 
7d20: 6e 75 6c 6c 52 6f 77 5b 5d 20 69 73 20 61 6e 20  nullRow[] is an 
7d30: 4f 50 5f 52 65 63 6f 72 64 20 65 6e 63 6f 64 69  OP_Record encodi
7d40: 6e 67 20 6f 66 20 61 20 72 6f 77 20 63 6f 6e 74  ng of a row cont
7d50: 61 69 6e 69 6e 67 20 35 20 4e 55 4c 4c 73 20 2a  aining 5 NULLs *
7d60: 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  /.    static con
7d70: 73 74 20 63 68 61 72 20 6e 75 6c 6c 52 6f 77 5b  st char nullRow[
7d80: 5d 20 3d 20 7b 20 36 2c 20 30 2c 20 30 2c 20 30  ] = { 6, 0, 0, 0
7d90: 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 73 71  , 0, 0 };.    sq
7da0: 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
7db0: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
7dc0: 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64   1, iDb);..#ifnd
7dd0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
7de0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
7df0: 69 66 28 20 69 73 56 69 72 74 75 61 6c 20 29 7b  if( isVirtual ){
7e00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7e10: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56  beAddOp0(v, OP_V
7e20: 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65  Begin);.    }.#e
7e30: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ndif..    /* If 
7e40: 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  the file format 
7e50: 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20  and encoding in 
7e60: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 76  the database hav
7e70: 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74 2c 20  e not been set, 
7e80: 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 6d  .    ** set them
7e90: 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   now..    */.   
7ea0: 20 72 65 67 31 20 3d 20 70 50 61 72 73 65 2d 3e   reg1 = pParse->
7eb0: 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61  regRowid = ++pPa
7ec0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
7ed0: 65 67 32 20 3d 20 70 50 61 72 73 65 2d 3e 72 65  eg2 = pParse->re
7ee0: 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72 73 65  gRoot = ++pParse
7ef0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 33  ->nMem;.    reg3
7f00: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
7f10: 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
7f20: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52  beAddOp3(v, OP_R
7f30: 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  eadCookie, iDb, 
7f40: 72 65 67 33 2c 20 42 54 52 45 45 5f 46 49 4c 45  reg3, BTREE_FILE
7f50: 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20 20 73 71  _FORMAT);.    sq
7f60: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
7f70: 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20  ee(v, iDb);.    
7f80: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
7f90: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
7fa0: 49 66 2c 20 72 65 67 33 29 3b 20 56 64 62 65 43  If, reg3); VdbeC
7fb0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
7fc0: 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64 62  fileFormat = (db
7fd0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
7fe0: 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 29 21  _LegacyFileFmt)!
7ff0: 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  =0 ?.           
8000: 20 20 20 20 20 20 20 31 20 3a 20 53 51 4c 49 54         1 : SQLIT
8010: 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41  E_MAX_FILE_FORMA
8020: 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  T;.    sqlite3Vd
8030: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
8040: 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42  etCookie, iDb, B
8050: 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54  TREE_FILE_FORMAT
8060: 2c 20 66 69 6c 65 46 6f 72 6d 61 74 29 3b 0a 20  , fileFormat);. 
8070: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8080: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f  dOp3(v, OP_SetCo
8090: 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45  okie, iDb, BTREE
80a0: 5f 54 45 58 54 5f 45 4e 43 4f 44 49 4e 47 2c 20  _TEXT_ENCODING, 
80b0: 45 4e 43 28 64 62 29 29 3b 0a 20 20 20 20 73 71  ENC(db));.    sq
80c0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
80d0: 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20  e(v, addr1);..  
80e0: 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63    /* This just c
80f0: 72 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68  reates a place-h
8100: 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20  older record in 
8110: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
8120: 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20  r table..    ** 
8130: 54 68 65 20 72 65 63 6f 72 64 20 63 72 65 61 74  The record creat
8140: 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  ed does not cont
8150: 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74  ain anything yet
8160: 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65  .  It will be re
8170: 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79  placed.    ** by
8180: 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20   the real entry 
8190: 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  in code generate
81a0: 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54  d at sqlite3EndT
81b0: 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  able()..    **. 
81c0: 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20     ** The rowid 
81d0: 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72  for the new entr
81e0: 79 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  y is left in reg
81f0: 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65  ister pParse->re
8200: 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54  gRowid..    ** T
8210: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
8220: 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ber of the new t
8230: 61 62 6c 65 20 69 73 20 6c 65 66 74 20 69 6e 20  able is left in 
8240: 72 65 67 20 70 50 61 72 73 65 2d 3e 72 65 67 52  reg pParse->regR
8250: 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  oot..    ** The 
8260: 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74 20 70  rowid and root p
8270: 61 67 65 20 6e 75 6d 62 65 72 20 76 61 6c 75 65  age number value
8280: 73 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20  s are needed by 
8290: 74 68 65 20 63 6f 64 65 20 74 68 61 74 0a 20 20  the code that.  
82a0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64 54    ** sqlite3EndT
82b0: 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72 61  able will genera
82c0: 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21  te..    */.#if !
82d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
82e0: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
82f0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
8300: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
8310: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 7c      if( isView |
8320: 7c 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20  | isVirtual ){. 
8330: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8340: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
8350: 65 67 65 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a  eger, 0, reg2);.
8360: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
8370: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 70 50 61  .    {.      pPa
8380: 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 20 3d  rse->addrCrTab =
8390: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
83a0: 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54  p2(v, OP_CreateT
83b0: 61 62 6c 65 2c 20 69 44 62 2c 20 72 65 67 32 29  able, iDb, reg2)
83c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
83d0: 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  te3OpenMasterTab
83e0: 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  le(pParse, iDb);
83f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8400: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
8410: 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b  Rowid, 0, reg1);
8420: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8430: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f  AddOp4(v, OP_Blo
8440: 62 2c 20 36 2c 20 72 65 67 33 2c 20 30 2c 20 6e  b, 6, reg3, 0, n
8450: 75 6c 6c 52 6f 77 2c 20 50 34 5f 53 54 41 54 49  ullRow, P4_STATI
8460: 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  C);.    sqlite3V
8470: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
8480: 49 6e 73 65 72 74 2c 20 30 2c 20 72 65 67 33 2c  Insert, 0, reg3,
8490: 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69   reg1);.    sqli
84a0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
84b0: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
84c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
84d0: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43  beAddOp0(v, OP_C
84e0: 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lose);.  }..  /*
84f0: 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72   Normal (non-err
8500: 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20  or) return. */. 
8510: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49   return;..  /* I
8520: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
8530: 73 2c 20 77 65 20 6a 75 6d 70 20 68 65 72 65 20  s, we jump here 
8540: 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  */.begin_table_e
8550: 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44  rror:.  sqlite3D
8560: 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
8570: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
8580: 2a 20 53 65 74 20 70 72 6f 70 65 72 74 69 65 73  * Set properties
8590: 20 6f 66 20 61 20 74 61 62 6c 65 20 63 6f 6c 75   of a table colu
85a0: 6d 6e 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  mn based on the 
85b0: 28 6d 61 67 69 63 61 6c 29 0a 2a 2a 20 6e 61 6d  (magical).** nam
85c0: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  e of the column.
85d0: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .*/.#if SQLITE_E
85e0: 4e 41 42 4c 45 5f 48 49 44 44 45 4e 5f 43 4f 4c  NABLE_HIDDEN_COL
85f0: 55 4d 4e 53 0a 76 6f 69 64 20 73 71 6c 69 74 65  UMNS.void sqlite
8600: 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65  3ColumnPropertie
8610: 73 46 72 6f 6d 4e 61 6d 65 28 54 61 62 6c 65 20  sFromName(Table 
8620: 2a 70 54 61 62 2c 20 43 6f 6c 75 6d 6e 20 2a 70  *pTab, Column *p
8630: 43 6f 6c 29 7b 0a 20 20 69 66 28 20 73 71 6c 69  Col){.  if( sqli
8640: 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 70 43 6f  te3_strnicmp(pCo
8650: 6c 2d 3e 7a 4e 61 6d 65 2c 20 22 5f 5f 68 69 64  l->zName, "__hid
8660: 64 65 6e 5f 5f 22 2c 20 31 30 29 3d 3d 30 20 29  den__", 10)==0 )
8670: 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46  {.    pCol->colF
8680: 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
8690: 48 49 44 44 45 4e 3b 0a 20 20 7d 65 6c 73 65 20  HIDDEN;.  }else 
86a0: 69 66 28 20 70 54 61 62 20 26 26 20 70 43 6f 6c  if( pTab && pCol
86b0: 21 3d 70 54 61 62 2d 3e 61 43 6f 6c 20 26 26 20  !=pTab->aCol && 
86c0: 28 70 43 6f 6c 5b 2d 31 5d 2e 63 6f 6c 46 6c 61  (pCol[-1].colFla
86d0: 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 48 49 44  gs & COLFLAG_HID
86e0: 44 45 4e 29 20 29 7b 0a 20 20 20 20 70 54 61 62  DEN) ){.    pTab
86f0: 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
8700: 5f 4f 4f 4f 48 69 64 64 65 6e 3b 0a 20 20 7d 0a  _OOOHidden;.  }.
8710: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
8720: 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d   Add a new colum
8730: 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  n to the table c
8740: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
8750: 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a  onstructed..**.*
8760: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
8770: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
8780: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f  once for each co
8790: 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e  lumn declaration
87a0: 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20  .** in a CREATE 
87b0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
87c0: 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61    sqlite3StartTa
87d0: 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65  ble() gets calle
87e0: 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65  d.** first to ge
87f0: 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20  t things going. 
8800: 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   Then this routi
8810: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
8820: 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e   each.** column.
8830: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8840: 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20  AddColumn(Parse 
8850: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
8860: 70 4e 61 6d 65 2c 20 54 6f 6b 65 6e 20 2a 70 54  pName, Token *pT
8870: 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ype){.  Table *p
8880: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
8890: 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 7a 54  r *z;.  char *zT
88a0: 79 70 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  ype;.  Column *p
88b0: 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Col;.  sqlite3 *
88c0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
88d0: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
88e0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
88f0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 20  0 ) return;.#if 
8900: 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
8910: 4e 0a 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b  N.  if( p->nCol+
8920: 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  1>db->aLimit[SQL
8930: 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
8940: 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
8950: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
8960: 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d   "too many colum
8970: 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e  ns on %s", p->zN
8980: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
8990: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7a  ;.  }.#endif.  z
89a0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
89b0: 6f 63 52 61 77 28 64 62 2c 20 70 4e 61 6d 65 2d  ocRaw(db, pName-
89c0: 3e 6e 20 2b 20 70 54 79 70 65 2d 3e 6e 20 2b 20  >n + pType->n + 
89d0: 32 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  2);.  if( z==0 )
89e0: 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 63 70   return;.  memcp
89f0: 79 28 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70  y(z, pName->z, p
8a00: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 4e  Name->n);.  z[pN
8a10: 61 6d 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73  ame->n] = 0;.  s
8a20: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29  qlite3Dequote(z)
8a30: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
8a40: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
8a50: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
8a60: 72 69 63 6d 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c  ricmp(z, p->aCol
8a70: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
8a80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
8a90: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8aa0: 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e  duplicate column
8ab0: 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a   name: %s", z);.
8ac0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
8ad0: 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
8ae0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
8af0: 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43    }.  if( (p->nC
8b00: 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a  ol & 0x7)==0 ){.
8b10: 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77      Column *aNew
8b20: 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c  ;.    aNew = sql
8b30: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
8b40: 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f  ,p->aCol,(p->nCo
8b50: 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  l+8)*sizeof(p->a
8b60: 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  Col[0]));.    if
8b70: 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( aNew==0 ){.   
8b80: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
8b90: 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72  (db, z);.      r
8ba0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
8bb0: 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b   p->aCol = aNew;
8bc0: 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70  .  }.  pCol = &p
8bd0: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b  ->aCol[p->nCol];
8be0: 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20  .  memset(pCol, 
8bf0: 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f  0, sizeof(p->aCo
8c00: 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e  l[0]));.  pCol->
8c10: 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 20 73 71 6c  zName = z;.  sql
8c20: 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72  ite3ColumnProper
8c30: 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28 70 2c 20  tiesFromName(p, 
8c40: 70 43 6f 6c 29 3b 0a 20 0a 20 20 69 66 28 20 70  pCol);. .  if( p
8c50: 54 79 70 65 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20  Type->n==0 ){.  
8c60: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
8c70: 20 6e 6f 20 74 79 70 65 20 73 70 65 63 69 66 69   no type specifi
8c80: 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65  ed, columns have
8c90: 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 66 66   the default aff
8ca0: 69 6e 69 74 79 0a 20 20 20 20 2a 2a 20 27 42 4c  inity.    ** 'BL
8cb0: 4f 42 27 2e 20 2a 2f 0a 20 20 20 20 70 43 6f 6c  OB'. */.    pCol
8cc0: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
8cd0: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20  ITE_AFF_BLOB;.  
8ce0: 20 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20    pCol->szEst = 
8cf0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
8d00: 7a 54 79 70 65 20 3d 20 7a 20 2b 20 73 71 6c 69  zType = z + sqli
8d10: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 2b  te3Strlen30(z) +
8d20: 20 31 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a   1;.    memcpy(z
8d30: 54 79 70 65 2c 20 70 54 79 70 65 2d 3e 7a 2c 20  Type, pType->z, 
8d40: 70 54 79 70 65 2d 3e 6e 29 3b 0a 20 20 20 20 7a  pType->n);.    z
8d50: 54 79 70 65 5b 70 54 79 70 65 2d 3e 6e 5d 20 3d  Type[pType->n] =
8d60: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   0;.    sqlite3D
8d70: 65 71 75 6f 74 65 28 7a 54 79 70 65 29 3b 0a 20  equote(zType);. 
8d80: 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74     pCol->affinit
8d90: 79 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e  y = sqlite3Affin
8da0: 69 74 79 54 79 70 65 28 7a 54 79 70 65 2c 20 26  ityType(zType, &
8db0: 70 43 6f 6c 2d 3e 73 7a 45 73 74 29 3b 0a 20 20  pCol->szEst);.  
8dc0: 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73    pCol->colFlags
8dd0: 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41 53 54   |= COLFLAG_HAST
8de0: 59 50 45 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 43  YPE;.  }.  p->nC
8df0: 6f 6c 2b 2b 3b 0a 20 20 70 50 61 72 73 65 2d 3e  ol++;.  pParse->
8e00: 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e  constraintName.n
8e10: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
8e20: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
8e30: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
8e40: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
8e50: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
8e60: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
8e70: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
8e80: 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f   A "NOT NULL" co
8e90: 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20  nstraint has.** 
8ea0: 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63  been seen on a c
8eb0: 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75  olumn.  This rou
8ec0: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f  tine sets the no
8ed0: 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a  tNull flag on.**
8ee0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72   the column curr
8ef0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
8f00: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
8f10: 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e  d sqlite3AddNotN
8f20: 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73  ull(Parse *pPars
8f30: 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b  e, int onError){
8f40: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 70  .  Table *p;.  p
8f50: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
8f60: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
8f70: 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f   || NEVER(p->nCo
8f80: 6c 3c 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  l<1) ) return;. 
8f90: 20 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c   p->aCol[p->nCol
8fa0: 2d 31 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75  -1].notNull = (u
8fb0: 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 2d 3e  8)onError;.  p->
8fc0: 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48  tabFlags |= TF_H
8fd0: 61 73 4e 6f 74 4e 75 6c 6c 3b 0a 7d 0a 0a 2f 2a  asNotNull;.}../*
8fe0: 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c  .** Scan the col
8ff0: 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54  umn type name zT
9000: 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70  ype (length nTyp
9010: 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  e) and return th
9020: 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  e.** associated 
9030: 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a  affinity type..*
9040: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
9050: 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e  e does a case-in
9060: 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68  dependent search
9070: 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68   of zType for th
9080: 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73  e .** substrings
9090: 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
90a0: 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20  g table. If one 
90b0: 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67  of the substring
90c0: 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74  s is.** found, t
90d0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
90e0: 20 61 66 66 69 6e 69 74 79 20 69 73 20 72 65 74   affinity is ret
90f0: 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20  urned. If zType 
9100: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65  contains.** more
9110: 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65   than one of the
9120: 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74   substrings, ent
9130: 72 69 65 73 20 74 6f 77 61 72 64 20 74 68 65 20  ries toward the 
9140: 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74  top of .** the t
9150: 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69  able take priori
9160: 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  ty. For example,
9170: 20 69 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c   if zType is 'BL
9180: 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49  OBINT', .** SQLI
9190: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69  TE_AFF_INTEGER i
91a0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
91b0: 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20 20 20  * Substring     
91c0: 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d  | Affinity.** --
91d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
91f0: 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20 20 20  * 'INT'         
9200: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  | SQLITE_AFF_INT
9210: 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20  EGER.** 'CHAR'  
9220: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
9230: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42  FF_TEXT.** 'CLOB
9240: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
9250: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54  E_AFF_TEXT.** 'T
9260: 45 58 54 27 20 20 20 20 20 20 20 20 7c 20 53 51  EXT'        | SQ
9270: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
9280: 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c   'BLOB'        |
9290: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
92a0: 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20  .** 'REAL'      
92b0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52    | SQLITE_AFF_R
92c0: 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20  EAL.** 'FLOA'   
92d0: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
92e0: 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27  F_REAL.** 'DOUB'
92f0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
9300: 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20  _AFF_REAL.**.** 
9310: 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73  If none of the s
9320: 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65  ubstrings in the
9330: 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65   above table are
9340: 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54   found,.** SQLIT
9350: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73  E_AFF_NUMERIC is
9360: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68   returned..*/.ch
9370: 61 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69  ar sqlite3Affini
9380: 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61  tyType(const cha
9390: 72 20 2a 7a 49 6e 2c 20 75 38 20 2a 70 73 7a 45  r *zIn, u8 *pszE
93a0: 73 74 29 7b 0a 20 20 75 33 32 20 68 20 3d 20 30  st){.  u32 h = 0
93b0: 3b 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 53  ;.  char aff = S
93c0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
93d0: 43 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  C;.  const char 
93e0: 2a 7a 43 68 61 72 20 3d 20 30 3b 0a 0a 20 20 61  *zChar = 0;..  a
93f0: 73 73 65 72 74 28 20 7a 49 6e 21 3d 30 20 29 3b  ssert( zIn!=0 );
9400: 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 5b 30 5d  .  while( zIn[0]
9410: 20 29 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c 3c   ){.    h = (h<<
9420: 38 29 20 2b 20 73 71 6c 69 74 65 33 55 70 70 65  8) + sqlite3Uppe
9430: 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49 6e 29 26  rToLower[(*zIn)&
9440: 30 78 66 66 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b  0xff];.    zIn++
9450: 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28 27  ;.    if( h==(('
9460: 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36  c'<<24)+('h'<<16
9470: 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 20  )+('a'<<8)+'r') 
9480: 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){             /
9490: 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 20  * CHAR */.      
94a0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
94b0: 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 7a 43 68  _TEXT;.      zCh
94c0: 61 72 20 3d 20 7a 49 6e 3b 0a 20 20 20 20 7d 65  ar = zIn;.    }e
94d0: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63 27  lse if( h==(('c'
94e0: 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b  <<24)+('l'<<16)+
94f0: 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b  ('o'<<8)+'b') ){
9500: 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a         /* CLOB *
9510: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
9520: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
9530: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
9540: 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c  (('t'<<24)+('e'<
9550: 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74  <16)+('x'<<8)+'t
9560: 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 54  ') ){       /* T
9570: 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  EXT */.      aff
9580: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   = SQLITE_AFF_TE
9590: 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  XT;.    }else if
95a0: 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b  ( h==(('b'<<24)+
95b0: 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c  ('l'<<16)+('o'<<
95c0: 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20  8)+'b')         
95d0: 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20   /* BLOB */.    
95e0: 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c      && (aff==SQL
95f0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
9600: 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
9610: 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20 20  FF_REAL) ){.    
9620: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
9630: 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 69  FF_BLOB;.      i
9640: 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27 28 27 20 29  f( zIn[0]=='(' )
9650: 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 23 69   zChar = zIn;.#i
9660: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9670: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
9680: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
9690: 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28 27 65  ==(('r'<<24)+('e
96a0: 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b  '<<16)+('a'<<8)+
96b0: 27 6c 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a  'l')          /*
96c0: 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20   REAL */.       
96d0: 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   && aff==SQLITE_
96e0: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20  AFF_NUMERIC ){. 
96f0: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
9700: 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20  E_AFF_REAL;.    
9710: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
9720: 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  f'<<24)+('l'<<16
9730: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20  )+('o'<<8)+'a') 
9740: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41           /* FLOA
9750: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61   */.        && a
9760: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
9770: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
9780: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
9790: 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _REAL;.    }else
97a0: 20 69 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32   if( h==(('d'<<2
97b0: 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75  4)+('o'<<16)+('u
97c0: 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20  '<<8)+'b')      
97d0: 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20      /* DOUB */. 
97e0: 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53         && aff==S
97f0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
9800: 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  C ){.      aff =
9810: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
9820: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
9830: 73 65 20 69 66 28 20 28 68 26 30 78 30 30 46 46  se if( (h&0x00FF
9840: 46 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36  FFFF)==(('i'<<16
9850: 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20  )+('n'<<8)+'t') 
9860: 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a  ){    /* INT */.
9870: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
9880: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a  TE_AFF_INTEGER;.
9890: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
98a0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
98b0: 70 73 7a 45 73 74 20 69 73 20 6e 6f 74 20 4e 55  pszEst is not NU
98c0: 4c 4c 2c 20 73 74 6f 72 65 20 61 6e 20 65 73 74  LL, store an est
98d0: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 66 69 65  imate of the fie
98e0: 6c 64 20 73 69 7a 65 2e 20 20 54 68 65 0a 20 20  ld size.  The.  
98f0: 2a 2a 20 65 73 74 69 6d 61 74 65 20 69 73 20 73  ** estimate is s
9900: 63 61 6c 65 64 20 73 6f 20 74 68 61 74 20 74 68  caled so that th
9910: 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 69 6e 74  e size of an int
9920: 65 67 65 72 20 69 73 20 31 2e 20 20 2a 2f 0a 20  eger is 1.  */. 
9930: 20 69 66 28 20 70 73 7a 45 73 74 20 29 7b 0a 20   if( pszEst ){. 
9940: 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 31 3b 20     *pszEst = 1; 
9950: 20 20 2f 2a 20 64 65 66 61 75 6c 74 20 73 69 7a    /* default siz
9960: 65 20 69 73 20 61 70 70 72 6f 78 20 34 20 62 79  e is approx 4 by
9970: 74 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 61  tes */.    if( a
9980: 66 66 3c 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  ff<SQLITE_AFF_NU
9990: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 69  MERIC ){.      i
99a0: 66 28 20 7a 43 68 61 72 20 29 7b 0a 20 20 20 20  f( zChar ){.    
99b0: 20 20 20 20 77 68 69 6c 65 28 20 7a 43 68 61 72      while( zChar
99c0: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  [0] ){.         
99d0: 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 64 69   if( sqlite3Isdi
99e0: 67 69 74 28 7a 43 68 61 72 5b 30 5d 29 20 29 7b  git(zChar[0]) ){
99f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
9a00: 20 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   v = 0;.        
9a10: 20 20 20 20 73 71 6c 69 74 65 33 47 65 74 49 6e      sqlite3GetIn
9a20: 74 33 32 28 7a 43 68 61 72 2c 20 26 76 29 3b 0a  t32(zChar, &v);.
9a30: 20 20 20 20 20 20 20 20 20 20 20 20 76 20 3d 20              v = 
9a40: 76 2f 34 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  v/4 + 1;.       
9a50: 20 20 20 20 20 69 66 28 20 76 3e 32 35 35 20 29       if( v>255 )
9a60: 20 76 20 3d 20 32 35 35 3b 0a 20 20 20 20 20 20   v = 255;.      
9a70: 20 20 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20        *pszEst = 
9a80: 76 3b 20 2f 2a 20 42 4c 4f 42 28 6b 29 2c 20 56  v; /* BLOB(k), V
9a90: 41 52 43 48 41 52 28 6b 29 2c 20 43 48 41 52 28  ARCHAR(k), CHAR(
9aa0: 6b 29 20 2d 3e 20 72 3d 28 6b 2f 34 2b 31 29 20  k) -> r=(k/4+1) 
9ab0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  */.            b
9ac0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
9ad0: 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 43 68 61  }.          zCha
9ae0: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  r++;.        }. 
9af0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9b00: 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 35 3b      *pszEst = 5;
9b10: 20 20 20 2f 2a 20 42 4c 4f 42 2c 20 54 45 58 54     /* BLOB, TEXT
9b20: 2c 20 43 4c 4f 42 20 2d 3e 20 72 3d 35 20 20 28  , CLOB -> r=5  (
9b30: 61 70 70 72 6f 78 20 32 30 20 62 79 74 65 73 29  approx 20 bytes)
9b40: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
9b50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66  .  }.  return af
9b60: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  f;.}../*.** The 
9b70: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68  expression is th
9b80: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
9b90: 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
9ba0: 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75  ently added colu
9bb0: 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62  mn.** of the tab
9bc0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
9bd0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
9be0: 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76  .**.** Default v
9bf0: 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73  alue expressions
9c00: 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e   must be constan
9c10: 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65 78 63  t.  Raise an exc
9c20: 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a  eption if this.*
9c30: 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73  * is not the cas
9c40: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
9c50: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
9c60: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
9c70: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
9c80: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
9c90: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
9ca0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
9cb0: 64 20 73 71 6c 69 74 65 33 41 64 64 44 65 66 61  d sqlite3AddDefa
9cc0: 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a  ultValue(Parse *
9cd0: 70 50 61 72 73 65 2c 20 45 78 70 72 53 70 61 6e  pParse, ExprSpan
9ce0: 20 2a 70 53 70 61 6e 29 7b 0a 20 20 54 61 62 6c   *pSpan){.  Tabl
9cf0: 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  e *p;.  Column *
9d00: 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20  pCol;.  sqlite3 
9d10: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
9d20: 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
9d30: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
9d40: 20 70 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f   p!=0 ){.    pCo
9d50: 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d  l = &(p->aCol[p-
9d60: 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69  >nCol-1]);.    i
9d70: 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  f( !sqlite3ExprI
9d80: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
9d90: 69 6f 6e 28 70 53 70 61 6e 2d 3e 70 45 78 70 72  ion(pSpan->pExpr
9da0: 2c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29  , db->init.busy)
9db0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9dc0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
9dd0: 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65  , "default value
9de0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20   of column [%s] 
9df0: 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22  is not constant"
9e00: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  ,.          pCol
9e10: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  ->zName);.    }e
9e20: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
9e30: 63 6f 70 79 20 6f 66 20 70 45 78 70 72 20 69 73  copy of pExpr is
9e40: 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66   used instead of
9e50: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61   the original, a
9e60: 73 20 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73  s pExpr contains
9e70: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73  .      ** tokens
9e80: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76   that point to v
9e90: 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 20  olatile memory. 
9ea0: 54 68 65 20 27 73 70 61 6e 27 20 6f 66 20 74 68  The 'span' of th
9eb0: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  e expression.   
9ec0: 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65     ** is require
9ed0: 64 20 62 79 20 70 72 61 67 6d 61 20 74 61 62 6c  d by pragma tabl
9ee0: 65 5f 69 6e 66 6f 2e 0a 20 20 20 20 20 20 2a 2f  e_info..      */
9ef0: 0a 20 20 20 20 20 20 45 78 70 72 20 78 3b 0a 20  .      Expr x;. 
9f00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
9f10: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d  Delete(db, pCol-
9f20: 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 6d  >pDflt);.      m
9f30: 65 6d 73 65 74 28 26 78 2c 20 30 2c 20 73 69 7a  emset(&x, 0, siz
9f40: 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 20 20 78  eof(x));.      x
9f50: 2e 6f 70 20 3d 20 54 4b 5f 53 50 41 4e 3b 0a 20  .op = TK_SPAN;. 
9f60: 20 20 20 20 20 78 2e 75 2e 7a 54 6f 6b 65 6e 20       x.u.zToken 
9f70: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
9f80: 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53  up(db, (char*)pS
9f90: 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20  pan->zStart,.   
9fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fc0: 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45   (int)(pSpan->zE
9fd0: 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61  nd - pSpan->zSta
9fe0: 72 74 29 29 3b 0a 20 20 20 20 20 20 78 2e 70 4c  rt));.      x.pL
9ff0: 65 66 74 20 3d 20 70 53 70 61 6e 2d 3e 70 45 78  eft = pSpan->pEx
a000: 70 72 3b 0a 20 20 20 20 20 20 78 2e 66 6c 61 67  pr;.      x.flag
a010: 73 20 3d 20 45 50 5f 53 6b 69 70 3b 0a 20 20 20  s = EP_Skip;.   
a020: 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d     pCol->pDflt =
a030: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
a040: 64 62 2c 20 26 78 2c 20 45 58 50 52 44 55 50 5f  db, &x, EXPRDUP_
a050: 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20 20 73  REDUCE);.      s
a060: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
a070: 20 78 2e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20   x.u.zToken);.  
a080: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
a090: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
a0a0: 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 3b 0a 7d  pSpan->pExpr);.}
a0b0: 0a 0a 2f 2a 0a 2a 2a 20 42 61 63 6b 77 61 72 64  ../*.** Backward
a0c0: 73 20 43 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s Compatibility 
a0d0: 48 61 63 6b 3a 0a 2a 2a 20 0a 2a 2a 20 48 69 73  Hack:.** .** His
a0e0: 74 6f 72 69 63 61 6c 20 76 65 72 73 69 6f 6e 73  torical versions
a0f0: 20 6f 66 20 53 51 4c 69 74 65 20 61 63 63 65 70   of SQLite accep
a100: 74 65 64 20 73 74 72 69 6e 67 73 20 61 73 20 63  ted strings as c
a110: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 0a 2a  olumn names in.*
a120: 2a 20 69 6e 64 65 78 65 73 20 61 6e 64 20 50 52  * indexes and PR
a130: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
a140: 61 69 6e 74 73 20 61 6e 64 20 69 6e 20 55 4e 49  aints and in UNI
a150: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  QUE constraints.
a160: 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a    Example:.**.**
a170: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
a180: 45 20 78 79 7a 28 61 2c 62 2c 63 2c 64 2c 65 2c  E xyz(a,b,c,d,e,
a190: 50 52 49 4d 41 52 59 20 4b 45 59 28 27 61 27 29  PRIMARY KEY('a')
a1a0: 2c 55 4e 49 51 55 45 28 27 62 27 2c 27 63 27 20  ,UNIQUE('b','c' 
a1b0: 43 4f 4c 4c 41 54 45 20 74 72 69 6d 29 0a 2a 2a  COLLATE trim).**
a1c0: 20 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45       CREATE INDE
a1d0: 58 20 61 62 63 20 4f 4e 20 78 79 7a 28 27 63 27  X abc ON xyz('c'
a1e0: 2c 27 64 27 20 44 45 53 43 2c 27 65 27 20 43 4f  ,'d' DESC,'e' CO
a1f0: 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 44 45 53  LLATE nocase DES
a200: 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  C);.**.** This i
a210: 73 20 67 6f 6f 66 79 2e 20 20 42 75 74 20 74 6f  s goofy.  But to
a220: 20 70 72 65 73 65 72 76 65 20 62 61 63 6b 77 61   preserve backwa
a230: 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
a240: 79 20 77 65 20 63 6f 6e 74 69 6e 75 65 20 74 6f  y we continue to
a250: 0a 2a 2a 20 61 63 63 65 70 74 20 69 74 2e 20 20  .** accept it.  
a260: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
a270: 73 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  s the necessary 
a280: 63 6f 6e 76 65 72 73 69 6f 6e 2e 20 20 49 74 20  conversion.  It 
a290: 63 6f 6e 76 65 72 74 73 0a 2a 2a 20 74 68 65 20  converts.** the 
a2a0: 65 78 70 72 65 73 73 69 6f 6e 20 67 69 76 65 6e  expression given
a2b0: 20 69 6e 20 69 74 73 20 61 72 67 75 6d 65 6e 74   in its argument
a2c0: 20 66 72 6f 6d 20 61 20 54 4b 5f 53 54 52 49 4e   from a TK_STRIN
a2d0: 47 20 69 6e 74 6f 20 61 20 54 4b 5f 49 44 0a 2a  G into a TK_ID.*
a2e0: 2a 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  * if the express
a2f0: 69 6f 6e 20 69 73 20 6a 75 73 74 20 61 20 54 4b  ion is just a TK
a300: 5f 53 54 52 49 4e 47 20 77 69 74 68 20 61 6e 20  _STRING with an 
a310: 6f 70 74 69 6f 6e 61 6c 20 43 4f 4c 4c 41 54 45  optional COLLATE
a320: 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 49 66 20 74   clause..** If t
a330: 68 65 20 65 70 78 72 65 73 73 69 6f 6e 20 69 73  he epxression is
a340: 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20   anything other 
a350: 74 68 61 6e 20 54 4b 5f 53 54 52 49 4e 47 2c 20  than TK_STRING, 
a360: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
a370: 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a  s.** unchanged..
a380: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
a390: 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49 64  qlite3StringToId
a3a0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
a3b0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e   p->op==TK_STRIN
a3c0: 47 20 29 7b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d  G ){.    p->op =
a3d0: 20 54 4b 5f 49 44 3b 0a 20 20 7d 65 6c 73 65 20   TK_ID;.  }else 
a3e0: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
a3f0: 4c 4c 41 54 45 20 26 26 20 70 2d 3e 70 4c 65 66  LLATE && p->pLef
a400: 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47  t->op==TK_STRING
a410: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 65 66 74   ){.    p->pLeft
a420: 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a 20 20  ->op = TK_ID;.  
a430: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67  }.}../*.** Desig
a440: 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59  nate the PRIMARY
a450: 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61 62   KEY for the tab
a460: 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20  le.  pList is a 
a470: 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a  list of names .*
a480: 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61  * of columns tha
a490: 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61  t form the prima
a4a0: 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73  ry key.  If pLis
a4b0: 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
a4c0: 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65  the.** most rece
a4d0: 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d  ntly added colum
a4e0: 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  n of the table i
a4f0: 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  s the primary ke
a500: 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65  y..**.** A table
a510: 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73   can have at mos
a520: 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65  t one primary ke
a530: 79 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65  y.  If the table
a540: 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20   already has.** 
a550: 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61  a primary key (a
a560: 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20 73  nd this is the s
a570: 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65  econd primary ke
a580: 79 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  y) then create a
a590: 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  n.** error..**.*
a5a0: 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41 52 59  * If the PRIMARY
a5b0: 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e   KEY is on a sin
a5c0: 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65  gle column whose
a5d0: 20 64 61 74 61 74 79 70 65 20 69 73 20 49 4e 54   datatype is INT
a5e0: 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65  EGER,.** then we
a5f0: 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65   will try to use
a600: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20   that column as 
a610: 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20  the rowid.  Set 
a620: 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a  the Table.iPKey.
a630: 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ** field of the 
a640: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
a650: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74  truction to be t
a660: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
a670: 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  ** INTEGER PRIMA
a680: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20  RY KEY column.  
a690: 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73  Table.iPKey is s
a6a0: 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72  et to -1 if ther
a6b0: 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47  e is.** no INTEG
a6c0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a  ER PRIMARY KEY..
a6d0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79  **.** If the key
a6e0: 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47   is not an INTEG
a6f0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
a700: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e  then create a un
a710: 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f  ique.** index fo
a720: 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69  r the key.  No i
a730: 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20  ndex is created 
a740: 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d  for INTEGER PRIM
a750: 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69  ARY KEYs..*/.voi
a760: 64 20 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d  d sqlite3AddPrim
a770: 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20  aryKey(.  Parse 
a780: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
a790: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
a7a0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
a7b0: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
a7c0: 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20   field names to 
a7d0: 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
a7e0: 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
a7f0: 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
a800: 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73  with a uniquenes
a810: 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  s conflict */.  
a820: 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20 20 20  int autoInc,    
a830: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
a840: 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b   AUTOINCREMENT k
a850: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
a860: 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f  t */.  int sortO
a870: 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51 4c 49  rder     /* SQLI
a880: 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c  TE_SO_ASC or SQL
a890: 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29  ITE_SO_DESC */.)
a8a0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
a8b0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
a8c0: 62 6c 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  ble;.  Column *p
a8d0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  Col = 0;.  int i
a8e0: 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69  Col = -1, i;.  i
a8f0: 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 69 66 28 20  nt nTerm;.  if( 
a900: 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 70  pTab==0 ) goto p
a910: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b  rimary_key_exit;
a920: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62  .  if( pTab->tab
a930: 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50 72  Flags & TF_HasPr
a940: 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20 20 20  imaryKey ){.    
a950: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
a960: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22  pParse, .      "
a970: 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73  table \"%s\" has
a980: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70   more than one p
a990: 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61  rimary key", pTa
a9a0: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
a9b0: 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f  oto primary_key_
a9c0: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62  exit;.  }.  pTab
a9d0: 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
a9e0: 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 3b 0a  _HasPrimaryKey;.
a9f0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
aa00: 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61  {.    iCol = pTa
aa10: 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20  b->nCol - 1;.   
aa20: 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61   pCol = &pTab->a
aa30: 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 70  Col[iCol];.    p
aa40: 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d  Col->colFlags |=
aa50: 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59   COLFLAG_PRIMKEY
aa60: 3b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 31 3b  ;.    nTerm = 1;
aa70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 54  .  }else{.    nT
aa80: 65 72 6d 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  erm = pList->nEx
aa90: 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  pr;.    for(i=0;
aaa0: 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a   i<nTerm; i++){.
aab0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 45 78        Expr *pCEx
aac0: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
aad0: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73  SkipCollate(pLis
aae0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
aaf0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
ab00: 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
ab10: 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f   sqlite3StringTo
ab20: 49 64 28 70 43 45 78 70 72 29 3b 0a 20 20 20 20  Id(pCExpr);.    
ab30: 20 20 69 66 28 20 70 43 45 78 70 72 2d 3e 6f 70    if( pCExpr->op
ab40: 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20  ==TK_ID ){.     
ab50: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
ab60: 43 4e 61 6d 65 20 3d 20 70 43 45 78 70 72 2d 3e  CName = pCExpr->
ab70: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
ab80: 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
ab90: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69  ol<pTab->nCol; i
aba0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
abb0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
abc0: 49 43 6d 70 28 7a 43 4e 61 6d 65 2c 20 70 54 61  ICmp(zCName, pTa
abd0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
abe0: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
abf0: 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70         pCol = &p
ac00: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b  Tab->aCol[iCol];
ac10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
ac20: 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l->colFlags |= C
ac30: 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a  OLFLAG_PRIMKEY;.
ac40: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
ac50: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
ac60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ac70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
ac80: 20 6e 54 65 72 6d 3d 3d 31 0a 20 20 20 26 26 20   nTerm==1.   && 
ac90: 70 43 6f 6c 0a 20 20 20 26 26 20 73 71 6c 69 74  pCol.   && sqlit
aca0: 65 33 53 74 72 49 43 6d 70 28 73 71 6c 69 74 65  e3StrICmp(sqlite
acb0: 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70 43 6f 6c  3ColumnType(pCol
acc0: 2c 22 22 29 2c 20 22 49 4e 54 45 47 45 52 22 29  ,""), "INTEGER")
acd0: 3d 3d 30 0a 20 20 20 26 26 20 73 6f 72 74 4f 72  ==0.   && sortOr
ace0: 64 65 72 21 3d 53 51 4c 49 54 45 5f 53 4f 5f 44  der!=SQLITE_SO_D
acf0: 45 53 43 0a 20 20 29 7b 0a 20 20 20 20 70 54 61  ESC.  ){.    pTa
ad00: 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b  b->iPKey = iCol;
ad10: 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f  .    pTab->keyCo
ad20: 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72  nf = (u8)onError
ad30: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 75  ;.    assert( au
ad40: 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75 74 6f  toInc==0 || auto
ad50: 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54  Inc==1 );.    pT
ad60: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
ad70: 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74 6f 69  autoInc*TF_Autoi
ad80: 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 20 20 69 66  ncrement;.    if
ad90: 28 20 70 4c 69 73 74 20 29 20 70 50 61 72 73 65  ( pList ) pParse
ada0: 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72 20 3d  ->iPkSortOrder =
adb0: 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72   pList->a[0].sor
adc0: 74 4f 72 64 65 72 3b 0a 20 20 7d 65 6c 73 65 20  tOrder;.  }else 
add0: 69 66 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23  if( autoInc ){.#
ade0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
adf0: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
ae00: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
ae10: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 41 55  rMsg(pParse, "AU
ae20: 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f  TOINCREMENT is o
ae30: 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61  nly allowed on a
ae40: 6e 20 22 0a 20 20 20 20 20 20 20 22 49 4e 54 45  n ".       "INTE
ae50: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22  GER PRIMARY KEY"
ae60: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  );.#endif.  }els
ae70: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72  e{.    sqlite3Cr
ae80: 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65  eateIndex(pParse
ae90: 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74  , 0, 0, 0, pList
aea0: 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 0a 20 20  , onError, 0,.  
aeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aec0: 20 20 20 20 20 20 20 20 20 30 2c 20 73 6f 72 74           0, sort
aed0: 4f 72 64 65 72 2c 20 30 2c 20 53 51 4c 49 54 45  Order, 0, SQLITE
aee0: 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59  _IDXTYPE_PRIMARY
aef0: 4b 45 59 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  KEY);.    pList 
af00: 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72  = 0;.  }..primar
af10: 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71  y_key_exit:.  sq
af20: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
af30: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
af40: 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
af50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
af60: 20 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74   new CHECK const
af70: 72 61 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62  raint to the tab
af80: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
af90: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
afa0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
afb0: 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69  AddCheckConstrai
afc0: 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
afd0: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
afe0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
aff0: 45 78 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72  Expr *pCheckExpr
b000: 20 20 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65    /* The check e
b010: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a  xpression */.){.
b020: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b030: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c  MIT_CHECK.  Tabl
b040: 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65  e *pTab = pParse
b050: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 73  ->pNewTable;.  s
b060: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
b070: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
b080: 54 61 62 20 26 26 20 21 49 4e 5f 44 45 43 4c 41  Tab && !IN_DECLA
b090: 52 45 5f 56 54 41 42 0a 20 20 20 26 26 20 21 73  RE_VTAB.   && !s
b0a0: 71 6c 69 74 65 33 42 74 72 65 65 49 73 52 65 61  qlite3BtreeIsRea
b0b0: 64 6f 6e 6c 79 28 64 62 2d 3e 61 44 62 5b 64 62  donly(db->aDb[db
b0c0: 2d 3e 69 6e 69 74 2e 69 44 62 5d 2e 70 42 74 29  ->init.iDb].pBt)
b0d0: 0a 20 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  .  ){.    pTab->
b0e0: 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33  pCheck = sqlite3
b0f0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
b100: 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68  Parse, pTab->pCh
b110: 65 63 6b 2c 20 70 43 68 65 63 6b 45 78 70 72 29  eck, pCheckExpr)
b120: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
b130: 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65  ->constraintName
b140: 2e 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  .n ){.      sqli
b150: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61  te3ExprListSetNa
b160: 6d 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d  me(pParse, pTab-
b170: 3e 70 43 68 65 63 6b 2c 20 26 70 50 61 72 73 65  >pCheck, &pParse
b180: 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65  ->constraintName
b190: 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 1);.    }.  }e
b1a0: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20  lse.#endif.  {. 
b1b0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
b1c0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
b1d0: 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20   pCheckExpr);.  
b1e0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
b1f0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  he collation fun
b200: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ction of the mos
b210: 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65  t recently parse
b220: 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a  d table column.*
b230: 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71  * to the CollSeq
b240: 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20   given..*/.void 
b250: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74  sqlite3AddCollat
b260: 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  eType(Parse *pPa
b270: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  rse, Token *pTok
b280: 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  en){.  Table *p;
b290: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
b2a0: 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *zColl;        
b2b0: 20 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74 65        /* Dequote
b2c0: 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74  d name of collat
b2d0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a  ion sequence */.
b2e0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
b2f0: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
b300: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
b310: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
b320: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64 62   p->nCol-1;.  db
b330: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
b340: 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   zColl = sqlite3
b350: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
b360: 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28  , pToken);.  if(
b370: 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e   !zColl ) return
b380: 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
b390: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
b3a0: 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a  arse, zColl) ){.
b3b0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
b3c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
b3d0: 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 5b 69  ee(db, p->aCol[i
b3e0: 5d 2e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 70 2d  ].zColl);.    p-
b3f0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d  >aCol[i].zColl =
b400: 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f   zColl;.  .    /
b410: 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
b420: 69 73 20 64 65 63 6c 61 72 65 64 20 61 73 20 22  is declared as "
b430: 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b  <name> PRIMARY K
b440: 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65  EY COLLATE <type
b450: 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  >",.    ** then 
b460: 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61 76  an index may hav
b470: 65 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f  e been created o
b480: 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65  n this column be
b490: 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  fore the.    ** 
b4a0: 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77  collation type w
b4b0: 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63  as added. Correc
b4c0: 74 20 74 68 69 73 20 69 66 20 69 74 20 69 73 20  t this if it is 
b4d0: 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  the case..    */
b4e0: 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 2d  .    for(pIdx=p-
b4f0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
b500: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
b510: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
b520: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31  pIdx->nKeyCol==1
b530: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49   );.      if( pI
b540: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d  dx->aiColumn[0]=
b550: 3d 69 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  =i ){.        pI
b560: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20  dx->azColl[0] = 
b570: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c  p->aCol[i].zColl
b580: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b590: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
b5a0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
b5b0: 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Coll);.  }.}../*
b5c0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
b5d0: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f  n returns the co
b5e0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
b5f0: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e 61   for database na
b600: 74 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63  tive text.** enc
b610: 6f 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65 64  oding identified
b620: 20 62 79 20 74 68 65 20 73 74 72 69 6e 67 20 7a   by the string z
b630: 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61  Name, length nNa
b640: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  me..**.** If the
b650: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61   requested colla
b660: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73  tion sequence is
b670: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20   not available, 
b680: 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  or not available
b690: 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62  .** in the datab
b6a0: 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f 64  ase native encod
b6b0: 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69  ing, the collati
b6c0: 6f 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69 6e  on factory is in
b6d0: 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75  voked to.** requ
b6e0: 65 73 74 20 69 74 2e 20 49 66 20 74 68 65 20 63  est it. If the c
b6f0: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
b700: 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c 79   does not supply
b710: 20 73 75 63 68 20 61 20 73 65 71 75 65 6e 63 65   such a sequence
b720: 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 71  ,.** and the seq
b730: 75 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61 62  uence is availab
b740: 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 65  le in another te
b750: 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65  xt encoding, the
b760: 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65 74  n that is.** ret
b770: 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a  urned instead..*
b780: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73 69  *.** If no versi
b790: 6f 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75 65  ons of the reque
b7a0: 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20  sted collations 
b7b0: 73 65 71 75 65 6e 63 65 20 61 72 65 20 61 76 61  sequence are ava
b7c0: 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e  ilable, or.** an
b7d0: 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75  other error occu
b7e0: 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
b7f0: 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f  rned and an erro
b800: 72 20 6d 65 73 73 61 67 65 20 77 72 69 74 74 65  r message writte
b810: 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65  n into.** pParse
b820: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
b830: 74 69 6e 65 20 69 73 20 61 20 77 72 61 70 70 65  tine is a wrappe
b840: 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33  r around sqlite3
b850: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20  FindCollSeq().  
b860: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
b870: 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c  invokes the coll
b880: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 66  ation factory if
b890: 20 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61   the named colla
b8a0: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66  tion cannot be f
b8b0: 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65  ound.** and gene
b8c0: 72 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d  rates an error m
b8d0: 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 65  essage..**.** Se
b8e0: 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33 46  e also: sqlite3F
b8f0: 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2c 20 73 71  indCollSeq(), sq
b900: 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28  lite3GetCollSeq(
b910: 29 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ).*/.CollSeq *sq
b920: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
b930: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
b940: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
b950: 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  ame){.  sqlite3 
b960: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
b970: 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43  ;.  u8 enc = ENC
b980: 28 64 62 29 3b 0a 20 20 75 38 20 69 6e 69 74 62  (db);.  u8 initb
b990: 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62  usy = db->init.b
b9a0: 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  usy;.  CollSeq *
b9b0: 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20  pColl;..  pColl 
b9c0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
b9d0: 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e  lSeq(db, enc, zN
b9e0: 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a  ame, initbusy);.
b9f0: 20 20 69 66 28 20 21 69 6e 69 74 62 75 73 79 20    if( !initbusy 
ba00: 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70  && (!pColl || !p
ba10: 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20  Coll->xCmp) ){. 
ba20: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
ba30: 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50 61  e3GetCollSeq(pPa
ba40: 72 73 65 2c 20 65 6e 63 2c 20 70 43 6f 6c 6c 2c  rse, enc, pColl,
ba50: 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20   zName);.  }..  
ba60: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
ba70: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
ba80: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
ba90: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63  increment the sc
baa0: 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a  hema cookie..**.
bab0: 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f  ** The schema co
bac0: 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20  okie is used to 
bad0: 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74  determine when t
bae0: 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68  he schema for th
baf0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68  e.** database ch
bb00: 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61  anges.  After ea
bb10: 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ch schema change
bb20: 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c  , the cookie val
bb30: 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  ue.** changes.  
bb40: 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66  When a process f
bb50: 69 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73  irst reads the s
bb60: 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73  chema it records
bb70: 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20   the.** cookie. 
bb80: 20 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65   Thereafter, whe
bb90: 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f  never it goes to
bba0: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
bbb0: 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63  base,.** it chec
bbc0: 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  ks the cookie to
bbd0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
bbe0: 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68  chema has not ch
bbf0: 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69  anged.** since i
bc00: 74 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e  t was last read.
bc10: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e  .**.** This plan
bc20: 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   is not complete
bc30: 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e  ly bullet-proof.
bc40: 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65    It is possible
bc50: 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65   for.** the sche
bc60: 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c  ma to change mul
bc70: 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20  tiple times and 
bc80: 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74  for the cookie t
bc90: 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b  o be.** set back
bca0: 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e   to prior value.
bcb0: 20 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61    But schema cha
bcc0: 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75  nges are infrequ
bcd0: 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70  ent.** and the p
bce0: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69  robability of hi
bcf0: 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63  tting the same c
bd00: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f  ookie value is o
bd10: 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20  nly.** 1 chance 
bd20: 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27  in 2^32.  So we'
bd30: 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a  re safe enough..
bd40: 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  **.** IMPLEMENTA
bd50: 54 49 4f 4e 2d 4f 46 3a 20 52 2d 33 34 32 33 30  TION-OF: R-34230
bd60: 2d 35 36 30 34 39 20 53 51 4c 69 74 65 20 61 75  -56049 SQLite au
bd70: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 69 6e 63 72  tomatically incr
bd80: 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 65 20 73 63  ements.** the sc
bd90: 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20 77 68 65  hema-version whe
bda0: 6e 65 76 65 72 20 74 68 65 20 73 63 68 65 6d 61  never the schema
bdb0: 20 63 68 61 6e 67 65 73 2e 0a 2a 2f 0a 76 6f 69   changes..*/.voi
bdc0: 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43  d sqlite3ChangeC
bdd0: 6f 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50 61  ookie(Parse *pPa
bde0: 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  rse, int iDb){. 
bdf0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
be00: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62  Parse->db;.  Vdb
be10: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
be20: 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
be30: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
be40: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
be50: 30 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  0) );.  sqlite3V
be60: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
be70: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
be80: 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52  BTREE_SCHEMA_VER
be90: 53 49 4f 4e 2c 20 0a 20 20 20 20 20 20 20 20 20  SION, .         
bea0: 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61             db->a
beb0: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
bec0: 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31  >schema_cookie+1
bed0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73  );.}../*.** Meas
bee0: 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ure the number o
bef0: 66 20 63 68 61 72 61 63 74 65 72 73 20 6e 65 65  f characters nee
bf00: 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68  ded to output th
bf10: 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74  e given.** ident
bf20: 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62  ifier.  The numb
bf30: 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c  er returned incl
bf40: 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20  udes any quotes 
bf50: 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73  used.** but does
bf60: 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65   not include the
bf70: 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72   null terminator
bf80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69  ..**.** The esti
bf90: 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61  mate is conserva
bfa0: 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20  tive.  It might 
bfb0: 62 65 20 6c 61 72 67 65 72 20 74 68 61 74 20 77  be larger that w
bfc0: 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79  hat is.** really
bfd0: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
bfe0: 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67  ic int identLeng
bff0: 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  th(const char *z
c000: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f  ){.  int n;.  fo
c010: 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20  r(n=0; *z; n++, 
c020: 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a  z++){.    if( *z
c030: 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a  =='"' ){ n++; }.
c040: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b    }.  return n +
c050: 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   2;.}../*.** The
c060: 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72   first parameter
c070: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
c080: 20 61 6e 20 6f 75 74 70 75 74 20 62 75 66 66 65   an output buffe
c090: 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a  r. The second .*
c0a0: 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  * parameter is a
c0b0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
c0c0: 6e 74 65 67 65 72 20 74 68 61 74 20 63 6f 6e 74  nteger that cont
c0d0: 61 69 6e 73 20 74 68 65 20 6f 66 66 73 65 74 20  ains the offset 
c0e0: 61 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20 77  at.** which to w
c0f0: 72 69 74 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  rite into the ou
c100: 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 69  tput buffer. Thi
c110: 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65  s function copie
c120: 73 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72  s the.** nul-ter
c130: 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 70  minated string p
c140: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65  ointed to by the
c150: 20 74 68 69 72 64 20 70 61 72 61 6d 65 74 65 72   third parameter
c160: 2c 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a  , zSignedIdent,.
c170: 2a 2a 20 74 6f 20 74 68 65 20 73 70 65 63 69 66  ** to the specif
c180: 69 65 64 20 6f 66 66 73 65 74 20 69 6e 20 74 68  ied offset in th
c190: 65 20 62 75 66 66 65 72 20 61 6e 64 20 75 70 64  e buffer and upd
c1a0: 61 74 65 73 20 2a 70 49 64 78 20 74 6f 20 72 65  ates *pIdx to re
c1b0: 66 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69  fer.** to the fi
c1c0: 72 73 74 20 62 79 74 65 20 61 66 74 65 72 20 74  rst byte after t
c1d0: 68 65 20 6c 61 73 74 20 62 79 74 65 20 77 72 69  he last byte wri
c1e0: 74 74 65 6e 20 62 65 66 6f 72 65 20 72 65 74 75  tten before retu
c1f0: 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66  rning..** .** If
c200: 20 74 68 65 20 73 74 72 69 6e 67 20 7a 53 69 67   the string zSig
c210: 6e 65 64 49 64 65 6e 74 20 63 6f 6e 73 69 73 74  nedIdent consist
c220: 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c  s entirely of al
c230: 70 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63  pha-numeric.** c
c240: 68 61 72 61 63 74 65 72 73 2c 20 64 6f 65 73 20  haracters, does 
c250: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61  not begin with a
c260: 20 64 69 67 69 74 20 61 6e 64 20 69 73 20 6e 6f   digit and is no
c270: 74 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64  t an SQL keyword
c280: 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20  ,.** then it is 
c290: 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20 6f 75  copied to the ou
c2a0: 74 70 75 74 20 62 75 66 66 65 72 20 65 78 61 63  tput buffer exac
c2b0: 74 6c 79 20 61 73 20 69 74 20 69 73 2e 20 4f 74  tly as it is. Ot
c2c0: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69  herwise,.** it i
c2d0: 73 20 71 75 6f 74 65 64 20 75 73 69 6e 67 20 64  s quoted using d
c2e0: 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f  ouble-quotes..*/
c2f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 65  .static void ide
c300: 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69  ntPut(char *z, i
c310: 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a  nt *pIdx, char *
c320: 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20  zSignedIdent){. 
c330: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
c340: 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e  zIdent = (unsign
c350: 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64  ed char*)zSigned
c360: 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20  Ident;.  int i, 
c370: 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20  j, needQuote;.  
c380: 69 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f  i = *pIdx;..  fo
c390: 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d  r(j=0; zIdent[j]
c3a0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; j++){.    if( 
c3b0: 21 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28  !sqlite3Isalnum(
c3c0: 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49  zIdent[j]) && zI
c3d0: 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62  dent[j]!='_' ) b
c3e0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64  reak;.  }.  need
c3f0: 51 75 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 49  Quote = sqlite3I
c400: 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d  sdigit(zIdent[0]
c410: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ).            ||
c420: 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43   sqlite3KeywordC
c430: 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d  ode(zIdent, j)!=
c440: 54 4b 5f 49 44 0a 20 20 20 20 20 20 20 20 20 20  TK_ID.          
c450: 20 20 7c 7c 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d    || zIdent[j]!=
c460: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  0.            ||
c470: 20 6a 3d 3d 30 3b 0a 0a 20 20 69 66 28 20 6e 65   j==0;..  if( ne
c480: 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d  edQuote ) z[i++]
c490: 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d   = '"';.  for(j=
c4a0: 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b  0; zIdent[j]; j+
c4b0: 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d  +){.    z[i++] =
c4c0: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20   zIdent[j];.    
c4d0: 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27  if( zIdent[j]=='
c4e0: 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22  "' ) z[i++] = '"
c4f0: 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65  ';.  }.  if( nee
c500: 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20  dQuote ) z[i++] 
c510: 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20  = '"';.  z[i] = 
c520: 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a  0;.  *pIdx = i;.
c530: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
c540: 65 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  e a CREATE TABLE
c550: 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f   statement appro
c560: 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67  priate for the g
c570: 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20  iven.** table.  
c580: 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74  Memory to hold t
c590: 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 73  he text of the s
c5a0: 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61  tatement is obta
c5b0: 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c  ined.** from sql
c5c0: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
c5d0: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
c5e0: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
c5f0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
c600: 20 63 68 61 72 20 2a 63 72 65 61 74 65 54 61 62   char *createTab
c610: 6c 65 53 74 6d 74 28 73 71 6c 69 74 65 33 20 2a  leStmt(sqlite3 *
c620: 64 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a 20  db, Table *p){. 
c630: 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20   int i, k, n;.  
c640: 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63  char *zStmt;.  c
c650: 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70  har *zSep, *zSep
c660: 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 43 6f 6c 75  2, *zEnd;.  Colu
c670: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20  mn *pCol;.  n = 
c680: 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20  0;.  for(pCol = 
c690: 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c  p->aCol, i=0; i<
c6a0: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  p->nCol; i++, pC
c6b0: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  ol++){.    n += 
c6c0: 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c  identLength(pCol
c6d0: 2d 3e 7a 4e 61 6d 65 29 20 2b 20 35 3b 0a 20 20  ->zName) + 5;.  
c6e0: 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65  }.  n += identLe
c6f0: 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  ngth(p->zName);.
c700: 20 20 69 66 28 20 6e 3c 35 30 20 29 7b 20 0a 20    if( n<50 ){ . 
c710: 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20     zSep = "";.  
c720: 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20    zSep2 = ",";. 
c730: 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20     zEnd = ")";. 
c740: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70   }else{.    zSep
c750: 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a   = "\n  ";.    z
c760: 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a  Sep2 = ",\n  ";.
c770: 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22      zEnd = "\n)"
c780: 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20  ;.  }.  n += 35 
c790: 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a  + 6*p->nCol;.  z
c7a0: 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 44 62  Stmt = sqlite3Db
c7b0: 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 29 3b  MallocRaw(0, n);
c7c0: 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20  .  if( zStmt==0 
c7d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  ){.    sqlite3Oo
c7e0: 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
c7f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
c800: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
c810: 28 6e 2c 20 7a 53 74 6d 74 2c 20 22 43 52 45 41  (n, zStmt, "CREA
c820: 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b  TE TABLE ");.  k
c830: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
c840: 33 30 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65  30(zStmt);.  ide
c850: 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c  ntPut(zStmt, &k,
c860: 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53   p->zName);.  zS
c870: 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a  tmt[k++] = '(';.
c880: 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43    for(pCol=p->aC
c890: 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  ol, i=0; i<p->nC
c8a0: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
c8b0: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
c8c0: 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20  st char * const 
c8d0: 61 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a 20 20 20  azType[] = {.   
c8e0: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
c8f0: 46 46 5f 42 4c 4f 42 20 20 20 20 2a 2f 20 22 22  FF_BLOB    */ ""
c900: 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  ,.        /* SQL
c910: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20  ITE_AFF_TEXT    
c920: 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20 20 20 20  */ " TEXT",.    
c930: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
c940: 46 5f 4e 55 4d 45 52 49 43 20 2a 2f 20 22 20 4e  F_NUMERIC */ " N
c950: 55 4d 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  UM",.        /* 
c960: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
c970: 45 52 20 2a 2f 20 22 20 49 4e 54 22 2c 0a 20 20  ER */ " INT",.  
c980: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
c990: 41 46 46 5f 52 45 41 4c 20 20 20 20 2a 2f 20 22  AFF_REAL    */ "
c9a0: 20 52 45 41 4c 22 0a 20 20 20 20 7d 3b 0a 20 20   REAL".    };.  
c9b0: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63    int len;.    c
c9c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
c9d0: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ;..    sqlite3_s
c9e0: 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53  nprintf(n-k, &zS
c9f0: 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20  tmt[k], zSep);. 
ca00: 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53     k += sqlite3S
ca10: 74 72 6c 65 6e 33 30 28 26 7a 53 74 6d 74 5b 6b  trlen30(&zStmt[k
ca20: 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a  ]);.    zSep = z
ca30: 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50  Sep2;.    identP
ca40: 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43  ut(zStmt, &k, pC
ca50: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
ca60: 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66  assert( pCol->af
ca70: 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46  finity-SQLITE_AF
ca80: 46 5f 42 4c 4f 42 20 3e 3d 20 30 20 29 3b 0a 20  F_BLOB >= 0 );. 
ca90: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
caa0: 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45  >affinity-SQLITE
cab0: 5f 41 46 46 5f 42 4c 4f 42 20 3c 20 41 72 72 61  _AFF_BLOB < Arra
cac0: 79 53 69 7a 65 28 61 7a 54 79 70 65 29 20 29 3b  ySize(azType) );
cad0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
cae0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
caf0: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29  QLITE_AFF_BLOB )
cb00: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
cb10: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
cb20: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
cb30: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
cb40: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
cb50: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
cb60: 52 49 43 20 29 3b 0a 20 20 20 20 74 65 73 74 63  RIC );.    testc
cb70: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
cb80: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
cb90: 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 74  INTEGER );.    t
cba0: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
cbb0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
cbc0: 41 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20 20 20  AFF_REAL );.    
cbd0: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 61 7a 54  .    zType = azT
cbe0: 79 70 65 5b 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  ype[pCol->affini
cbf0: 74 79 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty - SQLITE_AFF_
cc00: 42 4c 4f 42 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d  BLOB];.    len =
cc10: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
cc20: 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 61 73 73  (zType);.    ass
cc30: 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ert( pCol->affin
cc40: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
cc50: 42 4c 4f 42 20 0a 20 20 20 20 20 20 20 20 20 20  BLOB .          
cc60: 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66 69 6e    || pCol->affin
cc70: 69 74 79 3d 3d 73 71 6c 69 74 65 33 41 66 66 69  ity==sqlite3Affi
cc80: 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65 2c 20  nityType(zType, 
cc90: 30 29 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  0) );.    memcpy
cca0: 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79 70  (&zStmt[k], zTyp
ccb0: 65 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 6b 20 2b  e, len);.    k +
ccc0: 3d 20 6c 65 6e 3b 0a 20 20 20 20 61 73 73 65 72  = len;.    asser
ccd0: 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a 20  t( k<=n );.  }. 
cce0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
ccf0: 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d  f(n-k, &zStmt[k]
cd00: 2c 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20  , "%s", zEnd);. 
cd10: 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d   return zStmt;.}
cd20: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 61  ../*.** Resize a
cd30: 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74  n Index object t
cd40: 6f 20 68 6f 6c 64 20 4e 20 63 6f 6c 75 6d 6e 73  o hold N columns
cd50: 20 74 6f 74 61 6c 2e 20 20 52 65 74 75 72 6e 20   total.  Return 
cd60: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
cd70: 73 75 63 63 65 73 73 20 61 6e 64 20 53 51 4c 49  success and SQLI
cd80: 54 45 5f 4e 4f 4d 45 4d 20 6f 6e 20 61 6e 20 4f  TE_NOMEM on an O
cd90: 4f 4d 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61  OM error..*/.sta
cda0: 74 69 63 20 69 6e 74 20 72 65 73 69 7a 65 49 6e  tic int resizeIn
cdb0: 64 65 78 4f 62 6a 65 63 74 28 73 71 6c 69 74 65  dexObject(sqlite
cdc0: 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49  3 *db, Index *pI
cdd0: 64 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 63 68  dx, int N){.  ch
cde0: 61 72 20 2a 7a 45 78 74 72 61 3b 0a 20 20 69 6e  ar *zExtra;.  in
cdf0: 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70  t nByte;.  if( p
ce00: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 4e 20  Idx->nColumn>=N 
ce10: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
ce20: 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  OK;.  assert( pI
ce30: 64 78 2d 3e 69 73 52 65 73 69 7a 65 64 3d 3d 30  dx->isResized==0
ce40: 20 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 28 73   );.  nByte = (s
ce50: 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2b 20 73  izeof(char*) + s
ce60: 69 7a 65 6f 66 28 69 31 36 29 20 2b 20 31 29 2a  izeof(i16) + 1)*
ce70: 4e 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20 73 71  N;.  zExtra = sq
ce80: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
ce90: 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  o(db, nByte);.  
cea0: 69 66 28 20 7a 45 78 74 72 61 3d 3d 30 20 29 20  if( zExtra==0 ) 
ceb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
cec0: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d 63  MEM_BKPT;.  memc
ced0: 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d  py(zExtra, pIdx-
cee0: 3e 61 7a 43 6f 6c 6c 2c 20 73 69 7a 65 6f 66 28  >azColl, sizeof(
cef0: 63 68 61 72 2a 29 2a 70 49 64 78 2d 3e 6e 43 6f  char*)*pIdx->nCo
cf00: 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61  lumn);.  pIdx->a
cf10: 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74 20 63  zColl = (const c
cf20: 68 61 72 2a 2a 29 7a 45 78 74 72 61 3b 0a 20 20  har**)zExtra;.  
cf30: 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66  zExtra += sizeof
cf40: 28 63 68 61 72 2a 29 2a 4e 3b 0a 20 20 6d 65 6d  (char*)*N;.  mem
cf50: 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78  cpy(zExtra, pIdx
cf60: 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 73 69 7a 65  ->aiColumn, size
cf70: 6f 66 28 69 31 36 29 2a 70 49 64 78 2d 3e 6e 43  of(i16)*pIdx->nC
cf80: 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e  olumn);.  pIdx->
cf90: 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a  aiColumn = (i16*
cfa0: 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72  )zExtra;.  zExtr
cfb0: 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36 29  a += sizeof(i16)
cfc0: 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78  *N;.  memcpy(zEx
cfd0: 74 72 61 2c 20 70 49 64 78 2d 3e 61 53 6f 72 74  tra, pIdx->aSort
cfe0: 4f 72 64 65 72 2c 20 70 49 64 78 2d 3e 6e 43 6f  Order, pIdx->nCo
cff0: 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61  lumn);.  pIdx->a
d000: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
d010: 29 7a 45 78 74 72 61 3b 0a 20 20 70 49 64 78 2d  )zExtra;.  pIdx-
d020: 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a 20 20  >nColumn = N;.  
d030: 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64 20  pIdx->isResized 
d040: 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
d050: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
d060: 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 74  * Estimate the t
d070: 6f 74 61 6c 20 72 6f 77 20 77 69 64 74 68 20 66  otal row width f
d080: 6f 72 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  or a table..*/.s
d090: 74 61 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d  tatic void estim
d0a0: 61 74 65 54 61 62 6c 65 57 69 64 74 68 28 54 61  ateTableWidth(Ta
d0b0: 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 75 6e  ble *pTab){.  un
d0c0: 73 69 67 6e 65 64 20 77 54 61 62 6c 65 20 3d 20  signed wTable = 
d0d0: 30 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d  0;.  const Colum
d0e0: 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 69 6e  n *pTabCol;.  in
d0f0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 54 61  t i;.  for(i=pTa
d100: 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 43 6f 6c  b->nCol, pTabCol
d110: 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3e 30  =pTab->aCol; i>0
d120: 3b 20 69 2d 2d 2c 20 70 54 61 62 43 6f 6c 2b 2b  ; i--, pTabCol++
d130: 29 7b 0a 20 20 20 20 77 54 61 62 6c 65 20 2b 3d  ){.    wTable +=
d140: 20 70 54 61 62 43 6f 6c 2d 3e 73 7a 45 73 74 3b   pTabCol->szEst;
d150: 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d  .  }.  if( pTab-
d160: 3e 69 50 4b 65 79 3c 30 20 29 20 77 54 61 62 6c  >iPKey<0 ) wTabl
d170: 65 2b 2b 3b 0a 20 20 70 54 61 62 2d 3e 73 7a 54  e++;.  pTab->szT
d180: 61 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  abRow = sqlite3L
d190: 6f 67 45 73 74 28 77 54 61 62 6c 65 2a 34 29 3b  ogEst(wTable*4);
d1a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  .}../*.** Estima
d1b0: 74 65 20 74 68 65 20 61 76 65 72 61 67 65 20 73  te the average s
d1c0: 69 7a 65 20 6f 66 20 61 20 72 6f 77 20 66 6f 72  ize of a row for
d1d0: 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74   an index..*/.st
d1e0: 61 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61  atic void estima
d1f0: 74 65 49 6e 64 65 78 57 69 64 74 68 28 49 6e 64  teIndexWidth(Ind
d200: 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73  ex *pIdx){.  uns
d210: 69 67 6e 65 64 20 77 49 6e 64 65 78 20 3d 20 30  igned wIndex = 0
d220: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  ;.  int i;.  con
d230: 73 74 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20  st Column *aCol 
d240: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
d250: 61 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  aCol;.  for(i=0;
d260: 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   i<pIdx->nColumn
d270: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 31 36 20  ; i++){.    i16 
d280: 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  x = pIdx->aiColu
d290: 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72  mn[i];.    asser
d2a0: 74 28 20 78 3c 70 49 64 78 2d 3e 70 54 61 62 6c  t( x<pIdx->pTabl
d2b0: 65 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 77  e->nCol );.    w
d2c0: 49 6e 64 65 78 20 2b 3d 20 78 3c 30 20 3f 20 31  Index += x<0 ? 1
d2d0: 20 3a 20 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69   : aCol[pIdx->ai
d2e0: 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73 7a 45 73 74  Column[i]].szEst
d2f0: 3b 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e 73 7a  ;.  }.  pIdx->sz
d300: 49 64 78 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  IdxRow = sqlite3
d310: 4c 6f 67 45 73 74 28 77 49 6e 64 65 78 2a 34 29  LogEst(wIndex*4)
d320: 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  ;.}../* Return t
d330: 72 75 65 20 69 66 20 76 61 6c 75 65 20 78 20 69  rue if value x i
d340: 73 20 66 6f 75 6e 64 20 61 6e 79 20 6f 66 20 74  s found any of t
d350: 68 65 20 66 69 72 73 74 20 6e 43 6f 6c 20 65 6e  he first nCol en
d360: 74 72 69 65 73 20 6f 66 20 61 69 43 6f 6c 5b 5d  tries of aiCol[]
d370: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
d380: 61 73 43 6f 6c 75 6d 6e 28 63 6f 6e 73 74 20 69  asColumn(const i
d390: 31 36 20 2a 61 69 43 6f 6c 2c 20 69 6e 74 20 6e  16 *aiCol, int n
d3a0: 43 6f 6c 2c 20 69 6e 74 20 78 29 7b 0a 20 20 77  Col, int x){.  w
d3b0: 68 69 6c 65 28 20 6e 43 6f 6c 2d 2d 20 3e 20 30  hile( nCol-- > 0
d3c0: 20 29 20 69 66 28 20 78 3d 3d 2a 28 61 69 43 6f   ) if( x==*(aiCo
d3d0: 6c 2b 2b 29 20 29 20 72 65 74 75 72 6e 20 31 3b  l++) ) return 1;
d3e0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
d3f0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
d400: 6e 65 20 72 75 6e 73 20 61 74 20 74 68 65 20 65  ne runs at the e
d410: 6e 64 20 6f 66 20 70 61 72 73 69 6e 67 20 61 20  nd of parsing a 
d420: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
d430: 74 65 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20 68  tement that.** h
d440: 61 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  as a WITHOUT ROW
d450: 49 44 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20  ID clause.  The 
d460: 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74  job of this rout
d470: 69 6e 65 20 69 73 20 74 6f 20 63 6f 6e 76 65 72  ine is to conver
d480: 74 20 62 6f 74 68 0a 2a 2a 20 69 6e 74 65 72 6e  t both.** intern
d490: 61 6c 20 73 63 68 65 6d 61 20 64 61 74 61 20 73  al schema data s
d4a0: 74 72 75 63 74 75 72 65 73 20 61 6e 64 20 74 68  tructures and th
d4b0: 65 20 67 65 6e 65 72 61 74 65 64 20 56 44 42 45  e generated VDBE
d4c0: 20 63 6f 64 65 20 73 6f 20 74 68 61 74 20 74 68   code so that th
d4d0: 65 79 0a 2a 2a 20 61 72 65 20 61 70 70 72 6f 70  ey.** are approp
d4e0: 72 69 61 74 65 20 66 6f 72 20 61 20 57 49 54 48  riate for a WITH
d4f0: 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 20  OUT ROWID table 
d500: 69 6e 73 74 65 61 64 20 6f 66 20 61 20 72 6f 77  instead of a row
d510: 69 64 20 74 61 62 6c 65 2e 0a 2a 2a 20 43 68 61  id table..** Cha
d520: 6e 67 65 73 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a  nges include:.**
d530: 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 53 65 74  .**     (1)  Set
d540: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   all columns of 
d550: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
d560: 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 74 6f  schema object to
d570: 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a   be NOT NULL..**
d580: 20 20 20 20 20 28 32 29 20 20 43 6f 6e 76 65 72       (2)  Conver
d590: 74 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65 54  t the OP_CreateT
d5a0: 61 62 6c 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f  able into an OP_
d5b0: 43 72 65 61 74 65 49 6e 64 65 78 2e 20 20 54 68  CreateIndex.  Th
d5c0: 65 72 65 20 69 73 0a 2a 2a 20 20 20 20 20 20 20  ere is.**       
d5d0: 20 20 20 6e 6f 20 72 6f 77 69 64 20 62 74 72 65     no rowid btre
d5e0: 65 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20  e for a WITHOUT 
d5f0: 52 4f 57 49 44 2e 20 20 49 6e 73 74 65 61 64 2c  ROWID.  Instead,
d600: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a   the canonical.*
d610: 2a 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20  *          data 
d620: 73 74 6f 72 61 67 65 20 69 73 20 61 20 63 6f 76  storage is a cov
d630: 65 72 69 6e 67 20 69 6e 64 65 78 20 62 74 72 65  ering index btre
d640: 65 2e 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 42  e..**     (3)  B
d650: 79 70 61 73 73 20 74 68 65 20 63 72 65 61 74 69  ypass the creati
d660: 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  on of the sqlite
d670: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e  _master table en
d680: 74 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  try.**          
d690: 66 6f 72 20 74 68 65 20 50 52 49 4d 41 52 59 20  for the PRIMARY 
d6a0: 4b 45 59 20 61 73 20 74 68 65 20 70 72 69 6d 61  KEY as the prima
d6b0: 72 79 20 6b 65 79 20 69 6e 64 65 78 20 69 73 20  ry key index is 
d6c0: 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  now.**          
d6d0: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
d6e0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
d6f0: 74 61 62 6c 65 20 65 6e 74 72 79 20 6f 66 20 74  table entry of t
d700: 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e  he table itself.
d710: 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 53 65 74  .**     (4)  Set
d720: 20 74 68 65 20 49 6e 64 65 78 2e 74 6e 75 6d 20   the Index.tnum 
d730: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
d740: 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  EY Index object 
d750: 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  in the.**       
d760: 20 20 20 73 63 68 65 6d 61 20 74 6f 20 74 68 65     schema to the
d770: 20 72 6f 6f 74 70 61 67 65 20 66 72 6f 6d 20 74   rootpage from t
d780: 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a  he main table..*
d790: 2a 20 20 20 20 20 28 35 29 20 20 41 64 64 20 61  *     (5)  Add a
d7a0: 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  ll table columns
d7b0: 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59 20   to the PRIMARY 
d7c0: 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  KEY Index object
d7d0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f 20  .**          so 
d7e0: 74 68 61 74 20 74 68 65 20 50 52 49 4d 41 52 59  that the PRIMARY
d7f0: 20 4b 45 59 20 69 73 20 61 20 63 6f 76 65 72 69   KEY is a coveri
d800: 6e 67 20 69 6e 64 65 78 2e 20 20 54 68 65 20 73  ng index.  The s
d810: 75 72 70 6c 75 73 0a 2a 2a 20 20 20 20 20 20 20  urplus.**       
d820: 20 20 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 70     columns are p
d830: 61 72 74 20 6f 66 20 4b 65 79 49 6e 66 6f 2e 6e  art of KeyInfo.n
d840: 41 6c 6c 46 69 65 6c 64 20 61 6e 64 20 61 72 65  AllField and are
d850: 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 0a 2a 2a   not used for.**
d860: 20 20 20 20 20 20 20 20 20 20 73 6f 72 74 69 6e            sortin
d870: 67 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72 20 75  g or lookup or u
d880: 6e 69 71 75 65 6e 65 73 73 20 63 68 65 63 6b 73  niqueness checks
d890: 2e 0a 2a 2a 20 20 20 20 20 28 36 29 20 20 52 65  ..**     (6)  Re
d8a0: 70 6c 61 63 65 20 74 68 65 20 72 6f 77 69 64 20  place the rowid 
d8b0: 74 61 69 6c 20 6f 6e 20 61 6c 6c 20 61 75 74 6f  tail on all auto
d8c0: 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61  matically genera
d8d0: 74 65 64 20 55 4e 49 51 55 45 0a 2a 2a 20 20 20  ted UNIQUE.**   
d8e0: 20 20 20 20 20 20 20 69 6e 64 69 63 65 73 20 77         indices w
d8f0: 69 74 68 20 74 68 65 20 50 52 49 4d 41 52 59 20  ith the PRIMARY 
d900: 4b 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a  KEY columns..**.
d910: 2a 2a 20 46 6f 72 20 76 69 72 74 75 61 6c 20 74  ** For virtual t
d920: 61 62 6c 65 73 2c 20 6f 6e 6c 79 20 28 31 29 20  ables, only (1) 
d930: 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2f  is performed..*/
d940: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e  .static void con
d950: 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77  vertToWithoutRow
d960: 69 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  idTable(Parse *p
d970: 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
d980: 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ab){.  Index *pI
d990: 64 78 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b  dx;.  Index *pPk
d9a0: 3b 0a 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20 69  ;.  int nPk;.  i
d9b0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74  nt i, j;.  sqlit
d9c0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
d9d0: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  >db;.  Vdbe *v =
d9e0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
d9f0: 0a 20 20 2f 2a 20 4d 61 72 6b 20 65 76 65 72 79  .  /* Mark every
da00: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
da10: 75 6d 6e 20 61 73 20 4e 4f 54 20 4e 55 4c 4c 20  umn as NOT NULL 
da20: 28 65 78 63 65 70 74 20 66 6f 72 20 69 6d 70 6f  (except for impo
da30: 73 74 65 72 20 74 61 62 6c 65 73 29 0a 20 20 2a  ster tables).  *
da40: 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  /.  if( !db->ini
da50: 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c 65 20  t.imposterTable 
da60: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
da70: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
da80: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  +){.      if( (p
da90: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 63 6f 6c  Tab->aCol[i].col
daa0: 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f  Flags & COLFLAG_
dab0: 50 52 49 4d 4b 45 59 29 21 3d 30 20 29 7b 0a 20  PRIMKEY)!=0 ){. 
dac0: 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f         pTab->aCo
dad0: 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 4f  l[i].notNull = O
dae0: 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  E_Abort;.      }
daf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
db00: 20 54 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 74   The remaining t
db10: 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 73 20 6f  ransformations o
db20: 6e 6c 79 20 61 70 70 6c 79 20 74 6f 20 62 2d 74  nly apply to b-t
db30: 72 65 65 20 74 61 62 6c 65 73 2c 20 6e 6f 74 20  ree tables, not 
db40: 74 6f 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  to.  ** virtual 
db50: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 69 66 28 20  tables */.  if( 
db60: 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
db70: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
db80: 43 6f 6e 76 65 72 74 20 74 68 65 20 4f 50 5f 43  Convert the OP_C
db90: 72 65 61 74 65 54 61 62 6c 65 20 6f 70 63 6f 64  reateTable opcod
dba0: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 6f 72  e that would nor
dbb0: 6d 61 6c 6c 79 20 63 72 65 61 74 65 20 74 68 65  mally create the
dbc0: 0a 20 20 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20  .  ** root-page 
dbd0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 6e  for the table in
dbe0: 74 6f 20 61 6e 20 4f 50 5f 43 72 65 61 74 65 49  to an OP_CreateI
dbf0: 6e 64 65 78 20 6f 70 63 6f 64 65 2e 20 20 54 68  ndex opcode.  Th
dc00: 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 63 72 65  e index.  ** cre
dc10: 61 74 65 64 20 77 69 6c 6c 20 62 65 63 6f 6d 65  ated will become
dc20: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
dc30: 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69   index..  */.  i
dc40: 66 28 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43  f( pParse->addrC
dc50: 72 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65  rTab ){.    asse
dc60: 72 74 28 20 76 20 29 3b 0a 20 20 20 20 73 71 6c  rt( v );.    sql
dc70: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70  ite3VdbeChangeOp
dc80: 63 6f 64 65 28 76 2c 20 70 50 61 72 73 65 2d 3e  code(v, pParse->
dc90: 61 64 64 72 43 72 54 61 62 2c 20 4f 50 5f 43 72  addrCrTab, OP_Cr
dca0: 65 61 74 65 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  eateIndex);.  }.
dcb0: 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
dcc0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
dcd0: 65 78 2e 20 20 4f 72 2c 20 69 66 20 74 68 69 73  ex.  Or, if this
dce0: 20 74 61 62 6c 65 20 77 61 73 20 6f 72 69 67 69   table was origi
dcf0: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 61 6e 20 49 4e  nally.  ** an IN
dd00: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
dd10: 59 20 74 61 62 6c 65 2c 20 63 72 65 61 74 65 20  Y table, create 
dd20: 61 20 6e 65 77 20 50 52 49 4d 41 52 59 20 4b 45  a new PRIMARY KE
dd30: 59 20 69 6e 64 65 78 2e 20 0a 20 20 2a 2f 0a 20  Y index. .  */. 
dd40: 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79   if( pTab->iPKey
dd50: 3e 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c  >=0 ){.    ExprL
dd60: 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20  ist *pList;.    
dd70: 54 6f 6b 65 6e 20 69 70 6b 54 6f 6b 65 6e 3b 0a  Token ipkToken;.
dd80: 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
dd90: 49 6e 69 74 28 26 69 70 6b 54 6f 6b 65 6e 2c 20  Init(&ipkToken, 
dda0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d  pTab->aCol[pTab-
ddb0: 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a  >iPKey].zName);.
ddc0: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
ddd0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
dde0: 64 28 70 50 61 72 73 65 2c 20 30 2c 20 0a 20 20  d(pParse, 0, .  
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de00: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
de10: 28 64 62 2c 20 54 4b 5f 49 44 2c 20 26 69 70 6b  (db, TK_ID, &ipk
de20: 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20  Token, 0));.    
de30: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
de40: 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 69 73 74  eturn;.    pList
de50: 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
de60: 20 3d 20 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f   = pParse->iPkSo
de70: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 61 73 73  rtOrder;.    ass
de80: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65  ert( pParse->pNe
de90: 77 54 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a  wTable==pTab );.
dea0: 20 20 20 20 73 71 6c 69 74 65 33 43 72 65 61 74      sqlite3Creat
deb0: 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30  eIndex(pParse, 0
dec0: 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 70  , 0, 0, pList, p
ded0: 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 2c 20 30 2c  Tab->keyConf, 0,
dee0: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20   0, 0, 0,.      
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df00: 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f   SQLITE_IDXTYPE_
df10: 50 52 49 4d 41 52 59 4b 45 59 29 3b 0a 20 20 20  PRIMARYKEY);.   
df20: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
df30: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
df40: 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65      pPk = sqlite
df50: 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
df60: 28 70 54 61 62 29 3b 0a 20 20 20 20 70 54 61 62  (pTab);.    pTab
df70: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
df80: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b 20 3d  }else{.    pPk =
df90: 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
dfa0: 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 0a  eyIndex(pTab);..
dfb0: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65      /*.    ** Re
dfc0: 6d 6f 76 65 20 61 6c 6c 20 72 65 64 75 6e 64 61  move all redunda
dfd0: 6e 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  nt columns from 
dfe0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  the PRIMARY KEY.
dff0: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63    For example, c
e000: 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20 22 50 52  hange.    ** "PR
e010: 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c 61 2c  IMARY KEY(a,b,a,
e020: 62 2c 63 2c 62 2c 63 2c 64 29 22 20 69 6e 74 6f  b,c,b,c,d)" into
e030: 20 6a 75 73 74 20 22 50 52 49 4d 41 52 59 20 4b   just "PRIMARY K
e040: 45 59 28 61 2c 62 2c 63 2c 64 29 22 2e 20 20 4c  EY(a,b,c,d)".  L
e050: 61 74 65 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65  ater.    ** code
e060: 20 61 73 73 75 6d 65 73 20 74 68 65 20 50 52 49   assumes the PRI
e070: 4d 41 52 59 20 4b 45 59 20 63 6f 6e 74 61 69 6e  MARY KEY contain
e080: 73 20 6e 6f 20 72 65 70 65 61 74 65 64 20 63 6f  s no repeated co
e090: 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  lumns..    */.  
e0a0: 20 20 66 6f 72 28 69 3d 6a 3d 31 3b 20 69 3c 70    for(i=j=1; i<p
e0b0: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b  Pk->nKeyCol; i++
e0c0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68 61 73  ){.      if( has
e0d0: 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f  Column(pPk->aiCo
e0e0: 6c 75 6d 6e 2c 20 6a 2c 20 70 50 6b 2d 3e 61 69  lumn, j, pPk->ai
e0f0: 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20  Column[i]) ){.  
e100: 20 20 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75        pPk->nColu
e110: 6d 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  mn--;.      }els
e120: 65 7b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e  e{.        pPk->
e130: 61 69 43 6f 6c 75 6d 6e 5b 6a 2b 2b 5d 20 3d 20  aiColumn[j++] = 
e140: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  pPk->aiColumn[i]
e150: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e160: 20 20 20 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c      pPk->nKeyCol
e170: 20 3d 20 6a 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = j;.  }.  asse
e180: 72 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a 20 20  rt( pPk!=0 );.  
e190: 70 50 6b 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20  pPk->isCovering 
e1a0: 3d 20 31 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e  = 1;.  if( !db->
e1b0: 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62  init.imposterTab
e1c0: 6c 65 20 29 20 70 50 6b 2d 3e 75 6e 69 71 4e 6f  le ) pPk->uniqNo
e1d0: 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 6e 50 6b  tNull = 1;.  nPk
e1e0: 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   = pPk->nKeyCol;
e1f0: 0a 0a 20 20 2f 2a 20 42 79 70 61 73 73 20 74 68  ..  /* Bypass th
e200: 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68  e creation of th
e210: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 62 74  e PRIMARY KEY bt
e220: 72 65 65 20 61 6e 64 20 74 68 65 20 73 71 6c 69  ree and the sqli
e230: 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74  te_master.  ** t
e240: 61 62 6c 65 20 65 6e 74 72 79 2e 20 54 68 69 73  able entry. This
e250: 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65   is only require
e260: 64 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 67  d if currently g
e270: 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 0a 20  enerating VDBE. 
e280: 20 2a 2a 20 63 6f 64 65 20 66 6f 72 20 61 20 43   ** code for a C
e290: 52 45 41 54 45 20 54 41 42 4c 45 20 28 6e 6f 74  REATE TABLE (not
e2a0: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 6f 6e   when parsing on
e2b0: 65 20 61 73 20 70 61 72 74 20 6f 66 20 72 65 61  e as part of rea
e2c0: 64 69 6e 67 0a 20 20 2a 2a 20 61 20 64 61 74 61  ding.  ** a data
e2d0: 62 61 73 65 20 73 63 68 65 6d 61 29 2e 20 20 2a  base schema).  *
e2e0: 2f 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 6b  /.  if( v && pPk
e2f0: 2d 3e 74 6e 75 6d 3e 30 20 29 7b 0a 20 20 20 20  ->tnum>0 ){.    
e300: 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74  assert( db->init
e310: 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20  .busy==0 );.    
e320: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
e330: 65 4f 70 63 6f 64 65 28 76 2c 20 70 50 6b 2d 3e  eOpcode(v, pPk->
e340: 74 6e 75 6d 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a  tnum, OP_Goto);.
e350: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 6f    }..  /* The ro
e360: 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 50  ot page of the P
e370: 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 74 68  RIMARY KEY is th
e380: 65 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67  e table root pag
e390: 65 20 2a 2f 0a 20 20 70 50 6b 2d 3e 74 6e 75 6d  e */.  pPk->tnum
e3a0: 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 0a   = pTab->tnum;..
e3b0: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
e3c0: 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
e3d0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20  entation of all 
e3e0: 55 4e 49 51 55 45 20 69 6e 64 69 63 65 73 20 62  UNIQUE indices b
e3f0: 79 20 63 6f 6e 76 65 72 74 69 6e 67 0a 20 20 2a  y converting.  *
e400: 2a 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69  * the final rowi
e410: 64 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20 6f 6e  d column into on
e420: 65 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e  e or more column
e430: 73 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59  s of the PRIMARY
e440: 20 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72   KEY..  */.  for
e450: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
e460: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
e470: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
e480: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28 20   int n;.    if( 
e490: 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
e4a0: 78 28 70 49 64 78 29 20 29 20 63 6f 6e 74 69 6e  x(pIdx) ) contin
e4b0: 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d  ue;.    for(i=n=
e4c0: 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a  0; i<nPk; i++){.
e4d0: 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f        if( !hasCo
e4e0: 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c  lumn(pIdx->aiCol
e4f0: 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43  umn, pIdx->nKeyC
e500: 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  ol, pPk->aiColum
e510: 6e 5b 69 5d 29 20 29 20 6e 2b 2b 3b 0a 20 20 20  n[i]) ) n++;.   
e520: 20 7d 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20   }.    if( n==0 
e530: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
e540: 20 69 6e 64 65 78 20 69 73 20 61 20 73 75 70 65   index is a supe
e550: 72 73 65 74 20 6f 66 20 74 68 65 20 70 72 69 6d  rset of the prim
e560: 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 20 20 20  ary key */.     
e570: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d   pIdx->nColumn =
e580: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a   pIdx->nKeyCol;.
e590: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
e5a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65      }.    if( re
e5b0: 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  sizeIndexObject(
e5c0: 64 62 2c 20 70 49 64 78 2c 20 70 49 64 78 2d 3e  db, pIdx, pIdx->
e5d0: 6e 4b 65 79 43 6f 6c 2b 6e 29 20 29 20 72 65 74  nKeyCol+n) ) ret
e5e0: 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  urn;.    for(i=0
e5f0: 2c 20 6a 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  , j=pIdx->nKeyCo
e600: 6c 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a  l; i<nPk; i++){.
e610: 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f        if( !hasCo
e620: 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c  lumn(pIdx->aiCol
e630: 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43  umn, pIdx->nKeyC
e640: 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  ol, pPk->aiColum
e650: 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  n[i]) ){.       
e660: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
e670: 6a 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  j] = pPk->aiColu
e680: 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 70  mn[i];.        p
e690: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d  Idx->azColl[j] =
e6a0: 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b   pPk->azColl[i];
e6b0: 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  .        j++;.  
e6c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
e6d0: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43  assert( pIdx->nC
e6e0: 6f 6c 75 6d 6e 3e 3d 70 49 64 78 2d 3e 6e 4b 65  olumn>=pIdx->nKe
e6f0: 79 43 6f 6c 2b 6e 20 29 3b 0a 20 20 20 20 61 73  yCol+n );.    as
e700: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
e710: 75 6d 6e 3e 3d 6a 20 29 3b 0a 20 20 7d 0a 0a 20  umn>=j );.  }.. 
e720: 20 2f 2a 20 41 64 64 20 61 6c 6c 20 74 61 62 6c   /* Add all tabl
e730: 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65  e columns to the
e740: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
e750: 65 78 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50  ex.  */.  if( nP
e760: 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  k<pTab->nCol ){.
e770: 20 20 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e      if( resizeIn
e780: 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 50  dexObject(db, pP
e790: 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  k, pTab->nCol) )
e7a0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72   return;.    for
e7b0: 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20 69 3c 70  (i=0, j=nPk; i<p
e7c0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
e7d0: 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43  .      if( !hasC
e7e0: 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c  olumn(pPk->aiCol
e7f0: 75 6d 6e 2c 20 6a 2c 20 69 29 20 29 7b 0a 20 20  umn, j, i) ){.  
e800: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
e810: 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  pPk->nColumn );.
e820: 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43          pPk->aiC
e830: 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a 20 20  olumn[j] = i;.  
e840: 20 20 20 20 20 20 70 50 6b 2d 3e 61 7a 43 6f 6c        pPk->azCol
e850: 6c 5b 6a 5d 20 3d 20 73 71 6c 69 74 65 33 53 74  l[j] = sqlite3St
e860: 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 20  rBINARY;.       
e870: 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   j++;.      }.  
e880: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
e890: 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20  pPk->nColumn==j 
e8a0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
e8b0: 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a  Tab->nCol==j );.
e8c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b    }else{.    pPk
e8d0: 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61 62  ->nColumn = pTab
e8e0: 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ->nCol;.  }.}../
e8f0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
e900: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  e is called to r
e910: 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20  eport the final 
e920: 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61  ")" that termina
e930: 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20  tes.** a CREATE 
e940: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
e950: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  .**.** The table
e960: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
e970: 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75  other action rou
e980: 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20  tines have been 
e990: 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61  building.** is a
e9a0: 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65  dded to the inte
e9b0: 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73  rnal hash tables
e9c0: 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72  , assuming no er
e9d0: 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63  rors have.** occ
e9e0: 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  urred..**.** An 
e9f0: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61  entry for the ta
ea00: 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74  ble is made in t
ea10: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
ea20: 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a  on disk, unless.
ea30: 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65 6d  ** this is a tem
ea40: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20  porary table or 
ea50: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
ea60: 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74  .  When db->init
ea70: 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d  .busy==1.** it m
ea80: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
ea90: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ing the sqlite_m
eaa0: 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61  aster table beca
eab0: 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63  use we just.** c
eac0: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20  onnected to the 
ead0: 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61  database or beca
eae0: 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  use the sqlite_m
eaf0: 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a  aster table has.
eb00: 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e  ** recently chan
eb10: 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74 72  ged, so the entr
eb20: 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65  y for this table
eb30: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
eb40: 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  in.** the sqlite
eb50: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20  _master table.  
eb60: 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  We do not want t
eb70: 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69  o create it agai
eb80: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
eb90: 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74  pSelect argument
eba0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74   is not NULL, it
ebb0: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
ebc0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20   routine.** was 
ebd0: 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
ebe0: 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74   a table generat
ebf0: 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43  ed from a .** "C
ec00: 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20  REATE TABLE ... 
ec10: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73  AS SELECT ..." s
ec20: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63  tatement.  The c
ec30: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a  olumn names of.*
ec40: 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * the new table 
ec50: 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72  will match the r
ec60: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
ec70: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64   SELECT..*/.void
ec80: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
ec90: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
eca0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
ecb0: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
ecc0: 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20    Token *pCons, 
ecd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
ece0: 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65 72   ',' token after
ecf0: 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
ed00: 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65   defn. */.  Toke
ed10: 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20  n *pEnd,        
ed20: 20 20 20 20 2f 2a 20 54 68 65 20 27 29 27 20 62      /* The ')' b
ed30: 65 66 6f 72 65 20 6f 70 74 69 6f 6e 73 20 69 6e  efore options in
ed40: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
ed50: 45 20 2a 2f 0a 20 20 75 38 20 74 61 62 4f 70 74  E */.  u8 tabOpt
ed60: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
ed70: 2a 20 45 78 74 72 61 20 74 61 62 6c 65 20 6f 70  * Extra table op
ed80: 74 69 6f 6e 73 2e 20 55 73 75 61 6c 6c 79 20 30  tions. Usually 0
ed90: 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  . */.  Select *p
eda0: 53 65 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f  Select         /
edb0: 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20  * Select from a 
edc0: 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53  "CREATE ... AS S
edd0: 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54  ELECT" */.){.  T
ede0: 61 62 6c 65 20 2a 70 3b 20 20 20 20 20 20 20 20  able *p;        
edf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
ee00: 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  new table */.  s
ee10: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
ee20: 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20  rse->db; /* The 
ee30: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
ee40: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ion */.  int iDb
ee50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ee60: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69     /* Database i
ee70: 6e 20 77 68 69 63 68 20 74 68 65 20 74 61 62 6c  n which the tabl
ee80: 65 20 6c 69 76 65 73 20 2a 2f 0a 20 20 49 6e 64  e lives */.  Ind
ee90: 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
eea0: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6d 70         /* An imp
eeb0: 6c 69 65 64 20 69 6e 64 65 78 20 6f 66 20 74 68  lied index of th
eec0: 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69 66  e table */..  if
eed0: 28 20 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65  ( pEnd==0 && pSe
eee0: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  lect==0 ){.    r
eef0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
ef00: 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
ef10: 46 61 69 6c 65 64 20 29 3b 0a 20 20 70 20 3d 20  Failed );.  p = 
ef20: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
ef30: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  e;.  if( p==0 ) 
ef40: 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
ef50: 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
ef60: 79 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b  y || !pSelect );
ef70: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62  ..  /* If the db
ef80: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31  ->init.busy is 1
ef90: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
efa0: 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c   reading the SQL
efb0: 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73   off the.  ** "s
efc0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72  qlite_master" or
efd0: 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61   "sqlite_temp_ma
efe0: 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74  ster" table on t
eff0: 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f  he disk..  ** So
f000: 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f   do not write to
f010: 20 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e   the disk again.
f020: 20 20 45 78 74 72 61 63 74 20 74 68 65 20 72 6f    Extract the ro
f030: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20  ot page number. 
f040: 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c   ** for the tabl
f050: 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69  e from the db->i
f060: 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c  nit.newTnum fiel
f070: 64 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e 75  d.  (The page nu
f080: 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  mber.  ** should
f090: 20 68 61 76 65 20 62 65 65 6e 20 70 75 74 20 74   have been put t
f0a0: 68 65 72 65 20 62 79 20 74 68 65 20 73 71 6c 69  here by the sqli
f0b0: 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65  teOpenCb routine
f0c0: 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  .).  **.  ** If 
f0d0: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
f0e0: 6d 62 65 72 20 69 73 20 31 2c 20 74 68 61 74 20  mber is 1, that 
f0f0: 6d 65 61 6e 73 20 74 68 69 73 20 69 73 20 74 68  means this is th
f100: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a  e sqlite_master.
f110: 20 20 2a 2a 20 74 61 62 6c 65 20 69 74 73 65 6c    ** table itsel
f120: 66 2e 20 20 53 6f 20 6d 61 72 6b 20 69 74 20 72  f.  So mark it r
f130: 65 61 64 2d 6f 6e 6c 79 2e 0a 20 20 2a 2f 0a 20  ead-only..  */. 
f140: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
f150: 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75  sy ){.    p->tnu
f160: 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  m = db->init.new
f170: 54 6e 75 6d 3b 0a 20 20 20 20 69 66 28 20 70 2d  Tnum;.    if( p-
f180: 3e 74 6e 75 6d 3d 3d 31 20 29 20 70 2d 3e 74 61  >tnum==1 ) p->ta
f190: 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 52 65 61  bFlags |= TF_Rea
f1a0: 64 6f 6e 6c 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  donly;.  }..  /*
f1b0: 20 53 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73   Special process
f1c0: 69 6e 67 20 66 6f 72 20 57 49 54 48 4f 55 54 20  ing for WITHOUT 
f1d0: 52 4f 57 49 44 20 54 61 62 6c 65 73 20 2a 2f 0a  ROWID Tables */.
f1e0: 20 20 69 66 28 20 74 61 62 4f 70 74 73 20 26 20    if( tabOpts & 
f1f0: 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20  TF_WithoutRowid 
f200: 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74  ){.    if( (p->t
f210: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74  abFlags & TF_Aut
f220: 6f 69 6e 63 72 65 6d 65 6e 74 29 20 29 7b 0a 20  oincrement) ){. 
f230: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
f240: 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
f250: 20 20 20 20 20 20 20 22 41 55 54 4f 49 4e 43 52         "AUTOINCR
f260: 45 4d 45 4e 54 20 6e 6f 74 20 61 6c 6c 6f 77 65  EMENT not allowe
f270: 64 20 6f 6e 20 57 49 54 48 4f 55 54 20 52 4f 57  d on WITHOUT ROW
f280: 49 44 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20  ID tables");.   
f290: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
f2a0: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62  .    if( (p->tab
f2b0: 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50 72  Flags & TF_HasPr
f2c0: 69 6d 61 72 79 4b 65 79 29 3d 3d 30 20 29 7b 0a  imaryKey)==0 ){.
f2d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
f2e0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 50  orMsg(pParse, "P
f2f0: 52 49 4d 41 52 59 20 4b 45 59 20 6d 69 73 73 69  RIMARY KEY missi
f300: 6e 67 20 6f 6e 20 74 61 62 6c 65 20 25 73 22 2c  ng on table %s",
f310: 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20   p->zName);.    
f320: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
f330: 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 57  tabFlags |= TF_W
f340: 69 74 68 6f 75 74 52 6f 77 69 64 20 7c 20 54 46  ithoutRowid | TF
f350: 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b  _NoVisibleRowid;
f360: 0a 20 20 20 20 20 20 63 6f 6e 76 65 72 74 54 6f  .      convertTo
f370: 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c  WithoutRowidTabl
f380: 65 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  e(pParse, p);.  
f390: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 44 62 20 3d    }.  }..  iDb =
f3a0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
f3b0: 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63  Index(db, p->pSc
f3c0: 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20  hema);..#ifndef 
f3d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
f3e0: 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e  K.  /* Resolve n
f3f0: 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48 45 43  ames in all CHEC
f400: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 70  K constraint exp
f410: 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ressions..  */. 
f420: 20 69 66 28 20 70 2d 3e 70 43 68 65 63 6b 20 29   if( p->pCheck )
f430: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
f440: 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63  olveSelfReferenc
f450: 65 28 70 50 61 72 73 65 2c 20 70 2c 20 4e 43 5f  e(pParse, p, NC_
f460: 49 73 43 68 65 63 6b 2c 20 30 2c 20 70 2d 3e 70  IsCheck, 0, p->p
f470: 43 68 65 63 6b 29 3b 0a 20 20 7d 0a 23 65 6e 64  Check);.  }.#end
f480: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
f490: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
f4a0: 29 20 2a 2f 0a 0a 20 20 2f 2a 20 45 73 74 69 6d  ) */..  /* Estim
f4b0: 61 74 65 20 74 68 65 20 61 76 65 72 61 67 65 20  ate the average 
f4c0: 72 6f 77 20 73 69 7a 65 20 66 6f 72 20 74 68 65  row size for the
f4d0: 20 74 61 62 6c 65 20 61 6e 64 20 66 6f 72 20 61   table and for a
f4e0: 6c 6c 20 69 6d 70 6c 69 65 64 20 69 6e 64 69 63  ll implied indic
f4f0: 65 73 20 2a 2f 0a 20 20 65 73 74 69 6d 61 74 65  es */.  estimate
f500: 54 61 62 6c 65 57 69 64 74 68 28 70 29 3b 0a 20  TableWidth(p);. 
f510: 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e   for(pIdx=p->pIn
f520: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
f530: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
f540: 20 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57    estimateIndexW
f550: 69 64 74 68 28 70 49 64 78 29 3b 0a 20 20 7d 0a  idth(pIdx);.  }.
f560: 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69  .  /* If not ini
f570: 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20  tializing, then 
f580: 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20  create a record 
f590: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
f5a0: 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51  e.  ** in the SQ
f5b0: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
f5c0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
f5d0: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e..  **.  ** If 
f5e0: 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52  this is a TEMPOR
f5f0: 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65  ARY table, write
f600: 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20   the entry into 
f610: 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20  the auxiliary.  
f620: 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  ** file instead 
f630: 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  of into the main
f640: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
f650: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
f660: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
f670: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65   int n;.    Vdbe
f680: 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   *v;.    char *z
f690: 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65  Type;    /* "vie
f6a0: 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f  w" or "table" */
f6b0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65  .    char *zType
f6c0: 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f  2;   /* "VIEW" o
f6d0: 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20  r "TABLE" */.   
f6e0: 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20   char *zStmt;   
f6f0: 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20   /* Text of the 
f700: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20  CREATE TABLE or 
f710: 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74  CREATE VIEW stat
f720: 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20  ement */..    v 
f730: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
f740: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
f750: 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
f760: 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c  return;..    sql
f770: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
f780: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a  , OP_Close, 0);.
f790: 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20  .    /* .    ** 
f7a0: 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65  Initialize zType
f7b0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69 65   for the new vie
f7c0: 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20 20  w or table..    
f7d0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53  */.    if( p->pS
f7e0: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
f7f0: 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74    /* A regular t
f800: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54  able */.      zT
f810: 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20  ype = "table";. 
f820: 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54       zType2 = "T
f830: 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53  ABLE";.#ifndef S
f840: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
f850: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f860: 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20   /* A view */.  
f870: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65      zType = "vie
f880: 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32  w";.      zType2
f890: 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69   = "VIEW";.#endi
f8a0: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
f8b0: 49 66 20 74 68 69 73 20 69 73 20 61 20 43 52 45  If this is a CRE
f8c0: 41 54 45 20 54 41 42 4c 45 20 78 78 20 41 53 20  ATE TABLE xx AS 
f8d0: 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63  SELECT ..., exec
f8e0: 75 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20  ute the SELECT. 
f8f0: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
f900: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
f910: 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72  new table. The r
f920: 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20  oot-page number 
f930: 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  for the.    ** n
f940: 65 77 20 74 61 62 6c 65 20 69 73 20 69 6e 20 72  ew table is in r
f950: 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e  egister pParse->
f960: 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a  regRoot..    **.
f970: 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20      ** Once the 
f980: 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20  SELECT has been 
f990: 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65 33  coded by sqlite3
f9a0: 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20  Select(), it is 
f9b0: 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74  in a.    ** suit
f9c0: 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75  able state to qu
f9d0: 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ery for the colu
f9e0: 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70  mn names and typ
f9f0: 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20  es to be used.  
fa00: 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20    ** by the new 
fa10: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  table..    **.  
fa20: 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63 61    ** A shared-ca
fa30: 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69  che write-lock i
fa40: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74  s not required t
fa50: 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6e  o write to the n
fa60: 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a  ew table,.    **
fa70: 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63   as a schema-loc
fa80: 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  k must have alre
fa90: 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  ady been obtaine
faa0: 64 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e 20  d to create it. 
fab0: 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20 73  Since.    ** a s
fac0: 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75  chema-lock exclu
fad0: 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64 61  des all other da
fae0: 74 61 62 61 73 65 20 75 73 65 72 73 2c 20 74 68  tabase users, th
faf0: 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75  e write-lock wou
fb00: 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 64  ld.    ** be red
fb10: 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20  undant..    */. 
fb20: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
fb30: 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65  {.      SelectDe
fb40: 73 74 20 64 65 73 74 3b 20 20 20 20 2f 2a 20 57  st dest;    /* W
fb50: 68 65 72 65 20 74 68 65 20 53 45 4c 45 43 54 20  here the SELECT 
fb60: 73 68 6f 75 6c 64 20 73 74 6f 72 65 20 72 65 73  should store res
fb70: 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ults */.      in
fb80: 74 20 72 65 67 59 69 65 6c 64 3b 20 20 20 20 20  t regYield;     
fb90: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
fba0: 6c 64 69 6e 67 20 63 6f 2d 72 6f 75 74 69 6e 65  lding co-routine
fbb0: 20 65 6e 74 72 79 2d 70 6f 69 6e 74 20 2a 2f 0a   entry-point */.
fbc0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f        int addrTo
fbd0: 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70  p;        /* Top
fbe0: 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75 74 69   of the co-routi
fbf0: 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ne */.      int 
fc00: 72 65 67 52 65 63 3b 20 20 20 20 20 20 20 20 20  regRec;         
fc10: 2f 2a 20 41 20 72 65 63 6f 72 64 20 74 6f 20 62  /* A record to b
fc20: 65 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 68  e insert into th
fc30: 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20  e new table */. 
fc40: 20 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69       int regRowi
fc50: 64 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  d;       /* Rowi
fc60: 64 20 6f 66 20 74 68 65 20 6e 65 78 74 20 72 6f  d of the next ro
fc70: 77 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20  w to insert */. 
fc80: 20 20 20 20 20 69 6e 74 20 61 64 64 72 49 6e 73       int addrIns
fc90: 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 6f 70 20  Loop;    /* Top 
fca0: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
fcb0: 69 6e 73 65 72 74 69 6e 67 20 72 6f 77 73 20 2a  inserting rows *
fcc0: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
fcd0: 53 65 6c 54 61 62 3b 20 20 20 20 20 2f 2a 20 41  SelTab;     /* A
fce0: 20 74 61 62 6c 65 20 74 68 61 74 20 64 65 73 63   table that desc
fcf0: 72 69 62 65 73 20 74 68 65 20 53 45 4c 45 43 54  ribes the SELECT
fd00: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 20   results */..   
fd10: 20 20 20 72 65 67 59 69 65 6c 64 20 3d 20 2b 2b     regYield = ++
fd20: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
fd30: 20 20 20 20 72 65 67 52 65 63 20 3d 20 2b 2b 70      regRec = ++p
fd40: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
fd50: 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b     regRowid = ++
fd60: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
fd70: 20 20 20 20 61 73 73 65 72 74 28 70 50 61 72 73      assert(pPars
fd80: 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20 20 20  e->nTab==1);.   
fd90: 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f     sqlite3MayAbo
fda0: 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  rt(pParse);.    
fdb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fdc0: 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  Op3(v, OP_OpenWr
fdd0: 69 74 65 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e  ite, 1, pParse->
fde0: 72 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20  regRoot, iDb);. 
fdf0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fe00: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
fe10: 41 47 5f 50 32 49 53 52 45 47 29 3b 0a 20 20 20  AG_P2ISREG);.   
fe20: 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20     pParse->nTab 
fe30: 3d 20 32 3b 0a 20 20 20 20 20 20 61 64 64 72 54  = 2;.      addrT
fe40: 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
fe50: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
fe60: 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
fe70: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
fe80: 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c  P_InitCoroutine,
fe90: 20 72 65 67 59 69 65 6c 64 2c 20 30 2c 20 61 64   regYield, 0, ad
fea0: 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 73 71  drTop);.      sq
feb0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
fec0: 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43  nit(&dest, SRT_C
fed0: 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65  oroutine, regYie
fee0: 6c 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ld);.      sqlit
fef0: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
ff00: 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29   pSelect, &dest)
ff10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ff20: 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28  dbeEndCoroutine(
ff30: 76 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20  v, regYield);.  
ff40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
ff50: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
ff60: 6f 70 20 2d 20 31 29 3b 0a 20 20 20 20 20 20 69  op - 1);.      i
ff70: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
ff80: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
ff90: 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
ffa0: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
ffb0: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ct(pParse, pSele
ffc0: 63 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ct);.      if( p
ffd0: 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75  SelTab==0 ) retu
ffe0: 72 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  rn;.      assert
fff0: 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ( p->aCol==0 );.
10000 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20        p->nCol = 
10010 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
10020 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70       p->aCol = p
10030 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  SelTab->aCol;.  
10040 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f      pSelTab->nCo
10050 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65  l = 0;.      pSe
10060 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  lTab->aCol = 0;.
10070 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
10080 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53 65  eteTable(db, pSe
10090 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 61 64 64  lTab);.      add
100a0 72 49 6e 73 4c 6f 6f 70 20 3d 20 73 71 6c 69 74  rInsLoop = sqlit
100b0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
100c0 4f 50 5f 59 69 65 6c 64 2c 20 64 65 73 74 2e 69  OP_Yield, dest.i
100d0 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 56  SDParm);.      V
100e0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
100f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10100 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
10110 6b 65 52 65 63 6f 72 64 2c 20 64 65 73 74 2e 69  keRecord, dest.i
10120 53 64 73 74 2c 20 64 65 73 74 2e 6e 53 64 73 74  Sdst, dest.nSdst
10130 2c 20 72 65 67 52 65 63 29 3b 0a 20 20 20 20 20  , regRec);.     
10140 20 73 71 6c 69 74 65 33 54 61 62 6c 65 41 66 66   sqlite3TableAff
10150 69 6e 69 74 79 28 76 2c 20 70 2c 20 30 29 3b 0a  inity(v, p, 0);.
10160 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10170 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
10180 77 52 6f 77 69 64 2c 20 31 2c 20 72 65 67 52 6f  wRowid, 1, regRo
10190 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
101a0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
101b0 20 4f 50 5f 49 6e 73 65 72 74 2c 20 31 2c 20 72   OP_Insert, 1, r
101c0 65 67 52 65 63 2c 20 72 65 67 52 6f 77 69 64 29  egRec, regRowid)
101d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
101e0 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 49  dbeGoto(v, addrI
101f0 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73  nsLoop);.      s
10200 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
10210 72 65 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f 6f  re(v, addrInsLoo
10220 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
10230 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
10240 50 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a 20 20 20  P_Close, 1);.   
10250 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75   }..    /* Compu
10260 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  te the complete 
10270 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  text of the CREA
10280 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  TE statement */.
10290 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
102a0 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  ){.      zStmt =
102b0 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74   createTableStmt
102c0 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c  (db, p);.    }el
102d0 73 65 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20  se{.      Token 
102e0 2a 70 45 6e 64 32 20 3d 20 74 61 62 4f 70 74 73  *pEnd2 = tabOpts
102f0 20 3f 20 26 70 50 61 72 73 65 2d 3e 73 4c 61 73   ? &pParse->sLas
10300 74 54 6f 6b 65 6e 20 3a 20 70 45 6e 64 3b 0a 20  tToken : pEnd;. 
10310 20 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70       n = (int)(p
10320 45 6e 64 32 2d 3e 7a 20 2d 20 70 50 61 72 73 65  End2->z - pParse
10330 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b  ->sNameToken.z);
10340 0a 20 20 20 20 20 20 69 66 28 20 70 45 6e 64 32  .      if( pEnd2
10350 2d 3e 7a 5b 30 5d 21 3d 27 3b 27 20 29 20 6e 20  ->z[0]!=';' ) n 
10360 2b 3d 20 70 45 6e 64 32 2d 3e 6e 3b 0a 20 20 20  += pEnd2->n;.   
10370 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74     zStmt = sqlit
10380 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20  e3MPrintf(db, . 
10390 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
103a0 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65   %s %.*s", zType
103b0 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e  2, n, pParse->sN
103c0 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20  ameToken.z.     
103d0 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   );.    }..    /
103e0 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68 65  * A slot for the
103f0 20 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72 65   record has alre
10400 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
10410 65 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20 2a  ed in the .    *
10420 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  * SQLITE_MASTER 
10430 74 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74 20  table.  We just 
10440 6e 65 65 64 20 74 6f 20 75 70 64 61 74 65 20 74  need to update t
10450 68 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61 6c  hat slot with al
10460 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 66  l.    ** the inf
10470 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20 63  ormation we've c
10480 6f 6c 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a 2f  ollected..    */
10490 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
104a0 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
104b0 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51        "UPDATE %Q
104c0 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20 20 22  .%s ".         "
104d0 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e  SET type='%s', n
104e0 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65  ame=%Q, tbl_name
104f0 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 25  =%Q, rootpage=#%
10500 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20  d, sql=%Q ".    
10510 20 20 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d     "WHERE rowid=
10520 23 25 64 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e  #%d",.      db->
10530 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
10540 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a  e, MASTER_NAME,.
10550 20 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20        zType,.   
10560 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20     p->zName,.   
10570 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20     p->zName,.   
10580 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f     pParse->regRo
10590 6f 74 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c  ot,.      zStmt,
105a0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
105b0 65 67 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20  egRowid.    );. 
105c0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
105d0 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20  (db, zStmt);.   
105e0 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
105f0 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62  okie(pParse, iDb
10600 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
10610 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
10620 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65  EMENT.    /* Che
10630 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20  ck to see if we 
10640 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  need to create a
10650 6e 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  n sqlite_sequenc
10660 65 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20  e table for.    
10670 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b  ** keeping track
10680 20 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e   of autoincremen
10690 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20  t keys..    */. 
106a0 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c     if( (p->tabFl
106b0 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63  ags & TF_Autoinc
106c0 72 65 6d 65 6e 74 29 21 3d 30 20 29 7b 0a 20 20  rement)!=0 ){.  
106d0 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
106e0 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20  b->aDb[iDb];.   
106f0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
10700 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
10710 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
10720 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
10730 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62  pSchema->pSeqTab
10740 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
10750 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
10760 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
10770 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
10780 45 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75  E %Q.sqlite_sequ
10790 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c  ence(name,seq)",
107a0 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e  .          pDb->
107b0 7a 44 62 53 4e 61 6d 65 0a 20 20 20 20 20 20 20  zDbSName.       
107c0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
107d0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
107e0 20 52 65 70 61 72 73 65 20 65 76 65 72 79 74 68   Reparse everyth
107f0 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f 75  ing to update ou
10800 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20  r internal data 
10810 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20  structures */.  
10820 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10830 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 70 50  ParseSchemaOp(pP
10840 61 72 73 65 2c 20 69 44 62 2c 0a 20 20 20 20 20  arse, iDb,.     
10850 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
10860 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e 61  intf(db, "tbl_na
10870 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65  me='%q' AND type
10880 21 3d 27 74 72 69 67 67 65 72 27 22 2c 20 70 2d  !='trigger'", p-
10890 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 0a  >zName));.  }...
108a0 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62    /* Add the tab
108b0 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d  le to the in-mem
108c0 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
108d0 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  on of the databa
108e0 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  se..  */.  if( d
108f0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
10900 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b      Table *pOld;
10910 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63  .    Schema *pSc
10920 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d  hema = p->pSchem
10930 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  a;.    assert( s
10940 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
10950 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
10960 29 20 29 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20  ) );.    pOld = 
10970 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
10980 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  t(&pSchema->tblH
10990 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70  ash, p->zName, p
109a0 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20  );.    if( pOld 
109b0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
109c0 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20   p==pOld );  /* 
109d0 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
109e0 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48   failed inside H
109f0 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20  ashInsert() */. 
10a00 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46       sqlite3OomF
10a10 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20  ault(db);.      
10a20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
10a30 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
10a40 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  ble = 0;.    db-
10a50 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46  >mDbFlags |= DBF
10a60 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65  LAG_SchemaChange
10a70 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
10a80 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c  E_OMIT_ALTERTABL
10a90 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 70 53  E.    if( !p->pS
10aa0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 63  elect ){.      c
10ab0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
10ac0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
10ad0 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f  )pParse->sNameTo
10ae0 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74  ken.z;.      int
10af0 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61 73   nName;.      as
10b00 73 65 72 74 28 20 21 70 53 65 6c 65 63 74 20 26  sert( !pSelect &
10b10 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e 64 20  & pCons && pEnd 
10b20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  );.      if( pCo
10b30 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  ns->z==0 ){.    
10b40 20 20 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64      pCons = pEnd
10b50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10b60 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29 28 28 63  nName = (int)((c
10b70 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6e  onst char *)pCon
10b80 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20  s->z - zName);. 
10b90 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66       p->addColOf
10ba0 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71 6c 69  fset = 13 + sqli
10bb0 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e 28 7a  te3Utf8CharLen(z
10bc0 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20  Name, nName);.  
10bd0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
10be0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10bf0 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a  _OMIT_VIEW./*.**
10c00 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
10c10 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  s this routine i
10c20 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74  n order to creat
10c30 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a  e a new VIEW.*/.
10c40 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61  void sqlite3Crea
10c50 74 65 56 69 65 77 28 0a 20 20 50 61 72 73 65 20  teView(.  Parse 
10c60 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
10c70 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
10c80 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
10c90 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54  pBegin,     /* T
10ca0 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20  he CREATE token 
10cb0 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 65 20  that begins the 
10cc0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54  statement */.  T
10cd0 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
10ce0 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74    /* The token t
10cf0 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61  hat holds the na
10d00 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a  me of the view *
10d10 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
10d20 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f  2,     /* The to
10d30 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ken that holds t
10d40 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
10d50 69 65 77 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  iew */.  ExprLis
10d60 74 20 2a 70 43 4e 61 6d 65 73 2c 20 2f 2a 20 4f  t *pCNames, /* O
10d70 70 74 69 6f 6e 61 6c 20 6c 69 73 74 20 6f 66 20  ptional list of 
10d80 76 69 65 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  view column name
10d90 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  s */.  Select *p
10da0 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53  Select,   /* A S
10db0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
10dc0 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
10dd0 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f   the new view */
10de0 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20  .  int isTemp,  
10df0 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f        /* TRUE fo
10e00 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69  r a TEMPORARY vi
10e10 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72  ew */.  int noEr
10e20 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75  r          /* Su
10e30 70 70 72 65 73 73 20 65 72 72 6f 72 20 6d 65 73  ppress error mes
10e40 73 61 67 65 73 20 69 66 20 56 49 45 57 20 61 6c  sages if VIEW al
10e50 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
10e60 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
10e70 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20   int n;.  const 
10e80 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e  char *z;.  Token
10e90 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72   sEnd;.  DbFixer
10ea0 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a   sFix;.  Token *
10eb0 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pName = 0;.  int
10ec0 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 20   iDb;.  sqlite3 
10ed0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
10ee0 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
10ef0 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 73  >nVar>0 ){.    s
10f00 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
10f10 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65 74 65  Parse, "paramete
10f20 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77  rs are not allow
10f30 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b 0a 20  ed in views");. 
10f40 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76     goto create_v
10f50 69 65 77 5f 66 61 69 6c 3b 0a 20 20 7d 0a 20 20  iew_fail;.  }.  
10f60 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
10f70 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
10f80 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70  , pName2, isTemp
10f90 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a  , 1, 0, noErr);.
10fa0 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
10fb0 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
10fc0 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
10fd0 45 72 72 20 29 20 67 6f 74 6f 20 63 72 65 61 74  Err ) goto creat
10fe0 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20 73  e_view_fail;.  s
10ff0 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
11000 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
11010 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
11020 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  );.  iDb = sqlit
11030 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
11040 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b  db, p->pSchema);
11050 0a 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  .  sqlite3FixIni
11060 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
11070 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e   iDb, "view", pN
11080 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ame);.  if( sqli
11090 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46  te3FixSelect(&sF
110a0 69 78 2c 20 70 53 65 6c 65 63 74 29 20 29 20 67  ix, pSelect) ) g
110b0 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f  oto create_view_
110c0 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  fail;..  /* Make
110d0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65   a copy of the e
110e0 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74 61  ntire SELECT sta
110f0 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69  tement that defi
11100 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20  nes the view..  
11110 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72  ** This will for
11120 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e  ce all the Expr.
11130 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74  token.z values t
11140 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79  o be dynamically
11150 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  .  ** allocated 
11160 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e  rather than poin
11170 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73  t to the input s
11180 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65  tring - which me
11190 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ans that.  ** th
111a0 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20  ey will persist 
111b0 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e  after the curren
111c0 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  t sqlite3_exec()
111d0 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20   call returns.. 
111e0 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74   */.  p->pSelect
111f0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
11200 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74 2c  Dup(db, pSelect,
11210 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29   EXPRDUP_REDUCE)
11220 3b 0a 20 20 70 2d 3e 70 43 68 65 63 6b 20 3d 20  ;.  p->pCheck = 
11230 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
11240 75 70 28 64 62 2c 20 70 43 4e 61 6d 65 73 2c 20  up(db, pCNames, 
11250 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b  EXPRDUP_REDUCE);
11260 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
11270 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 63  cFailed ) goto c
11280 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b  reate_view_fail;
11290 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
112a0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45  e end of the CRE
112b0 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65  ATE VIEW stateme
112c0 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70  nt.  Make sEnd p
112d0 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65  oint to.  ** the
112e0 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e   end..  */.  sEn
112f0 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73  d = pParse->sLas
11300 74 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74  tToken;.  assert
11310 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 29  ( sEnd.z[0]!=0 )
11320 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30  ;.  if( sEnd.z[0
11330 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45  ]!=';' ){.    sE
11340 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a  nd.z += sEnd.n;.
11350 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30    }.  sEnd.n = 0
11360 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28 73 45  ;.  n = (int)(sE
11370 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a  nd.z - pBegin->z
11380 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30  );.  assert( n>0
11390 20 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e   );.  z = pBegin
113a0 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 73 71  ->z;.  while( sq
113b0 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 6e  lite3Isspace(z[n
113c0 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20  -1]) ){ n--; }. 
113d0 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31   sEnd.z = &z[n-1
113e0 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b  ];.  sEnd.n = 1;
113f0 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74  ..  /* Use sqlit
11400 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20  e3EndTable() to 
11410 61 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20  add the view to 
11420 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
11430 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  R table */.  sql
11440 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61  ite3EndTable(pPa
11450 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30  rse, 0, &sEnd, 0
11460 2c 20 30 29 3b 0a 0a 63 72 65 61 74 65 5f 76 69  , 0);..create_vi
11470 65 77 5f 66 61 69 6c 3a 0a 20 20 73 71 6c 69 74  ew_fail:.  sqlit
11480 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
11490 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 73  b, pSelect);.  s
114a0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
114b0 6c 65 74 65 28 64 62 2c 20 70 43 4e 61 6d 65 73  lete(db, pCNames
114c0 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23  );.  return;.}.#
114d0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
114e0 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69  OMIT_VIEW */..#i
114f0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
11500 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
11510 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
11520 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
11530 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62  E)./*.** The Tab
11540 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61  le structure pTa
11550 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ble is really a 
11560 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74  VIEW.  Fill in t
11570 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74  he names of.** t
11580 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
11590 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54  e view in the pT
115a0 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20  able structure. 
115b0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
115c0 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e  er.** of errors.
115d0 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73    If an error is
115e0 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65   seen leave an e
115f0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
11600 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
11610 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
11620 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
11630 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
11640 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
11650 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61  .  Table *pSelTa
11660 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74  b;   /* A fake t
11670 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20  able from which 
11680 77 65 20 67 65 74 20 74 68 65 20 72 65 73 75 6c  we get the resul
11690 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63  t set */.  Selec
116a0 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20  t *pSel;     /* 
116b0 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  Copy of the SELE
116c0 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  CT that implemen
116d0 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  ts the view */. 
116e0 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20   int nErr = 0;  
116f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11700 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72  errors encounter
11710 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  ed */.  int n;  
11720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
11730 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74  porarily holds t
11740 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72  he number of cur
11750 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f  sors assigned */
11760 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
11770 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a   pParse->db;  /*
11780 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
11790 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20  tion for malloc 
117a0 65 72 72 6f 72 73 20 2a 2f 0a 23 69 66 6e 64 65  errors */.#ifnde
117b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
117c0 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 73 71  THORIZATION.  sq
117d0 6c 69 74 65 33 5f 78 61 75 74 68 20 78 41 75 74  lite3_xauth xAut
117e0 68 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65  h;       /* Save
117f0 64 20 78 41 75 74 68 20 70 6f 69 6e 74 65 72 20  d xAuth pointer 
11800 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  */.#endif..  ass
11810 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a  ert( pTable );..
11820 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11830 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
11840 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 74  .  if( sqlite3Vt
11850 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50  abCallConnect(pP
11860 61 72 73 65 2c 20 70 54 61 62 6c 65 29 20 29 7b  arse, pTable) ){
11870 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11880 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
11890 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
118a0 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30  able) ) return 0
118b0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ;.#endif..#ifnde
118c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
118d0 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69  EW.  /* A positi
118e0 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68  ve nCol means th
118f0 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20  e columns names 
11900 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61 72  for this view ar
11910 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b  e.  ** already k
11920 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nown..  */.  if(
11930 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20   pTable->nCol>0 
11940 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
11950 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * A negative nCo
11960 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d  l is a special m
11970 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68  arker meaning th
11980 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e  at we are curren
11990 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20  tly.  ** trying 
119a0 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63  to compute the c
119b0 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66  olumn names.  If
119c0 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20 72   we enter this r
119d0 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a  outine with.  **
119e0 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c   a negative nCol
119f0 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f  , it means two o
11a00 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72  r more views for
11a10 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74  m a loop, like t
11a20 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  his:.  **.  **  
11a30 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 6f     CREATE VIEW o
11a40 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  ne AS SELECT * F
11a50 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20  ROM two;.  **   
11a60 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74 77    CREATE VIEW tw
11a70 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  o AS SELECT * FR
11a80 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a  OM one;.  **.  *
11a90 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20  * Actually, the 
11aa0 65 72 72 6f 72 20 61 62 6f 76 65 20 69 73 20 6e  error above is n
11ab0 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f 72 20  ow caught prior 
11ac0 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68 69 73  to reaching this
11ad0 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74   point..  ** But
11ae0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
11af0 65 73 74 20 69 73 20 73 74 69 6c 6c 20 69 6d 70  est is still imp
11b00 6f 72 74 61 6e 74 20 61 73 20 69 74 20 64 6f 65  ortant as it doe
11b10 73 20 63 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69  s come up.  ** i
11b20 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  n the following:
11b30 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20  .  ** .  **     
11b40 43 52 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69  CREATE TABLE mai
11b50 6e 2e 65 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20  n.ex1(a);.  **  
11b60 20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20 56     CREATE TEMP V
11b70 49 45 57 20 65 78 31 20 41 53 20 53 45 4c 45 43  IEW ex1 AS SELEC
11b80 54 20 61 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20  T a FROM ex1;.  
11b90 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  **     SELECT * 
11ba0 46 52 4f 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20  FROM temp.ex1;. 
11bb0 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
11bc0 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ->nCol<0 ){.    
11bd0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
11be0 70 50 61 72 73 65 2c 20 22 76 69 65 77 20 25 73  pParse, "view %s
11bf0 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64   is circularly d
11c00 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d  efined", pTable-
11c10 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
11c20 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 1;.  }.  ass
11c30 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  ert( pTable->nCo
11c40 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  l>=0 );..  /* If
11c50 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
11c60 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65  , it means we ne
11c70 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
11c80 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20  e table names.. 
11c90 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
11ca0 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
11cb0 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
11cc0 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64  ct() will expand
11cd0 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c   any.  ** "*" el
11ce0 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65  ements in the re
11cf0 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65  sults set of the
11d00 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61   view and will a
11d10 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20  ssign cursors.  
11d20 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e  ** to the elemen
11d30 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ts of the FROM c
11d40 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65 20 64  lause.  But we d
11d50 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65  o not want these
11d60 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f   changes.  ** to
11d70 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20   be permanent.  
11d80 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  So the computati
11d90 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20  on is done on a 
11da0 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  copy of the SELE
11db0 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  CT.  ** statemen
11dc0 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
11dd0 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20  he view..  */.  
11de0 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
11df0 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65  pSelect );.  pSe
11e00 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  l = sqlite3Selec
11e10 74 44 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d  tDup(db, pTable-
11e20 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  >pSelect, 0);.  
11e30 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20  if( pSel ){.    
11e40 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  n = pParse->nTab
11e50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63  ;.    sqlite3Src
11e60 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
11e70 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e  s(pParse, pSel->
11e80 70 53 72 63 29 3b 0a 20 20 20 20 70 54 61 62 6c  pSrc);.    pTabl
11e90 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20  e->nCol = -1;.  
11ea0 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
11eb0 62 44 69 73 61 62 6c 65 2b 2b 3b 0a 23 69 66 6e  bDisable++;.#ifn
11ec0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11ed0 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
11ee0 20 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78 41    xAuth = db->xA
11ef0 75 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75  uth;.    db->xAu
11f00 74 68 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c  th = 0;.    pSel
11f10 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
11f20 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
11f30 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 20 20  Parse, pSel);.  
11f40 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 78 41    db->xAuth = xA
11f50 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70  uth;.#else.    p
11f60 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
11f70 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
11f80 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b  t(pParse, pSel);
11f90 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 72  .#endif.    pPar
11fa0 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20  se->nTab = n;.  
11fb0 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 70 43    if( pTable->pC
11fc0 68 65 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  heck ){.      /*
11fd0 20 43 52 45 41 54 45 20 56 49 45 57 20 6e 61 6d   CREATE VIEW nam
11fe0 65 28 61 72 67 6c 69 73 74 29 20 41 53 20 2e 2e  e(arglist) AS ..
11ff0 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6e  ..      ** The n
12000 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75  ames of the colu
12010 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  mns in the table
12020 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 0a   are taken from.
12030 20 20 20 20 20 20 2a 2a 20 61 72 67 6c 69 73 74        ** arglist
12040 20 77 68 69 63 68 20 69 73 20 73 74 6f 72 65 64   which is stored
12050 20 69 6e 20 70 54 61 62 6c 65 2d 3e 70 43 68 65   in pTable->pChe
12060 63 6b 2e 20 20 54 68 65 20 70 43 68 65 63 6b 20  ck.  The pCheck 
12070 66 69 65 6c 64 0a 20 20 20 20 20 20 2a 2a 20 6e  field.      ** n
12080 6f 72 6d 61 6c 6c 79 20 68 6f 6c 64 73 20 43 48  ormally holds CH
12090 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ECK constraints 
120a0 6f 6e 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 74  on an ordinary t
120b0 61 62 6c 65 2c 20 62 75 74 20 66 6f 72 0a 20 20  able, but for.  
120c0 20 20 20 20 2a 2a 20 61 20 56 49 45 57 20 69 74      ** a VIEW it
120d0 20 68 6f 6c 64 73 20 74 68 65 20 6c 69 73 74 20   holds the list 
120e0 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e  of column names.
120f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
12100 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72  sqlite3ColumnsFr
12110 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
12120 65 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63  e, pTable->pChec
12130 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  k, .            
12140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12150 20 20 20 20 20 26 70 54 61 62 6c 65 2d 3e 6e 43       &pTable->nC
12160 6f 6c 2c 20 26 70 54 61 62 6c 65 2d 3e 61 43 6f  ol, &pTable->aCo
12170 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  l);.      if( db
12180 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
12190 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 50 61  0 .       && pPa
121a0 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 0a 20 20 20  rse->nErr==0.   
121b0 20 20 20 20 26 26 20 70 54 61 62 6c 65 2d 3e 6e      && pTable->n
121c0 43 6f 6c 3d 3d 70 53 65 6c 2d 3e 70 45 4c 69 73  Col==pSel->pELis
121d0 74 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 29  t->nExpr.      )
121e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
121f0 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e  3SelectAddColumn
12200 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
12210 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 2c  (pParse, pTable,
12220 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a   pSel);.      }.
12230 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53      }else if( pS
12240 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20 2f  elTab ){.      /
12250 2a 20 43 52 45 41 54 45 20 56 49 45 57 20 6e 61  * CREATE VIEW na
12260 6d 65 20 41 53 2e 2e 2e 20 20 77 69 74 68 6f 75  me AS...  withou
12270 74 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 6c 69  t an argument li
12280 73 74 2e 20 20 43 6f 6e 73 74 72 75 63 74 0a 20  st.  Construct. 
12290 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6c 75       ** the colu
122a0 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74 68  mn names from th
122b0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
122c0 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  nt that defines 
122d0 74 68 65 20 76 69 65 77 2e 0a 20 20 20 20 20 20  the view..      
122e0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
122f0 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30   pTable->aCol==0
12300 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65   );.      pTable
12310 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->nCol = pSelTab
12320 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54  ->nCol;.      pT
12330 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65  able->aCol = pSe
12340 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  lTab->aCol;.    
12350 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20    pSelTab->nCol 
12360 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54  = 0;.      pSelT
12370 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
12380 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
12390 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
123a0 6c 64 28 64 62 2c 20 30 2c 20 70 54 61 62 6c 65  ld(db, 0, pTable
123b0 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
123c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
123d0 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
123e0 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20  .      nErr++;. 
123f0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
12400 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
12410 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 73 71  pSelTab);.    sq
12420 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
12430 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20  e(db, pSel);.   
12440 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
12450 44 69 73 61 62 6c 65 2d 2d 3b 0a 20 20 7d 20 65  Disable--;.  } e
12460 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b  lse {.    nErr++
12470 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e  ;.  }.  pTable->
12480 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 46  pSchema->schemaF
12490 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73  lags |= DB_Unres
124a0 65 74 56 69 65 77 73 3b 0a 23 65 6e 64 69 66 20  etViews;.#endif 
124b0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
124c0 49 45 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  IEW */.  return 
124d0 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66  nErr;  .}.#endif
124e0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
124f0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
12500 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
12510 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
12520 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  BLE) */..#ifndef
12530 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
12540 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  W./*.** Clear th
12550 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  e column names f
12560 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20 69  rom every VIEW i
12570 6e 20 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a  n database idx..
12580 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
12590 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
125a0 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  l(sqlite3 *db, i
125b0 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45  nt idx){.  HashE
125c0 6c 65 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72 74  lem *i;.  assert
125d0 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
125e0 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 64 78  utexHeld(db, idx
125f0 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20 21 44  , 0) );.  if( !D
12600 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c  bHasProperty(db,
12610 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74   idx, DB_Unreset
12620 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b  Views) ) return;
12630 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48  .  for(i=sqliteH
12640 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44  ashFirst(&db->aD
12650 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[idx].pSchema->
12660 74 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73 71  tblHash); i;i=sq
12670 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29  liteHashNext(i))
12680 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
12690 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
126a0 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70  ta(i);.    if( p
126b0 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
126c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
126d0 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64  eteColumnNames(d
126e0 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  b, pTab);.      
126f0 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  pTab->aCol = 0;.
12700 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c        pTab->nCol
12710 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
12720 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74    DbClearPropert
12730 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
12740 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23  resetViews);.}.#
12750 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71  else.# define sq
12760 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
12770 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20  (A,B).#endif /* 
12780 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
12790 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
127a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
127b0 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20 74  ed by the VDBE t
127c0 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74  o adjust the int
127d0 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20  ernal schema.** 
127e0 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 20 77  used by SQLite w
127f0 68 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61  hen the btree la
12800 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c  yer moves a tabl
12810 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65  e root page. The
12820 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  .** root-page of
12830 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
12840 78 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44  x in database iD
12850 62 20 68 61 73 20 63 68 61 6e 67 65 64 20 66 72  b has changed fr
12860 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69  om iFrom.** to i
12870 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74  To..**.** Ticket
12880 20 23 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d   #1728:  The sym
12890 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20  bol table might 
128a0 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e  still contain in
128b0 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20  formation.** on 
128c0 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e  tables and/or in
128d0 64 69 63 65 73 20 74 68 61 74 20 61 72 65 20 74  dices that are t
128e0 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65  he process of be
128f0 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20  ing deleted..** 
12900 49 66 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63  If you are unluc
12910 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  ky, one of those
12920 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73   deleted indices
12930 20 6f 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74   or tables might
12940 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d  .** have the sam
12950 65 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65  e rootpage numbe
12960 72 20 61 73 20 74 68 65 20 72 65 61 6c 20 74 61  r as the real ta
12970 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61  ble or index tha
12980 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f  t is.** being mo
12990 76 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e  ved.  So we cann
129a0 6f 74 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e  ot stop searchin
129b0 67 20 61 66 74 65 72 20 74 68 65 20 66 69 72 73  g after the firs
129c0 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61  t match .** beca
129d0 75 73 65 20 74 68 65 20 66 69 72 73 74 20 6d 61  use the first ma
129e0 74 63 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72  tch might be for
129f0 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65   one of the dele
12a00 74 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f  ted indices.** o
12a10 72 20 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74  r tables and not
12a20 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
12a30 20 74 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c   that is actuall
12a40 79 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a  y being moved..*
12a50 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e  * We must contin
12a60 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ue looping until
12a70 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20   all tables and 
12a80 69 6e 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20  indices with.** 
12a90 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20  rootpage==iFrom 
12aa0 68 61 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72  have been conver
12ab0 74 65 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f  ted to have a ro
12ac0 6f 74 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a  otpage of iTo.**
12ad0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20   in order to be 
12ae0 63 65 72 74 61 69 6e 20 74 68 61 74 20 77 65 20  certain that we 
12af0 67 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e  got the right on
12b00 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
12b10 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
12b20 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65  CUUM.void sqlite
12b30 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 73  3RootPageMoved(s
12b40 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
12b50 69 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20  iDb, int iFrom, 
12b60 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68  int iTo){.  Hash
12b70 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48  Elem *pElem;.  H
12b80 61 73 68 20 2a 70 48 61 73 68 3b 0a 20 20 44 62  ash *pHash;.  Db
12b90 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74   *pDb;..  assert
12ba0 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
12bb0 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
12bc0 2c 20 30 29 20 29 3b 0a 20 20 70 44 62 20 3d 20  , 0) );.  pDb = 
12bd0 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20  &db->aDb[iDb];. 
12be0 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70   pHash = &pDb->p
12bf0 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b  Schema->tblHash;
12c00 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c  .  for(pElem=sql
12c10 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61  iteHashFirst(pHa
12c20 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  sh); pElem; pEle
12c30 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
12c40 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61  (pElem)){.    Ta
12c50 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
12c60 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
12c70 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  );.    if( pTab-
12c80 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a  >tnum==iFrom ){.
12c90 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d        pTab->tnum
12ca0 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20   = iTo;.    }.  
12cb0 7d 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62  }.  pHash = &pDb
12cc0 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
12cd0 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d  sh;.  for(pElem=
12ce0 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
12cf0 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  pHash); pElem; p
12d00 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
12d10 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
12d20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73   Index *pIdx = s
12d30 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
12d40 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49  lem);.    if( pI
12d50 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20  dx->tnum==iFrom 
12d60 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74  ){.      pIdx->t
12d70 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d  num = iTo;.    }
12d80 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
12d90 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20  *.** Write code 
12da0 74 6f 20 65 72 61 73 65 20 74 68 65 20 74 61 62  to erase the tab
12db0 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
12dc0 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61  e iTable from da
12dd0 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41  tabase iDb..** A
12de0 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74  lso write code t
12df0 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c  o modify the sql
12e00 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
12e10 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63   and internal sc
12e20 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f  hema.** if a roo
12e30 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65  t-page of anothe
12e40 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64  r table is moved
12e50 20 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61   by the btree-la
12e60 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72  yer whilst.** er
12e70 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68  asing iTable (th
12e80 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69  is can happen wi
12e90 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  th an auto-vacuu
12ea0 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20  m database)..*/ 
12eb0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73  .static void des
12ec0 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72  troyRootPage(Par
12ed0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
12ee0 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29  iTable, int iDb)
12ef0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
12f00 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
12f10 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d  rse);.  int r1 =
12f20 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
12f30 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  eg(pParse);.  as
12f40 73 65 72 74 28 20 69 54 61 62 6c 65 3e 31 20 29  sert( iTable>1 )
12f50 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
12f60 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65 73 74  ddOp3(v, OP_Dest
12f70 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c  roy, iTable, r1,
12f80 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   iDb);.  sqlite3
12f90 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
12fa0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
12fb0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
12fc0 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  /* OP_Destroy
12fd0 20 73 74 6f 72 65 73 20 61 6e 20 69 6e 20 69 6e   stores an in in
12fe0 74 65 67 65 72 20 72 31 2e 20 49 66 20 74 68 69  teger r1. If thi
12ff0 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69  s integer.  ** i
13000 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
13010 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
13020 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
13030 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a   table moved to.
13040 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54    ** location iT
13050 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  able. The follow
13060 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65  ing code modifie
13070 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  s the sqlite_mas
13080 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a  ter table to.  *
13090 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a  * reflect this..
130a0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23    **.  ** The "#
130b0 4e 4e 4e 22 20 69 6e 20 74 68 65 20 53 51 4c 20  NNN" in the SQL 
130c0 69 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6e  is a special con
130d0 73 74 61 6e 74 20 74 68 61 74 20 6d 65 61 6e 73  stant that means
130e0 20 77 68 61 74 65 76 65 72 20 76 61 6c 75 65 0a   whatever value.
130f0 20 20 2a 2a 20 69 73 20 69 6e 20 72 65 67 69 73    ** is in regis
13100 74 65 72 20 4e 4e 4e 2e 20 20 53 65 65 20 67 72  ter NNN.  See gr
13110 61 6d 6d 61 72 20 72 75 6c 65 73 20 61 73 73 6f  ammar rules asso
13120 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
13130 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 2a 2a  TK_REGISTER.  **
13140 20 74 6f 6b 65 6e 20 66 6f 72 20 61 64 64 69 74   token for addit
13150 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
13160 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  n..  */.  sqlite
13170 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
13180 72 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44 41  rse, .     "UPDA
13190 54 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f 6f  TE %Q.%s SET roo
131a0 74 70 61 67 65 3d 25 64 20 57 48 45 52 45 20 23  tpage=%d WHERE #
131b0 25 64 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d  %d AND rootpage=
131c0 23 25 64 22 2c 0a 20 20 20 20 20 70 50 61 72 73  #%d",.     pPars
131d0 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
131e0 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52  zDbSName, MASTER
131f0 5f 4e 41 4d 45 2c 20 69 54 61 62 6c 65 2c 20 72  _NAME, iTable, r
13200 31 2c 20 72 31 29 3b 0a 23 65 6e 64 69 66 0a 20  1, r1);.#endif. 
13210 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
13220 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
13230 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  1);.}../*.** Wri
13240 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20  te VDBE code to 
13250 65 72 61 73 65 20 74 61 62 6c 65 20 70 54 61 62  erase table pTab
13260 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69 61   and all associa
13270 74 65 64 20 69 6e 64 69 63 65 73 20 6f 6e 20 64  ted indices on d
13280 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20  isk..** Code to 
13290 75 70 64 61 74 65 20 74 68 65 20 73 71 6c 69 74  update the sqlit
132a0 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20  e_master tables 
132b0 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  and internal sch
132c0 65 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a  ema definitions.
132d0 2a 2a 20 69 6e 20 63 61 73 65 20 61 20 72 6f 6f  ** in case a roo
132e0 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  t-page belonging
132f0 20 74 6f 20 61 6e 6f 74 68 65 72 20 74 61 62 6c   to another tabl
13300 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68  e is moved by th
13310 65 20 62 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a  e btree layer.**
13320 20 69 73 20 61 6c 73 6f 20 61 64 64 65 64 20 28   is also added (
13330 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
13340 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63  with an auto-vac
13350 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a  uum database)..*
13360 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65  /.static void de
13370 73 74 72 6f 79 54 61 62 6c 65 28 50 61 72 73 65  stroyTable(Parse
13380 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
13390 2a 70 54 61 62 29 7b 0a 23 69 66 64 65 66 20 53  *pTab){.#ifdef S
133a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
133b0 41 43 55 55 4d 0a 20 20 49 6e 64 65 78 20 2a 70  ACUUM.  Index *p
133c0 49 64 78 3b 0a 20 20 69 6e 74 20 69 44 62 20 3d  Idx;.  int iDb =
133d0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
133e0 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
133f0 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
13400 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50  ;.  destroyRootP
13410 61 67 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  age(pParse, pTab
13420 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
13430 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
13440 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
13450 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
13460 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
13470 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 64 78  age(pParse, pIdx
13480 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
13490 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49 66 20  }.#else.  /* If 
134a0 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79  the database may
134b0 20 62 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   be auto-vacuum 
134c0 63 61 70 61 62 6c 65 20 28 69 66 20 53 51 4c 49  capable (if SQLI
134d0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
134e0 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64  UM.  ** is not d
134f0 65 66 69 6e 65 64 29 2c 20 74 68 65 6e 20 69 74  efined), then it
13500 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
13510 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79   call OP_Destroy
13520 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61 62   on the.  ** tab
13530 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f  le and index roo
13540 74 2d 70 61 67 65 73 20 69 6e 20 6f 72 64 65 72  t-pages in order
13550 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  , starting with 
13560 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20  the numerically 
13570 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f  .  ** largest ro
13580 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  ot-page number. 
13590 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 20  This guarantees 
135a0 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65  that none of the
135b0 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a   root-pages.  **
135c0 20 74 6f 20 62 65 20 64 65 73 74 72 6f 79 65 64   to be destroyed
135d0 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20 62 79   is relocated by
135e0 20 61 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f 44   an earlier OP_D
135f0 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20  estroy. i.e. if 
13600 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  the.  ** followi
13610 6e 67 20 77 65 72 65 20 63 6f 64 65 64 3a 0a 20  ng were coded:. 
13620 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74   **.  ** OP_Dest
13630 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e  roy 4 0.  ** ...
13640 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  ** OP_Destroy
13650 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61   5 0.  **.  ** a
13660 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 35 20 68  nd root page 5 h
13670 61 70 70 65 6e 65 64 20 74 6f 20 62 65 20 74 68  appened to be th
13680 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  e largest root-p
13690 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68  age number in th
136a0 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c  e.  ** database,
136b0 20 74 68 65 6e 20 72 6f 6f 74 20 70 61 67 65 20   then root page 
136c0 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64  5 would be moved
136d0 20 74 6f 20 70 61 67 65 20 34 20 62 79 20 74 68   to page 4 by th
136e0 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74  e .  ** "OP_Dest
136f0 72 6f 79 20 34 20 30 22 20 6f 70 63 6f 64 65 2e  roy 4 0" opcode.
13700 20 54 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   The subsequent 
13710 22 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 22  "OP_Destroy 5 0"
13720 20 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20   would hit.  ** 
13730 61 20 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65  a free-list page
13740 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ..  */.  int iTa
13750 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a  b = pTab->tnum;.
13760 20 20 69 6e 74 20 69 44 65 73 74 72 6f 79 65 64    int iDestroyed
13770 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = 0;..  while( 
13780 31 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  1 ){.    Index *
13790 70 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c  pIdx;.    int iL
137a0 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20  argest = 0;..   
137b0 20 69 66 28 20 69 44 65 73 74 72 6f 79 65 64 3d   if( iDestroyed=
137c0 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44 65 73 74  =0 || iTab<iDest
137d0 72 6f 79 65 64 20 29 7b 0a 20 20 20 20 20 20 69  royed ){.      i
137e0 4c 61 72 67 65 73 74 20 3d 20 69 54 61 62 3b 0a  Largest = iTab;.
137f0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 49      }.    for(pI
13800 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
13810 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
13820 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
13830 69 6e 74 20 69 49 64 78 20 3d 20 70 49 64 78 2d  int iIdx = pIdx-
13840 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73 73  >tnum;.      ass
13850 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65  ert( pIdx->pSche
13860 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
13870 61 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  a );.      if( (
13880 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c  iDestroyed==0 ||
13890 20 28 69 49 64 78 3c 69 44 65 73 74 72 6f 79 65   (iIdx<iDestroye
138a0 64 29 29 20 26 26 20 69 49 64 78 3e 69 4c 61 72  d)) && iIdx>iLar
138b0 67 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  gest ){.        
138c0 69 4c 61 72 67 65 73 74 20 3d 20 69 49 64 78 3b  iLargest = iIdx;
138d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
138e0 20 20 20 69 66 28 20 69 4c 61 72 67 65 73 74 3d     if( iLargest=
138f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
13900 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rn;.    }else{. 
13910 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73       int iDb = s
13920 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
13930 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
13940 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
13950 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 44        assert( iD
13960 62 3e 3d 30 20 26 26 20 69 44 62 3c 70 50 61 72  b>=0 && iDb<pPar
13970 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  se->db->nDb );. 
13980 20 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74       destroyRoot
13990 50 61 67 65 28 70 50 61 72 73 65 2c 20 69 4c 61  Page(pParse, iLa
139a0 72 67 65 73 74 2c 20 69 44 62 29 3b 0a 20 20 20  rgest, iDb);.   
139b0 20 20 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20     iDestroyed = 
139c0 69 4c 61 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a  iLargest;.    }.
139d0 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
139e0 0a 2a 2a 20 52 65 6d 6f 76 65 20 65 6e 74 72 69  .** Remove entri
139f0 65 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69  es from the sqli
13a00 74 65 5f 73 74 61 74 4e 20 74 61 62 6c 65 73 20  te_statN tables 
13a10 28 66 6f 72 20 4e 20 69 6e 20 28 31 2c 32 2c 33  (for N in (1,2,3
13a20 29 29 0a 2a 2a 20 61 66 74 65 72 20 61 20 44 52  )).** after a DR
13a30 4f 50 20 49 4e 44 45 58 20 6f 72 20 44 52 4f 50  OP INDEX or DROP
13a40 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a   TABLE command..
13a50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
13a60 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54  qlite3ClearStatT
13a70 61 62 6c 65 73 28 0a 20 20 50 61 72 73 65 20 2a  ables(.  Parse *
13a80 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
13a90 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
13aa0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
13ab0 69 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  iDb,            
13ac0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
13ad0 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63  se number */.  c
13ae0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
13af0 2c 20 20 20 20 20 2f 2a 20 22 69 64 78 22 20 6f  ,     /* "idx" o
13b00 72 20 22 74 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e  r "tbl" */.  con
13b10 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
13b20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 69      /* Name of i
13b30 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 2a 2f  ndex or table */
13b40 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  .){.  int i;.  c
13b50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
13b60 6d 65 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  me = pParse->db-
13b70 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
13b80 6d 65 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  me;.  for(i=1; i
13b90 3c 3d 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  <=4; i++){.    c
13ba0 68 61 72 20 7a 54 61 62 5b 32 34 5d 3b 0a 20 20  har zTab[24];.  
13bb0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
13bc0 74 66 28 73 69 7a 65 6f 66 28 7a 54 61 62 29 2c  tf(sizeof(zTab),
13bd0 7a 54 61 62 2c 22 73 71 6c 69 74 65 5f 73 74 61  zTab,"sqlite_sta
13be0 74 25 64 22 2c 69 29 3b 0a 20 20 20 20 69 66 28  t%d",i);.    if(
13bf0 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
13c00 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 54  e(pParse->db, zT
13c10 61 62 2c 20 7a 44 62 4e 61 6d 65 29 20 29 7b 0a  ab, zDbName) ){.
13c20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
13c30 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
13c40 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  .        "DELETE
13c50 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
13c60 45 20 25 73 3d 25 51 22 2c 0a 20 20 20 20 20 20  E %s=%Q",.      
13c70 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54 61 62 2c    zDbName, zTab,
13c80 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65 0a 20 20   zType, zName.  
13c90 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
13ca0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
13cb0 74 65 20 63 6f 64 65 20 74 6f 20 64 72 6f 70 20  te code to drop 
13cc0 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  a table..*/.void
13cd0 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f 70   sqlite3CodeDrop
13ce0 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
13cf0 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
13d00 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 69  , int iDb, int i
13d10 73 56 69 65 77 29 7b 0a 20 20 56 64 62 65 20 2a  sView){.  Vdbe *
13d20 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
13d30 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
13d40 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
13d50 65 72 3b 0a 20 20 44 62 20 2a 70 44 62 20 3d 20  er;.  Db *pDb = 
13d60 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a  &db->aDb[iDb];..
13d70 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
13d80 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
13d90 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
13da0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
13db0 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
13dc0 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23  rse, 1, iDb);..#
13dd0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13de0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
13df0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
13e00 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  pTab) ){.    sql
13e10 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
13e20 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20  , OP_VBegin);.  
13e30 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  }.#endif..  /* D
13e40 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73  rop all triggers
13e50 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
13e60 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
13e70 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20   dropped. Code. 
13e80 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64   ** is generated
13e90 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72 69   to remove entri
13ea0 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d  es from sqlite_m
13eb0 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20 2a  aster and/or.  *
13ec0 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61  * sqlite_temp_ma
13ed0 73 74 65 72 20 69 66 20 72 65 71 75 69 72 65 64  ster if required
13ee0 2e 0a 20 20 2a 2f 0a 20 20 70 54 72 69 67 67 65  ..  */.  pTrigge
13ef0 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67  r = sqlite3Trigg
13f00 65 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  erList(pParse, p
13f10 54 61 62 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  Tab);.  while( p
13f20 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 61  Trigger ){.    a
13f30 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72 2d  ssert( pTrigger-
13f40 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
13f50 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20  pSchema || .    
13f60 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e 70 53      pTrigger->pS
13f70 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31  chema==db->aDb[1
13f80 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ].pSchema );.   
13f90 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67   sqlite3DropTrig
13fa0 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 70  gerPtr(pParse, p
13fb0 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20 70 54  Trigger);.    pT
13fc0 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65  rigger = pTrigge
13fd0 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 23  r->pNext;.  }..#
13fe0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13ff0 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
14000 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79  .  /* Remove any
14010 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20   entries of the 
14020 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
14030 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64  table associated
14040 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 74   with.  ** the t
14050 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
14060 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  ed. This is done
14070 20 62 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c   before the tabl
14080 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20 2a  e is dropped.  *
14090 2a 20 61 74 20 74 68 65 20 62 74 72 65 65 20 6c  * at the btree l
140a0 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74 68  evel, in case th
140b0 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  e sqlite_sequenc
140c0 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74 6f  e table needs to
140d0 0a 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20  .  ** move as a 
140e0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 64 72  result of the dr
140f0 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e 20 69  op (can happen i
14100 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
14110 64 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  de)..  */.  if( 
14120 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
14130 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e   TF_Autoincremen
14140 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
14150 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
14160 73 65 2c 0a 20 20 20 20 20 20 22 44 45 4c 45 54  se,.      "DELET
14170 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65  E FROM %Q.sqlite
14180 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52 45 20  _sequence WHERE 
14190 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20  name=%Q",.      
141a0 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 70  pDb->zDbSName, p
141b0 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29  Tab->zName.    )
141c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
141d0 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49  /* Drop all SQLI
141e0 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
141f0 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65  and index entrie
14200 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
14210 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20  the.  ** table. 
14220 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65  The program name
14230 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74   loops through t
14240 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
14250 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 2a 2a  and deletes.  **
14260 20 65 76 65 72 79 20 72 6f 77 20 74 68 61 74 20   every row that 
14270 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
14280 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61  e of the same na
14290 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65  me as the one be
142a0 69 6e 67 0a 20 20 2a 2a 20 64 72 6f 70 70 65 64  ing.  ** dropped
142b0 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20 68  . Triggers are h
142c0 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c  andled separatel
142d0 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69 67  y because a trig
142e0 67 65 72 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20  ger can be.  ** 
142f0 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 74  created in the t
14300 65 6d 70 20 64 61 74 61 62 61 73 65 20 74 68 61  emp database tha
14310 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  t refers to a ta
14320 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20  ble in another. 
14330 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20   ** database..  
14340 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74  */.  sqlite3Nest
14350 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  edParse(pParse, 
14360 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46  .      "DELETE F
14370 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20  ROM %Q.%s WHERE 
14380 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20  tbl_name=%Q and 
14390 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27 22  type!='trigger'"
143a0 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62  ,.      pDb->zDb
143b0 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41  SName, MASTER_NA
143c0 4d 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  ME, pTab->zName)
143d0 3b 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20  ;.  if( !isView 
143e0 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  && !IsVirtual(pT
143f0 61 62 29 20 29 7b 0a 20 20 20 20 64 65 73 74 72  ab) ){.    destr
14400 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  oyTable(pParse, 
14410 70 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pTab);.  }..  /*
14420 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   Remove the tabl
14430 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c  e entry from SQL
14440 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20 73  ite's internal s
14450 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79  chema and modify
14460 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61  .  ** the schema
14470 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a 2f 0a 20 20   cookie..  */.  
14480 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
14490 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ab) ){.    sqlit
144a0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
144b0 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69 44 62  OP_VDestroy, iDb
144c0 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  , 0, 0, pTab->zN
144d0 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  ame, 0);.  }.  s
144e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
144f0 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65  (v, OP_DropTable
14500 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61  , iDb, 0, 0, pTa
14510 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  b->zName, 0);.  
14520 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
14530 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
14540 3b 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52 65  ;.  sqliteViewRe
14550 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b  setAll(db, iDb);
14560 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
14570 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
14580 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20   to do the work 
14590 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20  of a DROP TABLE 
145a0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e  statement..** pN
145b0 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
145c0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
145d0 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76  be dropped..*/.v
145e0 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54  oid sqlite3DropT
145f0 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
14600 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61  se, SrcList *pNa
14610 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77 2c 20  me, int isView, 
14620 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61  int noErr){.  Ta
14630 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62  ble *pTab;.  Vdb
14640 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *v;.  sqlite3 
14650 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
14660 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
14670 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
14680 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
14690 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
146a0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
146b0 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
146c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61  );.  assert( pNa
146d0 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  me->nSrc==1 );. 
146e0 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 61 64   if( sqlite3Read
146f0 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
14700 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
14710 74 61 62 6c 65 3b 0a 20 20 69 66 28 20 6e 6f 45  table;.  if( noE
14720 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73  rr ) db->suppres
14730 73 45 72 72 2b 2b 3b 0a 20 20 61 73 73 65 72 74  sErr++;.  assert
14740 28 20 69 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69  ( isView==0 || i
14750 73 56 69 65 77 3d 3d 4c 4f 43 41 54 45 5f 56 49  sView==LOCATE_VI
14760 45 57 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73  EW );.  pTab = s
14770 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
14780 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 69 73  eItem(pParse, is
14790 56 69 65 77 2c 20 26 70 4e 61 6d 65 2d 3e 61 5b  View, &pName->a[
147a0 30 5d 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72  0]);.  if( noErr
147b0 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45   ) db->suppressE
147c0 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20 70 54 61  rr--;..  if( pTa
147d0 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  b==0 ){.    if( 
147e0 6e 6f 45 72 72 20 29 20 73 71 6c 69 74 65 33 43  noErr ) sqlite3C
147f0 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63  odeVerifyNamedSc
14800 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61  hema(pParse, pNa
14810 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
14820 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  se);.    goto ex
14830 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
14840 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
14850 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
14860 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
14870 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  a);.  assert( iD
14880 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
14890 6e 44 62 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  nDb );.  sqlite3
148a0 53 63 68 65 6d 61 57 72 69 74 61 62 6c 65 28 70  SchemaWritable(p
148b0 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 0a 20 20  Parse, iDb);..  
148c0 2f 2a 20 49 66 20 70 54 61 62 20 69 73 20 61 20  /* If pTab is a 
148d0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 63  virtual table, c
148e0 61 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c 75 6d  all ViewGetColum
148f0 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e 73 75  nNames() to ensu
14900 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 69 6e  re.  ** it is in
14910 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
14920 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
14930 70 54 61 62 29 20 26 26 20 73 71 6c 69 74 65 33  pTab) && sqlite3
14940 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
14950 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
14960 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
14970 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
14980 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
14990 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
149a0 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ION.  {.    int 
149b0 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  code;.    const 
149c0 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48  char *zTab = SCH
149d0 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a  EMA_TABLE(iDb);.
149e0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
149f0 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
14a00 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20  b].zDbSName;.   
14a10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
14a20 67 32 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  g2 = 0;.    if( 
14a30 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
14a40 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
14a50 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c  DELETE, zTab, 0,
14a60 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f   zDb)){.      go
14a70 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
14a80 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  le;.    }.    if
14a90 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20  ( isView ){.    
14aa0 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
14ab0 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a  DB && iDb==1 ){.
14ac0 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
14ad0 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
14ae0 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73  VIEW;.      }els
14af0 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
14b00 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49  = SQLITE_DROP_VI
14b10 45 57 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e  EW;.      }.#ifn
14b20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14b30 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
14b40 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69 72   }else if( IsVir
14b50 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
14b60 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
14b70 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20  E_DROP_VTABLE;. 
14b80 20 20 20 20 20 7a 41 72 67 32 20 3d 20 73 71 6c       zArg2 = sql
14b90 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62  ite3GetVTable(db
14ba0 2c 20 70 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a  , pTab)->pMod->z
14bb0 4e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20  Name;.#endif.   
14bc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
14bd0 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
14be0 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  & iDb==1 ){.    
14bf0 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
14c00 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c  E_DROP_TEMP_TABL
14c10 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
14c20 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
14c30 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45  QLITE_DROP_TABLE
14c40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14c50 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
14c60 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
14c70 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61   code, pTab->zNa
14c80 6d 65 2c 20 7a 41 72 67 32 2c 20 7a 44 62 29 20  me, zArg2, zDb) 
14c90 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
14ca0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
14cb0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
14cc0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
14cd0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
14ce0 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ETE, pTab->zName
14cf0 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
14d00 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
14d10 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  p_table;.    }. 
14d20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
14d30 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
14d40 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71  pTab->zName, "sq
14d50 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20  lite_", 7)==0 . 
14d60 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72     && sqlite3Str
14d70 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d  NICmp(pTab->zNam
14d80 65 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 22  e, "sqlite_stat"
14d90 2c 20 31 31 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 11)!=0 ){.    
14da0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
14db0 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
14dc0 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f  s may not be dro
14dd0 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  pped", pTab->zNa
14de0 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
14df0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
14e00 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
14e10 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f  TE_OMIT_VIEW.  /
14e20 2a 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41  * Ensure DROP TA
14e30 42 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20  BLE is not used 
14e40 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44  on a view, and D
14e50 52 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20  ROP VIEW is not 
14e60 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74  used.  ** on a t
14e70 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
14e80 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d   isView && pTab-
14e90 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
14ea0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14eb0 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20  sg(pParse, "use 
14ec0 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65  DROP TABLE to de
14ed0 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20  lete table %s", 
14ee0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
14ef0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
14f00 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  _table;.  }.  if
14f10 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61  ( !isView && pTa
14f20 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
14f30 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
14f40 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44  g(pParse, "use D
14f50 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65  ROP VIEW to dele
14f60 74 65 20 76 69 65 77 20 25 73 22 2c 20 70 54 61  te view %s", pTa
14f70 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
14f80 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
14f90 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ble;.  }.#endif.
14fa0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
14fb0 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ode to remove th
14fc0 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
14fd0 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20   master table.  
14fe0 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f  ** on disk..  */
14ff0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
15000 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
15010 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
15020 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
15030 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
15040 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71   1, iDb);.    sq
15050 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61  lite3ClearStatTa
15060 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44 62  bles(pParse, iDb
15070 2c 20 22 74 62 6c 22 2c 20 70 54 61 62 2d 3e 7a  , "tbl", pTab->z
15080 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
15090 65 33 46 6b 44 72 6f 70 54 61 62 6c 65 28 70 50  e3FkDropTable(pP
150a0 61 72 73 65 2c 20 70 4e 61 6d 65 2c 20 70 54 61  arse, pName, pTa
150b0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  b);.    sqlite3C
150c0 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 70 50 61  odeDropTable(pPa
150d0 72 73 65 2c 20 70 54 61 62 2c 20 69 44 62 2c 20  rse, pTab, iDb, 
150e0 69 73 56 69 65 77 29 3b 0a 20 20 7d 0a 0a 65 78  isView);.  }..ex
150f0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20  it_drop_table:. 
15100 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
15110 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29  elete(db, pName)
15120 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
15130 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
15140 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  d to create a ne
15150 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e  w foreign key on
15160 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75   the table.** cu
15170 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
15180 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70 46 72  nstruction.  pFr
15190 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73  omCol determines
151a0 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a   which columns.*
151b0 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  * in the current
151c0 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20   table point to 
151d0 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e  the foreign key.
151e0 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30    If pFromCol==0
151f0 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74   then.** connect
15200 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20   the key to the 
15210 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65  last column inse
15220 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20 74 68  rted.  pTo is th
15230 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65  e name of.** the
15240 20 74 61 62 6c 65 20 72 65 66 65 72 72 65 64 20   table referred 
15250 74 6f 20 28 61 2e 6b 2e 61 20 74 68 65 20 22 70  to (a.k.a the "p
15260 61 72 65 6e 74 22 20 74 61 62 6c 65 29 2e 20 20  arent" table).  
15270 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74  pToCol is a list
15280 0a 2a 2a 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  .** of tables in
15290 20 74 68 65 20 70 61 72 65 6e 74 20 70 54 6f 20   the parent pTo 
152a0 74 61 62 6c 65 2e 20 20 66 6c 61 67 73 20 63 6f  table.  flags co
152b0 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e  ntains all.** in
152c0 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
152d0 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73  the conflict res
152e0 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
152f0 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  ms specified.** 
15300 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45  in the ON DELETE
15310 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20  , ON UPDATE and 
15320 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65  ON INSERT clause
15330 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79  s..**.** An FKey
15340 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72   structure is cr
15350 65 61 74 65 64 20 61 6e 64 20 61 64 64 65 64 20  eated and added 
15360 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
15370 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20  rently.** under 
15380 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20  construction in 
15390 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  the pParse->pNew
153a0 54 61 62 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a  Table field..**.
153b0 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b  ** The foreign k
153c0 65 79 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d  ey is set for IM
153d0 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73 73 69  MEDIATE processi
153e0 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e  ng.  A subsequen
153f0 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c  t call.** to sql
15400 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
15410 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e  Key() might chan
15420 67 65 20 74 68 69 73 20 74 6f 20 44 45 46 45 52  ge this to DEFER
15430 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  RED..*/.void sql
15440 69 74 65 33 43 72 65 61 74 65 46 6f 72 65 69 67  ite3CreateForeig
15450 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70  nKey(.  Parse *p
15460 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
15470 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
15480 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
15490 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c  FromCol,  /* Col
154a0 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62  umns in this tab
154b0 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  le that point to
154c0 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
154d0 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20    Token *pTo,   
154e0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
154f0 66 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c  f the other tabl
15500 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
15510 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43  *pToCol,    /* C
15520 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74  olumns in the ot
15530 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  her table */.  i
15540 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
15550 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20      /* Conflict 
15560 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72  resolution algor
15570 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73  ithms. */.){.  s
15580 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
15590 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66  rse->db;.#ifndef
155a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
155b0 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20  EIGN_KEY.  FKey 
155c0 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 46 4b  *pFKey = 0;.  FK
155d0 65 79 20 2a 70 4e 65 78 74 54 6f 3b 0a 20 20 54  ey *pNextTo;.  T
155e0 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65  able *p = pParse
155f0 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
15600 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20  nt nByte;.  int 
15610 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20  i;.  int nCol;. 
15620 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73   char *z;..  ass
15630 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20  ert( pTo!=0 );. 
15640 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 49 4e 5f   if( p==0 || IN_
15650 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67  DECLARE_VTAB ) g
15660 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66  oto fk_end;.  if
15670 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b  ( pFromCol==0 ){
15680 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  .    int iCol = 
15690 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69  p->nCol-1;.    i
156a0 66 28 20 4e 45 56 45 52 28 69 43 6f 6c 3c 30 29  f( NEVER(iCol<0)
156b0 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
156c0 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26      if( pToCol &
156d0 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21  & pToCol->nExpr!
156e0 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
156f0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
15700 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79  se, "foreign key
15710 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20   on %s".        
15720 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65   " should refere
15730 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c  nce only one col
15740 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22  umn of table %T"
15750 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43  ,.         p->aC
15760 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20  ol[iCol].zName, 
15770 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  pTo);.      goto
15780 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20   fk_end;.    }. 
15790 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d     nCol = 1;.  }
157a0 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20  else if( pToCol 
157b0 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72  && pToCol->nExpr
157c0 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70  !=pFromCol->nExp
157d0 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
157e0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
157f0 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72  .        "number
15800 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66   of columns in f
15810 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20  oreign key does 
15820 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75  not match the nu
15830 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20  mber of ".      
15840 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68    "columns in th
15850 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62  e referenced tab
15860 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66  le");.    goto f
15870 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  k_end;.  }else{.
15880 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d      nCol = pFrom
15890 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a  Col->nExpr;.  }.
158a0 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
158b0 28 2a 70 46 4b 65 79 29 20 2b 20 28 6e 43 6f 6c  (*pFKey) + (nCol
158c0 2d 31 29 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79  -1)*sizeof(pFKey
158d0 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f  ->aCol[0]) + pTo
158e0 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70  ->n + 1;.  if( p
158f0 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72  ToCol ){.    for
15900 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e  (i=0; i<pToCol->
15910 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
15920 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69     nByte += sqli
15930 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43  te3Strlen30(pToC
15940 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20  ol->a[i].zName) 
15950 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  + 1;.    }.  }. 
15960 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 33   pFKey = sqlite3
15970 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
15980 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
15990 70 46 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20  pFKey==0 ){.    
159a0 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d  goto fk_end;.  }
159b0 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20  .  pFKey->pFrom 
159c0 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e  = p;.  pFKey->pN
159d0 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b  extFrom = p->pFK
159e0 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a  ey;.  z = (char*
159f0 29 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e 43  )&pFKey->aCol[nC
15a00 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54  ol];.  pFKey->zT
15a10 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28  o = z;.  memcpy(
15a20 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e  z, pTo->z, pTo->
15a30 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20  n);.  z[pTo->n] 
15a40 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  = 0;.  sqlite3De
15a50 71 75 6f 74 65 28 7a 29 3b 0a 20 20 7a 20 2b 3d  quote(z);.  z +=
15a60 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b   pTo->n+1;.  pFK
15a70 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b  ey->nCol = nCol;
15a80 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d  .  if( pFromCol=
15a90 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d  =0 ){.    pFKey-
15aa0 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d  >aCol[0].iFrom =
15ab0 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65   p->nCol-1;.  }e
15ac0 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  lse{.    for(i=0
15ad0 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
15ae0 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
15af0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
15b00 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
15b10 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
15b20 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b  StrICmp(p->aCol[
15b30 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43  j].zName, pFromC
15b40 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  ol->a[i].zName)=
15b50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
15b60 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  pFKey->aCol[i].i
15b70 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20  From = j;.      
15b80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
15b90 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
15ba0 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f     if( j>=p->nCo
15bb0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
15bc0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
15bd0 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
15be0 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20  "unknown column 
15bf0 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67  \"%s\" in foreig
15c00 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
15c10 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46  ", .          pF
15c20 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
15c30 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
15c40 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20  o fk_end;.      
15c50 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
15c60 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20  ( pToCol ){.    
15c70 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
15c80 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
15c90 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
15ca0 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69  en30(pToCol->a[i
15cb0 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
15cc0 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  pFKey->aCol[i].z
15cd0 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d  Col = z;.      m
15ce0 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d  emcpy(z, pToCol-
15cf0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b  >a[i].zName, n);
15d00 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b  .      z[n] = 0;
15d10 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b  .      z += n+1;
15d20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
15d30 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
15d40 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63   0;.  pFKey->aAc
15d50 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29 28 66  tion[0] = (u8)(f
15d60 6c 61 67 73 20 26 20 30 78 66 66 29 3b 20 20 20  lags & 0xff);   
15d70 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 44           /* ON D
15d80 45 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a  ELETE action */.
15d90 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e    pFKey->aAction
15da0 5b 31 5d 20 3d 20 28 75 38 29 28 28 66 6c 61 67  [1] = (u8)((flag
15db0 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66 29  s >> 8 ) & 0xff)
15dc0 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54  ;    /* ON UPDAT
15dd0 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61  E action */..  a
15de0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
15df0 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
15e00 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  , 0, p->pSchema)
15e10 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20 3d 20   );.  pNextTo = 
15e20 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65 33 48  (FKey *)sqlite3H
15e30 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 53  ashInsert(&p->pS
15e40 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68 2c  chema->fkeyHash,
15e50 20 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a   .      pFKey->z
15e60 54 6f 2c 20 28 76 6f 69 64 20 2a 29 70 46 4b 65  To, (void *)pFKe
15e70 79 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  y.  );.  if( pNe
15e80 78 74 54 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a 20  xtTo==pFKey ){. 
15e90 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
15ea0 6c 74 28 64 62 29 3b 0a 20 20 20 20 67 6f 74 6f  lt(db);.    goto
15eb0 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69   fk_end;.  }.  i
15ec0 66 28 20 70 4e 65 78 74 54 6f 20 29 7b 0a 20 20  f( pNextTo ){.  
15ed0 20 20 61 73 73 65 72 74 28 20 70 4e 65 78 74 54    assert( pNextT
15ee0 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30 20 29 3b  o->pPrevTo==0 );
15ef0 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78  .    pFKey->pNex
15f00 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f 3b 0a 20  tTo = pNextTo;. 
15f10 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65     pNextTo->pPre
15f20 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a 20 20 7d  vTo = pFKey;.  }
15f30 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
15f40 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74  foreign key to t
15f50 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65 20  he table as the 
15f60 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a  last step..  */.
15f70 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b    p->pFKey = pFK
15f80 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b  ey;.  pFKey = 0;
15f90 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69  ..fk_end:.  sqli
15fa0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 46  te3DbFree(db, pF
15fb0 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  Key);.#endif /* 
15fc0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
15fd0 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
15fe0 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78  ) */.  sqlite3Ex
15ff0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
16000 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71   pFromCol);.  sq
16010 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
16020 65 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29 3b  ete(db, pToCol);
16030 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
16040 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
16050 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c   when an INITIAL
16060 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20  LY IMMEDIATE or 
16070 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
16080 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20  ED.** clause is 
16090 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20  seen as part of 
160a0 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  a foreign key de
160b0 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69  finition.  The i
160c0 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72  sDeferred.** par
160d0 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72 20  ameter is 1 for 
160e0 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
160f0 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49  ED and 0 for INI
16100 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
16110 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f  ..** The behavio
16120 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  r of the most re
16130 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66  cently created f
16140 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64  oreign key is ad
16150 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64  justed.** accord
16160 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ingly..*/.void s
16170 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69  qlite3DeferForei
16180 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61  gnKey(Parse *pPa
16190 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72  rse, int isDefer
161a0 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  red){.#ifndef SQ
161b0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
161c0 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70  N_KEY.  Table *p
161d0 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b  Tab;.  FKey *pFK
161e0 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20  ey;.  if( (pTab 
161f0 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
16200 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65  ble)==0 || (pFKe
16210 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29  y = pTab->pFKey)
16220 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
16230 61 73 73 65 72 74 28 20 69 73 44 65 66 65 72 72  assert( isDeferr
16240 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65 72  ed==0 || isDefer
16250 72 65 64 3d 3d 31 20 29 3b 20 2f 2a 20 45 56 3a  red==1 ); /* EV:
16260 20 52 2d 33 30 33 32 33 2d 32 31 39 31 37 20 2a   R-30323-21917 *
16270 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  /.  pFKey->isDef
16280 65 72 72 65 64 20 3d 20 28 75 38 29 69 73 44 65  erred = (u8)isDe
16290 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d  ferred;.#endif.}
162a0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
162b0 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
162c0 65 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c  erase and refill
162d0 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54   index *pIdx.  T
162e0 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  his is.** used t
162f0 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  o initialize a n
16300 65 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ewly created ind
16310 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75  ex or to recompu
16320 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  te the.** conten
16330 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e  t of an index in
16340 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52   response to a R
16350 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a  EINDEX command..
16360 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74  **.** if memRoot
16370 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61  Page is not nega
16380 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  tive, it means t
16390 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73  hat the index is
163a0 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65   newly.** create
163b0 64 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72  d.  The register
163c0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6d 65   specified by me
163d0 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69  mRootPage contai
163e0 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  ns the.** root p
163f0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
16400 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d  e index.  If mem
16410 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61  RootPage is nega
16420 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  tive, then.** th
16430 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  e index already 
16440 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20  exists and must 
16450 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72  be cleared befor
16460 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64  e being refilled
16470 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74   and.** the root
16480 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
16490 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b  the index is tak
164a0 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e  en from pIndex->
164b0 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tnum..*/.static 
164c0 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66 69  void sqlite3Refi
164d0 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  llIndex(Parse *p
164e0 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
164f0 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f  ndex, int memRoo
16500 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20  tPage){.  Table 
16510 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e  *pTab = pIndex->
16520 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20  pTable;  /* The 
16530 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e  table that is in
16540 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  dexed */.  int i
16550 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
16560 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72  ab++;     /* Btr
16570 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
16580 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  or pTab */.  int
16590 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e   iIdx = pParse->
165a0 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42  nTab++;     /* B
165b0 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64  tree cursor used
165c0 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20   for pIndex */. 
165d0 20 69 6e 74 20 69 53 6f 72 74 65 72 3b 20 20 20   int iSorter;   
165e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165f0 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 65 64  /* Cursor opened
16600 20 62 79 20 4f 70 65 6e 53 6f 72 74 65 72 20 28   by OpenSorter (
16610 69 66 20 69 6e 20 75 73 65 29 20 2a 2f 0a 20 20  if in use) */.  
16620 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20  int addr1;      
16630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16640 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70  * Address of top
16650 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e   of loop */.  in
16660 74 20 61 64 64 72 32 3b 20 20 20 20 20 20 20 20  t addr2;        
16670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16680 41 64 64 72 65 73 73 20 74 6f 20 6a 75 6d 70 20  Address to jump 
16690 74 6f 20 66 6f 72 20 6e 65 78 74 20 69 74 65 72  to for next iter
166a0 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 74  ation */.  int t
166b0 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  num;            
166c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
166d0 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20  t page of index 
166e0 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 74 49 64  */.  int iPartId
166f0 78 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20  xLabel;         
16700 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74      /* Jump to t
16710 68 69 73 20 6c 61 62 65 6c 20 74 6f 20 73 6b 69  his label to ski
16720 70 20 61 20 72 6f 77 20 2a 2f 0a 20 20 56 64 62  p a row */.  Vdb
16730 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
16740 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
16750 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
16760 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d  o this virtual m
16770 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49  achine */.  KeyI
16780 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20 20  nfo *pKey;      
16790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65             /* Ke
167a0 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78 20  yInfo for index 
167b0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  */.  int regReco
167c0 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rd;             
167d0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
167e0 68 6f 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c 65  holding assemble
167f0 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a  d index record *
16800 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
16810 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
16820 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
16830 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
16840 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  .  int iDb = sql
16850 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
16860 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53  x(db, pIndex->pS
16870 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66  chema);..#ifndef
16880 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
16890 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  HORIZATION.  if(
168a0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
168b0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
168c0 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78  _REINDEX, pIndex
168d0 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20  ->zName, 0,.    
168e0 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
168f0 44 62 53 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20  DbSName ) ){.   
16900 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
16910 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72  dif..  /* Requir
16920 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f  e a write-lock o
16930 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 70  n the table to p
16940 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70 65 72  erform this oper
16950 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ation */.  sqlit
16960 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
16970 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
16980 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e  num, 1, pTab->zN
16990 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  ame);..  v = sql
169a0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
169b0 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
169c0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
169d0 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29  memRootPage>=0 )
169e0 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d 65 6d  {.    tnum = mem
169f0 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65 6c 73  RootPage;.  }els
16a00 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49  e{.    tnum = pI
16a10 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 7d 0a  ndex->tnum;.  }.
16a20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
16a30 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70  KeyInfoOfIndex(p
16a40 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a  Parse, pIndex);.
16a50 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 21 3d    assert( pKey!=
16a60 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
16a70 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
16a80 3e 6e 45 72 72 20 29 3b 0a 0a 20 20 2f 2a 20 4f  >nErr );..  /* O
16a90 70 65 6e 20 74 68 65 20 73 6f 72 74 65 72 20 63  pen the sorter c
16aa0 75 72 73 6f 72 20 69 66 20 77 65 20 61 72 65 20  ursor if we are 
16ab0 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20  to use one. */. 
16ac0 20 69 53 6f 72 74 65 72 20 3d 20 70 50 61 72 73   iSorter = pPars
16ad0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c  e->nTab++;.  sql
16ae0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
16af0 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c  , OP_SorterOpen,
16b00 20 69 53 6f 72 74 65 72 2c 20 30 2c 20 70 49 6e   iSorter, 0, pIn
16b10 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 28 63  dex->nKeyCol, (c
16b20 68 61 72 2a 29 0a 20 20 20 20 20 20 20 20 20 20  har*).          
16b30 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
16b40 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79  3KeyInfoRef(pKey
16b50 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  ), P4_KEYINFO);.
16b60 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 74  .  /* Open the t
16b70 61 62 6c 65 2e 20 4c 6f 6f 70 20 74 68 72 6f 75  able. Loop throu
16b80 67 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74  gh all rows of t
16b90 68 65 20 74 61 62 6c 65 2c 20 69 6e 73 65 72 74  he table, insert
16ba0 69 6e 67 20 69 6e 64 65 78 0a 20 20 2a 2a 20 72  ing index.  ** r
16bb0 65 63 6f 72 64 73 20 69 6e 74 6f 20 74 68 65 20  ecords into the 
16bc0 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 73 71 6c  sorter. */.  sql
16bd0 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
16be0 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c  arse, iTab, iDb,
16bf0 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
16c00 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73  ad);.  addr1 = s
16c10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16c20 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
16c30 54 61 62 2c 20 30 29 3b 20 56 64 62 65 43 6f 76  Tab, 0); VdbeCov
16c40 65 72 61 67 65 28 76 29 3b 0a 20 20 72 65 67 52  erage(v);.  regR
16c50 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
16c60 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
16c70 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47 65 6e  );..  sqlite3Gen
16c80 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50  erateIndexKey(pP
16c90 61 72 73 65 2c 70 49 6e 64 65 78 2c 69 54 61 62  arse,pIndex,iTab
16ca0 2c 72 65 67 52 65 63 6f 72 64 2c 30 2c 26 69 50  ,regRecord,0,&iP
16cb0 61 72 74 49 64 78 4c 61 62 65 6c 2c 30 2c 30 29  artIdxLabel,0,0)
16cc0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
16cd0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
16ce0 65 72 49 6e 73 65 72 74 2c 20 69 53 6f 72 74 65  erInsert, iSorte
16cf0 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  r, regRecord);. 
16d00 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 50   sqlite3ResolveP
16d10 61 72 74 49 64 78 4c 61 62 65 6c 28 70 50 61 72  artIdxLabel(pPar
16d20 73 65 2c 20 69 50 61 72 74 49 64 78 4c 61 62 65  se, iPartIdxLabe
16d30 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  l);.  sqlite3Vdb
16d40 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
16d50 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b  xt, iTab, addr1+
16d60 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
16d70 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
16d80 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
16d90 64 72 31 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52  dr1);.  if( memR
16da0 6f 6f 74 50 61 67 65 3c 30 20 29 20 73 71 6c 69  ootPage<0 ) sqli
16db0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16dc0 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c   OP_Clear, tnum,
16dd0 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   iDb);.  sqlite3
16de0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
16df0 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78  _OpenWrite, iIdx
16e00 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20  , tnum, iDb, .  
16e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e20 20 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20    (char *)pKey, 
16e30 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73  P4_KEYINFO);.  s
16e40 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
16e50 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42 55 4c  P5(v, OPFLAG_BUL
16e60 4b 43 53 52 7c 28 28 6d 65 6d 52 6f 6f 74 50 61  KCSR|((memRootPa
16e70 67 65 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f 50 32  ge>=0)?OPFLAG_P2
16e80 49 53 52 45 47 3a 30 29 29 3b 0a 0a 20 20 61 64  ISREG:0));..  ad
16e90 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
16ea0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
16eb0 72 74 65 72 53 6f 72 74 2c 20 69 53 6f 72 74 65  rterSort, iSorte
16ec0 72 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72  r, 0); VdbeCover
16ed0 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20 49 73  age(v);.  if( Is
16ee0 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64  UniqueIndex(pInd
16ef0 65 78 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a  ex) ){.    int j
16f00 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
16f10 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
16f20 33 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  3;.    sqlite3Vd
16f30 62 65 47 6f 74 6f 28 76 2c 20 6a 32 29 3b 0a 20  beGoto(v, j2);. 
16f40 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74     addr2 = sqlit
16f50 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
16f60 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(v);.    sqlite
16f70 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
16f80 2c 20 4f 50 5f 53 6f 72 74 65 72 43 6f 6d 70 61  , OP_SorterCompa
16f90 72 65 2c 20 69 53 6f 72 74 65 72 2c 20 6a 32 2c  re, iSorter, j2,
16fa0 20 72 65 67 52 65 63 6f 72 64 2c 0a 20 20 20 20   regRecord,.    
16fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fc0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65       pIndex->nKe
16fd0 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65 72  yCol); VdbeCover
16fe0 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
16ff0 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74 72 61  te3UniqueConstra
17000 69 6e 74 28 70 50 61 72 73 65 2c 20 4f 45 5f 41  int(pParse, OE_A
17010 62 6f 72 74 2c 20 70 49 6e 64 65 78 29 3b 0a 20  bort, pIndex);. 
17020 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72   }else{.    addr
17030 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
17040 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
17050 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
17060 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72  AddOp3(v, OP_Sor
17070 74 65 72 44 61 74 61 2c 20 69 53 6f 72 74 65 72  terData, iSorter
17080 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 69 49 64  , regRecord, iId
17090 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  x);.  sqlite3Vdb
170a0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65  eAddOp1(v, OP_Se
170b0 65 6b 45 6e 64 2c 20 69 49 64 78 29 3b 0a 20 20  ekEnd, iIdx);.  
170c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
170d0 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
170e0 74 2c 20 69 49 64 78 2c 20 72 65 67 52 65 63 6f  t, iIdx, regReco
170f0 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rd);.  sqlite3Vd
17100 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
17110 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
17120 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  LT);.  sqlite3Re
17130 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
17140 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  rse, regRecord);
17150 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
17160 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
17170 72 4e 65 78 74 2c 20 69 53 6f 72 74 65 72 2c 20  rNext, iSorter, 
17180 61 64 64 72 32 29 3b 20 56 64 62 65 43 6f 76 65  addr2); VdbeCove
17190 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
171a0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
171b0 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 73 71 6c  , addr1);..  sql
171c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
171d0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62  , OP_Close, iTab
171e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
171f0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
17200 73 65 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c  se, iIdx);.  sql
17210 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
17220 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 53 6f 72  , OP_Close, iSor
17230 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ter);.}../*.** A
17240 6c 6c 6f 63 61 74 65 20 68 65 61 70 20 73 70 61  llocate heap spa
17250 63 65 20 74 6f 20 68 6f 6c 64 20 61 6e 20 49 6e  ce to hold an In
17260 64 65 78 20 6f 62 6a 65 63 74 20 77 69 74 68 20  dex object with 
17270 6e 43 6f 6c 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a  nCol columns..**
17280 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65  .** Increase the
17290 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65   allocation size
172a0 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 65   to provide an e
172b0 78 74 72 61 20 6e 45 78 74 72 61 20 62 79 74 65  xtra nExtra byte
172c0 73 0a 2a 2a 20 6f 66 20 38 2d 62 79 74 65 20 61  s.** of 8-byte a
172d0 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 66 74  ligned space aft
172e0 65 72 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  er the Index obj
172f0 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ect and return a
17300 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  .** pointer to t
17310 68 69 73 20 65 78 74 72 61 20 73 70 61 63 65 20  his extra space 
17320 69 6e 20 2a 70 70 45 78 74 72 61 2e 0a 2a 2f 0a  in *ppExtra..*/.
17330 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 41 6c  Index *sqlite3Al
17340 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63  locateIndexObjec
17350 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
17360 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ,         /* Dat
17370 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
17380 20 2a 2f 0a 20 20 69 31 36 20 6e 43 6f 6c 2c 20   */.  i16 nCol, 
17390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
173a0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  tal number of co
173b0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64  lumns in the ind
173c0 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  ex */.  int nExt
173d0 72 61 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ra,          /* 
173e0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
173f0 6f 66 20 65 78 74 72 61 20 73 70 61 63 65 20 74  of extra space t
17400 6f 20 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61  o alloc */.  cha
17410 72 20 2a 2a 70 70 45 78 74 72 61 20 20 20 20 20  r **ppExtra     
17420 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
17430 74 68 65 20 22 65 78 74 72 61 22 20 73 70 61 63  the "extra" spac
17440 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20  e */.){.  Index 
17450 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p;            /
17460 2a 20 41 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65  * Allocated inde
17470 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  x object */.  in
17480 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
17490 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
174a0 70 61 63 65 20 66 6f 72 20 49 6e 64 65 78 20 6f  pace for Index o
174b0 62 6a 65 63 74 20 2b 20 61 72 72 61 79 73 20 2a  bject + arrays *
174c0 2f 0a 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55  /..  nByte = ROU
174d0 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65 78  ND8(sizeof(Index
174e0 29 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20  )) +            
174f0 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63    /* Index struc
17500 74 75 72 65 20 20 2a 2f 0a 20 20 20 20 20 20 20  ture  */.       
17510 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66     ROUND8(sizeof
17520 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 20 2b 20  (char*)*nCol) + 
17530 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
17540 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20  .azColl     */. 
17550 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38 28           ROUND8(
17560 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28  sizeof(LogEst)*(
17570 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20 2f 2a  nCol+1) +     /*
17580 20 49 6e 64 65 78 2e 61 69 52 6f 77 4c 6f 67 45   Index.aiRowLogE
17590 73 74 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  st   */.        
175a0 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
175b0 69 31 36 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20  i16)*nCol +     
175c0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
175d0 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20  aiColumn   */.  
175e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
175f0 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 29 3b  izeof(u8)*nCol);
17600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17610 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72  Index.aSortOrder
17620 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   */.  p = sqlite
17630 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
17640 2c 20 6e 42 79 74 65 20 2b 20 6e 45 78 74 72 61  , nByte + nExtra
17650 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
17660 20 20 63 68 61 72 20 2a 70 45 78 74 72 61 20 3d    char *pExtra =
17670 20 28 28 63 68 61 72 2a 29 70 29 2b 52 4f 55 4e   ((char*)p)+ROUN
17680 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29  D8(sizeof(Index)
17690 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 43 6f 6c 6c  );.    p->azColl
176a0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a   = (const char**
176b0 29 70 45 78 74 72 61 3b 20 70 45 78 74 72 61 20  )pExtra; pExtra 
176c0 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  += ROUND8(sizeof
176d0 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 3b 0a 20  (char*)*nCol);. 
176e0 20 20 20 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73     p->aiRowLogEs
176f0 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70 45 78  t = (LogEst*)pEx
17700 74 72 61 3b 20 70 45 78 74 72 61 20 2b 3d 20 73  tra; pExtra += s
17710 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e  izeof(LogEst)*(n
17720 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 70 2d 3e 61  Col+1);.    p->a
17730 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29  iColumn = (i16*)
17740 70 45 78 74 72 61 3b 20 20 20 20 20 20 20 70 45  pExtra;       pE
17750 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69  xtra += sizeof(i
17760 31 36 29 2a 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d  16)*nCol;.    p-
17770 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
17780 38 2a 29 70 45 78 74 72 61 3b 0a 20 20 20 20 70  8*)pExtra;.    p
17790 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c  ->nColumn = nCol
177a0 3b 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 43 6f 6c  ;.    p->nKeyCol
177b0 20 3d 20 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20   = nCol - 1;.   
177c0 20 2a 70 70 45 78 74 72 61 20 3d 20 28 28 63 68   *ppExtra = ((ch
177d0 61 72 2a 29 70 29 20 2b 20 6e 42 79 74 65 3b 0a  ar*)p) + nByte;.
177e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
177f0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
17800 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20  a new index for 
17810 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70  an SQL table.  p
17820 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73 20  Name1.pName2 is 
17830 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
17840 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54  index .** and pT
17850 62 6c 4c 69 73 74 20 69 73 20 74 68 65 20 6e 61  blList is the na
17860 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
17870 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
17880 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c  dexed.  Both wil
17890 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f  l .** be NULL fo
178a0 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  r a primary key 
178b0 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  or an index that
178c0 20 69 73 20 63 72 65 61 74 65 64 20 74 6f 20 73   is created to s
178d0 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51  atisfy a.** UNIQ
178e0 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20  UE constraint.  
178f0 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49  If pTable and pI
17900 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75  ndex are NULL, u
17910 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
17920 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74  able.** as the t
17930 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
17940 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  ed.  pParse->pNe
17950 77 54 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c  wTable is a tabl
17960 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72  e that is.** cur
17970 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e  rently being con
17980 73 74 72 75 63 74 65 64 20 62 79 20 61 20 43 52  structed by a CR
17990 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
179a0 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73  ment..**.** pLis
179b0 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63  t is a list of c
179c0 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
179d0 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c  exed.  pList wil
179e0 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69  l be NULL if thi
179f0 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72  s.** is a primar
17a00 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d  y key or unique-
17a10 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68  constraint on th
17a20 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f  e most recent co
17a30 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f  lumn added.** to
17a40 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
17a50 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
17a60 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f  ruction.  .*/.vo
17a70 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
17a80 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
17a90 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 41  pParse,     /* A
17aa0 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ll information a
17ab0 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20  bout this parse 
17ac0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
17ad0 65 31 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74  e1,     /* First
17ae0 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e   part of index n
17af0 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ame. May be NULL
17b00 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
17b10 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f  me2,     /* Seco
17b20 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78  nd part of index
17b30 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55   name. May be NU
17b40 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  LL */.  SrcList 
17b50 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61  *pTblName, /* Ta
17b60 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73  ble to index. Us
17b70 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
17b80 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78  ble if 0 */.  Ex
17b90 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
17ba0 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f   /* A list of co
17bb0 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65  lumns to be inde
17bc0 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  xed */.  int onE
17bd0 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f  rror,       /* O
17be0 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f  E_Abort, OE_Igno
17bf0 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20  re, OE_Replace, 
17c00 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20  or OE_None */.  
17c10 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20  Token *pStart,  
17c20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
17c30 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
17c40 6e 73 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  ns this statemen
17c50 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 50 49  t */.  Expr *pPI
17c60 57 68 65 72 65 2c 20 20 20 20 2f 2a 20 57 48 45  Where,    /* WHE
17c70 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 70 61  RE clause for pa
17c80 72 74 69 61 6c 20 69 6e 64 69 63 65 73 20 2a 2f  rtial indices */
17c90 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72  .  int sortOrder
17ca0 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72  ,     /* Sort or
17cb0 64 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b  der of primary k
17cc0 65 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e  ey when pList==N
17cd0 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e  ULL */.  int ifN
17ce0 6f 74 45 78 69 73 74 2c 20 20 20 20 2f 2a 20 4f  otExist,    /* O
17cf0 6d 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e 64  mit error if ind
17d00 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ex already exist
17d10 73 20 2a 2f 0a 20 20 75 38 20 69 64 78 54 79 70  s */.  u8 idxTyp
17d20 65 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e         /* The
17d30 20 69 6e 64 65 78 20 74 79 70 65 20 2a 2f 0a 29   index type */.)
17d40 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
17d50 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c  = 0;     /* Tabl
17d60 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  e to be indexed 
17d70 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
17d80 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65  ex = 0;   /* The
17d90 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65   index to be cre
17da0 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ated */.  char *
17db0 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f  zName = 0;     /
17dc0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  * Name of the in
17dd0 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  dex */.  int nNa
17de0 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me;           /*
17df0 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   Number of chara
17e00 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a  cters in zName *
17e10 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  /.  int i, j;.  
17e20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20  DbFixer sFix;   
17e30 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69       /* For assi
17e40 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e  gning database n
17e50 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a  ames to pTable *
17e60 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
17e70 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f  rMask;   /* 1 to
17e80 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69   honor DESC in i
17e90 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f  ndex.  0 to igno
17ea0 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  re. */.  sqlite3
17eb0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
17ec0 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20  b;.  Db *pDb;   
17ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17ee0 20 73 70 65 63 69 66 69 63 20 74 61 62 6c 65 20   specific table 
17ef0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69  containing the i
17f00 6e 64 65 78 65 64 20 64 61 74 61 62 61 73 65 20  ndexed database 
17f10 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
17f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
17f30 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
17f40 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  se that is being
17f50 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f   written */.  To
17f60 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20  ken *pName = 0; 
17f70 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65     /* Unqualifie
17f80 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  d name of the in
17f90 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f  dex to create */
17fa0 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
17fb0 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74  st_item *pListIt
17fc0 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  em; /* For loopi
17fd0 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f  ng over pList */
17fe0 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20  .  int nExtra = 
17ff0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
18000 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c      /* Space all
18010 6f 63 61 74 65 64 20 66 6f 72 20 7a 45 78 74 72  ocated for zExtr
18020 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  a[] */.  int nEx
18030 74 72 61 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  traCol;         
18040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
18050 62 65 72 20 6f 66 20 65 78 74 72 61 20 63 6f 6c  ber of extra col
18060 75 6d 6e 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20  umns needed */. 
18070 20 63 68 61 72 20 2a 7a 45 78 74 72 61 20 3d 20   char *zExtra = 
18080 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
18090 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65    /* Extra space
180a0 20 61 66 74 65 72 20 74 68 65 20 49 6e 64 65 78   after the Index
180b0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 49 6e 64   object */.  Ind
180c0 65 78 20 2a 70 50 6b 20 3d 20 30 3b 20 20 20 20  ex *pPk = 0;    
180d0 20 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45 59    /* PRIMARY KEY
180e0 20 69 6e 64 65 78 20 66 6f 72 20 57 49 54 48 4f   index for WITHO
180f0 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20  UT ROWID tables 
18100 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  */..  if( db->ma
18110 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
18120 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a  arse->nErr>0 ){.
18130 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
18140 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
18150 20 20 69 66 28 20 49 4e 5f 44 45 43 4c 41 52 45    if( IN_DECLARE
18160 5f 56 54 41 42 20 26 26 20 69 64 78 54 79 70 65  _VTAB && idxType
18170 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  !=SQLITE_IDXTYPE
18180 5f 50 52 49 4d 41 52 59 4b 45 59 20 29 7b 0a 20  _PRIMARYKEY ){. 
18190 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
181a0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
181b0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
181c0 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
181d0 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
181e0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
181f0 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  e_index;.  }..  
18200 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
18210 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
18220 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52  o be indexed.  R
18230 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e  eturn early if n
18240 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20  ot found..  */. 
18250 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
18260 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20   ){..    /* Use 
18270 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64  the two-part ind
18280 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72  ex name to deter
18290 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62 61 73  mine the databas
182a0 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61  e .    ** to sea
182b0 72 63 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c  rch for the tabl
182c0 65 2e 20 27 46 69 78 27 20 74 68 65 20 74 61 62  e. 'Fix' the tab
182d0 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20  le name to this 
182e0 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  db.    ** before
182f0 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20   looking up the 
18300 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
18310 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31    assert( pName1
18320 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20   && pName2 );.  
18330 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
18340 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
18350 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
18360 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20  2, &pName);.    
18370 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f  if( iDb<0 ) goto
18380 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18390 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
183a0 70 4e 61 6d 65 20 26 26 20 70 4e 61 6d 65 2d 3e  pName && pName->
183b0 7a 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  z );..#ifndef SQ
183c0 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42  LITE_OMIT_TEMPDB
183d0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69  .    /* If the i
183e0 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e  ndex name was un
183f0 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b  qualified, check
18400 20 69 66 20 74 68 65 20 74 61 62 6c 65 0a 20 20   if the table.  
18410 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74    ** is a temp t
18420 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74  able. If so, set
18430 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
18440 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68   1. Do not do th
18450 69 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e 69  is.    ** if ini
18460 74 69 61 6c 69 73 69 6e 67 20 61 20 64 61 74 61  tialising a data
18470 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20  base schema..   
18480 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 64 62 2d   */.    if( !db-
18490 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
184a0 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
184b0 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28  e3SrcListLookup(
184c0 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65  pParse, pTblName
184d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61  );.      if( pNa
184e0 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61  me2->n==0 && pTa
184f0 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65  b && pTab->pSche
18500 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ma==db->aDb[1].p
18510 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
18520 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 20    iDb = 1;.     
18530 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
18540 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 78 49  .    sqlite3FixI
18550 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73  nit(&sFix, pPars
18560 65 2c 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c  e, iDb, "index",
18570 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   pName);.    if(
18580 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69   sqlite3FixSrcLi
18590 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61  st(&sFix, pTblNa
185a0 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  me) ){.      /* 
185b0 42 65 63 61 75 73 65 20 74 68 65 20 70 61 72 73  Because the pars
185c0 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54  er constructs pT
185d0 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69  blName from a si
185e0 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c  ngle identifier,
185f0 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
18600 33 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20  3FixSrcList can 
18610 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20  never fail. */. 
18620 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a       assert(0);.
18630 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d      }.    pTab =
18640 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
18650 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20  bleItem(pParse, 
18660 30 2c 20 26 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b  0, &pTblName->a[
18670 30 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0]);.    assert(
18680 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
18690 64 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d 30 20  d==0 || pTab==0 
186a0 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d  );.    if( pTab=
186b0 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
186c0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
186d0 20 69 66 28 20 69 44 62 3d 3d 31 20 26 26 20 64   if( iDb==1 && d
186e0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
186f0 65 6d 61 21 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema!=pTab->pSche
18700 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ma ){.      sqli
18710 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
18720 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
18730 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 61  "cannot create a
18740 20 54 45 4d 50 20 69 6e 64 65 78 20 6f 6e 20 6e   TEMP index on n
18750 6f 6e 2d 54 45 4d 50 20 74 61 62 6c 65 20 5c 22  on-TEMP table \"
18760 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\"",.         
18770 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a    pTab->zName);.
18780 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
18790 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
187a0 20 20 7d 0a 20 20 20 20 69 66 28 20 21 48 61 73    }.    if( !Has
187b0 52 6f 77 69 64 28 70 54 61 62 29 20 29 20 70 50  Rowid(pTab) ) pP
187c0 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  k = sqlite3Prima
187d0 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
187e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
187f0 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20  ssert( pName==0 
18800 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
18810 53 74 61 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Start==0 );.    
18820 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
18830 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 66  NewTable;.    if
18840 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65  ( !pTab ) goto e
18850 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18860 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
18870 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
18880 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
18890 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d  ma);.  }.  pDb =
188a0 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
188b0 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21  .  assert( pTab!
188c0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
188d0 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
188e0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
188f0 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a  StrNICmp(pTab->z
18900 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
18910 20 37 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26   7)==0 .       &
18920 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  & db->init.busy=
18930 3d 30 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53  =0.#if SQLITE_US
18940 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ER_AUTHENTICATIO
18950 4e 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  N.       && sqli
18960 74 65 33 55 73 65 72 41 75 74 68 54 61 62 6c 65  te3UserAuthTable
18970 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3d 3d 30  (pTab->zName)==0
18980 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 26  .#endif.       &
18990 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  & sqlite3StrNICm
189a0 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37  p(&pTab->zName[7
189b0 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c 39 29  ],"altertab_",9)
189c0 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
189d0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
189e0 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79  e, "table %s may
189f0 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22   not be indexed"
18a00 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
18a10 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
18a20 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
18a30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18a40 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70  MIT_VIEW.  if( p
18a50 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
18a60 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
18a70 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65  Msg(pParse, "vie
18a80 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  ws may not be in
18a90 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74  dexed");.    got
18aa0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
18ab0 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  dex;.  }.#endif.
18ac0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18ad0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
18ae0 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
18af0 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71  (pTab) ){.    sq
18b00 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
18b10 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c 20 74  arse, "virtual t
18b20 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65  ables may not be
18b30 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20   indexed");.    
18b40 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
18b50 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64  _index;.  }.#end
18b60 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69  if..  /*.  ** Fi
18b70 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  nd the name of t
18b80 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20  he index.  Make 
18b90 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
18ba0 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65  t already anothe
18bb0 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20  r.  ** index or 
18bc0 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  table with the s
18bd0 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a  ame name.  .  **
18be0 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a  .  ** Exception:
18bf0 20 20 49 66 20 77 65 20 61 72 65 20 72 65 61 64    If we are read
18c00 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ing the names of
18c10 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63   permanent indic
18c20 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a  es from the.  **
18c30 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
18c40 61 62 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f  able (because so
18c50 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
18c60 20 63 68 61 6e 67 65 64 20 74 68 65 20 73 63 68   changed the sch
18c70 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e  ema) and.  ** on
18c80 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e  e of the index n
18c90 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69  ames collides wi
18ca0 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  th the name of a
18cb0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
18cc0 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20   or.  ** index, 
18cd0 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e  then we will con
18ce0 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73  tinue to process
18cf0 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a   this index..  *
18d00 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d  *.  ** If pName=
18d10 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  =0 it means that
18d20 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61   we are.  ** dea
18d30 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d  ling with a prim
18d40 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55  ary key or UNIQU
18d50 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57  E constraint.  W
18d60 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74  e have to invent
18d70 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61   our.  ** own na
18d80 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  me..  */.  if( p
18d90 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d  Name ){.    zNam
18da0 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
18db0 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61  romToken(db, pNa
18dc0 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61  me);.    if( zNa
18dd0 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  me==0 ) goto exi
18de0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
18df0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
18e00 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 69  e->z!=0 );.    i
18e10 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
18e20 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74  lite3CheckObject
18e30 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61  Name(pParse, zNa
18e40 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  me) ){.      got
18e50 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
18e60 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
18e70 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
18e80 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  y ){.      if( s
18e90 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
18ea0 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30  db, zName, 0)!=0
18eb0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
18ec0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
18ed0 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  se, "there is al
18ee0 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61  ready a table na
18ef0 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  med %s", zName);
18f00 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
18f10 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
18f20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18f30 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
18f40 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
18f50 65 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65  e, pDb->zDbSName
18f60 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
18f70 28 20 21 69 66 4e 6f 74 45 78 69 73 74 20 29 7b  ( !ifNotExist ){
18f80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18f90 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
18fa0 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61   "index %s alrea
18fb0 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d  dy exists", zNam
18fc0 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
18fd0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
18fe0 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
18ff0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
19000 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
19010 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
19020 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
19030 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
19040 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
19050 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  else{.    int n;
19060 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f  .    Index *pLoo
19070 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  p;.    for(pLoop
19080 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e  =pTab->pIndex, n
19090 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =1; pLoop; pLoop
190a0 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e  =pLoop->pNext, n
190b0 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 20  ++){}.    zName 
190c0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
190d0 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 61 75 74  (db, "sqlite_aut
190e0 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22 2c 20 70  oindex_%s_%d", p
190f0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a  Tab->zName, n);.
19100 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
19110 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
19120 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
19130 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
19140 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  Automatic index 
19150 6e 61 6d 65 73 20 67 65 6e 65 72 61 74 65 64 20  names generated 
19160 66 72 6f 6d 20 77 69 74 68 69 6e 20 73 71 6c 69  from within sqli
19170 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
19180 28 29 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20 68  ().    ** must h
19190 61 76 65 20 6e 61 6d 65 73 20 74 68 61 74 20 61  ave names that a
191a0 72 65 20 64 69 73 74 69 6e 63 74 20 66 72 6f 6d  re distinct from
191b0 20 6e 6f 72 6d 61 6c 20 61 75 74 6f 6d 61 74 69   normal automati
191c0 63 20 69 6e 64 65 78 20 6e 61 6d 65 73 2e 0a 20  c index names.. 
191d0 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
191e0 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  ing statement co
191f0 6e 76 65 72 74 73 20 22 73 71 6c 69 74 65 33 5f  nverts "sqlite3_
19200 61 75 74 6f 69 6e 64 65 78 2e 2e 2e 22 20 69 6e  autoindex..." in
19210 74 6f 0a 20 20 20 20 2a 2a 20 22 73 71 6c 69 74  to.    ** "sqlit
19220 65 33 5f 62 75 74 6f 69 6e 64 65 78 2e 2e 2e 22  e3_butoindex..."
19230 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b   in order to mak
19240 65 20 74 68 65 20 6e 61 6d 65 73 20 64 69 73 74  e the names dist
19250 69 6e 63 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65  inct..    ** The
19260 20 22 76 74 61 62 5f 65 72 72 2e 74 65 73 74 22   "vtab_err.test"
19270 20 74 65 73 74 20 64 65 6d 6f 6e 73 74 72 61 74   test demonstrat
19280 65 73 20 74 68 65 20 6e 65 65 64 20 6f 66 20 74  es the need of t
19290 68 69 73 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a  his statement. *
192a0 2f 0a 20 20 20 20 69 66 28 20 49 4e 5f 44 45 43  /.    if( IN_DEC
192b0 4c 41 52 45 5f 56 54 41 42 20 29 20 7a 4e 61 6d  LARE_VTAB ) zNam
192c0 65 5b 37 5d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f  e[7]++;.  }..  /
192d0 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68  * Check for auth
192e0 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65  orization to cre
192f0 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20  ate an index..  
19300 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
19310 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
19320 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e  TION.  {.    con
19330 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 70  st char *zDb = p
19340 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20  Db->zDbSName;.  
19350 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
19360 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
19370 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
19380 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
19390 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
193a0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
193b0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
193c0 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43      i = SQLITE_C
193d0 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20  REATE_INDEX;.   
193e0 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
193f0 42 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20  B && iDb==1 ) i 
19400 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
19410 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  TEMP_INDEX;.    
19420 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
19430 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20  heck(pParse, i, 
19440 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
19450 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  me, zDb) ){.    
19460 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
19470 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
19480 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
19490 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74   If pList==0, it
194a0 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74   means this rout
194b0 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74  ine was called t
194c0 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79  o make a primary
194d0 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66  .  ** key out of
194e0 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
194f0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
19500 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
19510 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20  uction..  ** So 
19520 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69  create a fake li
19530 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74  st to simulate t
19540 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  his..  */.  if( 
19550 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
19560 54 6f 6b 65 6e 20 70 72 65 76 43 6f 6c 3b 0a 20  Token prevCol;. 
19570 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49     sqlite3TokenI
19580 6e 69 74 28 26 70 72 65 76 43 6f 6c 2c 20 70 54  nit(&prevCol, pT
19590 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e  ab->aCol[pTab->n
195a0 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  Col-1].zName);. 
195b0 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
195c0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
195d0 28 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20  (pParse, 0,.    
195e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
195f0 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
19600 4b 5f 49 44 2c 20 26 70 72 65 76 43 6f 6c 2c 20  K_ID, &prevCol, 
19610 30 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  0));.    if( pLi
19620 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  st==0 ) goto exi
19630 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
19640 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
19650 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20  t->nExpr==1 );. 
19660 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
19670 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28 70  stSetSortOrder(p
19680 4c 69 73 74 2c 20 73 6f 72 74 4f 72 64 65 72 29  List, sortOrder)
19690 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
196a0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68  qlite3ExprListCh
196b0 65 63 6b 4c 65 6e 67 74 68 28 70 50 61 72 73 65  eckLength(pParse
196c0 2c 20 70 4c 69 73 74 2c 20 22 69 6e 64 65 78 22  , pList, "index"
196d0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67  );.  }..  /* Fig
196e0 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
196f0 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
19700 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20  are required to 
19710 73 74 6f 72 65 20 65 78 70 6c 69 63 69 74 6c 79  store explicitly
19720 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20  .  ** specified 
19730 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
19740 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20  ce names..  */. 
19750 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
19760 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
19770 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
19780 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  = pList->a[i].pE
19790 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
197a0 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20   pExpr!=0 );.   
197b0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
197c0 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20  TK_COLLATE ){.  
197d0 20 20 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31      nExtra += (1
197e0 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   + sqlite3Strlen
197f0 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  30(pExpr->u.zTok
19800 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  en));.    }.  }.
19810 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f  .  /* .  ** Allo
19820 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73  cate the index s
19830 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a  tructure. .  */.
19840 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
19850 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
19860 3b 0a 20 20 6e 45 78 74 72 61 43 6f 6c 20 3d 20  ;.  nExtraCol = 
19870 70 50 6b 20 3f 20 70 50 6b 2d 3e 6e 4b 65 79 43  pPk ? pPk->nKeyC
19880 6f 6c 20 3a 20 31 3b 0a 20 20 70 49 6e 64 65 78  ol : 1;.  pIndex
19890 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61   = sqlite3Alloca
198a0 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62  teIndexObject(db
198b0 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b  , pList->nExpr +
198c0 20 6e 45 78 74 72 61 43 6f 6c 2c 0a 20 20 20 20   nExtraCol,.    
198d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198f0 20 20 6e 4e 61 6d 65 20 2b 20 6e 45 78 74 72 61    nName + nExtra
19900 20 2b 20 31 2c 20 26 7a 45 78 74 72 61 29 3b 0a   + 1, &zExtra);.
19910 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
19920 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
19930 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
19940 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ndex;.  }.  asse
19950 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
19960 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d  LIGNMENT(pIndex-
19970 3e 61 69 52 6f 77 4c 6f 67 45 73 74 29 20 29 3b  >aiRowLogEst) );
19980 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
19990 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
199a0 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20  pIndex->azColl) 
199b0 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  );.  pIndex->zNa
199c0 6d 65 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 7a  me = zExtra;.  z
199d0 45 78 74 72 61 20 2b 3d 20 6e 4e 61 6d 65 20 2b  Extra += nName +
199e0 20 31 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e   1;.  memcpy(pIn
199f0 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  dex->zName, zNam
19a00 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70  e, nName+1);.  p
19a10 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20  Index->pTable = 
19a20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  pTab;.  pIndex->
19a30 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e  onError = (u8)on
19a40 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d  Error;.  pIndex-
19a50 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f  >uniqNotNull = o
19a60 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b  nError!=OE_None;
19a70 0a 20 20 70 49 6e 64 65 78 2d 3e 69 64 78 54 79  .  pIndex->idxTy
19a80 70 65 20 3d 20 69 64 78 54 79 70 65 3b 0a 20 20  pe = idxType;.  
19a90 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 20  pIndex->pSchema 
19aa0 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
19ab0 53 63 68 65 6d 61 3b 0a 20 20 70 49 6e 64 65 78  Schema;.  pIndex
19ac0 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 70 4c 69 73  ->nKeyCol = pLis
19ad0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20  t->nExpr;.  if( 
19ae0 70 50 49 57 68 65 72 65 20 29 7b 0a 20 20 20 20  pPIWhere ){.    
19af0 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65  sqlite3ResolveSe
19b00 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61 72  lfReference(pPar
19b10 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f 50 61 72  se, pTab, NC_Par
19b20 74 49 64 78 2c 20 70 50 49 57 68 65 72 65 2c 20  tIdx, pPIWhere, 
19b30 30 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  0);.    pIndex->
19b40 70 50 61 72 74 49 64 78 57 68 65 72 65 20 3d 20  pPartIdxWhere = 
19b50 70 50 49 57 68 65 72 65 3b 0a 20 20 20 20 70 50  pPIWhere;.    pP
19b60 49 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a  IWhere = 0;.  }.
19b70 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
19b80 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
19b90 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
19ba0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
19bb0 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c 64 20  ee if we should 
19bc0 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71 75 65  honor DESC reque
19bd0 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c  sts on index col
19be0 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  umns.  */.  if( 
19bf0 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69  pDb->pSchema->fi
19c00 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a  le_format>=4 ){.
19c10 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73      sortOrderMas
19c20 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e  k = -1;   /* Hon
19c30 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c  or DESC */.  }el
19c40 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65  se{.    sortOrde
19c50 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a  rMask = 0;    /*
19c60 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a   Ignore DESC */.
19c70 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a    }..  /* Analyz
19c80 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78  e the list of ex
19c90 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 66  pressions that f
19ca0 6f 72 6d 20 74 68 65 20 74 65 72 6d 73 20 6f 66  orm the terms of
19cb0 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 0a 20   the index and. 
19cc0 20 2a 2a 20 72 65 70 6f 72 74 20 61 6e 79 20 65   ** report any e
19cd0 72 72 6f 72 73 2e 20 20 49 6e 20 74 68 65 20 63  rrors.  In the c
19ce0 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
19cf0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
19d00 69 73 20 65 78 61 63 74 6c 79 0a 20 20 2a 2a 20  is exactly.  ** 
19d10 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20  a table column, 
19d20 73 74 6f 72 65 20 74 68 61 74 20 63 6f 6c 75 6d  store that colum
19d30 6e 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e  n in aiColumn[].
19d40 20 20 46 6f 72 20 67 65 6e 65 72 61 6c 20 65 78    For general ex
19d50 70 72 65 73 73 69 6f 6e 73 2c 0a 20 20 2a 2a 20  pressions,.  ** 
19d60 70 6f 70 75 6c 61 74 65 20 70 49 6e 64 65 78 2d  populate pIndex-
19d70 3e 61 43 6f 6c 45 78 70 72 20 61 6e 64 20 73 74  >aColExpr and st
19d80 6f 72 65 20 58 4e 5f 45 58 50 52 20 28 2d 32 29  ore XN_EXPR (-2)
19d90 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 0a   in aiColumn[]..
19da0 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20    **.  ** TODO: 
19db0 49 73 73 75 65 20 61 20 77 61 72 6e 69 6e 67 20  Issue a warning 
19dc0 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63  if two or more c
19dd0 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
19de0 64 65 78 20 61 72 65 20 69 64 65 6e 74 69 63 61  dex are identica
19df0 6c 2e 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73  l..  ** TODO: Is
19e00 73 75 65 20 61 20 77 61 72 6e 69 6e 67 20 69 66  sue a warning if
19e10 20 74 68 65 20 74 61 62 6c 65 20 70 72 69 6d 61   the table prima
19e20 72 79 20 6b 65 79 20 69 73 20 75 73 65 64 20 61  ry key is used a
19e30 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20  s part of the.  
19e40 2a 2a 20 69 6e 64 65 78 20 6b 65 79 2e 0a 20 20  ** index key..  
19e50 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c  */.  for(i=0, pL
19e60 69 73 74 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  istItem=pList->a
19e70 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
19e80 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d  ; i++, pListItem
19e90 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
19ea0 43 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  CExpr;          
19eb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
19ec0 2d 74 68 20 69 6e 64 65 78 20 65 78 70 72 65 73  -th index expres
19ed0 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  sion */.    int 
19ee0 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
19ef0 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 53  er;        /* AS
19f00 43 20 6f 72 20 44 45 53 43 20 6f 6e 20 74 68 65  C or DESC on the
19f10 20 69 2d 74 68 20 65 78 70 72 65 73 73 69 6f 6e   i-th expression
19f20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
19f30 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20  ar *zColl;      
19f40 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
19f50 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
19f60 65 20 2a 2f 0a 0a 20 20 20 20 73 71 6c 69 74 65  e */..    sqlite
19f70 33 53 74 72 69 6e 67 54 6f 49 64 28 70 4c 69 73  3StringToId(pLis
19f80 74 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  tItem->pExpr);. 
19f90 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
19fa0 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70  eSelfReference(p
19fb0 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f  Parse, pTab, NC_
19fc0 49 64 78 45 78 70 72 2c 20 70 4c 69 73 74 49 74  IdxExpr, pListIt
19fd0 65 6d 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20  em->pExpr, 0);. 
19fe0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
19ff0 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  Err ) goto exit_
1a000 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1a010 20 20 70 43 45 78 70 72 20 3d 20 73 71 6c 69 74    pCExpr = sqlit
1a020 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
1a030 65 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  e(pListItem->pEx
1a040 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 45  pr);.    if( pCE
1a050 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
1a060 4d 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  MN ){.      if( 
1a070 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e  pTab==pParse->pN
1a080 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  ewTable ){.     
1a090 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1a0a0 73 67 28 70 50 61 72 73 65 2c 20 22 65 78 70 72  sg(pParse, "expr
1a0b0 65 73 73 69 6f 6e 73 20 70 72 6f 68 69 62 69 74  essions prohibit
1a0c0 65 64 20 69 6e 20 50 52 49 4d 41 52 59 20 4b 45  ed in PRIMARY KE
1a0d0 59 20 61 6e 64 20 22 0a 20 20 20 20 20 20 20 20  Y and ".        
1a0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0f0 20 20 20 20 20 20 20 20 22 55 4e 49 51 55 45 20          "UNIQUE 
1a100 63 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a 20  constraints");. 
1a110 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
1a120 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1a130 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1a140 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70   pIndex->aColExp
1a150 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r==0 ){.        
1a160 45 78 70 72 4c 69 73 74 20 2a 70 43 6f 70 79 20  ExprList *pCopy 
1a170 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1a180 74 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2c 20  tDup(db, pList, 
1a190 30 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64  0);.        pInd
1a1a0 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20 3d 20 70  ex->aColExpr = p
1a1b0 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 69 66  Copy;.        if
1a1c0 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
1a1d0 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  led ){.         
1a1e0 20 61 73 73 65 72 74 28 20 70 43 6f 70 79 21 3d   assert( pCopy!=
1a1f0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
1a200 4c 69 73 74 49 74 65 6d 20 3d 20 26 70 43 6f 70  ListItem = &pCop
1a210 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20  y->a[i];.       
1a220 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1a230 20 6a 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20   j = XN_EXPR;.  
1a240 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
1a250 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 45 58 50  lumn[i] = XN_EXP
1a260 52 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  R;.      pIndex-
1a270 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30  >uniqNotNull = 0
1a280 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a290 20 20 20 6a 20 3d 20 70 43 45 78 70 72 2d 3e 69     j = pCExpr->i
1a2a0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 61 73  Column;.      as
1a2b0 73 65 72 74 28 20 6a 3c 3d 30 78 37 66 66 66 20  sert( j<=0x7fff 
1a2c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 30  );.      if( j<0
1a2d0 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20   ){.        j = 
1a2e0 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
1a2f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61     }else if( pTa
1a300 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75  b->aCol[j].notNu
1a310 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ll==0 ){.       
1a320 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74   pIndex->uniqNot
1a330 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Null = 0;.      
1a340 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  }.      pIndex->
1a350 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 28 69  aiColumn[i] = (i
1a360 31 36 29 6a 3b 0a 20 20 20 20 7d 0a 20 20 20 20  16)j;.    }.    
1a370 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69  zColl = 0;.    i
1a380 66 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45  f( pListItem->pE
1a390 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c  xpr->op==TK_COLL
1a3a0 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ATE ){.      int
1a3b0 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7a 43   nColl;.      zC
1a3c0 6f 6c 6c 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d  oll = pListItem-
1a3d0 3e 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  >pExpr->u.zToken
1a3e0 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 6c 20 3d 20  ;.      nColl = 
1a3f0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1a400 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20 20 20  zColl) + 1;.    
1a410 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61    assert( nExtra
1a420 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20  >=nColl );.     
1a430 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20   memcpy(zExtra, 
1a440 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20  zColl, nColl);. 
1a450 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78       zColl = zEx
1a460 74 72 61 3b 0a 20 20 20 20 20 20 7a 45 78 74 72  tra;.      zExtr
1a470 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20  a += nColl;.    
1a480 20 20 6e 45 78 74 72 61 20 2d 3d 20 6e 43 6f 6c    nExtra -= nCol
1a490 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  l;.    }else if(
1a4a0 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a   j>=0 ){.      z
1a4b0 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Coll = pTab->aCo
1a4c0 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  l[j].zColl;.    
1a4d0 7d 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c  }.    if( !zColl
1a4e0 20 29 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74   ) zColl = sqlit
1a4f0 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20  e3StrBINARY;.   
1a500 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
1a510 75 73 79 20 26 26 20 21 73 71 6c 69 74 65 33 4c  usy && !sqlite3L
1a520 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
1a530 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20  rse, zColl) ){. 
1a540 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
1a550 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
1a560 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61   }.    pIndex->a
1a570 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c  zColl[i] = zColl
1a580 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65 64 53  ;.    requestedS
1a590 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74  ortOrder = pList
1a5a0 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20  Item->sortOrder 
1a5b0 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b  & sortOrderMask;
1a5c0 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f  .    pIndex->aSo
1a5d0 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 28 75 38  rtOrder[i] = (u8
1a5e0 29 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72  )requestedSortOr
1a5f0 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  der;.  }..  /* A
1a600 70 70 65 6e 64 20 74 68 65 20 74 61 62 6c 65 20  ppend the table 
1a610 6b 65 79 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  key to the end o
1a620 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 46 6f  f the index.  Fo
1a630 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a  r WITHOUT ROWID.
1a640 20 20 2a 2a 20 74 61 62 6c 65 73 20 28 77 68 65    ** tables (whe
1a650 6e 20 70 50 6b 21 3d 30 29 20 74 68 69 73 20 77  n pPk!=0) this w
1a660 69 6c 6c 20 62 65 20 74 68 65 20 64 65 63 6c 61  ill be the decla
1a670 72 65 64 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  red PRIMARY KEY.
1a680 20 20 46 6f 72 0a 20 20 2a 2a 20 6e 6f 72 6d 61    For.  ** norma
1a690 6c 20 74 61 62 6c 65 73 20 28 77 68 65 6e 20 70  l tables (when p
1a6a0 50 6b 3d 3d 30 29 20 74 68 69 73 20 77 69 6c 6c  Pk==0) this will
1a6b0 20 62 65 20 74 68 65 20 72 6f 77 69 64 2e 0a 20   be the rowid.. 
1a6c0 20 2a 2f 0a 20 20 69 66 28 20 70 50 6b 20 29 7b   */.  if( pPk ){
1a6d0 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
1a6e0 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b  pPk->nKeyCol; j+
1a6f0 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20  +){.      int x 
1a700 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  = pPk->aiColumn[
1a710 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  j];.      assert
1a720 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( x>=0 );.      
1a730 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70 49  if( hasColumn(pI
1a740 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20  ndex->aiColumn, 
1a750 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c  pIndex->nKeyCol,
1a760 20 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70   x) ){.        p
1a770 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d  Index->nColumn--
1a780 3b 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ; .      }else{.
1a790 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
1a7a0 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 78 3b  aiColumn[i] = x;
1a7b0 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
1a7c0 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50 6b  >azColl[i] = pPk
1a7d0 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20  ->azColl[j];.   
1a7e0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f       pIndex->aSo
1a7f0 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 50 6b  rtOrder[i] = pPk
1a800 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b  ->aSortOrder[j];
1a810 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  .        i++;.  
1a820 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1a830 61 73 73 65 72 74 28 20 69 3d 3d 70 49 6e 64 65  assert( i==pInde
1a840 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  x->nColumn );.  
1a850 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 64 65  }else{.    pInde
1a860 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d  x->aiColumn[i] =
1a870 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20 70   XN_ROWID;.    p
1a880 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  Index->azColl[i]
1a890 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e   = sqlite3StrBIN
1a8a0 41 52 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ARY;.  }.  sqlit
1a8b0 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28  e3DefaultRowEst(
1a8c0 70 49 6e 64 65 78 29 3b 0a 20 20 69 66 28 20 70  pIndex);.  if( p
1a8d0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
1a8e0 3d 3d 30 20 29 20 65 73 74 69 6d 61 74 65 49 6e  ==0 ) estimateIn
1a8f0 64 65 78 57 69 64 74 68 28 70 49 6e 64 65 78 29  dexWidth(pIndex)
1a900 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1a910 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e 73 20 65  index contains e
1a920 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69  very column of i
1a930 74 73 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d  ts table, then m
1a940 61 72 6b 0a 20 20 2a 2a 20 69 74 20 61 73 20 61  ark.  ** it as a
1a950 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
1a960 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 48 61 73  */.  assert( Has
1a970 52 6f 77 69 64 28 70 54 61 62 29 20 0a 20 20 20  Rowid(pTab) .   
1a980 20 20 20 7c 7c 20 70 54 61 62 2d 3e 69 50 4b 65     || pTab->iPKe
1a990 79 3c 30 20 7c 7c 20 73 71 6c 69 74 65 33 43 6f  y<0 || sqlite3Co
1a9a0 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 6e 64  lumnOfIndex(pInd
1a9b0 65 78 2c 20 70 54 61 62 2d 3e 69 50 4b 65 79 29  ex, pTab->iPKey)
1a9c0 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 54 62  >=0 );.  if( pTb
1a9d0 6c 4e 61 6d 65 21 3d 30 20 26 26 20 70 49 6e 64  lName!=0 && pInd
1a9e0 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 54 61  ex->nColumn>=pTa
1a9f0 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 70  b->nCol ){.    p
1aa00 49 6e 64 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e  Index->isCoverin
1aa10 67 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 6a  g = 1;.    for(j
1aa20 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; j<pTab->nCol
1aa30 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
1aa40 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79  ( j==pTab->iPKey
1aa50 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1aa60 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f     if( sqlite3Co
1aa70 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 6e 64  lumnOfIndex(pInd
1aa80 65 78 2c 6a 29 3e 3d 30 20 29 20 63 6f 6e 74 69  ex,j)>=0 ) conti
1aa90 6e 75 65 3b 0a 20 20 20 20 20 20 70 49 6e 64 65  nue;.      pInde
1aaa0 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20  x->isCovering = 
1aab0 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
1aac0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1aad0 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70   pTab==pParse->p
1aae0 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  NewTable ){.    
1aaf0 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
1ab00 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  has been called 
1ab10 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75 74  to create an aut
1ab20 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73 20  omatic index as 
1ab30 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20  a.    ** result 
1ab40 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  of a PRIMARY KEY
1ab50 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73   or UNIQUE claus
1ab60 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65  e on a column de
1ab70 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20  finition, or.   
1ab80 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45   ** a PRIMARY KE
1ab90 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75  Y or UNIQUE clau
1aba0 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  se following the
1abb0 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69   column definiti
1abc0 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e  ons..    ** i.e.
1abd0 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a   one of:.    **.
1abe0 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41      ** CREATE TA
1abf0 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59 20  BLE t(x PRIMARY 
1ac00 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20  KEY, y);.    ** 
1ac10 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78  CREATE TABLE t(x
1ac20 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79  , y, UNIQUE(x, y
1ac30 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ));.    **.    *
1ac40 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 68  * Either way, ch
1ac50 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
1ac60 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  e table already 
1ac70 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65  has such an inde
1ac80 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c  x. If.    ** so,
1ac90 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72   don't bother cr
1aca0 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e  eating this one.
1acb0 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69   This only appli
1acc0 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74  es to.    ** aut
1acd0 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74  omatically creat
1ace0 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72  ed indices. User
1acf0 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79  s can do as they
1ad00 20 77 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a   wish with.    *
1ad10 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63  * explicit indic
1ad20 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  es..    **.    *
1ad30 2a 20 54 77 6f 20 55 4e 49 51 55 45 20 6f 72 20  * Two UNIQUE or 
1ad40 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
1ad50 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 6e 73  traints are cons
1ad60 69 64 65 72 65 64 20 65 71 75 69 76 61 6c 65 6e  idered equivalen
1ad70 74 0a 20 20 20 20 2a 2a 20 28 61 6e 64 20 74 68  t.    ** (and th
1ad80 75 73 20 73 75 70 70 72 65 73 73 69 6e 67 20 74  us suppressing t
1ad90 68 65 20 73 65 63 6f 6e 64 20 6f 6e 65 29 20 65  he second one) e
1ada0 76 65 6e 20 69 66 20 74 68 65 79 20 68 61 76 65  ven if they have
1adb0 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20 2a   different.    *
1adc0 2a 20 73 6f 72 74 20 6f 72 64 65 72 73 2e 0a 20  * sort orders.. 
1add0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
1ade0 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72  there are differ
1adf0 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ent collating se
1ae00 71 75 65 6e 63 65 73 20 6f 72 20 69 66 20 74 68  quences or if th
1ae10 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20  e columns of.   
1ae20 20 2a 2a 20 74 68 65 20 63 6f 6e 73 74 72 61 69   ** the constrai
1ae30 6e 74 20 6f 63 63 75 72 20 69 6e 20 64 69 66 66  nt occur in diff
1ae40 65 72 65 6e 74 20 6f 72 64 65 72 73 2c 20 74 68  erent orders, th
1ae50 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  en the constrain
1ae60 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 63 6f  ts are.    ** co
1ae70 6e 73 69 64 65 72 65 64 20 64 69 73 74 69 6e 63  nsidered distinc
1ae80 74 20 61 6e 64 20 62 6f 74 68 20 72 65 73 75 6c  t and both resul
1ae90 74 20 69 6e 20 73 65 70 61 72 61 74 65 20 69 6e  t in separate in
1aea0 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  dices..    */.  
1aeb0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
1aec0 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
1aed0 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
1aee0 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
1aef0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a  ){.      int k;.
1af00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49 73        assert( Is
1af10 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78  UniqueIndex(pIdx
1af20 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
1af30 74 28 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65  t( pIdx->idxType
1af40 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  !=SQLITE_IDXTYPE
1af50 5f 41 50 50 44 45 46 20 29 3b 0a 20 20 20 20 20  _APPDEF );.     
1af60 20 61 73 73 65 72 74 28 20 49 73 55 6e 69 71 75   assert( IsUniqu
1af70 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20 29  eIndex(pIndex) )
1af80 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  ;..      if( pId
1af90 78 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e 64  x->nKeyCol!=pInd
1afa0 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f  ex->nKeyCol ) co
1afb0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f  ntinue;.      fo
1afc0 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e  r(k=0; k<pIdx->n
1afd0 4b 65 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20 20  KeyCol; k++){.  
1afe0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1aff0 20 2a 7a 31 3b 0a 20 20 20 20 20 20 20 20 63 6f   *z1;.        co
1b000 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20  nst char *z2;.  
1b010 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1b020 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 3e  dx->aiColumn[k]>
1b030 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
1b040 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
1b050 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43  [k]!=pIndex->aiC
1b060 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b  olumn[k] ) break
1b070 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70  ;.        z1 = p
1b080 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a  Idx->azColl[k];.
1b090 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70 49 6e          z2 = pIn
1b0a0 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a  dex->azColl[k];.
1b0b0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1b0c0 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a  te3StrICmp(z1, z
1b0d0 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  2) ) break;.    
1b0e0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d    }.      if( k=
1b0f0 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29  =pIdx->nKeyCol )
1b100 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
1b110 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e  dx->onError!=pIn
1b120 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a  dex->onError ){.
1b130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
1b140 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65  s constraint cre
1b150 61 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e  ates the same in
1b160 64 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75  dex as a previou
1b170 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  s.          ** c
1b180 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66  onstraint specif
1b190 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e  ied somewhere in
1b1a0 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
1b1b0 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  E statement..   
1b1c0 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65         ** Howeve
1b1d0 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43  r the ON CONFLIC
1b1e0 54 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69  T clauses are di
1b1f0 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68  fferent. If both
1b200 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20   this .         
1b210 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61   ** constraint a
1b220 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  nd the previous 
1b230 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74  equivalent const
1b240 72 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69  raint have expli
1b250 63 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  cit.          **
1b260 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
1b270 75 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20  uses this is an 
1b280 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65  error. Otherwise
1b290 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20  , use the.      
1b2a0 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c      ** explicitl
1b2b0 79 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61  y specified beha
1b2c0 76 69 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64  vior for the ind
1b2d0 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ex..          */
1b2e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
1b2f0 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  (pIdx->onError==
1b300 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49  OE_Default || pI
1b310 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
1b320 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20  E_Default) ){.  
1b330 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1b340 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1b350 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1b360 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20     "conflicting 
1b370 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
1b380 73 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20  ses specified", 
1b390 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
1b3a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
1b3b0 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
1b3c0 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
1b3d0 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45         pIdx->onE
1b3e0 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f  rror = pIndex->o
1b3f0 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  nError;.        
1b400 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1b410 20 20 20 20 20 20 69 66 28 20 69 64 78 54 79 70        if( idxTyp
1b420 65 3d 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50  e==SQLITE_IDXTYP
1b430 45 5f 50 52 49 4d 41 52 59 4b 45 59 20 29 20 70  E_PRIMARYKEY ) p
1b440 49 64 78 2d 3e 69 64 78 54 79 70 65 20 3d 20 69  Idx->idxType = i
1b450 64 78 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20  dxType;.        
1b460 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1b470 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
1b480 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1b490 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64  Link the new Ind
1b4a0 65 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  ex structure to 
1b4b0 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f  its table and to
1b4c0 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20   the other.  ** 
1b4d0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1b4e0 73 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a  se structures. .
1b4f0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
1b500 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
1b510 3b 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  ;.  if( db->init
1b520 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64  .busy ){.    Ind
1b530 65 78 20 2a 70 3b 0a 20 20 20 20 61 73 73 65 72  ex *p;.    asser
1b540 74 28 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56  t( !IN_DECLARE_V
1b550 54 41 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72  TAB );.    asser
1b560 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
1b570 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c  MutexHeld(db, 0,
1b580 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
1b590 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  ) );.    p = sql
1b5a0 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
1b5b0 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d  pIndex->pSchema-
1b5c0 3e 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20  >idxHash, .     
1b5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5e0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
1b5f0 6d 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20  me, pIndex);.   
1b600 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
1b610 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65  assert( p==pInde
1b620 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  x );  /* Malloc 
1b630 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
1b640 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1b650 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
1b660 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
1b670 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
1b680 20 7d 0a 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c   }.    db->mDbFl
1b690 61 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63  ags |= DBFLAG_Sc
1b6a0 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20 20 20  hemaChange;.    
1b6b0 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
1b6c0 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
1b6d0 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74  >tnum = db->init
1b6e0 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a  .newTnum;.    }.
1b6f0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
1b700 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  s is the initial
1b710 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
1b720 61 74 65 6d 65 6e 74 20 28 6f 72 20 43 52 45 41  atement (or CREA
1b730 54 45 20 54 41 42 4c 45 20 69 66 20 74 68 65 0a  TE TABLE if the.
1b740 20 20 2a 2a 20 69 6e 64 65 78 20 69 73 20 61 6e    ** index is an
1b750 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78 20 66   implied index f
1b760 6f 72 20 61 20 55 4e 49 51 55 45 20 6f 72 20 50  or a UNIQUE or P
1b770 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
1b780 72 61 69 6e 74 29 20 74 68 65 6e 0a 20 20 2a 2a  raint) then.  **
1b790 20 65 6d 69 74 20 63 6f 64 65 20 74 6f 20 61 6c   emit code to al
1b7a0 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  locate the index
1b7b0 20 72 6f 6f 74 70 61 67 65 20 6f 6e 20 64 69 73   rootpage on dis
1b7c0 6b 20 61 6e 64 20 6d 61 6b 65 20 61 6e 20 65 6e  k and make an en
1b7d0 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65  try for.  ** the
1b7e0 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 73 71   index in the sq
1b7f0 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
1b800 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 74  e and populate t
1b810 68 65 20 69 6e 64 65 78 20 77 69 74 68 0a 20 20  he index with.  
1b820 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75 74  ** content.  But
1b830 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73  , do not do this
1b840 20 69 66 20 77 65 20 61 72 65 20 73 69 6d 70 6c   if we are simpl
1b850 79 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71  y reading the sq
1b860 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a  lite_master.  **
1b870 20 74 61 62 6c 65 20 74 6f 20 70 61 72 73 65 20   table to parse 
1b880 74 68 65 20 73 63 68 65 6d 61 2c 20 6f 72 20 69  the schema, or i
1b890 66 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  f this index is 
1b8a0 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
1b8b0 69 6e 64 65 78 0a 20 20 2a 2a 20 6f 66 20 61 20  index.  ** of a 
1b8c0 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
1b8d0 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ble..  **.  ** I
1b8e0 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74  f pTblName==0 it
1b8f0 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65   means this inde
1b900 78 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61  x is generated a
1b910 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 50 52 49  s an implied PRI
1b920 4d 41 52 59 20 4b 45 59 0a 20 20 2a 2a 20 6f 72  MARY KEY.  ** or
1b930 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20 69 6e   UNIQUE index in
1b940 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
1b950 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63  statement.  Sinc
1b960 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a  e the table.  **
1b970 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63   has just been c
1b980 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61  reated, it conta
1b990 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20  ins no data and 
1b9a0 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61  the index initia
1b9b0 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74  lization.  ** st
1b9c0 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65  ep can be skippe
1b9d0 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69  d..  */.  else i
1b9e0 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
1b9f0 29 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 21 3d 30  ) || pTblName!=0
1ba00 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b   ){.    Vdbe *v;
1ba10 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74  .    char *zStmt
1ba20 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d  ;.    int iMem =
1ba30 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1ba40 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ..    v = sqlite
1ba50 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1ba60 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
1ba70 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1ba80 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20 73 71  e_index;..    sq
1ba90 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
1baa0 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
1bab0 20 31 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20 2f   1, iDb);..    /
1bac0 2a 20 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f  * Create the roo
1bad0 74 70 61 67 65 20 66 6f 72 20 74 68 65 20 69 6e  tpage for the in
1bae0 64 65 78 20 75 73 69 6e 67 20 43 72 65 61 74 65  dex using Create
1baf0 49 6e 64 65 78 2e 20 42 75 74 20 62 65 66 6f 72  Index. But befor
1bb00 65 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 73  e.    ** doing s
1bb10 6f 2c 20 63 6f 64 65 20 61 20 4e 6f 6f 70 20 69  o, code a Noop i
1bb20 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 73  nstruction and s
1bb30 74 6f 72 65 20 69 74 73 20 61 64 64 72 65 73 73  tore its address
1bb40 20 69 6e 20 0a 20 20 20 20 2a 2a 20 49 6e 64 65   in .    ** Inde
1bb50 78 2e 74 6e 75 6d 2e 20 54 68 69 73 20 69 73 20  x.tnum. This is 
1bb60 72 65 71 75 69 72 65 64 20 69 6e 20 63 61 73 65  required in case
1bb70 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 61   this index is a
1bb80 63 74 75 61 6c 6c 79 20 61 20 0a 20 20 20 20 2a  ctually a .    *
1bb90 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6e  * PRIMARY KEY an
1bba0 64 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61  d the table is a
1bbb0 63 74 75 61 6c 6c 79 20 61 20 57 49 54 48 4f 55  ctually a WITHOU
1bbc0 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 49  T ROWID table. I
1bbd0 6e 20 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 63  n .    ** that c
1bbe0 61 73 65 20 74 68 65 20 63 6f 6e 76 65 72 74 54  ase the convertT
1bbf0 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62  oWithoutRowidTab
1bc00 6c 65 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  le() routine wil
1bc10 6c 20 72 65 70 6c 61 63 65 0a 20 20 20 20 2a 2a  l replace.    **
1bc20 20 74 68 65 20 4e 6f 6f 70 20 77 69 74 68 20 61   the Noop with a
1bc30 20 47 6f 74 6f 20 74 6f 20 6a 75 6d 70 20 6f 76   Goto to jump ov
1bc40 65 72 20 74 68 65 20 56 44 42 45 20 63 6f 64 65  er the VDBE code
1bc50 20 67 65 6e 65 72 61 74 65 64 20 62 65 6c 6f 77   generated below
1bc60 2e 20 2a 2f 0a 20 20 20 20 70 49 6e 64 65 78 2d  . */.    pIndex-
1bc70 3e 74 6e 75 6d 20 3d 20 73 71 6c 69 74 65 33 56  >tnum = sqlite3V
1bc80 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
1bc90 4e 6f 6f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  Noop);.    sqlit
1bca0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1bcb0 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20  OP_CreateIndex, 
1bcc0 69 44 62 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20 20  iDb, iMem);..   
1bcd0 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65 20 63   /* Gather the c
1bce0 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
1bcf0 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58  the CREATE INDEX
1bd00 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a   statement into.
1bd10 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74      ** the zStmt
1bd20 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2f   variable.    */
1bd30 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20  .    if( pStart 
1bd40 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ){.      int n =
1bd50 20 28 69 6e 74 29 28 70 50 61 72 73 65 2d 3e 73   (int)(pParse->s
1bd60 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20 70 4e  LastToken.z - pN
1bd70 61 6d 65 2d 3e 7a 29 20 2b 20 70 50 61 72 73 65  ame->z) + pParse
1bd80 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a  ->sLastToken.n;.
1bd90 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 2d        if( pName-
1bda0 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29 20 6e  >z[n-1]==';' ) n
1bdb0 2d 2d 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e  --;.      /* A n
1bdc0 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68 20  amed index with 
1bdd0 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45 41  an explicit CREA
1bde0 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
1bdf0 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d  nt */.      zStm
1be00 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
1be10 74 66 28 64 62 2c 20 22 43 52 45 41 54 45 25 73  tf(db, "CREATE%s
1be20 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20   INDEX %.*s",.  
1be30 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f        onError==O
1be40 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20  E_None ? "" : " 
1be50 55 4e 49 51 55 45 22 2c 20 6e 2c 20 70 4e 61 6d  UNIQUE", n, pNam
1be60 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e->z);.    }else
1be70 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75  {.      /* An au
1be80 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72  tomatic index cr
1be90 65 61 74 65 64 20 62 79 20 61 20 50 52 49 4d 41  eated by a PRIMA
1bea0 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
1beb0 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
1bec0 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20       /* zStmt = 
1bed0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
1bee0 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74  "); */.      zSt
1bef0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  mt = 0;.    }.. 
1bf00 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74     /* Add an ent
1bf10 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73  ry in sqlite_mas
1bf20 74 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e 64  ter for this ind
1bf30 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  ex.    */.    sq
1bf40 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
1bf50 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
1bf60 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25    "INSERT INTO %
1bf70 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e 64  Q.%s VALUES('ind
1bf80 65 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c 25 51  ex',%Q,%Q,#%d,%Q
1bf90 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d  );",.        db-
1bfa0 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
1bfb0 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c  me, MASTER_NAME,
1bfc0 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
1bfd0 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
1bfe0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
1bff0 20 20 20 20 20 69 4d 65 6d 2c 0a 20 20 20 20 20       iMem,.     
1c000 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a     zStmt.    );.
1c010 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1c020 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20  e(db, zStmt);.. 
1c030 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69     /* Fill the i
1c040 6e 64 65 78 20 77 69 74 68 20 64 61 74 61 20 61  ndex with data a
1c050 6e 64 20 72 65 70 61 72 73 65 20 74 68 65 20 73  nd reparse the s
1c060 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f  chema. Code an O
1c070 50 5f 45 78 70 69 72 65 0a 20 20 20 20 2a 2a 20  P_Expire.    ** 
1c080 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  to invalidate al
1c090 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73  l pre-compiled s
1c0a0 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a  tatements..    *
1c0b0 2f 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61  /.    if( pTblNa
1c0c0 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  me ){.      sqli
1c0d0 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
1c0e0 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69  Parse, pIndex, i
1c0f0 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Mem);.      sqli
1c100 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
1c110 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
1c120 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c130 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28  ddParseSchemaOp(
1c140 70 50 61 72 73 65 2c 20 69 44 62 2c 0a 20 20 20  pParse, iDb,.   
1c150 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
1c160 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27  intf(db, "name='
1c170 25 71 27 20 41 4e 44 20 74 79 70 65 3d 27 69 6e  %q' AND type='in
1c180 64 65 78 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a  dex'", pIndex->z
1c190 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71  Name));.      sq
1c1a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
1c1b0 76 2c 20 4f 50 5f 45 78 70 69 72 65 29 3b 0a 20  v, OP_Expire);. 
1c1c0 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
1c1d0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
1c1e0 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 29 3b 0a   pIndex->tnum);.
1c1f0 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61    }..  /* When a
1c200 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74  dding an index t
1c210 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
1c220 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c  dices for a tabl
1c230 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72  e, make.  ** sur
1c240 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61  e all indices la
1c250 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65  beled OE_Replace
1c260 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20   come after all 
1c270 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20  those labeled.  
1c280 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54  ** OE_Ignore.  T
1c290 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
1c2a0 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74   for the correct
1c2b0 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 65 63   constraint chec
1c2c0 6b 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e  k.  ** processin
1c2d0 67 20 28 69 6e 20 73 71 6c 69 74 65 33 47 65 6e  g (in sqlite3Gen
1c2e0 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43  erateConstraintC
1c2f0 68 65 63 6b 73 28 29 29 20 61 73 20 70 61 72 74  hecks()) as part
1c300 20 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54 45 20   of.  ** UPDATE 
1c310 61 6e 64 20 49 4e 53 45 52 54 20 73 74 61 74 65  and INSERT state
1c320 6d 65 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20  ments.  .  */.  
1c330 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
1c340 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30  y || pTblName==0
1c350 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72   ){.    if( onEr
1c360 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
1c370 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d  || pTab->pIndex=
1c380 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  =0.         || p
1c390 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45  Tab->pIndex->onE
1c3a0 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  rror==OE_Replace
1c3b0 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
1c3c0 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70  >pNext = pTab->p
1c3d0 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61  Index;.      pTa
1c3e0 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64  b->pIndex = pInd
1c3f0 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ex;.    }else{. 
1c400 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68       Index *pOth
1c410 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  er = pTab->pInde
1c420 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  x;.      while( 
1c430 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26  pOther->pNext &&
1c440 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e   pOther->pNext->
1c450 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
1c460 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ace ){.        p
1c470 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e  Other = pOther->
1c480 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
1c490 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65       pIndex->pNe
1c4a0 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  xt = pOther->pNe
1c4b0 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72  xt;.      pOther
1c4c0 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
1c4d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64  ;.    }.    pInd
1c4e0 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ex = 0;.  }..  /
1c4f0 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72  * Clean up befor
1c500 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69  e exiting */.exi
1c510 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a  t_create_index:.
1c520 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 20 66    if( pIndex ) f
1c530 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  reeIndex(db, pIn
1c540 64 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  dex);.  sqlite3E
1c550 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 50  xprDelete(db, pP
1c560 49 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74  IWhere);.  sqlit
1c570 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
1c580 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73  (db, pList);.  s
1c590 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
1c5a0 65 74 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65  ete(db, pTblName
1c5b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
1c5c0 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 7d  ee(db, zName);.}
1c5d0 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65  ../*.** Fill the
1c5e0 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b   Index.aiRowEst[
1c5f0 5d 20 61 72 72 61 79 20 77 69 74 68 20 64 65 66  ] array with def
1c600 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ault information
1c610 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a   - information.*
1c620 2a 20 74 6f 20 62 65 20 75 73 65 64 20 77 68 65  * to be used whe
1c630 6e 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75  n we have not ru
1c640 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f  n the ANALYZE co
1c650 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52  mmand..**.** aiR
1c660 6f 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70  owEst[0] is supp
1c670 6f 73 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  osed to contain 
1c680 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
1c690 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e  ements in the in
1c6a0 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65  dex..** Since we
1c6b0 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75   do not know, gu
1c6c0 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20  ess 1 million.  
1c6d0 61 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61  aiRowEst[1] is a
1c6e0 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
1c6f0 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72  e.** number of r
1c700 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
1c710 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20   that match any 
1c720 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65  particular value
1c730 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   of the.** first
1c740 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
1c750 6e 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b  ndex.  aiRowEst[
1c760 32 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74  2] is an estimat
1c770 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a  e of the number.
1c780 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  ** of rows that 
1c790 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63  match any partic
1c7a0 75 6c 61 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ular combination
1c7b0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 32 20   of the first 2 
1c7c0 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68  columns.** of th
1c7d0 65 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f  e index.  And so
1c7e0 20 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74   forth.  It must
1c7f0 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 63   always be the c
1c800 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20  ase that.*.**   
1c810 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74          aiRowEst
1c820 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d  [N]<=aiRowEst[N-
1c830 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  1].**           
1c840 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a  aiRowEst[N]>=1.*
1c850 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20  *.** Apart from 
1c860 74 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69  that, we have li
1c870 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65  ttle to go on be
1c880 73 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20  sides intuition 
1c890 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52  as to.** how aiR
1c8a0 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62  owEst[] should b
1c8b0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20  e initialized.  
1c8c0 54 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65  The numbers gene
1c8d0 72 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72  rated here.** ar
1c8e0 65 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63  e based on typic
1c8f0 61 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20  al values found 
1c900 69 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65  in actual indice
1c910 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1c920 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28  e3DefaultRowEst(
1c930 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
1c940 2f 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /*              
1c950 20 20 31 30 2c 20 20 39 2c 20 20 38 2c 20 20 37    10,  9,  8,  7
1c960 2c 20 20 36 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  ,  6 */.  LogEst
1c970 20 61 56 61 6c 5b 5d 20 3d 20 7b 20 33 33 2c 20   aVal[] = { 33, 
1c980 33 32 2c 20 33 30 2c 20 32 38 2c 20 32 36 20 7d  32, 30, 28, 26 }
1c990 3b 0a 20 20 4c 6f 67 45 73 74 20 2a 61 20 3d 20  ;.  LogEst *a = 
1c9a0 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  pIdx->aiRowLogEs
1c9b0 74 3b 0a 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d  t;.  int nCopy =
1c9c0 20 4d 49 4e 28 41 72 72 61 79 53 69 7a 65 28 61   MIN(ArraySize(a
1c9d0 56 61 6c 29 2c 20 70 49 64 78 2d 3e 6e 4b 65 79  Val), pIdx->nKey
1c9e0 43 6f 6c 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Col);.  int i;..
1c9f0 20 20 2f 2a 20 49 6e 64 65 78 65 73 20 77 69 74    /* Indexes wit
1ca00 68 20 64 65 66 61 75 6c 74 20 72 6f 77 20 65 73  h default row es
1ca10 74 69 6d 61 74 65 73 20 73 68 6f 75 6c 64 20 6e  timates should n
1ca20 6f 74 20 68 61 76 65 20 73 74 61 74 31 20 64 61  ot have stat1 da
1ca30 74 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ta */.  assert( 
1ca40 21 70 49 64 78 2d 3e 68 61 73 53 74 61 74 31 20  !pIdx->hasStat1 
1ca50 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
1ca60 20 66 69 72 73 74 20 65 6e 74 72 79 20 28 6e 75   first entry (nu
1ca70 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
1ca80 74 68 65 20 69 6e 64 65 78 29 20 74 6f 20 74 68  the index) to th
1ca90 65 20 65 73 74 69 6d 61 74 65 64 20 0a 20 20 2a  e estimated .  *
1caa0 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
1cab0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 6f   in the table, o
1cac0 72 20 68 61 6c 66 20 74 68 65 20 6e 75 6d 62 65  r half the numbe
1cad0 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
1cae0 20 74 61 62 6c 65 0a 20 20 2a 2a 20 66 6f 72 20   table.  ** for 
1caf0 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e  a partial index.
1cb00 20 20 20 42 75 74 20 64 6f 20 6e 6f 74 20 6c 65     But do not le
1cb10 74 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 64  t the estimate d
1cb20 72 6f 70 20 62 65 6c 6f 77 20 31 30 2e 20 2a 2f  rop below 10. */
1cb30 0a 20 20 61 5b 30 5d 20 3d 20 70 49 64 78 2d 3e  .  a[0] = pIdx->
1cb40 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45  pTable->nRowLogE
1cb50 73 74 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e  st;.  if( pIdx->
1cb60 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30  pPartIdxWhere!=0
1cb70 20 29 20 61 5b 30 5d 20 2d 3d 20 31 30 3b 20 20   ) a[0] -= 10;  
1cb80 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69  assert( 10==sqli
1cb90 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a  te3LogEst(2) );.
1cba0 20 20 69 66 28 20 61 5b 30 5d 3c 33 33 20 29 20    if( a[0]<33 ) 
1cbb0 61 5b 30 5d 20 3d 20 33 33 3b 20 20 20 20 20 20  a[0] = 33;      
1cbc0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1cbd0 72 74 28 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c  rt( 33==sqlite3L
1cbe0 6f 67 45 73 74 28 31 30 29 20 29 3b 0a 0a 20 20  ogEst(10) );..  
1cbf0 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 61 74  /* Estimate that
1cc00 20 61 5b 31 5d 20 69 73 20 31 30 2c 20 61 5b 32   a[1] is 10, a[2
1cc10 5d 20 69 73 20 39 2c 20 61 5b 33 5d 20 69 73 20  ] is 9, a[3] is 
1cc20 38 2c 20 61 5b 34 5d 20 69 73 20 37 2c 20 61 5b  8, a[4] is 7, a[
1cc30 35 5d 20 69 73 0a 20 20 2a 2a 20 36 20 61 6e 64  5] is.  ** 6 and
1cc40 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74   each subsequent
1cc50 20 76 61 6c 75 65 20 28 69 66 20 61 6e 79 29 20   value (if any) 
1cc60 69 73 20 35 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63  is 5.  */.  memc
1cc70 70 79 28 26 61 5b 31 5d 2c 20 61 56 61 6c 2c 20  py(&a[1], aVal, 
1cc80 6e 43 6f 70 79 2a 73 69 7a 65 6f 66 28 4c 6f 67  nCopy*sizeof(Log
1cc90 45 73 74 29 29 3b 0a 20 20 66 6f 72 28 69 3d 6e  Est));.  for(i=n
1cca0 43 6f 70 79 2b 31 3b 20 69 3c 3d 70 49 64 78 2d  Copy+1; i<=pIdx-
1ccb0 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nKeyCol; i++){.
1ccc0 20 20 20 20 61 5b 69 5d 20 3d 20 32 33 3b 20 20      a[i] = 23;  
1ccd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cce0 20 20 61 73 73 65 72 74 28 20 32 33 3d 3d 73 71    assert( 23==sq
1ccf0 6c 69 74 65 33 4c 6f 67 45 73 74 28 35 29 20 29  lite3LogEst(5) )
1cd00 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
1cd10 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73   0==sqlite3LogEs
1cd20 74 28 31 29 20 29 3b 0a 20 20 69 66 28 20 49 73  t(1) );.  if( Is
1cd30 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78  UniqueIndex(pIdx
1cd40 29 20 29 20 61 5b 70 49 64 78 2d 3e 6e 4b 65 79  ) ) a[pIdx->nKey
1cd50 43 6f 6c 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Col] = 0;.}../*.
1cd60 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1cd70 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69  will drop an exi
1cd80 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65  sting named inde
1cd90 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  x.  This routine
1cda0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  .** implements t
1cdb0 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74  he DROP INDEX st
1cdc0 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
1cdd0 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65   sqlite3DropInde
1cde0 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
1cdf0 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c   SrcList *pName,
1ce00 20 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a   int ifExists){.
1ce10 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
1ce20 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
1ce30 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1ce40 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
1ce50 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  b;..  assert( pP
1ce60 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b  arse->nErr==0 );
1ce70 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c     /* Never call
1ce80 65 64 20 77 69 74 68 20 70 72 69 6f 72 20 65 72  ed with prior er
1ce90 72 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20 64 62  rors */.  if( db
1cea0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1ceb0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
1cec0 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
1ced0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
1cee0 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66  >nSrc==1 );.  if
1cef0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
1cf00 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
1cf10 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f  Parse) ){.    go
1cf20 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1cf30 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78  ex;.  }.  pIndex
1cf40 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
1cf50 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61  dex(db, pName->a
1cf60 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65  [0].zName, pName
1cf70 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
1cf80 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d  );.  if( pIndex=
1cf90 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21 69  =0 ){.    if( !i
1cfa0 66 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20  fExists ){.     
1cfb0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1cfc0 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
1cfd0 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e  h index: %S", pN
1cfe0 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  ame, 0);.    }el
1cff0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
1d000 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64  3CodeVerifyNamed
1d010 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70  Schema(pParse, p
1d020 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
1d030 62 61 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  base);.    }.   
1d040 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63   pParse->checkSc
1d050 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f  hema = 1;.    go
1d060 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1d070 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49  ex;.  }.  if( pI
1d080 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 21 3d 53  ndex->idxType!=S
1d090 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50  QLITE_IDXTYPE_AP
1d0a0 50 44 45 46 20 29 7b 0a 20 20 20 20 73 71 6c 69  PDEF ){.    sqli
1d0b0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1d0c0 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63  se, "index assoc
1d0d0 69 61 74 65 64 20 77 69 74 68 20 55 4e 49 51 55  iated with UNIQU
1d0e0 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52  E ".      "or PR
1d0f0 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
1d100 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64  aint cannot be d
1d110 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20  ropped", 0);.   
1d120 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
1d130 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62  index;.  }.  iDb
1d140 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
1d150 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  ToIndex(db, pInd
1d160 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ex->pSchema);.  
1d170 73 71 6c 69 74 65 33 53 63 68 65 6d 61 57 72 69  sqlite3SchemaWri
1d180 74 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44  table(pParse, iD
1d190 62 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  b);.#ifndef SQLI
1d1a0 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
1d1b0 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
1d1c0 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  t code = SQLITE_
1d1d0 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  DROP_INDEX;.    
1d1e0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
1d1f0 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20  ndex->pTable;.  
1d200 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
1d210 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
1d220 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63  .zDbSName;.    c
1d230 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
1d240 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  = SCHEMA_TABLE(i
1d250 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  Db);.    if( sql
1d260 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1d270 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
1d280 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44  ETE, zTab, 0, zD
1d290 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
1d2a0 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1d2b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1d2c0 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
1d2d0 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c  iDb ) code = SQL
1d2e0 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
1d2f0 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
1d300 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1d310 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64  arse, code, pInd
1d320 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  ex->zName, pTab-
1d330 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a  >zName, zDb) ){.
1d340 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1d350 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
1d360 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
1d370 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1d380 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69   to remove the i
1d390 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68  ndex and from th
1d3a0 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a  e master table *
1d3b0 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
1d3c0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
1d3d0 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
1d3e0 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
1d3f0 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
1d400 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 1, iDb);.    s
1d410 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
1d420 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
1d430 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
1d440 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25  .%s WHERE name=%
1d450 51 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65  Q AND type='inde
1d460 78 27 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e  x'",.       db->
1d470 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
1d480 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20  e, MASTER_NAME, 
1d490 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20  pIndex->zName.  
1d4a0 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
1d4b0 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28  ClearStatTables(
1d4c0 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69 64  pParse, iDb, "id
1d4d0 78 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  x", pIndex->zNam
1d4e0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  e);.    sqlite3C
1d4f0 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
1d500 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 64 65  se, iDb);.    de
1d510 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
1d520 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e  arse, pIndex->tn
1d530 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  um, iDb);.    sq
1d540 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1d550 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c  v, OP_DropIndex,
1d560 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64   iDb, 0, 0, pInd
1d570 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ex->zName, 0);. 
1d580 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e   }..exit_drop_in
1d590 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72  dex:.  sqlite3Sr
1d5a0 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  cListDelete(db, 
1d5b0 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pName);.}../*.**
1d5c0 20 70 41 72 72 61 79 20 69 73 20 61 20 70 6f 69   pArray is a poi
1d5d0 6e 74 65 72 20 74 6f 20 61 6e 20 61 72 72 61 79  nter to an array
1d5e0 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 45 61 63   of objects. Eac
1d5f0 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a  h object in the.
1d600 2a 2a 20 61 72 72 61 79 20 69 73 20 73 7a 45 6e  ** array is szEn
1d610 74 72 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a  try bytes in siz
1d620 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  e. This routine 
1d630 75 73 65 73 20 73 71 6c 69 74 65 33 44 62 52 65  uses sqlite3DbRe
1d640 61 6c 6c 6f 63 28 29 0a 2a 2a 20 74 6f 20 65 78  alloc().** to ex
1d650 74 65 6e 64 20 74 68 65 20 61 72 72 61 79 20 73  tend the array s
1d660 6f 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  o that there is 
1d670 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20  space for a new 
1d680 6f 62 6a 65 63 74 20 61 74 20 74 68 65 20 65 6e  object at the en
1d690 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  d..**.** When th
1d6a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1d6b0 61 6c 6c 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20  alled, *pnEntry 
1d6c0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 75 72  contains the cur
1d6d0 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 2a 2a 20  rent size of.** 
1d6e0 74 68 65 20 61 72 72 61 79 20 28 69 6e 20 65 6e  the array (in en
1d6f0 74 72 69 65 73 20 2d 20 73 6f 20 74 68 65 20 61  tries - so the a
1d700 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 28 28 2a  llocation is ((*
1d710 70 6e 45 6e 74 72 79 29 20 2a 20 73 7a 45 6e 74  pnEntry) * szEnt
1d720 72 79 29 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20  ry) bytes.** in 
1d730 74 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  total)..**.** If
1d740 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 69   the realloc() i
1d750 73 20 73 75 63 63 65 73 73 66 75 6c 20 28 69 2e  s successful (i.
1d760 65 2e 20 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f 6e  e. if no OOM con
1d770 64 69 74 69 6f 6e 20 6f 63 63 75 72 73 29 2c 20  dition occurs), 
1d780 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 61 6c 6c  the.** space all
1d790 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 6e  ocated for the n
1d7a0 65 77 20 6f 62 6a 65 63 74 20 69 73 20 7a 65 72  ew object is zer
1d7b0 6f 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 75 70  oed, *pnEntry up
1d7c0 64 61 74 65 64 20 74 6f 0a 2a 2a 20 72 65 66 6c  dated to.** refl
1d7d0 65 63 74 20 74 68 65 20 6e 65 77 20 73 69 7a 65  ect the new size
1d7e0 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 61 6e   of the array an
1d7f0 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  d a pointer to t
1d800 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f  he new allocatio
1d810 6e 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 2a  n.** returned. *
1d820 70 49 64 78 20 69 73 20 73 65 74 20 74 6f 20 74  pIdx is set to t
1d830 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
1d840 6e 65 77 20 61 72 72 61 79 20 65 6e 74 72 79 20  new array entry 
1d850 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
1d860 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
1d870 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20  f the realloc() 
1d880 66 61 69 6c 73 2c 20 2a 70 49 64 78 20 69 73 20  fails, *pIdx is 
1d890 73 65 74 20 74 6f 20 2d 31 2c 20 2a 70 6e 45 6e  set to -1, *pnEn
1d8a0 74 72 79 20 72 65 6d 61 69 6e 73 0a 2a 2a 20 75  try remains.** u
1d8b0 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 63  nchanged and a c
1d8c0 6f 70 79 20 6f 66 20 70 41 72 72 61 79 20 72 65  opy of pArray re
1d8d0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  turned..*/.void 
1d8e0 2a 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c  *sqlite3ArrayAll
1d8f0 6f 63 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33  ocate(.  sqlite3
1d900 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f   *db,      /* Co
1d910 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69  nnection to noti
1d920 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69  fy of malloc fai
1d930 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20  lures */.  void 
1d940 2a 70 41 72 72 61 79 2c 20 20 20 20 20 2f 2a 20  *pArray,     /* 
1d950 41 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73  Array of objects
1d960 2e 20 20 4d 69 67 68 74 20 62 65 20 72 65 61 6c  .  Might be real
1d970 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74  located */.  int
1d980 20 73 7a 45 6e 74 72 79 2c 20 20 20 20 20 20 2f   szEntry,      /
1d990 2a 20 53 69 7a 65 20 6f 66 20 65 61 63 68 20 6f  * Size of each o
1d9a0 62 6a 65 63 74 20 69 6e 20 74 68 65 20 61 72 72  bject in the arr
1d9b0 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45  ay */.  int *pnE
1d9c0 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d  ntry,     /* Num
1d9d0 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 63  ber of objects c
1d9e0 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20  urrently in use 
1d9f0 2a 2f 0a 20 20 69 6e 74 20 2a 70 49 64 78 20 20  */.  int *pIdx  
1da00 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1da10 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 6e  the index of a n
1da20 65 77 20 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a  ew slot here */.
1da30 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
1da40 69 6e 74 20 6e 20 3d 20 2a 70 6e 45 6e 74 72 79  int n = *pnEntry
1da50 3b 0a 20 20 69 66 28 20 28 6e 20 26 20 28 6e 2d  ;.  if( (n & (n-
1da60 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  1))==0 ){.    in
1da70 74 20 73 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f 20  t sz = (n==0) ? 
1da80 31 20 3a 20 32 2a 6e 3b 0a 20 20 20 20 76 6f 69  1 : 2*n;.    voi
1da90 64 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  d *pNew = sqlite
1daa0 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
1dab0 41 72 72 61 79 2c 20 73 7a 2a 73 7a 45 6e 74 72  Array, sz*szEntr
1dac0 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  y);.    if( pNew
1dad0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 49  ==0 ){.      *pI
1dae0 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72  dx = -1;.      r
1daf0 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 20 20  eturn pArray;.  
1db00 20 20 7d 0a 20 20 20 20 70 41 72 72 61 79 20 3d    }.    pArray =
1db10 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d   pNew;.  }.  z =
1db20 20 28 63 68 61 72 2a 29 70 41 72 72 61 79 3b 0a   (char*)pArray;.
1db30 20 20 6d 65 6d 73 65 74 28 26 7a 5b 6e 20 2a 20    memset(&z[n * 
1db40 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45  szEntry], 0, szE
1db50 6e 74 72 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d  ntry);.  *pIdx =
1db60 20 6e 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79   n;.  ++*pnEntry
1db70 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72 72 61  ;.  return pArra
1db80 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  y;.}../*.** Appe
1db90 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  nd a new element
1dba0 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64   to the given Id
1dbb0 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20  List.  Create a 
1dbc0 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a  new IdList if.**
1dbd0 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20   need be..**.** 
1dbe0 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20  A new IdList is 
1dbf0 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c  returned, or NUL
1dc00 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61  L if malloc() fa
1dc10 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a  ils..*/.IdList *
1dc20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70  sqlite3IdListApp
1dc30 65 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  end(sqlite3 *db,
1dc40 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20   IdList *pList, 
1dc50 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
1dc60 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1dc70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
1dc80 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62  List = sqlite3Db
1dc90 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
1dca0 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b  izeof(IdList) );
1dcb0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
1dcc0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1dcd0 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73  }.  pList->a = s
1dce0 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
1dcf0 61 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a 20  ate(.      db,. 
1dd00 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20       pList->a,. 
1dd10 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69 73       sizeof(pLis
1dd20 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20  t->a[0]),.      
1dd30 26 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20  &pList->nId,.   
1dd40 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28     &i.  );.  if(
1dd50 20 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69   i<0 ){.    sqli
1dd60 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
1dd70 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  db, pList);.    
1dd80 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1dd90 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1dda0 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
1ddb0 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f  romToken(db, pTo
1ddc0 6b 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ken);.  return p
1ddd0 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  List;.}../*.** D
1dde0 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e  elete an IdList.
1ddf0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1de00 49 64 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c  IdListDelete(sql
1de10 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74  ite3 *db, IdList
1de20 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
1de30 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
1de40 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
1de50 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
1de60 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
1de70 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1de80 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
1de90 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  me);.  }.  sqlit
1dea0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69  e3DbFree(db, pLi
1deb0 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
1dec0 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c  3DbFreeNN(db, pL
1ded0 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ist);.}../*.** R
1dee0 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
1def0 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20  in pList of the 
1df00 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64  identifier named
1df10 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31   zId.  Return -1
1df20 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  .** if not found
1df30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1df40 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69  IdListIndex(IdLi
1df50 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74  st *pList, const
1df60 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
1df70 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
1df80 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
1df90 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  -1;.  for(i=0; i
1dfa0 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  <pList->nId; i++
1dfb0 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1dfc0 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d  e3StrICmp(pList-
1dfd0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61  >a[i].zName, zNa
1dfe0 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  me)==0 ) return 
1dff0 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
1e000 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70  -1;.}../*.** Exp
1e010 61 6e 64 20 74 68 65 20 73 70 61 63 65 20 61 6c  and the space al
1e020 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
1e030 67 69 76 65 6e 20 53 72 63 4c 69 73 74 20 6f 62  given SrcList ob
1e040 6a 65 63 74 20 62 79 0a 2a 2a 20 63 72 65 61 74  ject by.** creat
1e050 69 6e 67 20 6e 45 78 74 72 61 20 6e 65 77 20 73  ing nExtra new s
1e060 6c 6f 74 73 20 62 65 67 69 6e 6e 69 6e 67 20 61  lots beginning a
1e070 74 20 69 53 74 61 72 74 2e 20 20 69 53 74 61 72  t iStart.  iStar
1e080 74 20 69 73 20 7a 65 72 6f 20 62 61 73 65 64 2e  t is zero based.
1e090 0a 2a 2a 20 4e 65 77 20 73 6c 6f 74 73 20 61 72  .** New slots ar
1e0a0 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20  e zeroed..**.** 
1e0b0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73 75 70  For example, sup
1e0c0 70 6f 73 65 20 61 20 53 72 63 4c 69 73 74 20 69  pose a SrcList i
1e0d0 6e 69 74 69 61 6c 6c 79 20 63 6f 6e 74 61 69 6e  nitially contain
1e0e0 73 20 74 77 6f 20 65 6e 74 72 69 65 73 3a 20 41  s two entries: A
1e0f0 2c 42 2e 0a 2a 2a 20 54 6f 20 61 70 70 65 6e 64  ,B..** To append
1e100 20 33 20 6e 65 77 20 65 6e 74 72 69 65 73 20 6f   3 new entries o
1e110 6e 74 6f 20 74 68 65 20 65 6e 64 2c 20 64 6f 20  nto the end, do 
1e120 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73  this:.**.**    s
1e130 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
1e140 61 72 67 65 28 64 62 2c 20 70 53 72 63 6c 69 73  arge(db, pSrclis
1e150 74 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20  t, 3, 2);.**.** 
1e160 41 66 74 65 72 20 74 68 65 20 63 61 6c 6c 20 61  After the call a
1e170 62 6f 76 65 20 69 74 20 77 6f 75 6c 64 20 63 6f  bove it would co
1e180 6e 74 61 69 6e 3a 20 20 41 2c 20 42 2c 20 6e 69  ntain:  A, B, ni
1e190 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20  l, nil, nil..** 
1e1a0 49 66 20 74 68 65 20 69 53 74 61 72 74 20 61 72  If the iStart ar
1e1b0 67 75 6d 65 6e 74 20 68 61 64 20 62 65 65 6e 20  gument had been 
1e1c0 31 20 69 6e 73 74 65 61 64 20 6f 66 20 32 2c 20  1 instead of 2, 
1e1d0 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 0a  then the result.
1e1e0 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65  ** would have be
1e1f0 65 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c  en:  A, nil, nil
1e200 2c 20 6e 69 6c 2c 20 42 2e 20 20 54 6f 20 70 72  , nil, B.  To pr
1e210 65 70 65 6e 64 20 74 68 65 20 6e 65 77 20 73 6c  epend the new sl
1e220 6f 74 73 2c 0a 2a 2a 20 74 68 65 20 69 53 74 61  ots,.** the iSta
1e230 72 74 20 76 61 6c 75 65 20 77 6f 75 6c 64 20 62  rt value would b
1e240 65 20 30 2e 20 20 54 68 65 20 72 65 73 75 6c 74  e 0.  The result
1e250 20 74 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62   then would.** b
1e260 65 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c  e: nil, nil, nil
1e270 2c 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66  , A, B..**.** If
1e280 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
1e290 74 69 6f 6e 20 66 61 69 6c 73 20 74 68 65 20 53  tion fails the S
1e2a0 72 63 4c 69 73 74 20 69 73 20 75 6e 63 68 61 6e  rcList is unchan
1e2b0 67 65 64 2e 20 20 54 68 65 0a 2a 2a 20 64 62 2d  ged.  The.** db-
1e2c0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
1e2d0 61 67 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74  ag will be set t
1e2e0 6f 20 74 72 75 65 2e 0a 2a 2f 0a 53 72 63 4c 69  o true..*/.SrcLi
1e2f0 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
1e300 73 74 45 6e 6c 61 72 67 65 28 0a 20 20 73 71 6c  stEnlarge(.  sql
1e310 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
1e320 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
1e330 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79  ection to notify
1e340 20 6f 66 20 4f 4f 4d 20 65 72 72 6f 72 73 20 2a   of OOM errors *
1e350 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
1e360 63 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 53 72  c,     /* The Sr
1e370 63 4c 69 73 74 20 74 6f 20 62 65 20 65 6e 6c 61  cList to be enla
1e380 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  rged */.  int nE
1e390 78 74 72 61 2c 20 20 20 20 20 20 20 20 2f 2a 20  xtra,        /* 
1e3a0 4e 75 6d 62 65 72 20 6f 66 20 6e 65 77 20 73 6c  Number of new sl
1e3b0 6f 74 73 20 74 6f 20 61 64 64 20 74 6f 20 70 53  ots to add to pS
1e3c0 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74  rc->a[] */.  int
1e3d0 20 69 53 74 61 72 74 20 20 20 20 20 20 20 20 20   iStart         
1e3e0 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 53 72 63  /* Index in pSrc
1e3f0 2d 3e 61 5b 5d 20 6f 66 20 66 69 72 73 74 20 6e  ->a[] of first n
1e400 65 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20  ew slot */.){.  
1e410 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e  int i;..  /* San
1e420 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
1e430 63 61 6c 6c 69 6e 67 20 70 61 72 61 6d 65 74 65  calling paramete
1e440 72 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  rs */.  assert( 
1e450 69 53 74 61 72 74 3e 3d 30 20 29 3b 0a 20 20 61  iStart>=0 );.  a
1e460 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 31  ssert( nExtra>=1
1e470 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
1e480 72 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  rc!=0 );.  asser
1e490 74 28 20 69 53 74 61 72 74 3c 3d 70 53 72 63 2d  t( iStart<=pSrc-
1e4a0 3e 6e 53 72 63 20 29 3b 0a 0a 20 20 2f 2a 20 41  >nSrc );..  /* A
1e4b0 6c 6c 6f 63 61 74 65 20 61 64 64 69 74 69 6f 6e  llocate addition
1e4c0 61 6c 20 73 70 61 63 65 20 69 66 20 6e 65 65 64  al space if need
1e4d0 65 64 20 2a 2f 0a 20 20 69 66 28 20 28 75 33 32  ed */.  if( (u32
1e4e0 29 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74  )pSrc->nSrc+nExt
1e4f0 72 61 3e 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20  ra>pSrc->nAlloc 
1e500 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  ){.    SrcList *
1e510 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 41  pNew;.    int nA
1e520 6c 6c 6f 63 20 3d 20 70 53 72 63 2d 3e 6e 53 72  lloc = pSrc->nSr
1e530 63 2a 32 2b 6e 45 78 74 72 61 3b 0a 20 20 20 20  c*2+nExtra;.    
1e540 69 6e 74 20 6e 47 6f 74 3b 0a 20 20 20 20 70 4e  int nGot;.    pN
1e550 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ew = sqlite3DbRe
1e560 61 6c 6c 6f 63 28 64 62 2c 20 70 53 72 63 2c 0a  alloc(db, pSrc,.
1e570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1e580 69 7a 65 6f 66 28 2a 70 53 72 63 29 20 2b 20 28  izeof(*pSrc) + (
1e590 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66  nAlloc-1)*sizeof
1e5a0 28 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 3b 0a  (pSrc->a[0]) );.
1e5b0 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
1e5c0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1e5d0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1e5e0 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  d );.      retur
1e5f0 6e 20 70 53 72 63 3b 0a 20 20 20 20 7d 0a 20 20  n pSrc;.    }.  
1e600 20 20 70 53 72 63 20 3d 20 70 4e 65 77 3b 0a 20    pSrc = pNew;. 
1e610 20 20 20 6e 47 6f 74 20 3d 20 28 73 71 6c 69 74     nGot = (sqlit
1e620 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64  e3DbMallocSize(d
1e630 62 2c 20 70 4e 65 77 29 20 2d 20 73 69 7a 65 6f  b, pNew) - sizeo
1e640 66 28 2a 70 53 72 63 29 29 2f 73 69 7a 65 6f 66  f(*pSrc))/sizeof
1e650 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2b 31 3b 0a  (pSrc->a[0])+1;.
1e660 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63      pSrc->nAlloc
1e670 20 3d 20 6e 47 6f 74 3b 0a 20 20 7d 0a 0a 20 20   = nGot;.  }..  
1e680 2f 2a 20 4d 6f 76 65 20 65 78 69 73 74 69 6e 67  /* Move existing
1e690 20 73 6c 6f 74 73 20 74 68 61 74 20 63 6f 6d 65   slots that come
1e6a0 20 61 66 74 65 72 20 74 68 65 20 6e 65 77 6c 79   after the newly
1e6b0 20 69 6e 73 65 72 74 65 64 20 73 6c 6f 74 73 0a   inserted slots.
1e6c0 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20    ** out of the 
1e6d0 77 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70  way */.  for(i=p
1e6e0 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d  Src->nSrc-1; i>=
1e6f0 69 53 74 61 72 74 3b 20 69 2d 2d 29 7b 0a 20 20  iStart; i--){.  
1e700 20 20 70 53 72 63 2d 3e 61 5b 69 2b 6e 45 78 74    pSrc->a[i+nExt
1e710 72 61 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d  ra] = pSrc->a[i]
1e720 3b 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e 6e 53  ;.  }.  pSrc->nS
1e730 72 63 20 2b 3d 20 6e 45 78 74 72 61 3b 0a 0a 20  rc += nExtra;.. 
1e740 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65 77   /* Zero the new
1e750 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f  ly allocated slo
1e760 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  ts */.  memset(&
1e770 70 53 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c  pSrc->a[iStart],
1e780 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 72 63 2d   0, sizeof(pSrc-
1e790 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a  >a[0])*nExtra);.
1e7a0 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 3b 20    for(i=iStart; 
1e7b0 69 3c 69 53 74 61 72 74 2b 6e 45 78 74 72 61 3b  i<iStart+nExtra;
1e7c0 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d   i++){.    pSrc-
1e7d0 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20  >a[i].iCursor = 
1e7e0 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  -1;.  }..  /* Re
1e7f0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1e800 6f 20 74 68 65 20 65 6e 6c 61 72 67 65 64 20 53  o the enlarged S
1e810 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74 75  rcList */.  retu
1e820 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  rn pSrc;.}.../*.
1e830 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
1e840 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
1e850 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e  e given SrcList.
1e860 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53    Create a new S
1e870 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65  rcList if.** nee
1e880 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74  d be.  A new ent
1e890 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e  ry is created in
1e8a0 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65   the SrcList eve
1e8b0 6e 20 69 66 20 70 54 61 62 6c 65 20 69 73 20 4e  n if pTable is N
1e8c0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63  ULL..**.** A Src
1e8d0 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
1e8e0 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65  , or NULL if the
1e8f0 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72  re is an OOM err
1e900 6f 72 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65  or.  The returne
1e910 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69 67  d.** SrcList mig
1e920 68 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ht be the same a
1e930 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68  s the SrcList th
1e940 61 74 20 77 61 73 20 69 6e 70 75 74 20 6f 72 20  at was input or 
1e950 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61  it might be.** a
1e960 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e   new one.  If an
1e970 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73 20   OOM error does 
1e980 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
1e990 20 70 72 69 6f 72 20 76 61 6c 75 65 20 6f 66 20   prior value of 
1e9a0 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74 20 69 73  pList.** that is
1e9b0 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72   input to this r
1e9c0 6f 75 74 69 6e 65 20 69 73 20 61 75 74 6f 6d 61  outine is automa
1e9d0 74 69 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a  tically freed..*
1e9e0 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73  *.** If pDatabas
1e9f0 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69  e is not null, i
1ea00 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
1ea10 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70   table has an op
1ea20 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61  tional.** databa
1ea30 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20  se name prefix. 
1ea40 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61   Like this:  "da
1ea50 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20  tabase.table".  
1ea60 54 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a  The pDatabase.**
1ea70 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74   points to the t
1ea80 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  able name and th
1ea90 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20  e pTable points 
1eaa0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1eab0 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63  name..** The Src
1eac0 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66  List.a[].zName f
1ead0 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77  ield is filled w
1eae0 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ith the table na
1eaf0 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a  me which might.*
1eb00 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62  * come from pTab
1eb10 6c 65 20 28 69 66 20 70 44 61 74 61 62 61 73 65  le (if pDatabase
1eb20 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f   is NULL) or fro
1eb30 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a  m pDatabase.  .*
1eb40 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44  * SrcList.a[].zD
1eb50 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65  atabase is fille
1eb60 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  d with the datab
1eb70 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54  ase name from pT
1eb80 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68  able,.** or with
1eb90 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61   NULL if no data
1eba0 62 61 73 65 20 69 73 20 73 70 65 63 69 66 69 65  base is specifie
1ebb0 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65  d..**.** In othe
1ebc0 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c  r words, if call
1ebd0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
1ebe0 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
1ebf0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44  3SrcListAppend(D
1ec00 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54  ,A,B,0);.**.** T
1ec10 68 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65  hen B is a table
1ec20 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61   name and the da
1ec30 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75  tabase name is u
1ec40 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49 66 20  nspecified.  If 
1ec50 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74  called.** like t
1ec60 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
1ec70 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
1ec80 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29  tAppend(D,A,B,C)
1ec90 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69  ;.**.** Then C i
1eca0 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  s the table name
1ecb0 20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61   and B is the da
1ecc0 74 61 62 61 73 65 20 6e 61 6d 65 2e 20 20 49 66  tabase name.  If
1ecd0 20 43 20 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a   C is defined.**
1ece0 20 74 68 65 6e 20 73 6f 20 69 73 20 42 2e 20 20   then so is B.  
1ecf0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1ed00 77 65 20 6e 65 76 65 72 20 68 61 76 65 20 61 20  we never have a 
1ed10 63 61 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a  case where:.**.*
1ed20 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
1ed30 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44  3SrcListAppend(D
1ed40 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42  ,A,0,C);.**.** B
1ed50 6f 74 68 20 70 54 61 62 6c 65 20 61 6e 64 20 70  oth pTable and p
1ed60 44 61 74 61 62 61 73 65 20 61 72 65 20 61 73 73  Database are ass
1ed70 75 6d 65 64 20 74 6f 20 62 65 20 71 75 6f 74 65  umed to be quote
1ed80 64 2e 20 20 54 68 65 79 20 61 72 65 20 64 65 71  d.  They are deq
1ed90 75 6f 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20  uoted.** before 
1eda0 62 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74  being added to t
1edb0 68 65 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53  he SrcList..*/.S
1edc0 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
1edd0 72 63 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20  rcListAppend(.  
1ede0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
1edf0 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
1ee00 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d  n to notify of m
1ee10 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a  alloc failures *
1ee20 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4c 69  /.  SrcList *pLi
1ee30 73 74 2c 20 20 20 20 20 2f 2a 20 41 70 70 65 6e  st,     /* Appen
1ee40 64 20 74 6f 20 74 68 69 73 20 53 72 63 4c 69 73  d to this SrcLis
1ee50 74 2e 20 4e 55 4c 4c 20 63 72 65 61 74 65 73 20  t. NULL creates 
1ee60 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 2a 2f  a new SrcList */
1ee70 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  .  Token *pTable
1ee80 2c 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  ,      /* Table 
1ee90 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54  to append */.  T
1eea0 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 20  oken *pDatabase 
1eeb0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f     /* Database o
1eec0 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29  f the table */.)
1eed0 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  {.  struct SrcLi
1eee0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1eef0 20 20 61 73 73 65 72 74 28 20 70 44 61 74 61 62    assert( pDatab
1ef00 61 73 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65  ase==0 || pTable
1ef10 21 3d 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f  !=0 );  /* Canno
1ef20 74 20 68 61 76 65 20 43 20 77 69 74 68 6f 75 74  t have C without
1ef30 20 42 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   B */.  assert( 
1ef40 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
1ef50 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
1ef60 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62  List = sqlite3Db
1ef70 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
1ef80 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20  sizeof(SrcList) 
1ef90 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
1efa0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1efb0 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
1efc0 63 20 3d 20 31 3b 0a 20 20 20 20 70 4c 69 73 74  c = 1;.    pList
1efd0 2d 3e 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20  ->nSrc = 1;.    
1efe0 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61  memset(&pList->a
1eff0 5b 30 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  [0], 0, sizeof(p
1f000 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
1f010 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43    pList->a[0].iC
1f020 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 65  ursor = -1;.  }e
1f030 6c 73 65 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  lse{.    pList =
1f040 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45   sqlite3SrcListE
1f050 6e 6c 61 72 67 65 28 64 62 2c 20 70 4c 69 73 74  nlarge(db, pList
1f060 2c 20 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63  , 1, pList->nSrc
1f070 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d  );.  }.  if( db-
1f080 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
1f090 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  .    sqlite3SrcL
1f0a0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
1f0b0 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ist);.    return
1f0c0 20 30 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20   0;.  }.  pItem 
1f0d0 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
1f0e0 74 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66  t->nSrc-1];.  if
1f0f0 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70  ( pDatabase && p
1f100 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29  Database->z==0 )
1f110 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20  {.    pDatabase 
1f120 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
1f130 44 61 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20  Database ){.    
1f140 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
1f150 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1f160 6b 65 6e 28 64 62 2c 20 70 44 61 74 61 62 61 73  ken(db, pDatabas
1f170 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  e);.    pItem->z
1f180 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74  Database = sqlit
1f190 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1f1a0 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 7d  db, pTable);.  }
1f1b0 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 6d 2d  else{.    pItem-
1f1c0 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
1f1d0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
1f1e0 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 70  , pTable);.    p
1f1f0 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  Item->zDatabase 
1f200 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1f210 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
1f220 2a 20 41 73 73 69 67 6e 20 56 64 62 65 43 75 72  * Assign VdbeCur
1f230 73 6f 72 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  sor index number
1f240 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20  s to all tables 
1f250 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a  in a SrcList.*/.
1f260 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
1f270 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
1f280 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1f290 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
1f2a0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1f2b0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1f2c0 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74  *pItem;.  assert
1f2d0 28 70 4c 69 73 74 20 7c 7c 20 70 50 61 72 73 65  (pList || pParse
1f2e0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1f2f0 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  ed );.  if( pLis
1f300 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t ){.    for(i=0
1f310 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
1f320 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b  ; i<pList->nSrc;
1f330 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
1f340 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
1f350 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29 20 62 72  >iCursor>=0 ) br
1f360 65 61 6b 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  eak;.      pItem
1f370 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72  ->iCursor = pPar
1f380 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
1f390 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
1f3a0 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
1f3b0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
1f3c0 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
1f3d0 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  se, pItem->pSele
1f3e0 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20  ct->pSrc);.     
1f3f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
1f400 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
1f410 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20 69  entire SrcList i
1f420 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73  ncluding all its
1f430 20 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a   substructure..*
1f440 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
1f450 63 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  cListDelete(sqli
1f460 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74  te3 *db, SrcList
1f470 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
1f480 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  i;.  struct SrcL
1f490 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1f4a0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1f4b0 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
1f4c0 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
1f4d0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53  i=0; i<pList->nS
1f4e0 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
1f4f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
1f500 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
1f510 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
1f520 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1f530 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pItem->zName);
1f540 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1f550 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 41  ee(db, pItem->zA
1f560 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70  lias);.    if( p
1f570 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  Item->fg.isIndex
1f580 65 64 42 79 20 29 20 73 71 6c 69 74 65 33 44 62  edBy ) sqlite3Db
1f590 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
1f5a0 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a  u1.zIndexedBy);.
1f5b0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66      if( pItem->f
1f5c0 67 2e 69 73 54 61 62 46 75 6e 63 20 29 20 73 71  g.isTabFunc ) sq
1f5d0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
1f5e0 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 75  ete(db, pItem->u
1f5f0 31 2e 70 46 75 6e 63 41 72 67 29 3b 0a 20 20 20  1.pFuncArg);.   
1f600 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
1f610 62 6c 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ble(db, pItem->p
1f620 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Tab);.    sqlite
1f630 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
1f640 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
1f650 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1f660 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  prDelete(db, pIt
1f670 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71  em->pOn);.    sq
1f680 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
1f690 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 55 73  e(db, pItem->pUs
1f6a0 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ing);.  }.  sqli
1f6b0 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
1f6c0 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
1f6d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1f6e0 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
1f6f0 61 72 73 65 72 20 74 6f 20 61 64 64 20 61 20 6e  arser to add a n
1f700 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a  ew term to the.*
1f710 2a 20 65 6e 64 20 6f 66 20 61 20 67 72 6f 77 69  * end of a growi
1f720 6e 67 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  ng FROM clause. 
1f730 20 54 68 65 20 22 70 22 20 70 61 72 61 6d 65 74   The "p" paramet
1f740 65 72 20 69 73 20 74 68 65 20 70 61 72 74 20 6f  er is the part o
1f750 66 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c  f.** the FROM cl
1f760 61 75 73 65 20 74 68 61 74 20 68 61 73 20 61 6c  ause that has al
1f770 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6e 73 74  ready been const
1f780 72 75 63 74 65 64 2e 20 20 22 70 22 20 69 73 20  ructed.  "p" is 
1f790 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73 20  NULL.** if this 
1f7a0 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72  is the first ter
1f7b0 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  m of the FROM cl
1f7c0 61 75 73 65 2e 20 20 70 54 61 62 6c 65 20 61 6e  ause.  pTable an
1f7d0 64 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 61  d pDatabase.** a
1f7e0 72 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  re the name of t
1f7f0 68 65 20 74 61 62 6c 65 20 61 6e 64 20 64 61 74  he table and dat
1f800 61 62 61 73 65 20 6e 61 6d 65 64 20 69 6e 20 74  abase named in t
1f810 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
1f820 65 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61 73  erm..** pDatabas
1f830 65 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  e is NULL if the
1f840 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 71   database name q
1f850 75 61 6c 69 66 69 65 72 20 69 73 20 6d 69 73 73  ualifier is miss
1f860 69 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73 75  ing - the.** usu
1f870 61 6c 20 63 61 73 65 2e 20 20 49 66 20 74 68 65  al case.  If the
1f880 20 74 65 72 6d 20 68 61 73 20 61 6e 20 61 6c 69   term has an ali
1f890 61 73 2c 20 74 68 65 6e 20 70 41 6c 69 61 73 20  as, then pAlias 
1f8a0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
1f8b0 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20 20 49   alias token.  I
1f8c0 66 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 20  f the term is a 
1f8d0 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 20 70  subquery, then p
1f8e0 53 75 62 71 75 65 72 79 20 69 73 20 74 68 65 0a  Subquery is the.
1f8f0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
1f900 65 6e 74 20 74 68 61 74 20 74 68 65 20 73 75 62  ent that the sub
1f910 71 75 65 72 79 20 65 6e 63 6f 64 65 73 2e 20 20  query encodes.  
1f920 54 68 65 20 70 54 61 62 6c 65 20 61 6e 64 0a 2a  The pTable and.*
1f930 2a 20 70 44 61 74 61 62 61 73 65 20 70 61 72 61  * pDatabase para
1f940 6d 65 74 65 72 73 20 61 72 65 20 4e 55 4c 4c 20  meters are NULL 
1f950 66 6f 72 20 73 75 62 71 75 65 72 69 65 73 2e 20  for subqueries. 
1f960 20 54 68 65 20 70 4f 6e 20 61 6e 64 20 70 55 73   The pOn and pUs
1f970 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ing.** parameter
1f980 73 20 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  s are the conten
1f990 74 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e 64 20  t of the ON and 
1f9a0 55 53 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a 2a  USING clauses..*
1f9b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 65  *.** Return a ne
1f9c0 77 20 53 72 63 4c 69 73 74 20 77 68 69 63 68 20  w SrcList which 
1f9d0 65 6e 63 6f 64 65 73 20 69 73 20 74 68 65 20 46  encodes is the F
1f9e0 52 4f 4d 20 77 69 74 68 20 74 68 65 20 6e 65 77  ROM with the new
1f9f0 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65 64 2e 0a  .** term added..
1fa00 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
1fa10 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1fa20 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61 72 73  FromTerm(.  Pars
1fa30 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1fa40 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1fa50 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
1fa60 69 73 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ist *p,         
1fa70 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20      /* The left 
1fa80 70 61 72 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  part of the FROM
1fa90 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20   clause already 
1faa0 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  seen */.  Token 
1fab0 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20  *pTable,        
1fac0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1fad0 20 74 61 62 6c 65 20 74 6f 20 61 64 64 20 74 6f   table to add to
1fae0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1faf0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61   */.  Token *pDa
1fb00 74 61 62 61 73 65 2c 20 20 20 20 20 20 20 2f 2a  tabase,       /*
1fb10 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
1fb20 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
1fb30 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b   pTable */.  Tok
1fb40 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20 20 20  en *pAlias,     
1fb50 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
1fb60 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
1fb70 68 65 20 41 53 20 73 75 62 65 78 70 72 65 73 73  he AS subexpress
1fb80 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ion */.  Select 
1fb90 2a 70 53 75 62 71 75 65 72 79 2c 20 20 20 20 20  *pSubquery,     
1fba0 20 2f 2a 20 41 20 73 75 62 71 75 65 72 79 20 75   /* A subquery u
1fbb0 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  sed in place of 
1fbc0 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a  a table name */.
1fbd0 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20 20 20    Expr *pOn,    
1fbe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1fbf0 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20   ON clause of a 
1fc00 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69 73 74  join */.  IdList
1fc10 20 2a 70 55 73 69 6e 67 20 20 20 20 20 20 20 20   *pUsing        
1fc20 20 20 2f 2a 20 54 68 65 20 55 53 49 4e 47 20 63    /* The USING c
1fc30 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20  lause of a join 
1fc40 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  */.){.  struct S
1fc50 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1fc60 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  em;.  sqlite3 *d
1fc70 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1fc80 20 20 69 66 28 20 21 70 20 26 26 20 28 70 4f 6e    if( !p && (pOn
1fc90 20 7c 7c 20 70 55 73 69 6e 67 29 20 29 7b 0a 20   || pUsing) ){. 
1fca0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1fcb0 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 4a 4f  sg(pParse, "a JO
1fcc0 49 4e 20 63 6c 61 75 73 65 20 69 73 20 72 65 71  IN clause is req
1fcd0 75 69 72 65 64 20 62 65 66 6f 72 65 20 25 73 22  uired before %s"
1fce0 2c 20 0a 20 20 20 20 20 20 28 70 4f 6e 20 3f 20  , .      (pOn ? 
1fcf0 22 4f 4e 22 20 3a 20 22 55 53 49 4e 47 22 29 0a  "ON" : "USING").
1fd00 20 20 20 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20      );.    goto 
1fd10 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f  append_from_erro
1fd20 72 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c  r;.  }.  p = sql
1fd30 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
1fd40 64 28 64 62 2c 20 70 2c 20 70 54 61 62 6c 65 2c  d(db, p, pTable,
1fd50 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69   pDatabase);.  i
1fd60 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52  f( p==0 || NEVER
1fd70 28 70 2d 3e 6e 53 72 63 3d 3d 30 29 20 29 7b 0a  (p->nSrc==0) ){.
1fd80 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f      goto append_
1fd90 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  from_error;.  }.
1fda0 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b    pItem = &p->a[
1fdb0 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 61 73  p->nSrc-1];.  as
1fdc0 73 65 72 74 28 20 70 41 6c 69 61 73 21 3d 30 20  sert( pAlias!=0 
1fdd0 29 3b 0a 20 20 69 66 28 20 70 41 6c 69 61 73 2d  );.  if( pAlias-
1fde0 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d  >n ){.    pItem-
1fdf0 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65  >zAlias = sqlite
1fe00 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
1fe10 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20 7d 0a  b, pAlias);.  }.
1fe20 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74    pItem->pSelect
1fe30 20 3d 20 70 53 75 62 71 75 65 72 79 3b 0a 20 20   = pSubquery;.  
1fe40 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e  pItem->pOn = pOn
1fe50 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e  ;.  pItem->pUsin
1fe60 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72 65  g = pUsing;.  re
1fe70 74 75 72 6e 20 70 3b 0a 0a 20 61 70 70 65 6e 64  turn p;.. append
1fe80 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 61  _from_error:.  a
1fe90 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20  ssert( p==0 );. 
1fea0 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1feb0 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a 20 20 73  te(db, pOn);.  s
1fec0 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
1fed0 74 65 28 64 62 2c 20 70 55 73 69 6e 67 29 3b 0a  te(db, pUsing);.
1fee0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1fef0 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 71 75  elete(db, pSubqu
1ff00 65 72 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ery);.  return 0
1ff10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
1ff20 6e 20 49 4e 44 45 58 45 44 20 42 59 20 6f 72 20  n INDEXED BY or 
1ff30 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75  NOT INDEXED clau
1ff40 73 65 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72  se to the most r
1ff50 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 0a 2a  ecently added .*
1ff60 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  * element of the
1ff70 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 70 61 73   source-list pas
1ff80 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
1ff90 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76  d argument..*/.v
1ffa0 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
1ffb0 73 74 49 6e 64 65 78 65 64 42 79 28 50 61 72 73  stIndexedBy(Pars
1ffc0 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
1ffd0 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a 70 49  st *p, Token *pI
1ffe0 6e 64 65 78 65 64 42 79 29 7b 0a 20 20 61 73 73  ndexedBy){.  ass
1fff0 65 72 74 28 20 70 49 6e 64 65 78 65 64 42 79 21  ert( pIndexedBy!
20000 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26  =0 );.  if( p &&
20010 20 41 4c 57 41 59 53 28 70 2d 3e 6e 53 72 63 3e   ALWAYS(p->nSrc>
20020 30 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  0) ){.    struct
20030 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
20040 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e  Item = &p->a[p->
20050 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73  nSrc-1];.    ass
20060 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6e  ert( pItem->fg.n
20070 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a  otIndexed==0 );.
20080 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
20090 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
200a0 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  y==0 );.    asse
200b0 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  rt( pItem->fg.is
200c0 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20  TabFunc==0 );.  
200d0 20 20 69 66 28 20 70 49 6e 64 65 78 65 64 42 79    if( pIndexedBy
200e0 2d 3e 6e 3d 3d 31 20 26 26 20 21 70 49 6e 64 65  ->n==1 && !pInde
200f0 78 65 64 42 79 2d 3e 7a 20 29 7b 0a 20 20 20 20  xedBy->z ){.    
20100 20 20 2f 2a 20 41 20 22 4e 4f 54 20 49 4e 44 45    /* A "NOT INDE
20110 58 45 44 22 20 63 6c 61 75 73 65 20 77 61 73 20  XED" clause was 
20120 73 75 70 70 6c 69 65 64 2e 20 53 65 65 20 70 61  supplied. See pa
20130 72 73 65 2e 79 20 0a 20 20 20 20 20 20 2a 2a 20  rse.y .      ** 
20140 63 6f 6e 73 74 72 75 63 74 20 22 69 6e 64 65 78  construct "index
20150 65 64 5f 6f 70 74 22 20 66 6f 72 20 64 65 74 61  ed_opt" for deta
20160 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49  ils. */.      pI
20170 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78  tem->fg.notIndex
20180 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ed = 1;.    }els
20190 65 7b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  e{.      pItem->
201a0 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 20 3d 20  u1.zIndexedBy = 
201b0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
201c0 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
201d0 20 70 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20   pIndexedBy);.  
201e0 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73      pItem->fg.is
201f0 49 6e 64 65 78 65 64 42 79 20 3d 20 28 70 49 74  IndexedBy = (pIt
20200 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42  em->u1.zIndexedB
20210 79 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  y!=0);.    }.  }
20220 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68  .}../*.** Add th
20230 65 20 6c 69 73 74 20 6f 66 20 66 75 6e 63 74 69  e list of functi
20240 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  on arguments to 
20250 74 68 65 20 53 72 63 4c 69 73 74 20 65 6e 74 72  the SrcList entr
20260 79 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65  y for a.** table
20270 2d 76 61 6c 75 65 64 2d 66 75 6e 63 74 69 6f 6e  -valued-function
20280 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
20290 33 53 72 63 4c 69 73 74 46 75 6e 63 41 72 67 73  3SrcListFuncArgs
202a0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
202b0 53 72 63 4c 69 73 74 20 2a 70 2c 20 45 78 70 72  SrcList *p, Expr
202c0 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
202d0 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 74 72  if( p ){.    str
202e0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
202f0 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b   *pItem = &p->a[
20300 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20  p->nSrc-1];.    
20310 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66  assert( pItem->f
20320 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20  g.notIndexed==0 
20330 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
20340 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  Item->fg.isIndex
20350 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61  edBy==0 );.    a
20360 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
20370 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b  .isTabFunc==0 );
20380 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 31 2e 70  .    pItem->u1.p
20390 46 75 6e 63 41 72 67 20 3d 20 70 4c 69 73 74 3b  FuncArg = pList;
203a0 0a 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69  .    pItem->fg.i
203b0 73 54 61 62 46 75 6e 63 20 3d 20 31 3b 0a 20 20  sTabFunc = 1;.  
203c0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
203d0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
203e0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69  (pParse->db, pLi
203f0 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  st);.  }.}../*.*
20400 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 6e 67 20  * When building 
20410 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  up a FROM clause
20420 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 2c 20   in the parser, 
20430 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
20440 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c  r.** is initiall
20450 79 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  y attached to th
20460 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 2e 20  e left operand. 
20470 20 42 75 74 20 74 68 65 20 63 6f 64 65 20 67 65   But the code ge
20480 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63  nerator.** expec
20490 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  ts the join oper
204a0 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20 74 68  ator to be on th
204b0 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e  e right operand.
204c0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
204d0 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69  * Shifts all joi
204e0 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 72 6f 6d  n operators from
204f0 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 66   left to right f
20500 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 46 52 4f  or an entire FRO
20510 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  M.** clause..**.
20520 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75 70 70  ** Example: Supp
20530 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 69 73 20  ose the join is 
20540 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
20550 20 20 20 20 20 20 20 20 20 20 20 41 20 6e 61 74             A nat
20560 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20  ural cross join 
20570 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72  B.**.** The oper
20580 61 74 6f 72 20 69 73 20 22 6e 61 74 75 72 61 6c  ator is "natural
20590 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54   cross join".  T
205a0 68 65 20 41 20 61 6e 64 20 42 20 6f 70 65 72 61  he A and B opera
205b0 6e 64 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a  nds are stored.*
205c0 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64  * in p->a[0] and
205d0 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63   p->a[1], respec
205e0 74 69 76 65 6c 79 2e 20 20 54 68 65 20 70 61 72  tively.  The par
205f0 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 74  ser initially st
20600 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72  ores the.** oper
20610 61 74 6f 72 20 77 69 74 68 20 41 2e 20 20 54 68  ator with A.  Th
20620 69 73 20 72 6f 75 74 69 6e 65 20 73 68 69 66 74  is routine shift
20630 73 20 74 68 61 74 20 6f 70 65 72 61 74 6f 72 20  s that operator 
20640 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f  over to B..*/.vo
20650 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
20660 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65 28 53  tShiftJoinType(S
20670 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 69 66  rcList *p){.  if
20680 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ( p ){.    int i
20690 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e  ;.    for(i=p->n
206a0 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29  Src-1; i>0; i--)
206b0 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e  {.      p->a[i].
206c0 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d  fg.jointype = p-
206d0 3e 61 5b 69 2d 31 5d 2e 66 67 2e 6a 6f 69 6e 74  >a[i-1].fg.joint
206e0 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ype;.    }.    p
206f0 2d 3e 61 5b 30 5d 2e 66 67 2e 6a 6f 69 6e 74 79  ->a[0].fg.jointy
20700 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pe = 0;.  }.}../
20710 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
20720 42 45 20 63 6f 64 65 20 66 6f 72 20 61 20 42 45  BE code for a BE
20730 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  GIN statement..*
20740 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65  /.void sqlite3Be
20750 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  ginTransaction(P
20760 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
20770 74 20 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74  t type){.  sqlit
20780 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  e3 *db;.  Vdbe *
20790 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61  v;.  int i;..  a
207a0 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30  ssert( pParse!=0
207b0 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73   );.  db = pPars
207c0 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
207d0 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
207e0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
207f0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
20800 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45  TRANSACTION, "BE
20810 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20  GIN", 0, 0) ){. 
20820 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
20830 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
20840 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
20850 66 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a  f( !v ) return;.
20860 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b 5f 44    if( type!=TK_D
20870 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20 66  EFERRED ){.    f
20880 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
20890 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  b; i++){.      s
208a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
208b0 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  (v, OP_Transacti
208c0 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b  on, i, (type==TK
208d0 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a  _EXCLUSIVE)+1);.
208e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
208f0 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 29  eUsesBtree(v, i)
20900 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
20910 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
20920 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
20930 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
20940 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 66  rate VDBE code f
20950 6f 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 52  or a COMMIT or R
20960 4f 4c 4c 42 41 43 4b 20 73 74 61 74 65 6d 65 6e  OLLBACK statemen
20970 74 2e 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 52  t..** Code for R
20980 4f 4c 4c 42 41 43 4b 20 69 73 20 67 65 6e 65 72  OLLBACK is gener
20990 61 74 65 64 20 69 66 20 65 54 79 70 65 3d 3d 54  ated if eType==T
209a0 4b 5f 52 4f 4c 4c 42 41 43 4b 2e 20 20 4f 74 68  K_ROLLBACK.  Oth
209b0 65 72 77 69 73 65 0a 2a 2a 20 63 6f 64 65 20 69  erwise.** code i
209c0 73 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  s generated for 
209d0 61 20 43 4f 4d 4d 49 54 2e 0a 2a 2f 0a 76 6f 69  a COMMIT..*/.voi
209e0 64 20 73 71 6c 69 74 65 33 45 6e 64 54 72 61 6e  d sqlite3EndTran
209f0 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
20a00 50 61 72 73 65 2c 20 69 6e 74 20 65 54 79 70 65  Parse, int eType
20a10 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  ){.  Vdbe *v;.  
20a20 69 6e 74 20 69 73 52 6f 6c 6c 62 61 63 6b 3b 0a  int isRollback;.
20a30 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
20a40 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
20a50 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20  ( pParse->db!=0 
20a60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  );.  assert( eTy
20a70 70 65 3d 3d 54 4b 5f 43 4f 4d 4d 49 54 20 7c 7c  pe==TK_COMMIT ||
20a80 20 65 54 79 70 65 3d 3d 54 4b 5f 45 4e 44 20 7c   eType==TK_END |
20a90 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c  | eType==TK_ROLL
20aa0 42 41 43 4b 20 29 3b 0a 20 20 69 73 52 6f 6c 6c  BACK );.  isRoll
20ab0 62 61 63 6b 20 3d 20 65 54 79 70 65 3d 3d 54 4b  back = eType==TK
20ac0 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 69 66 28  _ROLLBACK;.  if(
20ad0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
20ae0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
20af0 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 0a 20  _TRANSACTION, . 
20b00 20 20 20 20 20 20 69 73 52 6f 6c 6c 62 61 63 6b        isRollback
20b10 20 3f 20 22 52 4f 4c 4c 42 41 43 4b 22 20 3a 20   ? "ROLLBACK" : 
20b20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20  "COMMIT", 0, 0) 
20b30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
20b40 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33   }.  v = sqlite3
20b50 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
20b60 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
20b70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20b80 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  2(v, OP_AutoComm
20b90 69 74 2c 20 31 2c 20 69 73 52 6f 6c 6c 62 61 63  it, 1, isRollbac
20ba0 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  k);.  }.}../*.**
20bb0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
20bc0 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
20bd0 70 61 72 73 65 72 20 77 68 65 6e 20 69 74 20 70  parser when it p
20be0 61 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e 64 20  arses a command 
20bf0 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20 72 65  to create,.** re
20c00 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63  lease or rollbac
20c10 6b 20 61 6e 20 53 51 4c 20 73 61 76 65 70 6f 69  k an SQL savepoi
20c20 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nt. .*/.void sql
20c30 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28 50 61  ite3Savepoint(Pa
20c40 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
20c50 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d   op, Token *pNam
20c60 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  e){.  char *zNam
20c70 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
20c80 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
20c90 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  >db, pName);.  i
20ca0 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
20cb0 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
20cc0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
20cd0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
20ce0 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
20cf0 49 4f 4e 0a 20 20 20 20 73 74 61 74 69 63 20 63  ION.    static c
20d00 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73  onst char * cons
20d10 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45 47 49  t az[] = { "BEGI
20d20 4e 22 2c 20 22 52 45 4c 45 41 53 45 22 2c 20 22  N", "RELEASE", "
20d30 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20 20 20  ROLLBACK" };.   
20d40 20 61 73 73 65 72 74 28 20 21 53 41 56 45 50 4f   assert( !SAVEPO
20d50 49 4e 54 5f 42 45 47 49 4e 20 26 26 20 53 41 56  INT_BEGIN && SAV
20d60 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3d 3d  EPOINT_RELEASE==
20d70 31 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52  1 && SAVEPOINT_R
20d80 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a 23 65  OLLBACK==2 );.#e
20d90 6e 64 69 66 0a 20 20 20 20 69 66 28 20 21 76 20  ndif.    if( !v 
20da0 7c 7c 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  || sqlite3AuthCh
20db0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
20dc0 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20 61 7a  TE_SAVEPOINT, az
20dd0 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29 20  [op], zName, 0) 
20de0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
20df0 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
20e00 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b, zName);.     
20e10 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
20e20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20e30 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76 65 70  dOp4(v, OP_Savep
20e40 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  oint, op, 0, 0, 
20e50 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49  zName, P4_DYNAMI
20e60 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  C);.  }.}../*.**
20e70 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 54   Make sure the T
20e80 45 4d 50 20 64 61 74 61 62 61 73 65 20 69 73 20  EMP database is 
20e90 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62  open and availab
20ea0 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74  le for use.  Ret
20eb0 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  urn.** the numbe
20ec0 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65  r of errors.  Le
20ed0 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ave any error me
20ee0 73 73 61 67 65 73 20 69 6e 20 74 68 65 20 70 50  ssages in the pP
20ef0 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  arse structure..
20f00 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 70  */.int sqlite3Op
20f10 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50  enTempDatabase(P
20f20 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
20f30 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
20f40 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
20f50 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d   db->aDb[1].pBt=
20f60 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65  =0 && !pParse->e
20f70 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e  xplain ){.    in
20f80 74 20 72 63 3b 0a 20 20 20 20 42 74 72 65 65 20  t rc;.    Btree 
20f90 2a 70 42 74 3b 0a 20 20 20 20 73 74 61 74 69 63  *pBt;.    static
20fa0 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
20fb0 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 53 51   = .          SQ
20fc0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
20fd0 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ITE |.          
20fe0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
20ff0 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  TE |.          S
21000 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
21010 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20  SIVE |.         
21020 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
21030 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20  ETEONCLOSE |.   
21040 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
21050 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20  EN_TEMP_DB;..   
21060 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
21070 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c  eeOpen(db->pVfs,
21080 20 30 2c 20 64 62 2c 20 26 70 42 74 2c 20 30 2c   0, db, &pBt, 0,
21090 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28   flags);.    if(
210a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
210b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
210c0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
210d0 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "unable to open 
210e0 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  a temporary data
210f0 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22  base ".        "
21100 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67  file for storing
21110 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
21120 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  s");.      pPars
21130 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  e->rc = rc;.    
21140 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
21150 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b 31 5d  }.    db->aDb[1]
21160 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  .pBt = pBt;.    
21170 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
21180 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  1].pSchema );.  
21190 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d    if( SQLITE_NOM
211a0 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65  EM==sqlite3Btree
211b0 53 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 2c  SetPageSize(pBt,
211c0 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a   db->nextPagesiz
211d0 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a 20 20 20  e, -1, 0) ){.   
211e0 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
211f0 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 72 65  lt(db);.      re
21200 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
21210 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
21220 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68  ./*.** Record th
21230 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20  e fact that the 
21240 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 77 69  schema cookie wi
21250 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 76 65  ll need to be ve
21260 72 69 66 69 65 64 0a 2a 2a 20 66 6f 72 20 64 61  rified.** for da
21270 74 61 62 61 73 65 20 69 44 62 2e 20 20 54 68 65  tabase iDb.  The
21280 20 63 6f 64 65 20 74 6f 20 61 63 74 75 61 6c 6c   code to actuall
21290 79 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68  y verify the sch
212a0 65 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a 20 77 69  ema cookie.** wi
212b0 6c 6c 20 6f 63 63 75 72 20 61 74 20 74 68 65 20  ll occur at the 
212c0 65 6e 64 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c  end of the top-l
212d0 65 76 65 6c 20 56 44 42 45 20 61 6e 64 20 77 69  evel VDBE and wi
212e0 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a  ll be generated.
212f0 2a 2a 20 6c 61 74 65 72 2c 20 62 79 20 73 71 6c  ** later, by sql
21300 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67  ite3FinishCoding
21310 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
21320 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
21330 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  ema(Parse *pPars
21340 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50  e, int iDb){.  P
21350 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
21360 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
21370 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
21380 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
21390 30 20 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d  0 && iDb<pParse-
213a0 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  >db->nDb );.  as
213b0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
213c0 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d  ->aDb[iDb].pBt!=
213d0 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20  0 || iDb==1 );. 
213e0 20 61 73 73 65 72 74 28 20 69 44 62 3c 53 51 4c   assert( iDb<SQL
213f0 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
21400 2b 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  +2 );.  assert( 
21410 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
21420 65 78 48 65 6c 64 28 70 50 61 72 73 65 2d 3e 64  exHeld(pParse->d
21430 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
21440 69 66 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70  if( DbMaskTest(p
21450 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65  Toplevel->cookie
21460 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20 29 7b  Mask, iDb)==0 ){
21470 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70  .    DbMaskSet(p
21480 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65  Toplevel->cookie
21490 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 20 20  Mask, iDb);.    
214a0 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
214b0 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20   && iDb==1 ){.  
214c0 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
214d0 65 6d 70 44 61 74 61 62 61 73 65 28 70 54 6f 70  empDatabase(pTop
214e0 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  level);.    }.  
214f0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72  }.}../*.** If ar
21500 67 75 6d 65 6e 74 20 7a 44 62 20 69 73 20 4e 55  gument zDb is NU
21510 4c 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20 73 71  LL, then call sq
21520 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
21530 63 68 65 6d 61 28 29 20 66 6f 72 20 65 61 63 68  chema() for each
21540 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61   .** attached da
21550 74 61 62 61 73 65 2e 20 4f 74 68 65 72 77 69 73  tabase. Otherwis
21560 65 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66 6f 72  e, invoke it for
21570 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
21580 6d 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a 2f  med zDb only..*/
21590 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
215a0 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65  eVerifyNamedSche
215b0 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
215c0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
215d0 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  b){.  sqlite3 *d
215e0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
215f0 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
21600 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
21610 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62  ++){.    Db *pDb
21620 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
21630 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
21640 20 26 26 20 28 21 7a 44 62 20 7c 7c 20 30 3d 3d   && (!zDb || 0==
21650 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
21660 44 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d  Db, pDb->zDbSNam
21670 65 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  e)) ){.      sql
21680 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
21690 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b  hema(pParse, i);
216a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
216b0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
216c0 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70  E code that prep
216d0 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61  ares for doing a
216e0 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  n operation that
216f0 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65  .** might change
21700 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
21710 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
21720 65 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74  e starts a new t
21730 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65  ransaction if we
21740 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79   are not already
21750 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61   within.** a tra
21760 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65  nsaction.  If we
21770 20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74   are already wit
21780 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hin a transactio
21790 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70  n, then a checkp
217a0 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69  oint.** is set i
217b0 66 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65  f the setStateme
217c0 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nt parameter is 
217d0 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f  true.  A checkpo
217e0 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  int should.** be
217f0 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69   set for operati
21800 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66  ons that might f
21810 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f  ail (due to a co
21820 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f  nstraint) part o
21830 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72  f.** the way thr
21840 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77  ough and which w
21850 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f  ill need to undo
21860 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74   some writes wit
21870 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a  hout having to.*
21880 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77  * rollback the w
21890 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  hole transaction
218a0 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e  .  For operation
218b0 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73  s where all cons
218c0 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62  traints.** can b
218d0 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65  e checked before
218e0 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65   any changes are
218f0 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
21900 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76  abase, it is nev
21910 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20  er.** necessary 
21920 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20  to undo a write 
21930 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69  and the checkpoi
21940 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  nt should not be
21950 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   set..*/.void sq
21960 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
21970 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a  peration(Parse *
21980 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53  pParse, int setS
21990 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44  tatement, int iD
219a0 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f  b){.  Parse *pTo
219b0 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
219c0 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
219d0 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
219e0 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
219f0 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
21a00 20 44 62 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c   DbMaskSet(pTopl
21a10 65 76 65 6c 2d 3e 77 72 69 74 65 4d 61 73 6b 2c  evel->writeMask,
21a20 20 69 44 62 29 3b 0a 20 20 70 54 6f 70 6c 65 76   iDb);.  pToplev
21a30 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65  el->isMultiWrite
21a40 20 7c 3d 20 73 65 74 53 74 61 74 65 6d 65 6e 74   |= setStatement
21a50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63  ;.}../*.** Indic
21a60 61 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61  ate that the sta
21a70 74 65 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79  tement currently
21a80 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
21a90 69 6f 6e 20 6d 69 67 68 74 20 77 72 69 74 65 0a  ion might write.
21aa0 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ** more than one
21ab0 20 65 6e 74 72 79 20 28 65 78 61 6d 70 6c 65 3a   entry (example:
21ac0 20 64 65 6c 65 74 69 6e 67 20 6f 6e 65 20 72 6f   deleting one ro
21ad0 77 20 74 68 65 6e 20 69 6e 73 65 72 74 69 6e 67  w then inserting
21ae0 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e 73   another,.** ins
21af0 65 72 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20  erting multiple 
21b00 72 6f 77 73 20 69 6e 20 61 20 74 61 62 6c 65 2c  rows in a table,
21b10 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 61 20   or inserting a 
21b20 72 6f 77 20 61 6e 64 20 69 6e 64 65 78 20 65 6e  row and index en
21b30 74 72 69 65 73 2e 29 0a 2a 2a 20 49 66 20 61 6e  tries.).** If an
21b40 20 61 62 6f 72 74 20 6f 63 63 75 72 73 20 61 66   abort occurs af
21b50 74 65 72 20 73 6f 6d 65 20 6f 66 20 74 68 65 73  ter some of thes
21b60 65 20 77 72 69 74 65 73 20 68 61 76 65 20 63 6f  e writes have co
21b70 6d 70 6c 65 74 65 64 2c 20 74 68 65 6e 20 69 74  mpleted, then it
21b80 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63 65   will.** be nece
21b90 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 74 68  ssary to undo th
21ba0 65 20 63 6f 6d 70 6c 65 74 65 64 20 77 72 69 74  e completed writ
21bb0 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
21bc0 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28 50 61  te3MultiWrite(Pa
21bd0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
21be0 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
21bf0 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
21c00 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
21c10 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73  .  pToplevel->is
21c20 4d 75 6c 74 69 57 72 69 74 65 20 3d 20 31 3b 0a  MultiWrite = 1;.
21c30 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 63 6f  }../* .** The co
21c40 64 65 20 67 65 6e 65 72 61 74 6f 72 20 63 61 6c  de generator cal
21c50 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
21c60 69 66 20 69 73 20 64 69 73 63 6f 76 65 72 73 20  if is discovers 
21c70 74 68 61 74 20 69 74 20 69 73 0a 2a 2a 20 70 6f  that it is.** po
21c80 73 73 69 62 6c 65 20 74 6f 20 61 62 6f 72 74 20  ssible to abort 
21c90 61 20 73 74 61 74 65 6d 65 6e 74 20 70 72 69 6f  a statement prio
21ca0 72 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e  r to completion.
21cb0 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 0a 2a    In order to .*
21cc0 2a 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 61  * perform this a
21cd0 62 6f 72 74 20 77 69 74 68 6f 75 74 20 63 6f 72  bort without cor
21ce0 72 75 70 74 69 6e 67 20 74 68 65 20 64 61 74 61  rupting the data
21cf0 62 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f  base, we need to
21d00 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 74 68   make.** sure th
21d10 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  at the statement
21d20 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79   is protected by
21d30 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
21d40 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
21d50 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20  Technically, we 
21d60 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 65 74  only need to set
21d70 20 74 68 65 20 6d 61 79 41 62 6f 72 74 20 66 6c   the mayAbort fl
21d80 61 67 20 69 66 20 74 68 65 0a 2a 2a 20 69 73 4d  ag if the.** isM
21d90 75 6c 74 69 57 72 69 74 65 20 66 6c 61 67 20 77  ultiWrite flag w
21da0 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65  as previously se
21db0 74 2e 20 20 54 68 65 72 65 20 69 73 20 61 20 74  t.  There is a t
21dc0 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a  ime dependency.*
21dd0 2a 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  * such that the 
21de0 61 62 6f 72 74 20 6d 75 73 74 20 6f 63 63 75 72  abort must occur
21df0 20 61 66 74 65 72 20 74 68 65 20 6d 75 6c 74 69   after the multi
21e00 77 72 69 74 65 2e 20 20 54 68 69 73 20 6d 61 6b  write.  This mak
21e10 65 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 61 74 65  es.** some state
21e20 6d 65 6e 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20  ments involving 
21e30 74 68 65 20 52 45 50 4c 41 43 45 20 63 6f 6e 66  the REPLACE conf
21e40 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
21e50 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f 20  algorithm.** go 
21e60 61 20 6c 69 74 74 6c 65 20 66 61 73 74 65 72 2e  a little faster.
21e70 20 20 42 75 74 20 74 61 6b 69 6e 67 20 61 64 76    But taking adv
21e80 61 6e 74 61 67 65 20 6f 66 20 74 68 69 73 20 74  antage of this t
21e90 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a  ime dependency.*
21ea0 2a 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72 65 20  * makes it more 
21eb0 64 69 66 66 69 63 75 6c 74 20 74 6f 20 70 72 6f  difficult to pro
21ec0 76 65 20 74 68 61 74 20 74 68 65 20 63 6f 64 65  ve that the code
21ed0 20 69 73 20 63 6f 72 72 65 63 74 20 28 69 6e 20   is correct (in 
21ee0 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 2c 20  .** particular, 
21ef0 69 74 20 70 72 65 76 65 6e 74 73 20 75 73 20 66  it prevents us f
21f00 72 6f 6d 20 77 72 69 74 69 6e 67 20 61 6e 20 65  rom writing an e
21f10 66 66 65 63 74 69 76 65 0a 2a 2a 20 69 6d 70 6c  ffective.** impl
21f20 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71  ementation of sq
21f30 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62  lite3AssertMayAb
21f40 6f 72 74 28 29 29 20 61 6e 64 20 73 6f 20 77 65  ort()) and so we
21f50 20 68 61 76 65 20 63 68 6f 73 65 6e 0a 2a 2a 20   have chosen.** 
21f60 74 6f 20 74 61 6b 65 20 74 68 65 20 73 61 66 65  to take the safe
21f70 20 72 6f 75 74 65 20 61 6e 64 20 73 6b 69 70 20   route and skip 
21f80 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
21f90 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
21fa0 33 4d 61 79 41 62 6f 72 74 28 50 61 72 73 65 20  3MayAbort(Parse 
21fb0 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73  *pParse){.  Pars
21fc0 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
21fd0 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
21fe0 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70  vel(pParse);.  p
21ff0 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41 62 6f  Toplevel->mayAbo
22000 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rt = 1;.}../*.**
22010 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74   Code an OP_Halt
22020 20 74 68 61 74 20 63 61 75 73 65 73 20 74 68 65   that causes the
22030 20 76 64 62 65 20 74 6f 20 72 65 74 75 72 6e 20   vdbe to return 
22040 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  an SQLITE_CONSTR
22050 41 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e 20 54  AINT.** error. T
22060 68 65 20 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d  he onError param
22070 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20  eter determines 
22080 77 68 69 63 68 20 28 69 66 20 61 6e 79 29 20 6f  which (if any) o
22090 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  f the statement.
220a0 2a 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72 65 6e  ** and/or curren
220b0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
220c0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f   rolled back..*/
220d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 48 61 6c  .void sqlite3Hal
220e0 74 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50  tConstraint(.  P
220f0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
22100 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
22110 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  ext */.  int err
22120 43 6f 64 65 2c 20 20 20 20 20 20 2f 2a 20 65 78  Code,      /* ex
22130 74 65 6e 64 65 64 20 65 72 72 6f 72 20 63 6f 64  tended error cod
22140 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  e */.  int onErr
22150 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73  or,      /* Cons
22160 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20  traint type */. 
22170 20 63 68 61 72 20 2a 70 34 2c 20 20 20 20 20 20   char *p4,      
22180 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73     /* Error mess
22190 61 67 65 20 2a 2f 0a 20 20 69 38 20 70 34 74 79  age */.  i8 p4ty
221a0 70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 34  pe,        /* P4
221b0 5f 53 54 41 54 49 43 20 6f 72 20 50 34 5f 54 52  _STATIC or P4_TR
221c0 41 4e 53 49 45 4e 54 20 2a 2f 0a 20 20 75 38 20  ANSIENT */.  u8 
221d0 70 35 45 72 72 6d 73 67 20 20 20 20 20 20 20 2f  p5Errmsg       /
221e0 2a 20 50 35 5f 45 72 72 4d 73 67 20 74 79 70 65  * P5_ErrMsg type
221f0 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
22200 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
22210 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  e(pParse);.  ass
22220 65 72 74 28 20 28 65 72 72 43 6f 64 65 26 30 78  ert( (errCode&0x
22230 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  ff)==SQLITE_CONS
22240 54 52 41 49 4e 54 20 29 3b 0a 20 20 69 66 28 20  TRAINT );.  if( 
22250 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72  onError==OE_Abor
22260 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
22270 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
22280 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
22290 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
222a0 48 61 6c 74 2c 20 65 72 72 43 6f 64 65 2c 20 6f  Halt, errCode, o
222b0 6e 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70  nError, 0, p4, p
222c0 34 74 79 70 65 29 3b 0a 20 20 73 71 6c 69 74 65  4type);.  sqlite
222d0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
222e0 20 70 35 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f   p5Errmsg);.}../
222f0 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
22300 48 61 6c 74 20 64 75 65 20 74 6f 20 55 4e 49 51  Halt due to UNIQ
22310 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45  UE or PRIMARY KE
22320 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f  Y constraint vio
22330 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  lation..*/.void 
22340 73 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e  sqlite3UniqueCon
22350 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65  straint(.  Parse
22360 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
22370 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
22380 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
22390 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  ,      /* Constr
223a0 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20 49  aint type */.  I
223b0 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20  ndex *pIdx      
223c0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68   /* The index th
223d0 61 74 20 74 72 69 67 67 65 72 73 20 74 68 65 20  at triggers the 
223e0 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b  constraint */.){
223f0 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20  .  char *zErr;. 
22400 20 69 6e 74 20 6a 3b 0a 20 20 53 74 72 41 63 63   int j;.  StrAcc
22410 75 6d 20 65 72 72 4d 73 67 3b 0a 20 20 54 61 62  um errMsg;.  Tab
22420 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 64 78 2d  le *pTab = pIdx-
22430 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 73 71 6c 69  >pTable;..  sqli
22440 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
22450 26 65 72 72 4d 73 67 2c 20 70 50 61 72 73 65 2d  &errMsg, pParse-
22460 3e 64 62 2c 20 30 2c 20 30 2c 20 32 30 30 29 3b  >db, 0, 0, 200);
22470 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 61 43 6f  .  if( pIdx->aCo
22480 6c 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c  lExpr ){.    sql
22490 69 74 65 33 58 50 72 69 6e 74 66 28 26 65 72 72  ite3XPrintf(&err
224a0 4d 73 67 2c 20 22 69 6e 64 65 78 20 27 25 71 27  Msg, "index '%q'
224b0 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b  ", pIdx->zName);
224c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
224d0 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e  r(j=0; j<pIdx->n
224e0 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  KeyCol; j++){.  
224f0 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a      char *zCol;.
22500 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
22510 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e  dx->aiColumn[j]>
22520 3d 30 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c  =0 );.      zCol
22530 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49   = pTab->aCol[pI
22540 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d  dx->aiColumn[j]]
22550 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 66  .zName;.      if
22560 28 20 6a 20 29 20 73 71 6c 69 74 65 33 53 74 72  ( j ) sqlite3Str
22570 41 63 63 75 6d 41 70 70 65 6e 64 28 26 65 72 72  AccumAppend(&err
22580 4d 73 67 2c 20 22 2c 20 22 2c 20 32 29 3b 0a 20  Msg, ", ", 2);. 
22590 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41       sqlite3StrA
225a0 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 65  ccumAppendAll(&e
225b0 72 72 4d 73 67 2c 20 70 54 61 62 2d 3e 7a 4e 61  rrMsg, pTab->zNa
225c0 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
225d0 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
225e0 28 26 65 72 72 4d 73 67 2c 20 22 2e 22 2c 20 31  (&errMsg, ".", 1
225f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22600 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c  StrAccumAppendAl
22610 6c 28 26 65 72 72 4d 73 67 2c 20 7a 43 6f 6c 29  l(&errMsg, zCol)
22620 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 45  ;.    }.  }.  zE
22630 72 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72 41  rr = sqlite3StrA
22640 63 63 75 6d 46 69 6e 69 73 68 28 26 65 72 72 4d  ccumFinish(&errM
22650 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 48 61  sg);.  sqlite3Ha
22660 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  ltConstraint(pPa
22670 72 73 65 2c 20 0a 20 20 20 20 49 73 50 72 69 6d  rse, .    IsPrim
22680 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78  aryKeyIndex(pIdx
22690 29 20 3f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ) ? SQLITE_CONST
226a0 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59  RAINT_PRIMARYKEY
226b0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
226c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20                : 
226d0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
226e0 54 5f 55 4e 49 51 55 45 2c 0a 20 20 20 20 6f 6e  T_UNIQUE,.    on
226f0 45 72 72 6f 72 2c 20 7a 45 72 72 2c 20 50 34 5f  Error, zErr, P4_
22700 44 59 4e 41 4d 49 43 2c 20 50 35 5f 43 6f 6e 73  DYNAMIC, P5_Cons
22710 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d  traintUnique);.}
22720 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  .../*.** Code an
22730 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20   OP_Halt due to 
22740 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64  non-unique rowid
22750 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22760 33 52 6f 77 69 64 43 6f 6e 73 74 72 61 69 6e 74  3RowidConstraint
22770 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
22780 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
22790 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
227a0 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
227b0 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f  /* Conflict reso
227c0 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
227d0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
227e0 62 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74  b       /* The t
227f0 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 6e 6f  able with the no
22800 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 20 2a  n-unique rowid *
22810 2f 20 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4d  / .){.  char *zM
22820 73 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  sg;.  int rc;.  
22830 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e  if( pTab->iPKey>
22840 3d 30 20 29 7b 0a 20 20 20 20 7a 4d 73 67 20 3d  =0 ){.    zMsg =
22850 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
22860 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e  pParse->db, "%s.
22870 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
22880 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22890 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
228a0 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b  ->aCol[pTab->iPK
228b0 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ey].zName);.    
228c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rc = SQLITE_CONS
228d0 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45  TRAINT_PRIMARYKE
228e0 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
228f0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
22900 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62  rintf(pParse->db
22910 2c 20 22 25 73 2e 72 6f 77 69 64 22 2c 20 70 54  , "%s.rowid", pT
22920 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
22930 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rc = SQLITE_CONS
22940 54 52 41 49 4e 54 5f 52 4f 57 49 44 3b 0a 20 20  TRAINT_ROWID;.  
22950 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43  }.  sqlite3HaltC
22960 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65  onstraint(pParse
22970 2c 20 72 63 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a  , rc, onError, z
22980 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c  Msg, P4_DYNAMIC,
22990 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
229a0 20 20 20 20 20 20 20 20 20 50 35 5f 43 6f 6e 73           P5_Cons
229b0 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d  traintUnique);.}
229c0 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
229d0 20 73 65 65 20 69 66 20 70 49 6e 64 65 78 20 75   see if pIndex u
229e0 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  ses the collatin
229f0 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
22a00 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
22a10 65 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64  e if it does and
22a20 20 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65   false if it doe
22a30 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65  s not..*/.#ifnde
22a40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
22a50 49 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74  INDEX.static int
22a60 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28   collationMatch(
22a70 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
22a80 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  l, Index *pIndex
22a90 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
22aa0 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29  sert( zColl!=0 )
22ab0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
22ac0 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  Index->nColumn; 
22ad0 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
22ae0 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78  char *z = pIndex
22af0 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20  ->azColl[i];.   
22b00 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 7c 7c   assert( z!=0 ||
22b10 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
22b20 6e 5b 69 5d 3c 30 20 29 3b 0a 20 20 20 20 69 66  n[i]<0 );.    if
22b30 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  ( pIndex->aiColu
22b40 6d 6e 5b 69 5d 3e 3d 30 20 26 26 20 30 3d 3d 73  mn[i]>=0 && 0==s
22b50 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
22b60 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20   zColl) ){.     
22b70 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
22b80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
22b90 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
22ba0 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   Recompute all i
22bb0 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 20 74  ndices of pTab t
22bc0 68 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c  hat use the coll
22bd0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
22be0 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c  Coll..** If pCol
22bf0 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70  l==0 then recomp
22c00 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
22c10 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e  of pTab..*/.#ifn
22c20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22c30 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76  REINDEX.static v
22c40 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65  oid reindexTable
22c50 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
22c60 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61  Table *pTab, cha
22c70 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b  r const *zColl){
22c80 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
22c90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
22ca0 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63  * An index assoc
22cb0 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20  iated with pTab 
22cc0 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78  */..  for(pIndex
22cd0 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
22ce0 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49  Index; pIndex=pI
22cf0 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  ndex->pNext){.  
22d00 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c    if( zColl==0 |
22d10 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68  | collationMatch
22d20 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20  (zColl, pIndex) 
22d30 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62  ){.      int iDb
22d40 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
22d50 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
22d60 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
22d70 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  a);.      sqlite
22d80 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
22d90 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
22da0 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
22db0 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
22dc0 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d  Parse, pIndex, -
22dd0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  1);.    }.  }.}.
22de0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
22df0 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
22e00 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ces of all table
22e10 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73  s in all databas
22e20 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20  es where the.** 
22e30 69 6e 64 69 63 65 73 20 75 73 65 20 74 68 65 20  indices use the 
22e40 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
22e50 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43  ce pColl.  If pC
22e60 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f  oll==0 then reco
22e70 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64  mpute.** all ind
22e80 69 63 65 73 20 65 76 65 72 79 77 68 65 72 65 2e  ices everywhere.
22e90 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
22ea0 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
22eb0 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e  static void rein
22ec0 64 65 78 44 61 74 61 62 61 73 65 73 28 50 61 72  dexDatabases(Par
22ed0 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72  se *pParse, char
22ee0 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a   const *zColl){.
22ef0 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20    Db *pDb;      
22f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22f10 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   A single databa
22f20 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  se */.  int iDb;
22f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f40 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
22f50 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ase index number
22f60 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
22f70 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
22f80 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
22f90 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
22fa0 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20    HashElem *k;  
22fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22fc0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
22fd0 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20  r tables in pDb 
22fe0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
22ff0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23000 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74   /* A table in t
23010 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a  he database */..
23020 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
23030 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
23040 74 65 78 65 73 28 64 62 29 20 29 3b 20 20 2f 2a  texes(db) );  /*
23050 20 4e 65 65 64 65 64 20 66 6f 72 20 73 63 68 65   Needed for sche
23060 6d 61 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 66  ma access */.  f
23070 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62  or(iDb=0, pDb=db
23080 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e  ->aDb; iDb<db->n
23090 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b  Db; iDb++, pDb++
230a0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
230b0 44 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72  Db!=0 );.    for
230c0 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (k=sqliteHashFir
230d0 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61  st(&pDb->pSchema
230e0 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20  ->tblHash);  k; 
230f0 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  k=sqliteHashNext
23100 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62  (k)){.      pTab
23110 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74   = (Table*)sqlit
23120 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20  eHashData(k);.  
23130 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65      reindexTable
23140 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 7a  (pParse, pTab, z
23150 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Coll);.    }.  }
23160 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
23170 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
23180 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58 20 63  or the REINDEX c
23190 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  ommand..**.**   
231a0 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 20 20       REINDEX    
231b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231c0 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20          -- 1.** 
231d0 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
231e0 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20  <collation>     
231f0 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a            -- 2.*
23200 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
23210 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c    ?<database>.?<
23220 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33  tablename>  -- 3
23230 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
23240 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e  EX  ?<database>.
23250 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d  ?<indexname>  --
23260 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20   4.**.** Form 1 
23270 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63  causes all indic
23280 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68  es in all attach
23290 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f 20  ed databases to 
232a0 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46  be rebuilt..** F
232b0 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61  orm 2 rebuilds a
232c0 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c  ll indices in al
232d0 6c 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  l databases that
232e0 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a   use the named.*
232f0 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  * collating func
23300 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61  tion.  Forms 3 a
23310 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74 68 65  nd 4 rebuild the
23320 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20   named index or 
23330 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61  all.** indices a
23340 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
23350 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a  he named table..
23360 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
23370 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76  E_OMIT_REINDEX.v
23380 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64  oid sqlite3Reind
23390 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
233a0 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c  , Token *pName1,
233b0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b   Token *pName2){
233c0 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
233d0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
233e0 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
233f0 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64  ence to be reind
23400 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  exed, or NULL */
23410 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  .  char *z;     
23420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23430 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c  * Name of a tabl
23440 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e or index */.  
23450 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b  const char *zDb;
23460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
23470 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
23480 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ase */.  Table *
23490 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
234a0 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
234b0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
234c0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
234d0 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
234e0 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73   /* An index ass
234f0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61  ociated with pTa
23500 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  b */.  int iDb; 
23510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23520 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
23530 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  se index number 
23540 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
23550 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
23560 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
23570 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
23580 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65   Token *pObjName
23590 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
235a0 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
235b0 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65  e or index to be
235c0 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20   reindexed */.. 
235d0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74   /* Read the dat
235e0 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66  abase schema. If
235f0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
23600 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
23610 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e   message.  ** an
23620 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65  d code in pParse
23630 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
23640 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54  . */.  if( SQLIT
23650 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
23660 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
23670 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
23680 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 31   }..  if( pName1
23690 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e 64  ==0 ){.    reind
236a0 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72  exDatabases(pPar
236b0 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  se, 0);.    retu
236c0 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  rn;.  }else if( 
236d0 4e 45 56 45 52 28 70 4e 61 6d 65 32 3d 3d 30 29  NEVER(pName2==0)
236e0 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30   || pName2->z==0
236f0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43   ){.    char *zC
23700 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28  oll;.    assert(
23710 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20   pName1->z );.  
23720 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    zColl = sqlite
23730 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
23740 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65  Parse->db, pName
23750 31 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 43 6f  1);.    if( !zCo
23760 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ll ) return;.   
23770 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
23780 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
23790 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20  ENC(db), zColl, 
237a0 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  0);.    if( pCol
237b0 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 69 6e 64  l ){.      reind
237c0 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72  exDatabases(pPar
237d0 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  se, zColl);.    
237e0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
237f0 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  db, zColl);.    
23800 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
23810 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
23820 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  e(db, zColl);.  
23830 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  }.  iDb = sqlite
23840 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
23850 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
23860 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b  me2, &pObjName);
23870 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72  .  if( iDb<0 ) r
23880 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c  eturn;.  z = sql
23890 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
238a0 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b  n(db, pObjName);
238b0 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
238c0 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62  turn;.  zDb = db
238d0 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
238e0 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  ame;.  pTab = sq
238f0 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
23900 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66  b, z, zDb);.  if
23910 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65  ( pTab ){.    re
23920 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73  indexTable(pPars
23930 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20  e, pTab, 0);.   
23940 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
23950 62 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74 75 72  b, z);.    retur
23960 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20  n;.  }.  pIndex 
23970 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
23980 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a  ex(db, z, zDb);.
23990 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
239a0 64 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 49  db, z);.  if( pI
239b0 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  ndex ){.    sqli
239c0 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
239d0 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
239e0 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
239f0 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
23a00 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d  Parse, pIndex, -
23a10 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  1);.    return;.
23a20 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72    }.  sqlite3Err
23a30 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
23a40 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66  nable to identif
23a50 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20  y the object to 
23a60 62 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a  be reindexed");.
23a70 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
23a80 52 65 74 75 72 6e 20 61 20 4b 65 79 49 6e 66 6f  Return a KeyInfo
23a90 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
23aa0 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
23ab0 6f 72 20 74 68 65 20 67 69 76 65 6e 20 49 6e 64  or the given Ind
23ac0 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ex..**.** The ca
23ad0 6c 6c 65 72 20 73 68 6f 75 6c 64 20 69 6e 76 6f  ller should invo
23ae0 6b 65 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  ke sqlite3KeyInf
23af0 6f 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20  oUnref() on the 
23b00 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 0a  returned object.
23b10 2a 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20 66  ** when it has f
23b20 69 6e 69 73 68 65 64 20 75 73 69 6e 67 20 69 74  inished using it
23b30 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71  ..*/.KeyInfo *sq
23b40 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e  lite3KeyInfoOfIn
23b50 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
23b60 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  e, Index *pIdx){
23b70 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
23b80 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f  nCol = pIdx->nCo
23b90 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e 4b 65 79  lumn;.  int nKey
23ba0 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   = pIdx->nKeyCol
23bb0 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  ;.  KeyInfo *pKe
23bc0 79 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  y;.  if( pParse-
23bd0 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30  >nErr ) return 0
23be0 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 75 6e  ;.  if( pIdx->un
23bf0 69 71 4e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20  iqNotNull ){.   
23c00 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b   pKey = sqlite3K
23c10 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72  eyInfoAlloc(pPar
23c20 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 2c 20 6e 43  se->db, nKey, nC
23c30 6f 6c 2d 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73  ol-nKey);.  }els
23c40 65 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71  e{.    pKey = sq
23c50 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
23c60 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 43  c(pParse->db, nC
23c70 6f 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  ol, 0);.  }.  if
23c80 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73  ( pKey ){.    as
23c90 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
23ca0 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
23cb0 70 4b 65 79 29 20 29 3b 0a 20 20 20 20 66 6f 72  pKey) );.    for
23cc0 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
23cd0 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  +){.      const 
23ce0 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49  char *zColl = pI
23cf0 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20  dx->azColl[i];. 
23d00 20 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c       pKey->aColl
23d10 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3d 3d 73 71 6c  [i] = zColl==sql
23d20 69 74 65 33 53 74 72 42 49 4e 41 52 59 20 3f 20  ite3StrBINARY ? 
23d30 30 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  0 :.            
23d40 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
23d50 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
23d60 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b  (pParse, zColl);
23d70 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f  .      pKey->aSo
23d80 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 64  rtOrder[i] = pId
23d90 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  x->aSortOrder[i]
23da0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
23db0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
23dc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79        sqlite3Key
23dd0 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 29 3b  InfoUnref(pKey);
23de0 0a 20 20 20 20 20 20 70 4b 65 79 20 3d 20 30 3b  .      pKey = 0;
23df0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
23e00 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a 0a 23 69 66  urn pKey;.}..#if
23e10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
23e20 5f 43 54 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  _CTE./* .** This
23e30 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
23e40 6b 65 64 20 6f 6e 63 65 20 70 65 72 20 43 54 45  ked once per CTE
23e50 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
23e60 68 69 6c 65 20 70 61 72 73 69 6e 67 20 61 20 0a  hile parsing a .
23e70 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20  ** WITH clause. 
23e80 0a 2a 2f 0a 57 69 74 68 20 2a 73 71 6c 69 74 65  .*/.With *sqlite
23e90 33 57 69 74 68 41 64 64 28 0a 20 20 50 61 72 73  3WithAdd(.  Pars
23ea0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
23eb0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
23ec0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 69 74 68  ontext */.  With
23ed0 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20 20   *pWith,        
23ee0 20 20 20 20 2f 2a 20 45 78 69 73 74 69 6e 67 20      /* Existing 
23ef0 57 49 54 48 20 63 6c 61 75 73 65 2c 20 6f 72 20  WITH clause, or 
23f00 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
23f10 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *pName,         
23f20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
23f30 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 20 2a 2f   common-table */
23f40 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41 72  .  ExprList *pAr
23f50 67 6c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4f 70  glist,     /* Op
23f60 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 6e 61  tional column na
23f70 6d 65 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20  me list for the 
23f80 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63  table */.  Selec
23f90 74 20 2a 70 51 75 65 72 79 20 20 20 20 20 20 20  t *pQuery       
23fa0 20 20 20 2f 2a 20 51 75 65 72 79 20 75 73 65 64     /* Query used
23fb0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   to initialize t
23fc0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  he table */.){. 
23fd0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
23fe0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 57 69 74  Parse->db;.  Wit
23ff0 68 20 2a 70 4e 65 77 3b 0a 20 20 63 68 61 72 20  h *pNew;.  char 
24000 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 43 68  *zName;..  /* Ch
24010 65 63 6b 20 74 68 61 74 20 74 68 65 20 43 54 45  eck that the CTE
24020 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 20   name is unique 
24030 77 69 74 68 69 6e 20 74 68 69 73 20 57 49 54 48  within this WITH
24040 20 63 6c 61 75 73 65 2e 20 49 66 0a 20 20 2a 2a   clause. If.  **
24050 20 6e 6f 74 2c 20 73 74 6f 72 65 20 61 6e 20 65   not, store an e
24060 72 72 6f 72 20 69 6e 20 74 68 65 20 50 61 72 73  rror in the Pars
24070 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  e structure. */.
24080 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
24090 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
240a0 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65  Parse->db, pName
240b0 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 26  );.  if( zName &
240c0 26 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69  & pWith ){.    i
240d0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
240e0 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65  0; i<pWith->nCte
240f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
24100 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
24110 28 7a 4e 61 6d 65 2c 20 70 57 69 74 68 2d 3e 61  (zName, pWith->a
24120 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
24130 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24140 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
24150 20 22 64 75 70 6c 69 63 61 74 65 20 57 49 54 48   "duplicate WITH
24160 20 74 61 62 6c 65 20 6e 61 6d 65 3a 20 25 73 22   table name: %s"
24170 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
24180 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
24190 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20  f( pWith ){.    
241a0 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  int nByte = size
241b0 6f 66 28 2a 70 57 69 74 68 29 20 2b 20 28 73 69  of(*pWith) + (si
241c0 7a 65 6f 66 28 70 57 69 74 68 2d 3e 61 5b 31 5d  zeof(pWith->a[1]
241d0 29 20 2a 20 70 57 69 74 68 2d 3e 6e 43 74 65 29  ) * pWith->nCte)
241e0 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
241f0 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
24200 2c 20 70 57 69 74 68 2c 20 6e 42 79 74 65 29 3b  , pWith, nByte);
24210 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
24220 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
24230 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
24240 65 6f 66 28 2a 70 57 69 74 68 29 29 3b 0a 20 20  eof(*pWith));.  
24250 7d 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65  }.  assert( (pNe
24260 77 21 3d 30 20 26 26 20 7a 4e 61 6d 65 21 3d 30  w!=0 && zName!=0
24270 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ) || db->mallocF
24280 61 69 6c 65 64 20 29 3b 0a 0a 20 20 69 66 28 20  ailed );..  if( 
24290 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
242a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
242b0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
242c0 2c 20 70 41 72 67 6c 69 73 74 29 3b 0a 20 20 20  , pArglist);.   
242d0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
242e0 6c 65 74 65 28 64 62 2c 20 70 51 75 65 72 79 29  lete(db, pQuery)
242f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
24300 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
24310 20 20 20 20 70 4e 65 77 20 3d 20 70 57 69 74 68      pNew = pWith
24320 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
24330 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74  New->a[pNew->nCt
24340 65 5d 2e 70 53 65 6c 65 63 74 20 3d 20 70 51 75  e].pSelect = pQu
24350 65 72 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ery;.    pNew->a
24360 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 43 6f  [pNew->nCte].pCo
24370 6c 73 20 3d 20 70 41 72 67 6c 69 73 74 3b 0a 20  ls = pArglist;. 
24380 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
24390 3e 6e 43 74 65 5d 2e 7a 4e 61 6d 65 20 3d 20 7a  >nCte].zName = z
243a0 4e 61 6d 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Name;.    pNew->
243b0 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 43  a[pNew->nCte].zC
243c0 74 65 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70  teErr = 0;.    p
243d0 4e 65 77 2d 3e 6e 43 74 65 2b 2b 3b 0a 20 20 7d  New->nCte++;.  }
243e0 0a 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ..  return pNew;
243f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
24400 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
24410 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74 20 70  he With object p
24420 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
24430 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
24440 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 74  .void sqlite3Wit
24450 68 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  hDelete(sqlite3 
24460 2a 64 62 2c 20 57 69 74 68 20 2a 70 57 69 74 68  *db, With *pWith
24470 29 7b 0a 20 20 69 66 28 20 70 57 69 74 68 20 29  ){.  if( pWith )
24480 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
24490 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69 74   for(i=0; i<pWit
244a0 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20  h->nCte; i++){. 
244b0 20 20 20 20 20 73 74 72 75 63 74 20 43 74 65 20       struct Cte 
244c0 2a 70 43 74 65 20 3d 20 26 70 57 69 74 68 2d 3e  *pCte = &pWith->
244d0 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  a[i];.      sqli
244e0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
244f0 65 28 64 62 2c 20 70 43 74 65 2d 3e 70 43 6f 6c  e(db, pCte->pCol
24500 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  s);.      sqlite
24510 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
24520 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 29  , pCte->pSelect)
24530 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
24540 62 46 72 65 65 28 64 62 2c 20 70 43 74 65 2d 3e  bFree(db, pCte->
24550 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
24560 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
24570 64 62 2c 20 70 57 69 74 68 29 3b 0a 20 20 7d 0a  db, pWith);.  }.
24580 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
24590 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
245a0 5f 43 54 45 29 20 2a 2f 0a                       _CTE) */.