/ Hex Artifact Content
Login

Artifact 672022c06e1a5c2653f80c77a687de11f7e65ce81d20fe2825aadfa13a875c33:


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: 20 20 54 68 65 20 72 65 73 65 74 20 69 73 20 64    The reset is d
41e0: 65 66 65 72 72 65 64 20 69 66 20 64 62 2d 3e 6e  eferred if db->n
41f0: 53 63 68 65 6d 61 4c 6f 63 6b 20 69 73 20 6e 6f  SchemaLock is no
4200: 74 20 7a 65 72 6f 2e 0a 2a 2a 20 44 65 66 65 72  t zero..** Defer
4210: 72 65 64 20 72 65 73 65 74 73 20 6d 61 79 20 62  red resets may b
4220: 65 20 72 75 6e 20 62 79 20 63 61 6c 6c 69 6e 67  e run by calling
4230: 20 77 69 74 68 20 69 44 62 3c 30 2e 0a 2a 2f 0a   with iDb<0..*/.
4240: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65  void sqlite3Rese
4250: 74 4f 6e 65 53 63 68 65 6d 61 28 73 71 6c 69 74  tOneSchema(sqlit
4260: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29  e3 *db, int iDb)
4270: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
4280: 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62  ert( iDb<db->nDb
4290: 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62 3e 3d   );..  if( iDb>=
42a0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
42b0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
42c0: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
42d0: 20 30 29 20 29 3b 0a 20 20 20 20 44 62 53 65 74   0) );.    DbSet
42e0: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62  Property(db, iDb
42f0: 2c 20 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64  , DB_ResetWanted
4300: 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70  );.    DbSetProp
4310: 65 72 74 79 28 64 62 2c 20 31 2c 20 44 42 5f 52  erty(db, 1, DB_R
4320: 65 73 65 74 57 61 6e 74 65 64 29 3b 0a 20 20 7d  esetWanted);.  }
4330: 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 63 68  ..  if( db->nSch
4340: 65 6d 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  emaLock==0 ){.  
4350: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
4360: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
4370: 20 20 69 66 28 20 44 62 48 61 73 50 72 6f 70 65    if( DbHasPrope
4380: 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f 52 65  rty(db, i, DB_Re
4390: 73 65 74 57 61 6e 74 65 64 29 20 29 7b 0a 20 20  setWanted) ){.  
43a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 63 68        sqlite3Sch
43b0: 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61 44 62  emaClear(db->aDb
43c0: 5b 69 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20  [i].pSchema);.  
43d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
43e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61  }../*.** Erase a
43f0: 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d  ll schema inform
4400: 61 74 69 6f 6e 20 66 72 6f 6d 20 61 6c 6c 20 61  ation from all a
4410: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
4420: 73 20 28 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20  s (including.** 
4430: 22 6d 61 69 6e 22 20 61 6e 64 20 22 74 65 6d 70  "main" and "temp
4440: 22 29 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ") for a single 
4450: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
4460: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
4470: 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65  ite3ResetAllSche
4480: 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28  masOfConnection(
4490: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
44a0: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
44b0: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
44c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
44d0: 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 3d 3d 30 20  >nSchemaLock==0 
44e0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
44f0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
4500: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
4510: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
4520: 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 29  ( pDb->pSchema )
4530: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
4540: 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e  chemaClear(pDb->
4550: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
4560: 20 20 7d 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61    }.  db->mDbFla
4570: 67 73 20 26 3d 20 7e 44 42 46 4c 41 47 5f 53 63  gs &= ~DBFLAG_Sc
4580: 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20 73 71  hemaChange;.  sq
4590: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c  lite3VtabUnlockL
45a0: 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ist(db);.  sqlit
45b0: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
45c0: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  db);.  sqlite3Co
45d0: 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65 41 72  llapseDatabaseAr
45e0: 72 61 79 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ray(db);.}../*.*
45f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4600: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
4610: 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a  commit occurs..*
4620: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
4630: 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
4640: 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ges(sqlite3 *db)
4650: 7b 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73  {.  db->mDbFlags
4660: 20 26 3d 20 7e 44 42 46 4c 41 47 5f 53 63 68 65   &= ~DBFLAG_Sche
4670: 6d 61 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a  maChange;.}../*.
4680: 2a 2a 20 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79  ** Delete memory
4690: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
46a0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
46b0: 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69  of a table or vi
46c0: 65 77 20 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65  ew (the.** Table
46d0: 2e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a  .aCol[] array)..
46e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
46f0: 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
4700: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
4710: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
4720: 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20  int i;.  Column 
4730: 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28  *pCol;.  assert(
4740: 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20   pTable!=0 );.  
4750: 69 66 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62  if( (pCol = pTab
4760: 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a  le->aCol)!=0 ){.
4770: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
4780: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  Table->nCol; i++
4790: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
47a0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
47b0: 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  b, pCol->zName);
47c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
47d0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f  prDelete(db, pCo
47e0: 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20  l->pDflt);.     
47f0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4800: 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b  b, pCol->zColl);
4810: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
4820: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
4830: 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a  ble->aCol);.  }.
4840: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
4850: 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20  the memory data 
4860: 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63  structures assoc
4870: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67  iated with the g
4880: 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20  iven.** Table.  
4890: 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
48a0: 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74  ade to disk by t
48b0: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
48c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
48d0: 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65  just deletes the
48e0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e   data structure.
48f0: 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e    It does not un
4900: 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c  link.** the tabl
4910: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
4920: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
4930: 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f  able.  But it do
4940: 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65  es destroy.** me
4950: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
4960: 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61  of the indices a
4970: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  nd foreign keys 
4980: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
4990: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  .** the table..*
49a0: 2a 0a 2a 2a 20 54 68 65 20 64 62 20 70 61 72 61  *.** The db para
49b0: 6d 65 74 65 72 20 69 73 20 6f 70 74 69 6f 6e 61  meter is optiona
49c0: 6c 2e 20 20 49 74 20 69 73 20 6e 65 65 64 65 64  l.  It is needed
49d0: 20 69 66 20 74 68 65 20 54 61 62 6c 65 20 6f 62   if the Table ob
49e0: 6a 65 63 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e  ject .** contain
49f0: 73 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  s lookaside memo
4a00: 72 79 2e 20 20 28 54 61 62 6c 65 20 6f 62 6a 65  ry.  (Table obje
4a10: 63 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d  cts in the schem
4a20: 61 20 64 6f 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  a do not use.** 
4a30: 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  lookaside memory
4a40: 2c 20 62 75 74 20 73 6f 6d 65 20 65 70 68 65 6d  , but some ephem
4a50: 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63  eral Table objec
4a60: 74 73 20 64 6f 2e 29 20 20 4f 72 20 74 68 65 0a  ts do.)  Or the.
4a70: 2a 2a 20 64 62 20 70 61 72 61 6d 65 74 65 72 20  ** db parameter 
4a80: 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68  can be used with
4a90: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
4aa0: 64 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65  d to measure the
4ab0: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 75 73 65 64 20   memory.** used 
4ac0: 62 79 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  by the Table obj
4ad0: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
4ae0: 6f 69 64 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  oid SQLITE_NOINL
4af0: 49 4e 45 20 64 65 6c 65 74 65 54 61 62 6c 65 28  INE deleteTable(
4b00: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62  sqlite3 *db, Tab
4b10: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49  le *pTable){.  I
4b20: 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70  ndex *pIndex, *p
4b30: 4e 65 78 74 3b 0a 0a 23 69 66 64 65 66 20 53 51  Next;..#ifdef SQ
4b40: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
4b50: 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65  Record the numbe
4b60: 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  r of outstanding
4b70: 20 6c 6f 6f 6b 61 73 69 64 65 20 61 6c 6c 6f 63   lookaside alloc
4b80: 61 74 69 6f 6e 73 20 69 6e 20 73 63 68 65 6d 61  ations in schema
4b90: 20 54 61 62 6c 65 73 0a 20 20 2a 2a 20 70 72 69   Tables.  ** pri
4ba0: 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79 20  or to doing any 
4bb0: 66 72 65 65 28 29 20 6f 70 65 72 61 74 69 6f 6e  free() operation
4bc0: 73 2e 20 20 53 69 6e 63 65 20 73 63 68 65 6d 61  s.  Since schema
4bd0: 20 54 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 75   Tables do not u
4be0: 73 65 0a 20 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64  se.  ** lookasid
4bf0: 65 2c 20 74 68 69 73 20 6e 75 6d 62 65 72 20 73  e, this number s
4c00: 68 6f 75 6c 64 20 6e 6f 74 20 63 68 61 6e 67 65  hould not change
4c10: 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b  . */.  int nLook
4c20: 61 73 69 64 65 20 3d 20 30 3b 0a 20 20 69 66 28  aside = 0;.  if(
4c30: 20 64 62 20 26 26 20 28 70 54 61 62 6c 65 2d 3e   db && (pTable->
4c40: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
4c50: 68 65 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a 20  hemeral)==0 ){. 
4c60: 20 20 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20     nLookaside = 
4c70: 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65  sqlite3Lookaside
4c80: 55 73 65 64 28 64 62 2c 20 30 29 3b 0a 20 20 7d  Used(db, 0);.  }
4c90: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 65  .#endif..  /* De
4ca0: 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  lete all indices
4cb0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
4cc0: 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a   this table. */.
4cd0: 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70    for(pIndex = p
4ce0: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70  Table->pIndex; p
4cf0: 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e  Index; pIndex=pN
4d00: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
4d10: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
4d20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
4d30: 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  dex->pSchema==pT
4d40: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 0a 20 20  able->pSchema.  
4d50: 20 20 20 20 20 20 20 7c 7c 20 28 49 73 56 69 72         || (IsVir
4d60: 74 75 61 6c 28 70 54 61 62 6c 65 29 20 26 26 20  tual(pTable) && 
4d70: 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 21  pIndex->idxType!
4d80: 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f  =SQLITE_IDXTYPE_
4d90: 41 50 50 44 45 46 29 20 29 3b 0a 20 20 20 20 69  APPDEF) );.    i
4da0: 66 28 20 28 64 62 3d 3d 30 20 7c 7c 20 64 62 2d  f( (db==0 || db-
4db0: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
4dc0: 29 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28  ) && !IsVirtual(
4dd0: 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20  pTable) ){.     
4de0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
4df0: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20  Index->zName; . 
4e00: 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 20 28 20       TESTONLY ( 
4e10: 49 6e 64 65 78 20 2a 70 4f 6c 64 20 3d 20 29 20  Index *pOld = ) 
4e20: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
4e30: 74 28 0a 20 20 20 20 20 20 20 20 20 26 70 49 6e  t(.         &pIn
4e40: 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64  dex->pSchema->id
4e50: 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a  xHash, zName, 0.
4e60: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
4e70: 73 73 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20  ssert( db==0 || 
4e80: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
4e90: 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49  exHeld(db, 0, pI
4ea0: 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29  ndex->pSchema) )
4eb0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4ec0: 70 4f 6c 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20  pOld==pIndex || 
4ed0: 70 4f 6c 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  pOld==0 );.    }
4ee0: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 64  .    freeIndex(d
4ef0: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
4f00: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79  .  /* Delete any
4f10: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 74   foreign keys at
4f20: 74 61 63 68 65 64 20 74 6f 20 74 68 69 73 20 74  tached to this t
4f30: 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  able. */.  sqlit
4f40: 65 33 46 6b 44 65 6c 65 74 65 28 64 62 2c 20 70  e3FkDelete(db, p
4f50: 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65  Table);..  /* De
4f60: 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73  lete the Table s
4f70: 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e  tructure itself.
4f80: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  .  */.  sqlite3D
4f90: 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
4fa0: 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  (db, pTable);.  
4fb0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4fc0: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
4fd0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
4fe0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43  e(db, pTable->zC
4ff0: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
5000: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
5010: 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  , pTable->pSelec
5020: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
5030: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
5040: 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b  pTable->pCheck);
5050: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5060: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
5070: 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 43  E.  sqlite3VtabC
5080: 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29  lear(db, pTable)
5090: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
50a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
50b0: 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69  ble);..  /* Veri
50c0: 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61  fy that no looka
50d0: 73 69 64 65 20 6d 65 6d 6f 72 79 20 77 61 73 20  side memory was 
50e0: 75 73 65 64 20 62 79 20 73 63 68 65 6d 61 20 74  used by schema t
50f0: 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  ables */.  asser
5100: 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30  t( nLookaside==0
5110: 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d   || nLookaside==
5120: 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65  sqlite3Lookaside
5130: 55 73 65 64 28 64 62 2c 30 29 20 29 3b 0a 7d 0a  Used(db,0) );.}.
5140: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65  void sqlite3Dele
5150: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
5160: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  *db, Table *pTab
5170: 6c 65 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74  le){.  /* Do not
5180: 20 64 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c   delete the tabl
5190: 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65  e until the refe
51a0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63  rence count reac
51b0: 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69  hes zero. */.  i
51c0: 66 28 20 21 70 54 61 62 6c 65 20 29 20 72 65 74  f( !pTable ) ret
51d0: 75 72 6e 3b 0a 20 20 69 66 28 20 28 28 21 64 62  urn;.  if( ((!db
51e0: 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46   || db->pnBytesF
51f0: 72 65 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d 70  reed==0) && (--p
5200: 54 61 62 6c 65 2d 3e 6e 54 61 62 52 65 66 29 3e  Table->nTabRef)>
5210: 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64  0) ) return;.  d
5220: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
5230: 54 61 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  Table);.}.../*.*
5240: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
5250: 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  en table from th
5260: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  e hash tables an
5270: 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65  d the delete the
5280: 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74  .** table struct
5290: 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73  ure with all its
52a0: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
52b0: 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f  eign keys..*/.vo
52c0: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
52d0: 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73  AndDeleteTable(s
52e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
52f0: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
5300: 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61  *zTabName){.  Ta
5310: 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44  ble *p;.  Db *pD
5320: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  b;..  assert( db
5330: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
5340: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
5350: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
5360: 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a  rt( zTabName );.
5370: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5380: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
5390: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
53a0: 20 20 74 65 73 74 63 61 73 65 28 20 7a 54 61 62    testcase( zTab
53b0: 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f  Name[0]==0 );  /
53c0: 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61  * Zero-length ta
53d0: 62 6c 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c  ble names are al
53e0: 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d  lowed */.  pDb =
53f0: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
5400: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
5410: 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53  hInsert(&pDb->pS
5420: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
5430: 7a 54 61 62 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  zTabName, 0);.  
5440: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
5450: 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d  le(db, p);.  db-
5460: 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46  >mDbFlags |= DBF
5470: 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65  LAG_SchemaChange
5480: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
5490: 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e   a token, return
54a0: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63   a string that c
54b0: 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74  onsists of the t
54c0: 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74  ext of that.** t
54d0: 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20  oken.  Space to 
54e0: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
54f0: 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f  d string.** is o
5500: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
5510: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
5520: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
5530: 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
5540: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
5550: 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61  Any quotation ma
5560: 72 6b 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22  rks (ex:  "name"
5570: 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d  , 'name', [name]
5580: 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61  , or `name`) tha
5590: 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68  t.** surround th
55a0: 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f  e body of the to
55b0: 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e  ken are removed.
55c0: 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72  .**.** Tokens ar
55d0: 65 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69  e often just poi
55e0: 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f  nters into the o
55f0: 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74  riginal SQL text
5600: 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e   and so.** are n
5610: 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  ot \000 terminat
5620: 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70  ed and are not p
5630: 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20  ersistent.  The 
5640: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
5650: 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69  ** is \000 termi
5660: 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72  nated and is per
5670: 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72  sistent..*/.char
5680: 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f   *sqlite3NameFro
5690: 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a  mToken(sqlite3 *
56a0: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
56b0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  ){.  char *zName
56c0: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b  ;.  if( pName ){
56d0: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
56e0: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
56f0: 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e  , (char*)pName->
5700: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
5710: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
5720: 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  (zName);.  }else
5730: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  {.    zName = 0;
5740: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
5750: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  ame;.}../*.** Op
5760: 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  en the sqlite_ma
5770: 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65  ster table store
5780: 64 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75  d in database nu
5790: 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20  mber iDb for.** 
57a0: 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62  writing. The tab
57b0: 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  le is opened usi
57c0: 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a  ng cursor 0..*/.
57d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e  void sqlite3Open
57e0: 4d 61 73 74 65 72 54 61 62 6c 65 28 50 61 72 73  MasterTable(Pars
57f0: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a  e *p, int iDb){.
5800: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
5810: 74 65 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20  te3GetVdbe(p);. 
5820: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
5830: 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52  k(p, iDb, MASTER
5840: 5f 52 4f 4f 54 2c 20 31 2c 20 4d 41 53 54 45 52  _ROOT, 1, MASTER
5850: 5f 4e 41 4d 45 29 3b 0a 20 20 73 71 6c 69 74 65  _NAME);.  sqlite
5860: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
5870: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
5880: 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  0, MASTER_ROOT, 
5890: 69 44 62 2c 20 35 29 3b 0a 20 20 69 66 28 20 70  iDb, 5);.  if( p
58a0: 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ->nTab==0 ){.   
58b0: 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20   p->nTab = 1;.  
58c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  }.}../*.** Param
58d0: 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74  eter zName point
58e0: 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69  s to a nul-termi
58f0: 6e 61 74 65 64 20 62 75 66 66 65 72 20 63 6f 6e  nated buffer con
5900: 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65  taining the name
5910: 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61 62 61 73  .** of a databas
5920: 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70  e ("main", "temp
5930: 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  " or the name of
5940: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29   an attached db)
5950: 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
5960: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 69  on returns the i
5970: 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65  ndex of the name
5980: 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62  d database in db
5990: 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d  ->aDb[], or.** -
59a0: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
59b0: 62 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  b cannot be foun
59c0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
59d0: 33 46 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69  3FindDbName(sqli
59e0: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
59f0: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
5a00: 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 20 20  nt i = -1;      
5a10: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
5a20: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a  umber */.  if( z
5a30: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44 62 20 2a  Name ){.    Db *
5a40: 70 44 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28  pDb;.    for(i=(
5a50: 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d  db->nDb-1), pDb=
5a60: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d  &db->aDb[i]; i>=
5a70: 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a  0; i--, pDb--){.
5a80: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
5a90: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 44 62  ite3_stricmp(pDb
5aa0: 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a 4e 61 6d  ->zDbSName, zNam
5ab0: 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  e) ) break;.    
5ac0: 20 20 2f 2a 20 22 6d 61 69 6e 22 20 69 73 20 61    /* "main" is a
5ad0: 6c 77 61 79 73 20 61 6e 20 61 63 63 65 70 74 61  lways an accepta
5ae0: 62 6c 65 20 61 6c 69 61 73 20 66 6f 72 20 74 68  ble alias for th
5af0: 65 20 70 72 69 6d 61 72 79 20 64 61 74 61 62 61  e primary databa
5b00: 73 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e  se.      ** even
5b10: 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20   if it has been 
5b20: 72 65 6e 61 6d 65 64 20 75 73 69 6e 67 20 53 51  renamed using SQ
5b30: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4d 41  LITE_DBCONFIG_MA
5b40: 49 4e 44 42 4e 41 4d 45 2e 20 2a 2f 0a 20 20 20  INDBNAME. */.   
5b50: 20 20 20 69 66 28 20 69 3d 3d 30 20 26 26 20 30     if( i==0 && 0
5b60: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ==sqlite3_stricm
5b70: 70 28 22 6d 61 69 6e 22 2c 20 7a 4e 61 6d 65 29  p("main", zName)
5b80: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
5b90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
5ba0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b  }../*.** The tok
5bb0: 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69  en *pName contai
5bc0: 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ns the name of a
5bd0: 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65   database (eithe
5be0: 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22  r "main" or.** "
5bf0: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
5c00: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
5c10: 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69   db). This routi
5c20: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
5c30: 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  * index of the n
5c40: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
5c50: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d   db->aDb[], or -
5c60: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
5c70: 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  b .** does not e
5c80: 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  xist..*/.int sql
5c90: 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74  ite3FindDb(sqlit
5ca0: 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70  e3 *db, Token *p
5cb0: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Name){.  int i; 
5cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5ce0: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
5cf0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
5d00: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
5d10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
5d20: 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63 68  me we are search
5d30: 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61  ing for */.  zNa
5d40: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
5d50: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
5d60: 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69  ame);.  i = sqli
5d70: 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
5d80: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  , zName);.  sqli
5d90: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
5da0: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  ame);.  return i
5db0: 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c  ;.}../* The tabl
5dc0: 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69  e or view or tri
5dd0: 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73  gger name is pas
5de0: 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74  sed to this rout
5df0: 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a  ine via tokens.*
5e00: 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61  * pName1 and pNa
5e10: 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c  me2. If the tabl
5e20: 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79  e name was fully
5e30: 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20   qualified, for 
5e40: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43  example:.**.** C
5e50: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e  REATE TABLE xxx.
5e60: 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a  yyy (...);.** .*
5e70: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
5e80: 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e   set to "xxx" an
5e90: 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20  d pName2 "yyy". 
5ea0: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
5eb0: 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  d if.** the tabl
5ec0: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75  e name is not fu
5ed0: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69  lly qualified, i
5ee0: 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  .e.:.**.** CREAT
5ef0: 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29  E TABLE yyy(...)
5f00: 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61  ;.**.** Then pNa
5f10: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79  me1 is set to "y
5f20: 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69  yy" and pName2 i
5f30: 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  s ""..**.** This
5f40: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
5f50: 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e  e *ppUnqual poin
5f60: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
5f70: 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65  the token (pName
5f80: 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20  1 or.** pName2) 
5f90: 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20  that stores the 
5fa0: 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c  unqualified tabl
5fb0: 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64  e name.  The ind
5fc0: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ex of the.** dat
5fd0: 61 62 61 73 65 20 22 78 78 78 22 20 69 73 20 72  abase "xxx" is r
5fe0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
5ff0: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
6000: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
6010: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
6020: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
6030: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
6040: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
6050: 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  me1,      /* The
6060: 20 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61   "xxx" in the na
6070: 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20  me "xxx.yyy" or 
6080: 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e  "xxx" */.  Token
6090: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f   *pName2,      /
60a0: 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e 20 74  * The "yyy" in t
60b0: 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79  he name "xxx.yyy
60c0: 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70  " */.  Token **p
60d0: 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72  Unqual     /* Wr
60e0: 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66  ite the unqualif
60f0: 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ied object name 
6100: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
6110: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
6120: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
6130: 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  base holding the
6140: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c   object */.  sql
6150: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
6160: 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74  e->db;..  assert
6170: 28 20 70 4e 61 6d 65 32 21 3d 30 20 29 3b 0a 20  ( pName2!=0 );. 
6180: 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30   if( pName2->n>0
6190: 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
61a0: 69 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a 20 20  init.busy ) {.  
61b0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
61c0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72  Msg(pParse, "cor
61d0: 72 75 70 74 20 64 61 74 61 62 61 73 65 22 29 3b  rupt database");
61e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
61f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 55 6e  ;.    }.    *pUn
6200: 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20  qual = pName2;. 
6210: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
6220: 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65  FindDb(db, pName
6230: 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  1);.    if( iDb<
6240: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
6250: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
6260: 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61  e, "unknown data
6270: 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31  base %T", pName1
6280: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
6290: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  -1;.    }.  }els
62a0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
62b0: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c  b->init.iDb==0 |
62c0: 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 0a  | db->init.busy.
62d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
62e0: 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 20  (db->mDbFlags & 
62f0: 44 42 46 4c 41 47 5f 56 61 63 75 75 6d 29 21 3d  DBFLAG_Vacuum)!=
6300: 30 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62  0);.    iDb = db
6310: 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20  ->init.iDb;.    
6320: 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65  *pUnqual = pName
6330: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
6340: 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  iDb;.}../*.** Th
6350: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
6360: 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74  ed to check if t
6370: 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20  he UTF-8 string 
6380: 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c  zName is a legal
6390: 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20  .** unqualified 
63a0: 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73  name for a new s
63b0: 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61  chema object (ta
63c0: 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77  ble, index, view
63d0: 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e   or.** trigger).
63e0: 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c   All names are l
63f0: 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73  egal except thos
6400: 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  e that begin wit
6410: 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20  h the string.** 
6420: 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70  "sqlite_" (in up
6430: 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69  per, lower or mi
6440: 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20  xed case). This 
6450: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  portion of the n
6460: 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72  amespace.** is r
6470: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
6480: 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74  rnal use..*/.int
6490: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a   sqlite3CheckObj
64a0: 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70  ectName(Parse *p
64b0: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
64c0: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28  r *zName){.  if(
64d0: 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e   !pParse->db->in
64e0: 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73  it.busy && pPars
64f0: 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20  e->nested==0 .  
6500: 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61 72          && (pPar
6510: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
6520: 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65  SQLITE_WriteSche
6530: 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ma)==0.         
6540: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
6550: 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  rNICmp(zName, "s
6560: 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20  qlite_", 7) ){. 
6570: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
6580: 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a 65  sg(pParse, "obje
6590: 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65 64  ct name reserved
65a0: 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73   for internal us
65b0: 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  e: %s", zName);.
65c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
65d0: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
65e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
65f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
6600: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
6610: 20 69 6e 64 65 78 20 6f 66 20 61 20 74 61 62 6c   index of a tabl
6620: 65 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69  e.*/.Index *sqli
6630: 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
6640: 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  ex(Table *pTab){
6650: 0a 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 66  .  Index *p;.  f
6660: 6f 72 28 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65  or(p=pTab->pInde
6670: 78 3b 20 70 20 26 26 20 21 49 73 50 72 69 6d 61  x; p && !IsPrima
6680: 72 79 4b 65 79 49 6e 64 65 78 28 70 29 3b 20 70  ryKeyIndex(p); p
6690: 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 72  =p->pNext){}.  r
66a0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
66b0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f 6c  * Return the col
66c0: 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64  umn of index pId
66d0: 78 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  x that correspon
66e0: 64 73 20 74 6f 20 74 61 62 6c 65 0a 2a 2a 20 63  ds to table.** c
66f0: 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 20 20 52 65 74  olumn iCol.  Ret
6700: 75 72 6e 20 2d 31 20 69 66 20 6e 6f 74 20 66 6f  urn -1 if not fo
6710: 75 6e 64 2e 0a 2a 2f 0a 69 31 36 20 73 71 6c 69  und..*/.i16 sqli
6720: 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
6730: 28 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 31  (Index *pIdx, i1
6740: 36 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69  6 iCol){.  int i
6750: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
6760: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Idx->nColumn; i+
6770: 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  +){.    if( iCol
6780: 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ==pIdx->aiColumn
6790: 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  [i] ) return i;.
67a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
67b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
67c0: 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e  constructing a n
67d0: 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73 65  ew table represe
67e0: 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72  ntation in memor
67f0: 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74  y.  This is.** t
6800: 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76 65  he first of seve
6810: 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69  ral action routi
6820: 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61 6c  nes that get cal
6830: 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a  led in response.
6840: 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20 54  ** to a CREATE T
6850: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
6860: 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20   In particular, 
6870: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
6880: 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20  called.** after 
6890: 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43  seeing tokens "C
68a0: 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c  REATE" and "TABL
68b0: 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  E" and the table
68c0: 20 6e 61 6d 65 2e 20 54 68 65 20 69 73 54 65 6d   name. The isTem
68d0: 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75  p.** flag is tru
68e0: 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73  e if the table s
68f0: 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20  hould be stored 
6900: 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  in the auxiliary
6910: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
6920: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20  e instead of in 
6930: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
6940: 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  e file.  This is
6950: 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61   normally the ca
6960: 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22  se.** when the "
6970: 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52  TEMP" or "TEMPOR
6980: 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63  ARY" keyword occ
6990: 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a  urs in between.*
69a0: 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41 42  * CREATE and TAB
69b0: 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  LE..**.** The ne
69c0: 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  w table record i
69d0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e  s initialized an
69e0: 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d  d put in pParse-
69f0: 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41  >pNewTable..** A
6a00: 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52  s more of the CR
6a10: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
6a20: 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20  ment is parsed, 
6a30: 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f  additional actio
6a40: 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69  n.** routines wi
6a50: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20  ll be called to 
6a60: 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  add more informa
6a70: 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63  tion to this rec
6a80: 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ord..** At the e
6a90: 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
6aa0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
6ab0: 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64  , the sqlite3End
6ac0: 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a  Table() routine.
6ad0: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ** is called to 
6ae0: 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e  complete the con
6af0: 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65  struction of the
6b00: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
6b10: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
6b20: 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20  e3StartTable(.  
6b30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
6b40: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
6b50: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
6b60: 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73  Name1,   /* Firs
6b70: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61  t part of the na
6b80: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
6b90: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b  or view */.  Tok
6ba0: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a  en *pName2,   /*
6bb0: 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20   Second part of 
6bc0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
6bd0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f  table or view */
6be0: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20  .  int isTemp,  
6bf0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
6c00: 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74 61  his is a TEMP ta
6c10: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  ble */.  int isV
6c20: 69 65 77 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  iew,      /* Tru
6c30: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
6c40: 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  IEW */.  int isV
6c50: 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72 75  irtual,   /* Tru
6c60: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
6c70: 49 52 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f 0a  IRTUAL table */.
6c80: 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20    int noErr     
6c90: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
6ca0: 20 69 66 20 74 61 62 6c 65 20 61 6c 72 65 61 64   if table alread
6cb0: 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20  y exists */.){. 
6cc0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a   Table *pTable;.
6cd0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
6ce0: 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f  0; /* The name o
6cf0: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
6d00: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
6d10: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
6d20: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
6d30: 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  iDb;         /* 
6d40: 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  Database number 
6d50: 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61  to create the ta
6d60: 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ble in */.  Toke
6d70: 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  n *pName;    /* 
6d80: 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  Unqualified name
6d90: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
6da0: 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 69 66   create */..  if
6db0: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
6dc0: 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  && db->init.newT
6dd0: 6e 75 6d 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  num==1 ){.    /*
6de0: 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20   Special case:  
6df0: 50 61 72 73 69 6e 67 20 74 68 65 20 73 71 6c 69  Parsing the sqli
6e00: 74 65 5f 6d 61 73 74 65 72 20 6f 72 20 73 71 6c  te_master or sql
6e10: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20  ite_temp_master 
6e20: 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 69 44  schema */.    iD
6e30: 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  b = db->init.iDb
6e40: 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  ;.    zName = sq
6e50: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
6e60: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
6e70: 44 62 29 29 3b 0a 20 20 20 20 70 4e 61 6d 65 20  Db));.    pName 
6e80: 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 65 6c 73  = pName1;.  }els
6e90: 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  e{.    /* The co
6ea0: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20  mmon case */.   
6eb0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
6ec0: 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
6ed0: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
6ee0: 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  , &pName);.    i
6ef0: 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72  f( iDb<0 ) retur
6f00: 6e 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54  n;.    if( !OMIT
6f10: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
6f20: 70 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30  p && pName2->n>0
6f30: 20 26 26 20 69 44 62 21 3d 31 20 29 7b 0a 20 20   && iDb!=1 ){.  
6f40: 20 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69      /* If creati
6f50: 6e 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c  ng a temp table,
6f60: 20 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f   the name may no
6f70: 74 20 62 65 20 71 75 61 6c 69 66 69 65 64 2e 20  t be qualified. 
6f80: 55 6e 6c 65 73 73 20 0a 20 20 20 20 20 20 2a 2a  Unless .      **
6f90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
6fa0: 6d 65 20 69 73 20 22 74 65 6d 70 22 20 61 6e 79  me is "temp" any
6fb0: 77 61 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 73  way.  */.      s
6fc0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
6fd0: 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72  Parse, "temporar
6fe0: 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73  y table name mus
6ff0: 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64  t be unqualified
7000: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
7010: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7020: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
7030: 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31  isTemp ) iDb = 1
7040: 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  ;.    zName = sq
7050: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
7060: 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  en(db, pName);. 
7070: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61   }.  pParse->sNa
7080: 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65  meToken = *pName
7090: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
70a0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
70b0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
70c0: 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
70d0: 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  me(pParse, zName
70e0: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65  ) ){.    goto be
70f0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
7100: 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69  .  }.  if( db->i
7110: 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54  nit.iDb==1 ) isT
7120: 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  emp = 1;.#ifndef
7130: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
7140: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73  HORIZATION.  ass
7150: 65 72 74 28 20 69 73 54 65 6d 70 3d 3d 30 20 7c  ert( isTemp==0 |
7160: 7c 20 69 73 54 65 6d 70 3d 3d 31 20 29 3b 0a 20  | isTemp==1 );. 
7170: 20 61 73 73 65 72 74 28 20 69 73 56 69 65 77 3d   assert( isView=
7180: 3d 30 20 7c 7c 20 69 73 56 69 65 77 3d 3d 31 20  =0 || isView==1 
7190: 29 3b 0a 20 20 7b 0a 20 20 20 20 73 74 61 74 69  );.  {.    stati
71a0: 63 20 63 6f 6e 73 74 20 75 38 20 61 43 6f 64 65  c const u8 aCode
71b0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 53 51  [] = {.       SQ
71c0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c  LITE_CREATE_TABL
71d0: 45 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45  E,.       SQLITE
71e0: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42  _CREATE_TEMP_TAB
71f0: 4c 45 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54  LE,.       SQLIT
7200: 45 5f 43 52 45 41 54 45 5f 56 49 45 57 2c 0a 20  E_CREATE_VIEW,. 
7210: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45        SQLITE_CRE
7220: 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 0a 20 20  ATE_TEMP_VIEW.  
7230: 20 20 7d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a    };.    char *z
7240: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
7250: 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20  ].zDbSName;.    
7260: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
7270: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
7280: 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45  ITE_INSERT, SCHE
7290: 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29  MA_TABLE(isTemp)
72a0: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
72b0: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
72c0: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
72d0: 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 72 74  .    if( !isVirt
72e0: 75 61 6c 20 26 26 20 73 71 6c 69 74 65 33 41 75  ual && sqlite3Au
72f0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
7300: 28 69 6e 74 29 61 43 6f 64 65 5b 69 73 54 65 6d  (int)aCode[isTem
7310: 70 2b 32 2a 69 73 56 69 65 77 5d 2c 0a 20 20 20  p+2*isView],.   
7320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7340: 20 20 20 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44      zName, 0, zD
7350: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
7360: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
7370: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  or;.    }.  }.#e
7380: 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ndif..  /* Make 
7390: 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61 62  sure the new tab
73a0: 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74  le name does not
73b0: 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e   collide with an
73c0: 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69   existing.  ** i
73d0: 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61  ndex or table na
73e0: 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  me in the same d
73f0: 61 74 61 62 61 73 65 2e 20 20 49 73 73 75 65 20  atabase.  Issue 
7400: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
7410: 20 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73   if.  ** it does
7420: 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20  . The exception 
7430: 69 73 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  is if the statem
7440: 65 6e 74 20 62 65 69 6e 67 20 70 61 72 73 65 64  ent being parsed
7450: 20 77 61 73 20 70 61 73 73 65 64 0a 20 20 2a 2a   was passed.  **
7460: 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 64   to an sqlite3_d
7470: 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20 63 61  eclare_vtab() ca
7480: 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ll. In that case
7490: 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e   only the column
74a0: 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64 20   names.  ** and 
74b0: 74 79 70 65 73 20 77 69 6c 6c 20 62 65 20 75 73  types will be us
74c0: 65 64 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20  ed, so there is 
74d0: 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65 73 74 20  no need to test 
74e0: 66 6f 72 20 6e 61 6d 65 73 70 61 63 65 0a 20 20  for namespace.  
74f0: 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20  ** collisions.. 
7500: 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e 5f 44 45   */.  if( !IN_DE
7510: 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20  CLARE_VTAB ){.  
7520: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62    char *zDb = db
7530: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
7540: 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  ame;.    if( SQL
7550: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
7560: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
7570: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
7580: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
7590: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  r;.    }.    pTa
75a0: 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ble = sqlite3Fin
75b0: 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
75c0: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , zDb);.    if( 
75d0: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  pTable ){.      
75e0: 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20  if( !noErr ){.  
75f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
7600: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
7610: 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20  able %T already 
7620: 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b  exists", pName);
7630: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7640: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64        assert( !d
7650: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20  b->init.busy || 
7660: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
7670: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
7680: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
7690: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
76a0: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 62    }.      goto b
76b0: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
76c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
76d0: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
76e0: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29  (db, zName, zDb)
76f0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
7700: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7710: 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61  rse, "there is a
7720: 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20  lready an index 
7730: 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65  named %s", zName
7740: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  );.      goto be
7750: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
7760: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54  .    }.  }..  pT
7770: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62  able = sqlite3Db
7780: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
7790: 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
77a0: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
77b0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
77c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
77d0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  ;.    pParse->rc
77e0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
77f0: 42 4b 50 54 3b 0a 20 20 20 20 70 50 61 72 73 65  BKPT;.    pParse
7800: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
7810: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7820: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rror;.  }.  pTab
7830: 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  le->zName = zNam
7840: 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b  e;.  pTable->iPK
7850: 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c  ey = -1;.  pTabl
7860: 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  e->pSchema = db-
7870: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
7880: 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 54 61  a;.  pTable->nTa
7890: 62 52 65 66 20 3d 20 31 3b 0a 23 69 66 64 65 66  bRef = 1;.#ifdef
78a0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
78b0: 52 4f 57 45 53 54 0a 20 20 70 54 61 62 6c 65 2d  ROWEST.  pTable-
78c0: 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73 71  >nRowLogEst = sq
78d0: 6c 69 74 65 33 4c 6f 67 45 73 74 28 53 51 4c 49  lite3LogEst(SQLI
78e0: 54 45 5f 44 45 46 41 55 4c 54 5f 52 4f 57 45 53  TE_DEFAULT_ROWES
78f0: 54 29 3b 0a 23 65 6c 73 65 0a 20 20 70 54 61 62  T);.#else.  pTab
7900: 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  le->nRowLogEst =
7910: 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30   200; assert( 20
7920: 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
7930: 28 31 30 34 38 35 37 36 29 20 29 3b 0a 23 65 6e  (1048576) );.#en
7940: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 50  dif.  assert( pP
7950: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d  arse->pNewTable=
7960: 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  =0 );.  pParse->
7970: 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62  pNewTable = pTab
7980: 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  le;..  /* If thi
7990: 73 20 69 73 20 74 68 65 20 6d 61 67 69 63 20 73  s is the magic s
79a0: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
79b0: 61 62 6c 65 20 75 73 65 64 20 62 79 20 61 75 74  able used by aut
79c0: 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a  oincrement,.  **
79d0: 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70   then record a p
79e0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74  ointer to this t
79f0: 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e  able in the main
7a00: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
7a10: 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  ure.  ** so that
7a20: 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64   INSERT can find
7a30: 20 74 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c   the table easil
7a40: 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  y..  */.#ifndef 
7a50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
7a60: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20  INCREMENT.  if( 
7a70: 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20  !pParse->nested 
7a80: 26 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  && strcmp(zName,
7a90: 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63   "sqlite_sequenc
7aa0: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  e")==0 ){.    as
7ab0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
7ac0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
7ad0: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
7ae0: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d  pTable->pSchema-
7af0: 3e 70 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c  >pSeqTab = pTabl
7b00: 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  e;.  }.#endif.. 
7b10: 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61   /* Begin genera
7b20: 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68  ting the code th
7b30: 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74  at will insert t
7b40: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
7b50: 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51  into.  ** the SQ
7b60: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
7b70: 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74  e.  Note in part
7b80: 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d  icular that we m
7b90: 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a  ust go ahead.  *
7ba0: 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74  * and allocate t
7bb0: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
7bc0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65   for the table e
7bd0: 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72  ntry now.  Befor
7be0: 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41  e any.  ** PRIMA
7bf0: 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
7c00: 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61   keywords are pa
7c10: 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79  rsed.  Those key
7c20: 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65  words will cause
7c30: 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f  .  ** indices to
7c40: 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20   be created and 
7c50: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
7c60: 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72   must come befor
7c70: 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69  e the .  ** indi
7c80: 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ces.  Hence, the
7c90: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
7ca0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73  or the table mus
7cb0: 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20  t be allocated. 
7cc0: 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   ** now..  */.  
7cd0: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
7ce0: 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74  sy && (v = sqlit
7cf0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
7d00: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ))!=0 ){.    int
7d10: 20 61 64 64 72 31 3b 0a 20 20 20 20 69 6e 74 20   addr1;.    int 
7d20: 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20  fileFormat;.    
7d30: 69 6e 74 20 72 65 67 31 2c 20 72 65 67 32 2c 20  int reg1, reg2, 
7d40: 72 65 67 33 3b 0a 20 20 20 20 2f 2a 20 6e 75 6c  reg3;.    /* nul
7d50: 6c 52 6f 77 5b 5d 20 69 73 20 61 6e 20 4f 50 5f  lRow[] is an OP_
7d60: 52 65 63 6f 72 64 20 65 6e 63 6f 64 69 6e 67 20  Record encoding 
7d70: 6f 66 20 61 20 72 6f 77 20 63 6f 6e 74 61 69 6e  of a row contain
7d80: 69 6e 67 20 35 20 4e 55 4c 4c 73 20 2a 2f 0a 20  ing 5 NULLs */. 
7d90: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
7da0: 63 68 61 72 20 6e 75 6c 6c 52 6f 77 5b 5d 20 3d  char nullRow[] =
7db0: 20 7b 20 36 2c 20 30 2c 20 30 2c 20 30 2c 20 30   { 6, 0, 0, 0, 0
7dc0: 2c 20 30 20 7d 3b 0a 20 20 20 20 73 71 6c 69 74  , 0 };.    sqlit
7dd0: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
7de0: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
7df0: 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
7e00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
7e10: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
7e20: 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20   isVirtual ){.  
7e30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7e40: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67  ddOp0(v, OP_VBeg
7e50: 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  in);.    }.#endi
7e60: 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  f..    /* If the
7e70: 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64   file format and
7e80: 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68 65   encoding in the
7e90: 20 64 61 74 61 62 61 73 65 20 68 61 76 65 20 6e   database have n
7ea0: 6f 74 20 62 65 65 6e 20 73 65 74 2c 20 0a 20 20  ot been set, .  
7eb0: 20 20 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f    ** set them no
7ec0: 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  w..    */.    re
7ed0: 67 31 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67  g1 = pParse->reg
7ee0: 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65  Rowid = ++pParse
7ef0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 32  ->nMem;.    reg2
7f00: 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f   = pParse->regRo
7f10: 6f 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ot = ++pParse->n
7f20: 4d 65 6d 3b 0a 20 20 20 20 72 65 67 33 20 3d 20  Mem;.    reg3 = 
7f30: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
7f40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7f50: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 64  ddOp3(v, OP_Read
7f60: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 72 65 67  Cookie, iDb, reg
7f70: 33 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f  3, BTREE_FILE_FO
7f80: 52 4d 41 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  RMAT);.    sqlit
7f90: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
7fa0: 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 61 64 64  v, iDb);.    add
7fb0: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
7fc0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c  AddOp1(v, OP_If,
7fd0: 20 72 65 67 33 29 3b 20 56 64 62 65 43 6f 76 65   reg3); VdbeCove
7fe0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 66 69 6c  rage(v);.    fil
7ff0: 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66  eFormat = (db->f
8000: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 65  lags & SQLITE_Le
8010: 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30 20  gacyFileFmt)!=0 
8020: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
8030: 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d      1 : SQLITE_M
8040: 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a  AX_FILE_FORMAT;.
8050: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8060: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43  ddOp3(v, OP_SetC
8070: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45  ookie, iDb, BTRE
8080: 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 2c 20 66  E_FILE_FORMAT, f
8090: 69 6c 65 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  ileFormat);.    
80a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
80b0: 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  3(v, OP_SetCooki
80c0: 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 54 45  e, iDb, BTREE_TE
80d0: 58 54 5f 45 4e 43 4f 44 49 4e 47 2c 20 45 4e 43  XT_ENCODING, ENC
80e0: 28 64 62 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  (db));.    sqlit
80f0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
8100: 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 20 20 2f  , addr1);..    /
8110: 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72 65 61  * This just crea
8120: 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64  tes a place-hold
8130: 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  er record in the
8140: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
8150: 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65  able..    ** The
8160: 20 72 65 63 6f 72 64 20 63 72 65 61 74 65 64 20   record created 
8170: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
8180: 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20 20   anything yet.  
8190: 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61  It will be repla
81a0: 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ced.    ** by th
81b0: 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e 20  e real entry in 
81c0: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 61  code generated a
81d0: 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  t sqlite3EndTabl
81e0: 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
81f0: 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72  ** The rowid for
8200: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69   the new entry i
8210: 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74  s left in regist
8220: 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f  er pParse->regRo
8230: 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  wid..    ** The 
8240: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
8250: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
8260: 65 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  e is left in reg
8270: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
8280: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77  ..    ** The row
8290: 69 64 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65  id and root page
82a0: 20 6e 75 6d 62 65 72 20 76 61 6c 75 65 73 20 61   number values a
82b0: 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65  re needed by the
82c0: 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20 2a   code that.    *
82d0: 2a 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  * sqlite3EndTabl
82e0: 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e  e will generate.
82f0: 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  .    */.#if !def
8300: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
8310: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
8320: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
8330: 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20  IRTUALTABLE).   
8340: 20 69 66 28 20 69 73 56 69 65 77 20 7c 7c 20 69   if( isView || i
8350: 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20  sVirtual ){.    
8360: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8370: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
8380: 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20 20 20  r, 0, reg2);.   
8390: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
83a0: 20 20 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65    {.      pParse
83b0: 2d 3e 61 64 64 72 43 72 54 61 62 20 3d 0a 20 20  ->addrCrTab =.  
83c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
83d0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
83e0: 72 65 61 74 65 42 74 72 65 65 2c 20 69 44 62 2c  reateBtree, iDb,
83f0: 20 72 65 67 32 2c 20 42 54 52 45 45 5f 49 4e 54   reg2, BTREE_INT
8400: 4b 45 59 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  KEY);.    }.    
8410: 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65  sqlite3OpenMaste
8420: 72 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  rTable(pParse, i
8430: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
8440: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8450: 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20 72 65  _NewRowid, 0, re
8460: 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g1);.    sqlite3
8470: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
8480: 5f 42 6c 6f 62 2c 20 36 2c 20 72 65 67 33 2c 20  _Blob, 6, reg3, 
8490: 30 2c 20 6e 75 6c 6c 52 6f 77 2c 20 50 34 5f 53  0, nullRow, P4_S
84a0: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
84b0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
84c0: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20 72   OP_Insert, 0, r
84d0: 65 67 33 2c 20 72 65 67 31 29 3b 0a 20 20 20 20  eg3, reg1);.    
84e0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
84f0: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
8500: 50 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69 74  PEND);.    sqlit
8510: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
8520: 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a  OP_Close);.  }..
8530: 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e    /* Normal (non
8540: 2d 65 72 72 6f 72 29 20 72 65 74 75 72 6e 2e 20  -error) return. 
8550: 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  */.  return;..  
8560: 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
8570: 63 63 75 72 73 2c 20 77 65 20 6a 75 6d 70 20 68  ccurs, we jump h
8580: 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62  ere */.begin_tab
8590: 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69  le_error:.  sqli
85a0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
85b0: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ame);.  return;.
85c0: 7d 0a 0a 2f 2a 20 53 65 74 20 70 72 6f 70 65 72  }../* Set proper
85d0: 74 69 65 73 20 6f 66 20 61 20 74 61 62 6c 65 20  ties of a table 
85e0: 63 6f 6c 75 6d 6e 20 62 61 73 65 64 20 6f 6e 20  column based on 
85f0: 74 68 65 20 28 6d 61 67 69 63 61 6c 29 0a 2a 2a  the (magical).**
8600: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   name of the col
8610: 75 6d 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  umn..*/.#if SQLI
8620: 54 45 5f 45 4e 41 42 4c 45 5f 48 49 44 44 45 4e  TE_ENABLE_HIDDEN
8630: 5f 43 4f 4c 55 4d 4e 53 0a 76 6f 69 64 20 73 71  _COLUMNS.void sq
8640: 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65  lite3ColumnPrope
8650: 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28 54 61  rtiesFromName(Ta
8660: 62 6c 65 20 2a 70 54 61 62 2c 20 43 6f 6c 75 6d  ble *pTab, Colum
8670: 6e 20 2a 70 43 6f 6c 29 7b 0a 20 20 69 66 28 20  n *pCol){.  if( 
8680: 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
8690: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 22 5f  (pCol->zName, "_
86a0: 5f 68 69 64 64 65 6e 5f 5f 22 2c 20 31 30 29 3d  _hidden__", 10)=
86b0: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e  =0 ){.    pCol->
86c0: 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46  colFlags |= COLF
86d0: 4c 41 47 5f 48 49 44 44 45 4e 3b 0a 20 20 7d 65  LAG_HIDDEN;.  }e
86e0: 6c 73 65 20 69 66 28 20 70 54 61 62 20 26 26 20  lse if( pTab && 
86f0: 70 43 6f 6c 21 3d 70 54 61 62 2d 3e 61 43 6f 6c  pCol!=pTab->aCol
8700: 20 26 26 20 28 70 43 6f 6c 5b 2d 31 5d 2e 63 6f   && (pCol[-1].co
8710: 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47  lFlags & COLFLAG
8720: 5f 48 49 44 44 45 4e 29 20 29 7b 0a 20 20 20 20  _HIDDEN) ){.    
8730: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
8740: 3d 20 54 46 5f 4f 4f 4f 48 69 64 64 65 6e 3b 0a  = TF_OOOHidden;.
8750: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
8760: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63  *.** Add a new c
8770: 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62  olumn to the tab
8780: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  le currently bei
8790: 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a  ng constructed..
87a0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  **.** The parser
87b0: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
87c0: 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ine once for eac
87d0: 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61  h column declara
87e0: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45  tion.** in a CRE
87f0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
8800: 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61  ent.  sqlite3Sta
8810: 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20 63  rtTable() gets c
8820: 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74  alled.** first t
8830: 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69  o get things goi
8840: 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72  ng.  Then this r
8850: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8860: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c   for each.** col
8870: 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  umn..*/.void sql
8880: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61  ite3AddColumn(Pa
8890: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
88a0: 65 6e 20 2a 70 4e 61 6d 65 2c 20 54 6f 6b 65 6e  en *pName, Token
88b0: 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c   *pType){.  Tabl
88c0: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
88d0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72   char *z;.  char
88e0: 20 2a 7a 54 79 70 65 3b 0a 20 20 43 6f 6c 75 6d   *zType;.  Colum
88f0: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74  n *pCol;.  sqlit
8900: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
8910: 3e 64 62 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  >db;.  if( (p = 
8920: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
8930: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
8940: 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e    if( p->nCol+1>
8950: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
8960: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
8970: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
8980: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8990: 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
89a0: 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d   on %s", p->zNam
89b0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
89c0: 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65    }.  z = sqlite
89d0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
89e0: 20 70 4e 61 6d 65 2d 3e 6e 20 2b 20 70 54 79 70   pName->n + pTyp
89f0: 65 2d 3e 6e 20 2b 20 32 29 3b 0a 20 20 69 66 28  e->n + 2);.  if(
8a00: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
8a10: 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 4e 61 6d    memcpy(z, pNam
8a20: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
8a30: 0a 20 20 7a 5b 70 4e 61 6d 65 2d 3e 6e 5d 20 3d  .  z[pName->n] =
8a40: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71   0;.  sqlite3Deq
8a50: 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f 72 28 69  uote(z);.  for(i
8a60: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
8a70: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
8a80: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 2c 20  ite3_stricmp(z, 
8a90: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  p->aCol[i].zName
8aa0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
8ab0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8ac0: 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65  arse, "duplicate
8ad0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73   column name: %s
8ae0: 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", z);.      sql
8af0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
8b00: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
8b10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
8b20: 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29   (p->nCol & 0x7)
8b30: 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d  ==0 ){.    Colum
8b40: 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65  n *aNew;.    aNe
8b50: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
8b60: 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c  lloc(db,p->aCol,
8b70: 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65  (p->nCol+8)*size
8b80: 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b  of(p->aCol[0]));
8b90: 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30  .    if( aNew==0
8ba0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8bb0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a  3DbFree(db, z);.
8bc0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
8bd0: 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20    }.    p->aCol 
8be0: 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43  = aNew;.  }.  pC
8bf0: 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d  ol = &p->aCol[p-
8c00: 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74  >nCol];.  memset
8c10: 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (pCol, 0, sizeof
8c20: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
8c30: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
8c40: 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  ;.  sqlite3Colum
8c50: 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e  nPropertiesFromN
8c60: 61 6d 65 28 70 2c 20 70 43 6f 6c 29 3b 0a 20 0a  ame(p, pCol);. .
8c70: 20 20 69 66 28 20 70 54 79 70 65 2d 3e 6e 3d 3d    if( pType->n==
8c80: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  0 ){.    /* If t
8c90: 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20  here is no type 
8ca0: 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d  specified, colum
8cb0: 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66 61  ns have the defa
8cc0: 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20 20  ult affinity.   
8cd0: 20 2a 2a 20 27 42 4c 4f 42 27 2e 20 2a 2f 0a 20   ** 'BLOB'. */. 
8ce0: 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74     pCol->affinit
8cf0: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  y = SQLITE_AFF_B
8d00: 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73  LOB;.    pCol->s
8d10: 7a 45 73 74 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  zEst = 1;.  }els
8d20: 65 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 7a  e{.    zType = z
8d30: 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   + sqlite3Strlen
8d40: 33 30 28 7a 29 20 2b 20 31 3b 0a 20 20 20 20 6d  30(z) + 1;.    m
8d50: 65 6d 63 70 79 28 7a 54 79 70 65 2c 20 70 54 79  emcpy(zType, pTy
8d60: 70 65 2d 3e 7a 2c 20 70 54 79 70 65 2d 3e 6e 29  pe->z, pType->n)
8d70: 3b 0a 20 20 20 20 7a 54 79 70 65 5b 70 54 79 70  ;.    zType[pTyp
8d80: 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 73  e->n] = 0;.    s
8d90: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 54  qlite3Dequote(zT
8da0: 79 70 65 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  ype);.    pCol->
8db0: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
8dc0: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a  e3AffinityType(z
8dd0: 54 79 70 65 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45  Type, &pCol->szE
8de0: 73 74 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63  st);.    pCol->c
8df0: 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c  olFlags |= COLFL
8e00: 41 47 5f 48 41 53 54 59 50 45 3b 0a 20 20 7d 0a  AG_HASTYPE;.  }.
8e10: 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 20 20 70    p->nCol++;.  p
8e20: 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e  Parse->constrain
8e30: 74 4e 61 6d 65 2e 6e 20 3d 20 30 3b 0a 7d 0a 0a  tName.n = 0;.}..
8e40: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
8e50: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
8e60: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
8e70: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
8e80: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
8e90: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
8ea0: 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e  ement.  A "NOT N
8eb0: 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20  ULL" constraint 
8ec0: 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e  has.** been seen
8ed0: 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54   on a column.  T
8ee0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
8ef0: 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61   the notNull fla
8f00: 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  g on.** the colu
8f10: 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  mn currently und
8f20: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
8f30: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8f40: 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65  AddNotNull(Parse
8f50: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e   *pParse, int on
8f60: 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20  Error){.  Table 
8f70: 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *p;.  Column *pC
8f80: 6f 6c 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65  ol;.  p = pParse
8f90: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
8fa0: 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52  f( p==0 || NEVER
8fb0: 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 65  (p->nCol<1) ) re
8fc0: 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26  turn;.  pCol = &
8fd0: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d  p->aCol[p->nCol-
8fe0: 31 5d 3b 0a 20 20 70 43 6f 6c 2d 3e 6e 6f 74 4e  1];.  pCol->notN
8ff0: 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f  ull = (u8)onErro
9000: 72 3b 0a 20 20 70 2d 3e 74 61 62 46 6c 61 67 73  r;.  p->tabFlags
9010: 20 7c 3d 20 54 46 5f 48 61 73 4e 6f 74 4e 75 6c   |= TF_HasNotNul
9020: 6c 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  l;..  /* Set the
9030: 20 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 66 6c 61   uniqNotNull fla
9040: 67 20 6f 6e 20 61 6e 79 20 55 4e 49 51 55 45 20  g on any UNIQUE 
9050: 6f 72 20 50 4b 20 69 6e 64 65 78 65 73 20 61 6c  or PK indexes al
9060: 72 65 61 64 79 20 63 72 65 61 74 65 64 0a 20 20  ready created.  
9070: 2a 2a 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d  ** on this colum
9080: 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 6f  n.  */.  if( pCo
9090: 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f  l->colFlags & CO
90a0: 4c 46 4c 41 47 5f 55 4e 49 51 55 45 20 29 7b 0a  LFLAG_UNIQUE ){.
90b0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
90c0: 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 2d  .    for(pIdx=p-
90d0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
90e0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
90f0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
9100: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31  pIdx->nKeyCol==1
9110: 20 26 26 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f   && pIdx->onErro
9120: 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20  r!=OE_None );.  
9130: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
9140: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 70 2d 3e 6e 43  Column[0]==p->nC
9150: 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  ol-1 ){.        
9160: 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  pIdx->uniqNotNul
9170: 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  l = 1;.      }. 
9180: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
9190: 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d  * Scan the colum
91a0: 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70  n type name zTyp
91b0: 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29  e (length nType)
91c0: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a   and return the.
91d0: 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61 66  ** associated af
91e0: 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a  finity type..**.
91f0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9200: 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65  does a case-inde
9210: 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f  pendent search o
9220: 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20  f zType for the 
9230: 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69  .** substrings i
9240: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
9250: 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66  table. If one of
9260: 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20   the substrings 
9270: 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65  is.** found, the
9280: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61   corresponding a
9290: 66 66 69 6e 69 74 79 20 69 73 20 72 65 74 75 72  ffinity is retur
92a0: 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f  ned. If zType co
92b0: 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74  ntains.** more t
92c0: 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73  han one of the s
92d0: 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69  ubstrings, entri
92e0: 65 73 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f  es toward the to
92f0: 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62  p of .** the tab
9300: 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79  le take priority
9310: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
9320: 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42  f zType is 'BLOB
9330: 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45  INT', .** SQLITE
9340: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20  _AFF_INTEGER is 
9350: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
9360: 53 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20  Substring     | 
9370: 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d  Affinity.** ----
9380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
93a0: 27 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20  'INT'         | 
93b0: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
93c0: 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20  ER.** 'CHAR'    
93d0: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
93e0: 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20  _TEXT.** 'CLOB' 
93f0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
9400: 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58  AFF_TEXT.** 'TEX
9410: 54 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  T'        | SQLI
9420: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
9430: 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53  BLOB'        | S
9440: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 0a 2a  QLITE_AFF_BLOB.*
9450: 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20 20 20  * 'REAL'        
9460: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  | SQLITE_AFF_REA
9470: 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20 20  L.** 'FLOA'     
9480: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
9490: 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20  REAL.** 'DOUB'  
94a0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
94b0: 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66  FF_REAL.**.** If
94c0: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62   none of the sub
94d0: 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61  strings in the a
94e0: 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20 66  bove table are f
94f0: 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ound,.** SQLITE_
9500: 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72  AFF_NUMERIC is r
9510: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72  eturned..*/.char
9520: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
9530: 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20  Type(const char 
9540: 2a 7a 49 6e 2c 20 75 38 20 2a 70 73 7a 45 73 74  *zIn, u8 *pszEst
9550: 29 7b 0a 20 20 75 33 32 20 68 20 3d 20 30 3b 0a  ){.  u32 h = 0;.
9560: 20 20 63 68 61 72 20 61 66 66 20 3d 20 53 51 4c    char aff = SQL
9570: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
9580: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
9590: 43 68 61 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Char = 0;..  ass
95a0: 65 72 74 28 20 7a 49 6e 21 3d 30 20 29 3b 0a 20  ert( zIn!=0 );. 
95b0: 20 77 68 69 6c 65 28 20 7a 49 6e 5b 30 5d 20 29   while( zIn[0] )
95c0: 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c 3c 38 29  {.    h = (h<<8)
95d0: 20 2b 20 73 71 6c 69 74 65 33 55 70 70 65 72 54   + sqlite3UpperT
95e0: 6f 4c 6f 77 65 72 5b 28 2a 7a 49 6e 29 26 30 78  oLower[(*zIn)&0x
95f0: 66 66 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a  ff];.    zIn++;.
9600: 20 20 20 20 69 66 28 20 68 3d 3d 28 28 27 63 27      if( h==(('c'
9610: 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b  <<24)+('h'<<16)+
9620: 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b  ('a'<<8)+'r') ){
9630: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9640: 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 20 61 66  CHAR */.      af
9650: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
9660: 45 58 54 3b 0a 20 20 20 20 20 20 7a 43 68 61 72  EXT;.      zChar
9670: 20 3d 20 7a 49 6e 3b 0a 20 20 20 20 7d 65 6c 73   = zIn;.    }els
9680: 65 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c  e if( h==(('c'<<
9690: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
96a0: 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20 20  o'<<8)+'b') ){  
96b0: 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a       /* CLOB */.
96c0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
96d0: 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
96e0: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
96f0: 27 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31  't'<<24)+('e'<<1
9700: 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27 29  6)+('x'<<8)+'t')
9710: 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 54 45 58   ){       /* TEX
9720: 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  T */.      aff =
9730: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
9740: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9750: 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28 27  h==(('b'<<24)+('
9760: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
9770: 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'b')          /
9780: 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20  * BLOB */.      
9790: 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54    && (aff==SQLIT
97a0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c  E_AFF_NUMERIC ||
97b0: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
97c0: 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  _REAL) ){.      
97d0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
97e0: 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 69 66 28  _BLOB;.      if(
97f0: 20 7a 49 6e 5b 30 5d 3d 3d 27 28 27 20 29 20 7a   zIn[0]=='(' ) z
9800: 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 23 69 66 6e  Char = zIn;.#ifn
9810: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9820: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
9830: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
9840: 28 28 27 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c  (('r'<<24)+('e'<
9850: 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c  <16)+('a'<<8)+'l
9860: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ')          /* R
9870: 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  EAL */.        &
9880: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
9890: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
98a0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
98b0: 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65  AFF_REAL;.    }e
98c0: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 66 27  lse if( h==(('f'
98d0: 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b  <<24)+('l'<<16)+
98e0: 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20 20  ('o'<<8)+'a')   
98f0: 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a         /* FLOA *
9900: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66  /.        && aff
9910: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
9920: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66  ERIC ){.      af
9930: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  f = SQLITE_AFF_R
9940: 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EAL;.    }else i
9950: 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29  f( h==(('d'<<24)
9960: 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c  +('o'<<16)+('u'<
9970: 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20  <8)+'b')        
9980: 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20    /* DOUB */.   
9990: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
99a0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
99b0: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
99c0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
99d0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
99e0: 20 69 66 28 20 28 68 26 30 78 30 30 46 46 46 46   if( (h&0x00FFFF
99f0: 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b  FF)==(('i'<<16)+
9a00: 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b  ('n'<<8)+'t') ){
9a10: 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20      /* INT */.  
9a20: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
9a30: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20  _AFF_INTEGER;.  
9a40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9a50: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 73  .  }..  /* If ps
9a60: 7a 45 73 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  zEst is not NULL
9a70: 2c 20 73 74 6f 72 65 20 61 6e 20 65 73 74 69 6d  , store an estim
9a80: 61 74 65 20 6f 66 20 74 68 65 20 66 69 65 6c 64  ate of the field
9a90: 20 73 69 7a 65 2e 20 20 54 68 65 0a 20 20 2a 2a   size.  The.  **
9aa0: 20 65 73 74 69 6d 61 74 65 20 69 73 20 73 63 61   estimate is sca
9ab0: 6c 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  led so that the 
9ac0: 73 69 7a 65 20 6f 66 20 61 6e 20 69 6e 74 65 67  size of an integ
9ad0: 65 72 20 69 73 20 31 2e 20 20 2a 2f 0a 20 20 69  er is 1.  */.  i
9ae0: 66 28 20 70 73 7a 45 73 74 20 29 7b 0a 20 20 20  f( pszEst ){.   
9af0: 20 2a 70 73 7a 45 73 74 20 3d 20 31 3b 20 20 20   *pszEst = 1;   
9b00: 2f 2a 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20  /* default size 
9b10: 69 73 20 61 70 70 72 6f 78 20 34 20 62 79 74 65  is approx 4 byte
9b20: 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66 66  s */.    if( aff
9b30: 3c 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  <SQLITE_AFF_NUME
9b40: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 69 66 28  RIC ){.      if(
9b50: 20 7a 43 68 61 72 20 29 7b 0a 20 20 20 20 20 20   zChar ){.      
9b60: 20 20 77 68 69 6c 65 28 20 7a 43 68 61 72 5b 30    while( zChar[0
9b70: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ] ){.          i
9b80: 66 28 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  f( sqlite3Isdigi
9b90: 74 28 7a 43 68 61 72 5b 30 5d 29 20 29 7b 0a 20  t(zChar[0]) ){. 
9ba0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76             int v
9bb0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
9bc0: 20 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33    sqlite3GetInt3
9bd0: 32 28 7a 43 68 61 72 2c 20 26 76 29 3b 0a 20 20  2(zChar, &v);.  
9be0: 20 20 20 20 20 20 20 20 20 20 76 20 3d 20 76 2f            v = v/
9bf0: 34 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 20  4 + 1;.         
9c00: 20 20 20 69 66 28 20 76 3e 32 35 35 20 29 20 76     if( v>255 ) v
9c10: 20 3d 20 32 35 35 3b 0a 20 20 20 20 20 20 20 20   = 255;.        
9c20: 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 76 3b      *pszEst = v;
9c30: 20 2f 2a 20 42 4c 4f 42 28 6b 29 2c 20 56 41 52   /* BLOB(k), VAR
9c40: 43 48 41 52 28 6b 29 2c 20 43 48 41 52 28 6b 29  CHAR(k), CHAR(k)
9c50: 20 2d 3e 20 72 3d 28 6b 2f 34 2b 31 29 20 2a 2f   -> r=(k/4+1) */
9c60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
9c70: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
9c80: 20 20 20 20 20 20 20 20 20 20 7a 43 68 61 72 2b            zChar+
9c90: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
9ca0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9cb0: 20 20 2a 70 73 7a 45 73 74 20 3d 20 35 3b 20 20    *pszEst = 5;  
9cc0: 20 2f 2a 20 42 4c 4f 42 2c 20 54 45 58 54 2c 20   /* BLOB, TEXT, 
9cd0: 43 4c 4f 42 20 2d 3e 20 72 3d 35 20 20 28 61 70  CLOB -> r=5  (ap
9ce0: 70 72 6f 78 20 32 30 20 62 79 74 65 73 29 2a 2f  prox 20 bytes)*/
9cf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9d00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b   }.  return aff;
9d10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78  .}../*.** The ex
9d20: 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
9d30: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
9d40: 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
9d50: 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e  tly added column
9d60: 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65  .** of the table
9d70: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
9d80: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
9d90: 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c  *.** Default val
9da0: 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d  ue expressions m
9db0: 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e  ust be constant.
9dc0: 20 20 52 61 69 73 65 20 61 6e 20 65 78 63 65 70    Raise an excep
9dd0: 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20  tion if this.** 
9de0: 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e  is not the case.
9df0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9e00: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
9e10: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
9e20: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
9e30: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
9e40: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
9e50: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
9e60: 73 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c  sqlite3AddDefaul
9e70: 74 56 61 6c 75 65 28 0a 20 20 50 61 72 73 65 20  tValue(.  Parse 
9e80: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
9e90: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
9ea0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
9eb0: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
9ec0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
9ed0: 64 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  d expression of 
9ee0: 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
9ef0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
9f00: 72 20 2a 7a 53 74 61 72 74 2c 20 20 20 20 20 20  r *zStart,      
9f10: 2f 2a 20 53 74 61 72 74 20 6f 66 20 74 68 65 20  /* Start of the 
9f20: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 74 65  default value te
9f30: 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  xt */.  const ch
9f40: 61 72 20 2a 7a 45 6e 64 20 20 20 20 20 20 20 20  ar *zEnd        
9f50: 20 2f 2a 20 46 69 72 73 74 20 63 68 61 72 61 63   /* First charac
9f60: 74 65 72 20 70 61 73 74 20 65 6e 64 20 6f 66 20  ter past end of 
9f70: 64 65 66 61 75 74 20 76 61 6c 75 65 20 74 65 78  defaut value tex
9f80: 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  t */.){.  Table 
9f90: 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *p;.  Column *pC
9fa0: 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ol;.  sqlite3 *d
9fb0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
9fc0: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
9fd0: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
9fe0: 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20  !=0 ){.    pCol 
9ff0: 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e  = &(p->aCol[p->n
a000: 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28  Col-1]);.    if(
a010: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
a020: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
a030: 6e 28 70 45 78 70 72 2c 20 64 62 2d 3e 69 6e 69  n(pExpr, db->ini
a040: 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20 20  t.busy) ){.     
a050: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
a060: 28 70 50 61 72 73 65 2c 20 22 64 65 66 61 75 6c  (pParse, "defaul
a070: 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d  t value of colum
a080: 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f  n [%s] is not co
a090: 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20 20 20  nstant",.       
a0a0: 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b     pCol->zName);
a0b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a0c0: 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70    /* A copy of p
a0d0: 45 78 70 72 20 69 73 20 75 73 65 64 20 69 6e 73  Expr is used ins
a0e0: 74 65 61 64 20 6f 66 20 74 68 65 20 6f 72 69 67  tead of the orig
a0f0: 69 6e 61 6c 2c 20 61 73 20 70 45 78 70 72 20 63  inal, as pExpr c
a100: 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a  ontains.      **
a110: 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 70 6f 69   tokens that poi
a120: 6e 74 20 74 6f 20 76 6f 6c 61 74 69 6c 65 20 6d  nt to volatile m
a130: 65 6d 6f 72 79 2e 09 0a 20 20 20 20 20 20 2a 2f  emory...      */
a140: 0a 20 20 20 20 20 20 45 78 70 72 20 78 3b 0a 20  .      Expr x;. 
a150: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
a160: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d  Delete(db, pCol-
a170: 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 6d  >pDflt);.      m
a180: 65 6d 73 65 74 28 26 78 2c 20 30 2c 20 73 69 7a  emset(&x, 0, siz
a190: 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 20 20 78  eof(x));.      x
a1a0: 2e 6f 70 20 3d 20 54 4b 5f 53 50 41 4e 3b 0a 20  .op = TK_SPAN;. 
a1b0: 20 20 20 20 20 78 2e 75 2e 7a 54 6f 6b 65 6e 20       x.u.zToken 
a1c0: 3d 20 73 71 6c 69 74 65 33 44 62 53 70 61 6e 44  = sqlite3DbSpanD
a1d0: 75 70 28 64 62 2c 20 7a 53 74 61 72 74 2c 20 7a  up(db, zStart, z
a1e0: 45 6e 64 29 3b 0a 20 20 20 20 20 20 78 2e 70 4c  End);.      x.pL
a1f0: 65 66 74 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  eft = pExpr;.   
a200: 20 20 20 78 2e 66 6c 61 67 73 20 3d 20 45 50 5f     x.flags = EP_
a210: 53 6b 69 70 3b 0a 20 20 20 20 20 20 70 43 6f 6c  Skip;.      pCol
a220: 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65  ->pDflt = sqlite
a230: 33 45 78 70 72 44 75 70 28 64 62 2c 20 26 78 2c  3ExprDup(db, &x,
a240: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29   EXPRDUP_REDUCE)
a250: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
a260: 62 46 72 65 65 28 64 62 2c 20 78 2e 75 2e 7a 54  bFree(db, x.u.zT
a270: 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  oken);.    }.  }
a280: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
a290: 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
a2a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 61 63 6b 77 61  .}../*.** Backwa
a2b0: 72 64 73 20 43 6f 6d 70 61 74 69 62 69 6c 69 74  rds Compatibilit
a2c0: 79 20 48 61 63 6b 3a 0a 2a 2a 20 0a 2a 2a 20 48  y Hack:.** .** H
a2d0: 69 73 74 6f 72 69 63 61 6c 20 76 65 72 73 69 6f  istorical versio
a2e0: 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61 63 63  ns of SQLite acc
a2f0: 65 70 74 65 64 20 73 74 72 69 6e 67 73 20 61 73  epted strings as
a300: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e   column names in
a310: 0a 2a 2a 20 69 6e 64 65 78 65 73 20 61 6e 64 20  .** indexes and 
a320: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
a330: 74 72 61 69 6e 74 73 20 61 6e 64 20 69 6e 20 55  traints and in U
a340: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
a350: 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  s.  Example:.**.
a360: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41  **     CREATE TA
a370: 42 4c 45 20 78 79 7a 28 61 2c 62 2c 63 2c 64 2c  BLE xyz(a,b,c,d,
a380: 65 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 27 61  e,PRIMARY KEY('a
a390: 27 29 2c 55 4e 49 51 55 45 28 27 62 27 2c 27 63  '),UNIQUE('b','c
a3a0: 27 20 43 4f 4c 4c 41 54 45 20 74 72 69 6d 29 0a  ' COLLATE trim).
a3b0: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 49 4e  **     CREATE IN
a3c0: 44 45 58 20 61 62 63 20 4f 4e 20 78 79 7a 28 27  DEX abc ON xyz('
a3d0: 63 27 2c 27 64 27 20 44 45 53 43 2c 27 65 27 20  c','d' DESC,'e' 
a3e0: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 44  COLLATE nocase D
a3f0: 45 53 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ESC);.**.** This
a400: 20 69 73 20 67 6f 6f 66 79 2e 20 20 42 75 74 20   is goofy.  But 
a410: 74 6f 20 70 72 65 73 65 72 76 65 20 62 61 63 6b  to preserve back
a420: 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
a430: 69 74 79 20 77 65 20 63 6f 6e 74 69 6e 75 65 20  ity we continue 
a440: 74 6f 0a 2a 2a 20 61 63 63 65 70 74 20 69 74 2e  to.** accept it.
a450: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64    This routine d
a460: 6f 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  oes the necessar
a470: 79 20 63 6f 6e 76 65 72 73 69 6f 6e 2e 20 20 49  y conversion.  I
a480: 74 20 63 6f 6e 76 65 72 74 73 0a 2a 2a 20 74 68  t converts.** th
a490: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 67 69 76  e expression giv
a4a0: 65 6e 20 69 6e 20 69 74 73 20 61 72 67 75 6d 65  en in its argume
a4b0: 6e 74 20 66 72 6f 6d 20 61 20 54 4b 5f 53 54 52  nt from a TK_STR
a4c0: 49 4e 47 20 69 6e 74 6f 20 61 20 54 4b 5f 49 44  ING into a TK_ID
a4d0: 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 70 72 65  .** if the expre
a4e0: 73 73 69 6f 6e 20 69 73 20 6a 75 73 74 20 61 20  ssion is just a 
a4f0: 54 4b 5f 53 54 52 49 4e 47 20 77 69 74 68 20 61  TK_STRING with a
a500: 6e 20 6f 70 74 69 6f 6e 61 6c 20 43 4f 4c 4c 41  n optional COLLA
a510: 54 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 49 66  TE clause..** If
a520: 20 74 68 65 20 65 70 78 72 65 73 73 69 6f 6e 20   the epxression 
a530: 69 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65  is anything othe
a540: 72 20 74 68 61 6e 20 54 4b 5f 53 54 52 49 4e 47  r than TK_STRING
a550: 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  , the expression
a560: 20 69 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64   is.** unchanged
a570: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a580: 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f   sqlite3StringTo
a590: 49 64 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  Id(Expr *p){.  i
a5a0: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52  f( p->op==TK_STR
a5b0: 49 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e 6f 70  ING ){.    p->op
a5c0: 20 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 65 6c 73   = TK_ID;.  }els
a5d0: 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  e if( p->op==TK_
a5e0: 43 4f 4c 4c 41 54 45 20 26 26 20 70 2d 3e 70 4c  COLLATE && p->pL
a5f0: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49  eft->op==TK_STRI
a600: 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 65  NG ){.    p->pLe
a610: 66 74 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a  ft->op = TK_ID;.
a620: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73    }.}../*.** Des
a630: 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41  ignate the PRIMA
a640: 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74  RY KEY for the t
a650: 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20  able.  pList is 
a660: 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  a list of names 
a670: 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  .** of columns t
a680: 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69  hat form the pri
a690: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c  mary key.  If pL
a6a0: 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ist is NULL, the
a6b0: 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  n the.** most re
a6c0: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
a6d0: 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
a6e0: 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20   is the primary 
a6f0: 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62  key..**.** A tab
a700: 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d  le can have at m
a710: 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  ost one primary 
a720: 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62  key.  If the tab
a730: 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a  le already has.*
a740: 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  * a primary key 
a750: 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65  (and this is the
a760: 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20   second primary 
a770: 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65  key) then create
a780: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a   an.** error..**
a790: 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41  .** If the PRIMA
a7a0: 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73  RY KEY is on a s
a7b0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f  ingle column who
a7c0: 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49  se datatype is I
a7d0: 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20  NTEGER,.** then 
a7e0: 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75  we will try to u
a7f0: 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61  se that column a
a800: 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65  s the rowid.  Se
a810: 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65  t the Table.iPKe
a820: 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68  y.** field of th
a830: 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
a840: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
a850: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
a860: 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49  e.** INTEGER PRI
a870: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e  MARY KEY column.
a880: 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73    Table.iPKey is
a890: 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68   set to -1 if th
a8a0: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54  ere is.** no INT
a8b0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
a8c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b  ..**.** If the k
a8d0: 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54  ey is not an INT
a8e0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
a8f0: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
a900: 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20  unique.** index 
a910: 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f  for the key.  No
a920: 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65   index is create
a930: 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52  d for INTEGER PR
a940: 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76  IMARY KEYs..*/.v
a950: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72  oid sqlite3AddPr
a960: 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73  imaryKey(.  Pars
a970: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
a980: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
a990: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
a9a0: 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  pList,  /* List 
a9b0: 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74  of field names t
a9c0: 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
a9d0: 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
a9e0: 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
a9f0: 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e  o with a uniquen
aa00: 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  ess conflict */.
aa10: 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20    int autoInc,  
aa20: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
aa30: 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  he AUTOINCREMENT
aa40: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
aa50: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ent */.  int sor
aa60: 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51  tOrder     /* SQ
aa70: 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53  LITE_SO_ASC or S
aa80: 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f  QLITE_SO_DESC */
aa90: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
aaa0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
aab0: 54 61 62 6c 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20  Table;.  Column 
aac0: 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  *pCol = 0;.  int
aad0: 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20   iCol = -1, i;. 
aae0: 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 69 66   int nTerm;.  if
aaf0: 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f  ( pTab==0 ) goto
ab00: 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69   primary_key_exi
ab10: 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74  t;.  if( pTab->t
ab20: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73  abFlags & TF_Has
ab30: 50 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20  PrimaryKey ){.  
ab40: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
ab50: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
ab60: 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68   "table \"%s\" h
ab70: 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  as more than one
ab80: 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70   primary key", p
ab90: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
aba0: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
abb0: 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54  y_exit;.  }.  pT
abc0: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
abd0: 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79  TF_HasPrimaryKey
abe0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
abf0: 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70   ){.    iCol = p
ac00: 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20  Tab->nCol - 1;. 
ac10: 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d     pCol = &pTab-
ac20: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20  >aCol[iCol];.   
ac30: 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
ac40: 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b  |= COLFLAG_PRIMK
ac50: 45 59 3b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20  EY;.    nTerm = 
ac60: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
ac70: 6e 54 65 72 6d 20 3d 20 70 4c 69 73 74 2d 3e 6e  nTerm = pList->n
ac80: 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Expr;.    for(i=
ac90: 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29  0; i<nTerm; i++)
aca0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43  {.      Expr *pC
acb0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
acc0: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c  prSkipCollate(pL
acd0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
ace0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
acf0: 70 43 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20  pCExpr!=0 );.   
ad00: 20 20 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67     sqlite3String
ad10: 54 6f 49 64 28 70 43 45 78 70 72 29 3b 0a 20 20  ToId(pCExpr);.  
ad20: 20 20 20 20 69 66 28 20 70 43 45 78 70 72 2d 3e      if( pCExpr->
ad30: 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20  op==TK_ID ){.   
ad40: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
ad50: 2a 7a 43 4e 61 6d 65 20 3d 20 70 43 45 78 70 72  *zCName = pCExpr
ad60: 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
ad70: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
ad80: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
ad90: 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
ada0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
adb0: 74 72 49 43 6d 70 28 7a 43 4e 61 6d 65 2c 20 70  trICmp(zCName, p
adc0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
add0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
ade0: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
adf0: 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  &pTab->aCol[iCol
ae00: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ];.            p
ae10: 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d  Col->colFlags |=
ae20: 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59   COLFLAG_PRIMKEY
ae30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
ae40: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
ae50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ae60: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
ae70: 66 28 20 6e 54 65 72 6d 3d 3d 31 0a 20 20 20 26  f( nTerm==1.   &
ae80: 26 20 70 43 6f 6c 0a 20 20 20 26 26 20 73 71 6c  & pCol.   && sql
ae90: 69 74 65 33 53 74 72 49 43 6d 70 28 73 71 6c 69  ite3StrICmp(sqli
aea0: 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70 43  te3ColumnType(pC
aeb0: 6f 6c 2c 22 22 29 2c 20 22 49 4e 54 45 47 45 52  ol,""), "INTEGER
aec0: 22 29 3d 3d 30 0a 20 20 20 26 26 20 73 6f 72 74  ")==0.   && sort
aed0: 4f 72 64 65 72 21 3d 53 51 4c 49 54 45 5f 53 4f  Order!=SQLITE_SO
aee0: 5f 44 45 53 43 0a 20 20 29 7b 0a 20 20 20 20 70  _DESC.  ){.    p
aef0: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f  Tab->iPKey = iCo
af00: 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79  l;.    pTab->key
af10: 43 6f 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72 72  Conf = (u8)onErr
af20: 6f 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  or;.    assert( 
af30: 61 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75  autoInc==0 || au
af40: 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20  toInc==1 );.    
af50: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
af60: 3d 20 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74  = autoInc*TF_Aut
af70: 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 20 20  oincrement;.    
af80: 69 66 28 20 70 4c 69 73 74 20 29 20 70 50 61 72  if( pList ) pPar
af90: 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72  se->iPkSortOrder
afa0: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73   = pList->a[0].s
afb0: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 65 6c 73  ortOrder;.  }els
afc0: 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20 29 7b  e if( autoInc ){
afd0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
afe0: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
aff0: 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  NT.    sqlite3Er
b000: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
b010: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73  AUTOINCREMENT is
b020: 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e   only allowed on
b030: 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22 49 4e   an ".       "IN
b040: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
b050: 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  Y");.#endif.  }e
b060: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
b070: 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72  CreateIndex(pPar
b080: 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69  se, 0, 0, 0, pLi
b090: 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 0a  st, onError, 0,.
b0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0b0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73 6f             0, so
b0c0: 72 74 4f 72 64 65 72 2c 20 30 2c 20 53 51 4c 49  rtOrder, 0, SQLI
b0d0: 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41  TE_IDXTYPE_PRIMA
b0e0: 52 59 4b 45 59 29 3b 0a 20 20 20 20 70 4c 69 73  RYKEY);.    pLis
b0f0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d  t = 0;.  }..prim
b100: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20  ary_key_exit:.  
b110: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
b120: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
b130: 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75  , pList);.  retu
b140: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rn;.}../*.** Add
b150: 20 61 20 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e   a new CHECK con
b160: 73 74 72 61 69 6e 74 20 74 6f 20 74 68 65 20 74  straint to the t
b170: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
b180: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
b190: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
b1a0: 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72  e3AddCheckConstr
b1b0: 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  aint(.  Parse *p
b1c0: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
b1d0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
b1e0: 20 20 45 78 70 72 20 2a 70 43 68 65 63 6b 45 78    Expr *pCheckEx
b1f0: 70 72 20 20 2f 2a 20 54 68 65 20 63 68 65 63 6b  pr  /* The check
b200: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29   expression */.)
b210: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
b220: 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54 61  _OMIT_CHECK.  Ta
b230: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72  ble *pTab = pPar
b240: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
b250: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
b260: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
b270: 20 70 54 61 62 20 26 26 20 21 49 4e 5f 44 45 43   pTab && !IN_DEC
b280: 4c 41 52 45 5f 56 54 41 42 0a 20 20 20 26 26 20  LARE_VTAB.   && 
b290: 21 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 52  !sqlite3BtreeIsR
b2a0: 65 61 64 6f 6e 6c 79 28 64 62 2d 3e 61 44 62 5b  eadonly(db->aDb[
b2b0: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 5d 2e 70 42  db->init.iDb].pB
b2c0: 74 29 0a 20 20 29 7b 0a 20 20 20 20 70 54 61 62  t).  ){.    pTab
b2d0: 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74  ->pCheck = sqlit
b2e0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
b2f0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 70  (pParse, pTab->p
b300: 43 68 65 63 6b 2c 20 70 43 68 65 63 6b 45 78 70  Check, pCheckExp
b310: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72  r);.    if( pPar
b320: 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61  se->constraintNa
b330: 6d 65 2e 6e 20 29 7b 0a 20 20 20 20 20 20 73 71  me.n ){.      sq
b340: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
b350: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 54 61  Name(pParse, pTa
b360: 62 2d 3e 70 43 68 65 63 6b 2c 20 26 70 50 61 72  b->pCheck, &pPar
b370: 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61  se->constraintNa
b380: 6d 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  me, 1);.    }.  
b390: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b  }else.#endif.  {
b3a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
b3b0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
b3c0: 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a  b, pCheckExpr);.
b3d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
b3e0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
b3f0: 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  unction of the m
b400: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72  ost recently par
b410: 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  sed table column
b420: 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53  .** to the CollS
b430: 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69  eq given..*/.voi
b440: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c  d sqlite3AddColl
b450: 61 74 65 54 79 70 65 28 50 61 72 73 65 20 2a 70  ateType(Parse *p
b460: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54  Parse, Token *pT
b470: 6f 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a  oken){.  Table *
b480: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
b490: 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20  ar *zColl;      
b4a0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 71 75 6f          /* Dequo
b4b0: 74 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c  ted name of coll
b4c0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a  ation sequence *
b4d0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
b4e0: 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ..  if( (p = pPa
b4f0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
b500: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
b510: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
b520: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
b530: 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  zColl = sqlit
b540: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
b550: 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69  db, pToken);.  i
b560: 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75  f( !zColl ) retu
b570: 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  rn;..  if( sqlit
b580: 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
b590: 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29  pParse, zColl) )
b5a0: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
b5b0: 78 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  x;.    sqlite3Db
b5c0: 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c  Free(db, p->aCol
b5d0: 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  [i].zColl);.    
b5e0: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c  p->aCol[i].zColl
b5f0: 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20   = zColl;.  .   
b600: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
b610: 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20 61 73  n is declared as
b620: 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59   "<name> PRIMARY
b630: 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79   KEY COLLATE <ty
b640: 70 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65  pe>",.    ** the
b650: 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68  n an index may h
b660: 61 76 65 20 62 65 65 6e 20 63 72 65 61 74 65 64  ave been created
b670: 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20   on this column 
b680: 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a  before the.    *
b690: 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65  * collation type
b6a0: 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72   was added. Corr
b6b0: 65 63 74 20 74 68 69 73 20 69 66 20 69 74 20 69  ect this if it i
b6c0: 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20  s the case..    
b6d0: 2a 2f 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  */.    for(pIdx=
b6e0: 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  p->pIndex; pIdx;
b6f0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
b700: 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t){.      assert
b710: 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d  ( pIdx->nKeyCol=
b720: 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =1 );.      if( 
b730: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30  pIdx->aiColumn[0
b740: 5d 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==i ){.        
b750: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20  pIdx->azColl[0] 
b760: 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  = p->aCol[i].zCo
b770: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
b780: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
b790: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
b7a0: 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a   zColl);.  }.}..
b7b0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
b7c0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
b7d0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
b7e0: 63 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  ce for database 
b7f0: 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20 65  native text.** e
b800: 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66 69  ncoding identifi
b810: 65 64 20 62 79 20 74 68 65 20 73 74 72 69 6e 67  ed by the string
b820: 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e   zName, length n
b830: 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Name..**.** If t
b840: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
b850: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
b860: 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
b870: 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61 62  , or not availab
b880: 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74  le.** in the dat
b890: 61 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63  abase native enc
b8a0: 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61  oding, the colla
b8b0: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73 20  tion factory is 
b8c0: 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65  invoked to.** re
b8d0: 71 75 65 73 74 20 69 74 2e 20 49 66 20 74 68 65  quest it. If the
b8e0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f   collation facto
b8f0: 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ry does not supp
b900: 6c 79 20 73 75 63 68 20 61 20 73 65 71 75 65 6e  ly such a sequen
b910: 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73  ce,.** and the s
b920: 65 71 75 65 6e 63 65 20 69 73 20 61 76 61 69 6c  equence is avail
b930: 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 20  able in another 
b940: 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74  text encoding, t
b950: 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20 72  hen that is.** r
b960: 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e  eturned instead.
b970: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72  .**.** If no ver
b980: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65 71  sions of the req
b990: 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  uested collation
b9a0: 73 20 73 65 71 75 65 6e 63 65 20 61 72 65 20 61  s sequence are a
b9b0: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20  vailable, or.** 
b9c0: 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63  another error oc
b9d0: 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
b9e0: 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72  turned and an er
b9f0: 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69 74  ror message writ
ba00: 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72  ten into.** pPar
ba10: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
ba20: 6f 75 74 69 6e 65 20 69 73 20 61 20 77 72 61 70  outine is a wrap
ba30: 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74  per around sqlit
ba40: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e  e3FindCollSeq().
ba50: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
ba60: 2a 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f  * invokes the co
ba70: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
ba80: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c  if the named col
ba90: 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  lation cannot be
baa0: 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65   found.** and ge
bab0: 6e 65 72 61 74 65 73 20 61 6e 20 65 72 72 6f 72  nerates an error
bac0: 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20   message..**.** 
bad0: 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65  See also: sqlite
bae0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2c 20  3FindCollSeq(), 
baf0: 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65  sqlite3GetCollSe
bb00: 71 28 29 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a  q().*/.CollSeq *
bb10: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
bb20: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
bb30: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
bb40: 7a 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65  zName){.  sqlite
bb50: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
bb60: 64 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20 45  db;.  u8 enc = E
bb70: 4e 43 28 64 62 29 3b 0a 20 20 75 38 20 69 6e 69  NC(db);.  u8 ini
bb80: 74 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74  tbusy = db->init
bb90: 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71  .busy;.  CollSeq
bba0: 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c   *pColl;..  pCol
bbb0: 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
bbc0: 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20  ollSeq(db, enc, 
bbd0: 7a 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29  zName, initbusy)
bbe0: 3b 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75 73  ;.  if( !initbus
bbf0: 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20  y && (!pColl || 
bc00: 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b  !pColl->xCmp) ){
bc10: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
bc20: 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70  ite3GetCollSeq(p
bc30: 50 61 72 73 65 2c 20 65 6e 63 2c 20 70 43 6f 6c  Parse, enc, pCol
bc40: 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a  l, zName);.  }..
bc50: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
bc60: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
bc70: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
bc80: 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  l increment the 
bc90: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a  schema cookie..*
bca0: 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20  *.** The schema 
bcb0: 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74  cookie is used t
bcc0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e  o determine when
bcd0: 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
bce0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
bcf0: 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20  changes.  After 
bd00: 65 61 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e  each schema chan
bd10: 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76  ge, the cookie v
bd20: 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e  alue.** changes.
bd30: 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73    When a process
bd40: 20 66 69 72 73 74 20 72 65 61 64 73 20 74 68 65   first reads the
bd50: 20 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72   schema it recor
bd60: 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65  ds the.** cookie
bd70: 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c 20 77  .  Thereafter, w
bd80: 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20  henever it goes 
bd90: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
bda0: 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68  tabase,.** it ch
bdb0: 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20  ecks the cookie 
bdc0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
bdd0: 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20   schema has not 
bde0: 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65  changed.** since
bdf0: 20 69 74 20 77 61 73 20 6c 61 73 74 20 72 65 61   it was last rea
be00: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c  d..**.** This pl
be10: 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65  an is not comple
be20: 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f  tely bullet-proo
be30: 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62  f.  It is possib
be40: 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63  le for.** the sc
be50: 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d  hema to change m
be60: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e  ultiple times an
be70: 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65  d for the cookie
be80: 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61   to be.** set ba
be90: 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75  ck to prior valu
bea0: 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20 63  e.  But schema c
beb0: 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65  hanges are infre
bec0: 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65  quent.** and the
bed0: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
bee0: 68 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65  hitting the same
bef0: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73   cookie value is
bf00: 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63   only.** 1 chanc
bf10: 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77  e in 2^32.  So w
bf20: 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68  e're safe enough
bf30: 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e  ..**.** IMPLEMEN
bf40: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 33 34 32  TATION-OF: R-342
bf50: 33 30 2d 35 36 30 34 39 20 53 51 4c 69 74 65 20  30-56049 SQLite 
bf60: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 69 6e  automatically in
bf70: 63 72 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 65 20  crements.** the 
bf80: 73 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20 77  schema-version w
bf90: 68 65 6e 65 76 65 72 20 74 68 65 20 73 63 68 65  henever the sche
bfa0: 6d 61 20 63 68 61 6e 67 65 73 2e 0a 2a 2f 0a 76  ma changes..*/.v
bfb0: 6f 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67  oid sqlite3Chang
bfc0: 65 43 6f 6f 6b 69 65 28 50 61 72 73 65 20 2a 70  eCookie(Parse *p
bfd0: 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b  Parse, int iDb){
bfe0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
bff0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56   pParse->db;.  V
c000: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
c010: 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
c020: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
c030: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
c040: 2c 20 30 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  , 0) );.  sqlite
c050: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
c060: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
c070: 2c 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56  , BTREE_SCHEMA_V
c080: 45 52 53 49 4f 4e 2c 20 0a 20 20 20 20 20 20 20  ERSION, .       
c090: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d               db-
c0a0: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
c0b0: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
c0c0: 2b 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65  +1);.}../*.** Me
c0d0: 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72  asure the number
c0e0: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 6e   of characters n
c0f0: 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20  eeded to output 
c100: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65  the given.** ide
c110: 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75  ntifier.  The nu
c120: 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e  mber returned in
c130: 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65  cludes any quote
c140: 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f  s used.** but do
c150: 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74  es not include t
c160: 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74  he null terminat
c170: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73  or..**.** The es
c180: 74 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72  timate is conser
c190: 76 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68  vative.  It migh
c1a0: 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 74  t be larger that
c1b0: 20 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c   what is.** real
c1c0: 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  ly needed..*/.st
c1d0: 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65  atic int identLe
c1e0: 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20  ngth(const char 
c1f0: 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *z){.  int n;.  
c200: 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b  for(n=0; *z; n++
c210: 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , z++){.    if( 
c220: 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20  *z=='"' ){ n++; 
c230: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
c240: 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   + 2;.}../*.** T
c250: 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74  he first paramet
c260: 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  er is a pointer 
c270: 74 6f 20 61 6e 20 6f 75 74 70 75 74 20 62 75 66  to an output buf
c280: 66 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  fer. The second 
c290: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
c2a0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
c2b0: 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 63 6f   integer that co
c2c0: 6e 74 61 69 6e 73 20 74 68 65 20 6f 66 66 73 65  ntains the offse
c2d0: 74 20 61 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f  t at.** which to
c2e0: 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65 20   write into the 
c2f0: 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 54  output buffer. T
c300: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70  his function cop
c310: 69 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74  ies the.** nul-t
c320: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
c330: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
c340: 68 65 20 74 68 69 72 64 20 70 61 72 61 6d 65 74  he third paramet
c350: 65 72 2c 20 7a 53 69 67 6e 65 64 49 64 65 6e 74  er, zSignedIdent
c360: 2c 0a 2a 2a 20 74 6f 20 74 68 65 20 73 70 65 63  ,.** to the spec
c370: 69 66 69 65 64 20 6f 66 66 73 65 74 20 69 6e 20  ified offset in 
c380: 74 68 65 20 62 75 66 66 65 72 20 61 6e 64 20 75  the buffer and u
c390: 70 64 61 74 65 73 20 2a 70 49 64 78 20 74 6f 20  pdates *pIdx to 
c3a0: 72 65 66 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  refer.** to the 
c3b0: 66 69 72 73 74 20 62 79 74 65 20 61 66 74 65 72  first byte after
c3c0: 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 77   the last byte w
c3d0: 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20 72 65  ritten before re
c3e0: 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20  turning..** .** 
c3f0: 49 66 20 74 68 65 20 73 74 72 69 6e 67 20 7a 53  If the string zS
c400: 69 67 6e 65 64 49 64 65 6e 74 20 63 6f 6e 73 69  ignedIdent consi
c410: 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  sts entirely of 
c420: 61 6c 70 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a  alpha-numeric.**
c430: 20 63 68 61 72 61 63 74 65 72 73 2c 20 64 6f 65   characters, doe
c440: 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68  s not begin with
c450: 20 61 20 64 69 67 69 74 20 61 6e 64 20 69 73 20   a digit and is 
c460: 6e 6f 74 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f  not an SQL keywo
c470: 72 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69  rd,.** then it i
c480: 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20  s copied to the 
c490: 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 65 78  output buffer ex
c4a0: 61 63 74 6c 79 20 61 73 20 69 74 20 69 73 2e 20  actly as it is. 
c4b0: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74  Otherwise,.** it
c4c0: 20 69 73 20 71 75 6f 74 65 64 20 75 73 69 6e 67   is quoted using
c4d0: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a   double-quotes..
c4e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
c4f0: 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c  dentPut(char *z,
c500: 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72   int *pIdx, char
c510: 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b   *zSignedIdent){
c520: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
c530: 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69   *zIdent = (unsi
c540: 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e  gned char*)zSign
c550: 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69  edIdent;.  int i
c560: 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a  , j, needQuote;.
c570: 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20    i = *pIdx;..  
c580: 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b  for(j=0; zIdent[
c590: 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66  j]; j++){.    if
c5a0: 28 20 21 73 71 6c 69 74 65 33 49 73 61 6c 6e 75  ( !sqlite3Isalnu
c5b0: 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20  m(zIdent[j]) && 
c5c0: 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29  zIdent[j]!='_' )
c5d0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65   break;.  }.  ne
c5e0: 65 64 51 75 6f 74 65 20 3d 20 73 71 6c 69 74 65  edQuote = sqlite
c5f0: 33 49 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b  3Isdigit(zIdent[
c600: 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  0]).            
c610: 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72  || sqlite3Keywor
c620: 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29  dCode(zIdent, j)
c630: 21 3d 54 4b 5f 49 44 0a 20 20 20 20 20 20 20 20  !=TK_ID.        
c640: 20 20 20 20 7c 7c 20 7a 49 64 65 6e 74 5b 6a 5d      || zIdent[j]
c650: 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  !=0.            
c660: 7c 7c 20 6a 3d 3d 30 3b 0a 0a 20 20 69 66 28 20  || j==0;..  if( 
c670: 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b  needQuote ) z[i+
c680: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28  +] = '"';.  for(
c690: 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20  j=0; zIdent[j]; 
c6a0: 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d  j++){.    z[i++]
c6b0: 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20   = zIdent[j];.  
c6c0: 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d    if( zIdent[j]=
c6d0: 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  ='"' ) z[i++] = 
c6e0: 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  '"';.  }.  if( n
c6f0: 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b  eedQuote ) z[i++
c700: 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20  ] = '"';.  z[i] 
c710: 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69  = 0;.  *pIdx = i
c720: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
c730: 61 74 65 20 61 20 43 52 45 41 54 45 20 54 41 42  ate a CREATE TAB
c740: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70  LE statement app
c750: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
c760: 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e   given.** table.
c770: 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64    Memory to hold
c780: 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   the text of the
c790: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62   statement is ob
c7a0: 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73  tained.** from s
c7b0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
c7c0: 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
c7d0: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
c7e0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
c7f0: 69 63 20 63 68 61 72 20 2a 63 72 65 61 74 65 54  ic char *createT
c800: 61 62 6c 65 53 74 6d 74 28 73 71 6c 69 74 65 33  ableStmt(sqlite3
c810: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b   *db, Table *p){
c820: 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a  .  int i, k, n;.
c830: 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20    char *zStmt;. 
c840: 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53   char *zSep, *zS
c850: 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 43 6f  ep2, *zEnd;.  Co
c860: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20  lumn *pCol;.  n 
c870: 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20  = 0;.  for(pCol 
c880: 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20  = p->aCol, i=0; 
c890: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  i<p->nCol; i++, 
c8a0: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b  pCol++){.    n +
c8b0: 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 43  = identLength(pC
c8c0: 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b 20 35 3b 0a  ol->zName) + 5;.
c8d0: 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74    }.  n += ident
c8e0: 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29  Length(p->zName)
c8f0: 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20 29 7b 20  ;.  if( n<50 ){ 
c900: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a  .    zSep = "";.
c910: 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b      zSep2 = ",";
c920: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b  .    zEnd = ")";
c930: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53  .  }else{.    zS
c940: 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20  ep = "\n  ";.   
c950: 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22   zSep2 = ",\n  "
c960: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e  ;.    zEnd = "\n
c970: 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33  )";.  }.  n += 3
c980: 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20  5 + 6*p->nCol;. 
c990: 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
c9a0: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e  DbMallocRaw(0, n
c9b0: 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d  );.  if( zStmt==
c9c0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
c9d0: 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20  OomFault(db);.  
c9e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
c9f0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
ca00: 74 66 28 6e 2c 20 7a 53 74 6d 74 2c 20 22 43 52  tf(n, zStmt, "CR
ca10: 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20  EATE TABLE ");. 
ca20: 20 6b 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   k = sqlite3Strl
ca30: 65 6e 33 30 28 7a 53 74 6d 74 29 3b 0a 20 20 69  en30(zStmt);.  i
ca40: 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26  dentPut(zStmt, &
ca50: 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  k, p->zName);.  
ca60: 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27  zStmt[k++] = '('
ca70: 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e  ;.  for(pCol=p->
ca80: 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e  aCol, i=0; i<p->
ca90: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
caa0: 2b 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  +){.    static c
cab0: 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73  onst char * cons
cac0: 74 20 61 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a 20  t azType[] = {. 
cad0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
cae0: 5f 41 46 46 5f 42 4c 4f 42 20 20 20 20 2a 2f 20  _AFF_BLOB    */ 
caf0: 22 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  "",.        /* S
cb00: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20  QLITE_AFF_TEXT  
cb10: 20 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20 20    */ " TEXT",.  
cb20: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
cb30: 41 46 46 5f 4e 55 4d 45 52 49 43 20 2a 2f 20 22  AFF_NUMERIC */ "
cb40: 20 4e 55 4d 22 2c 0a 20 20 20 20 20 20 20 20 2f   NUM",.        /
cb50: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  * SQLITE_AFF_INT
cb60: 45 47 45 52 20 2a 2f 20 22 20 49 4e 54 22 2c 0a  EGER */ " INT",.
cb70: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
cb80: 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 2a 2f  E_AFF_REAL    */
cb90: 20 22 20 52 45 41 4c 22 0a 20 20 20 20 7d 3b 0a   " REAL".    };.
cba0: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
cbb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
cbc0: 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  pe;..    sqlite3
cbd0: 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26  _snprintf(n-k, &
cbe0: 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b  zStmt[k], zSep);
cbf0: 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65  .    k += sqlite
cc00: 33 53 74 72 6c 65 6e 33 30 28 26 7a 53 74 6d 74  3Strlen30(&zStmt
cc10: 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d  [k]);.    zSep =
cc20: 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e   zSep2;.    iden
cc30: 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20  tPut(zStmt, &k, 
cc40: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
cc50: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e    assert( pCol->
cc60: 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f  affinity-SQLITE_
cc70: 41 46 46 5f 42 4c 4f 42 20 3e 3d 20 30 20 29 3b  AFF_BLOB >= 0 );
cc80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f  .    assert( pCo
cc90: 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49  l->affinity-SQLI
cca0: 54 45 5f 41 46 46 5f 42 4c 4f 42 20 3c 20 41 72  TE_AFF_BLOB < Ar
ccb0: 72 61 79 53 69 7a 65 28 61 7a 54 79 70 65 29 20  raySize(azType) 
ccc0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
ccd0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
cce0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  =SQLITE_AFF_BLOB
ccf0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
cd00: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
cd10: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
cd20: 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  T );.    testcas
cd30: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
cd40: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  y==SQLITE_AFF_NU
cd50: 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 74 65 73  MERIC );.    tes
cd60: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
cd70: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
cd80: 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20  F_INTEGER );.   
cd90: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
cda0: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
cdb0: 45 5f 41 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20  E_AFF_REAL );.  
cdc0: 20 20 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 61    .    zType = a
cdd0: 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e 61 66 66 69  zType[pCol->affi
cde0: 6e 69 74 79 20 2d 20 53 51 4c 49 54 45 5f 41 46  nity - SQLITE_AF
cdf0: 46 5f 42 4c 4f 42 5d 3b 0a 20 20 20 20 6c 65 6e  F_BLOB];.    len
ce00: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
ce10: 33 30 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 61  30(zType);.    a
ce20: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66  ssert( pCol->aff
ce30: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
ce40: 46 5f 42 4c 4f 42 20 0a 20 20 20 20 20 20 20 20  F_BLOB .        
ce50: 20 20 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66      || pCol->aff
ce60: 69 6e 69 74 79 3d 3d 73 71 6c 69 74 65 33 41 66  inity==sqlite3Af
ce70: 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65  finityType(zType
ce80: 2c 20 30 29 20 29 3b 0a 20 20 20 20 6d 65 6d 63  , 0) );.    memc
ce90: 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54  py(&zStmt[k], zT
cea0: 79 70 65 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 6b  ype, len);.    k
ceb0: 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 61 73 73   += len;.    ass
cec0: 65 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d  ert( k<=n );.  }
ced0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
cee0: 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b  ntf(n-k, &zStmt[
cef0: 6b 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b  k], "%s", zEnd);
cf00: 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b  .  return zStmt;
cf10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65  .}../*.** Resize
cf20: 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63 74   an Index object
cf30: 20 74 6f 20 68 6f 6c 64 20 4e 20 63 6f 6c 75 6d   to hold N colum
cf40: 6e 73 20 74 6f 74 61 6c 2e 20 20 52 65 74 75 72  ns total.  Retur
cf50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
cf60: 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 53 51  n success and SQ
cf70: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 6e 20 61 6e  LITE_NOMEM on an
cf80: 20 4f 4f 4d 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73   OOM error..*/.s
cf90: 74 61 74 69 63 20 69 6e 74 20 72 65 73 69 7a 65  tatic int resize
cfa0: 49 6e 64 65 78 4f 62 6a 65 63 74 28 73 71 6c 69  IndexObject(sqli
cfb0: 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a  te3 *db, Index *
cfc0: 70 49 64 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  pIdx, int N){.  
cfd0: 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a 20 20  char *zExtra;.  
cfe0: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28  int nByte;.  if(
cff0: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
d000: 4e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  N ) return SQLIT
d010: 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
d020: 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64 3d  pIdx->isResized=
d030: 3d 30 20 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20  =0 );.  nByte = 
d040: 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2b  (sizeof(char*) +
d050: 20 73 69 7a 65 6f 66 28 69 31 36 29 20 2b 20 31   sizeof(i16) + 1
d060: 29 2a 4e 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20  )*N;.  zExtra = 
d070: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
d080: 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a  ero(db, nByte);.
d090: 20 20 69 66 28 20 7a 45 78 74 72 61 3d 3d 30 20    if( zExtra==0 
d0a0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
d0b0: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65  NOMEM_BKPT;.  me
d0c0: 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64  mcpy(zExtra, pId
d0d0: 78 2d 3e 61 7a 43 6f 6c 6c 2c 20 73 69 7a 65 6f  x->azColl, sizeo
d0e0: 66 28 63 68 61 72 2a 29 2a 70 49 64 78 2d 3e 6e  f(char*)*pIdx->n
d0f0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d  Column);.  pIdx-
d100: 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74  >azColl = (const
d110: 20 63 68 61 72 2a 2a 29 7a 45 78 74 72 61 3b 0a   char**)zExtra;.
d120: 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a 65    zExtra += size
d130: 6f 66 28 63 68 61 72 2a 29 2a 4e 3b 0a 20 20 6d  of(char*)*N;.  m
d140: 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49  emcpy(zExtra, pI
d150: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 73 69  dx->aiColumn, si
d160: 7a 65 6f 66 28 69 31 36 29 2a 70 49 64 78 2d 3e  zeof(i16)*pIdx->
d170: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78  nColumn);.  pIdx
d180: 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31  ->aiColumn = (i1
d190: 36 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78  6*)zExtra;.  zEx
d1a0: 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31  tra += sizeof(i1
d1b0: 36 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a  6)*N;.  memcpy(z
d1c0: 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 53 6f  Extra, pIdx->aSo
d1d0: 72 74 4f 72 64 65 72 2c 20 70 49 64 78 2d 3e 6e  rtOrder, pIdx->n
d1e0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d  Column);.  pIdx-
d1f0: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
d200: 38 2a 29 7a 45 78 74 72 61 3b 0a 20 20 70 49 64  8*)zExtra;.  pId
d210: 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a  x->nColumn = N;.
d220: 20 20 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65    pIdx->isResize
d230: 64 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  d = 1;.  return 
d240: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
d250: 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
d260: 20 74 6f 74 61 6c 20 72 6f 77 20 77 69 64 74 68   total row width
d270: 20 66 6f 72 20 61 20 74 61 62 6c 65 2e 0a 2a 2f   for a table..*/
d280: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 73 74  .static void est
d290: 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68 28  imateTableWidth(
d2a0: 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20  Table *pTab){.  
d2b0: 75 6e 73 69 67 6e 65 64 20 77 54 61 62 6c 65 20  unsigned wTable 
d2c0: 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c  = 0;.  const Col
d2d0: 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20  umn *pTabCol;.  
d2e0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70  int i;.  for(i=p
d2f0: 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 43  Tab->nCol, pTabC
d300: 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69  ol=pTab->aCol; i
d310: 3e 30 3b 20 69 2d 2d 2c 20 70 54 61 62 43 6f 6c  >0; i--, pTabCol
d320: 2b 2b 29 7b 0a 20 20 20 20 77 54 61 62 6c 65 20  ++){.    wTable 
d330: 2b 3d 20 70 54 61 62 43 6f 6c 2d 3e 73 7a 45 73  += pTabCol->szEs
d340: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61  t;.  }.  if( pTa
d350: 62 2d 3e 69 50 4b 65 79 3c 30 20 29 20 77 54 61  b->iPKey<0 ) wTa
d360: 62 6c 65 2b 2b 3b 0a 20 20 70 54 61 62 2d 3e 73  ble++;.  pTab->s
d370: 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c 69 74 65  zTabRow = sqlite
d380: 33 4c 6f 67 45 73 74 28 77 54 61 62 6c 65 2a 34  3LogEst(wTable*4
d390: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69  );.}../*.** Esti
d3a0: 6d 61 74 65 20 74 68 65 20 61 76 65 72 61 67 65  mate the average
d3b0: 20 73 69 7a 65 20 6f 66 20 61 20 72 6f 77 20 66   size of a row f
d3c0: 6f 72 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a  or an index..*/.
d3d0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 73 74 69  static void esti
d3e0: 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 49  mateIndexWidth(I
d3f0: 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 75  ndex *pIdx){.  u
d400: 6e 73 69 67 6e 65 64 20 77 49 6e 64 65 78 20 3d  nsigned wIndex =
d410: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63   0;.  int i;.  c
d420: 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  onst Column *aCo
d430: 6c 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  l = pIdx->pTable
d440: 2d 3e 61 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d  ->aCol;.  for(i=
d450: 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; i<pIdx->nColu
d460: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 31  mn; i++){.    i1
d470: 36 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  6 x = pIdx->aiCo
d480: 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73  lumn[i];.    ass
d490: 65 72 74 28 20 78 3c 70 49 64 78 2d 3e 70 54 61  ert( x<pIdx->pTa
d4a0: 62 6c 65 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  ble->nCol );.   
d4b0: 20 77 49 6e 64 65 78 20 2b 3d 20 78 3c 30 20 3f   wIndex += x<0 ?
d4c0: 20 31 20 3a 20 61 43 6f 6c 5b 70 49 64 78 2d 3e   1 : aCol[pIdx->
d4d0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73 7a 45  aiColumn[i]].szE
d4e0: 73 74 3b 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e  st;.  }.  pIdx->
d4f0: 73 7a 49 64 78 52 6f 77 20 3d 20 73 71 6c 69 74  szIdxRow = sqlit
d500: 65 33 4c 6f 67 45 73 74 28 77 49 6e 64 65 78 2a  e3LogEst(wIndex*
d510: 34 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  4);.}../* Return
d520: 20 74 72 75 65 20 69 66 20 76 61 6c 75 65 20 78   true if value x
d530: 20 69 73 20 66 6f 75 6e 64 20 61 6e 79 20 6f 66   is found any of
d540: 20 74 68 65 20 66 69 72 73 74 20 6e 43 6f 6c 20   the first nCol 
d550: 65 6e 74 72 69 65 73 20 6f 66 20 61 69 43 6f 6c  entries of aiCol
d560: 5b 5d 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  [].*/.static int
d570: 20 68 61 73 43 6f 6c 75 6d 6e 28 63 6f 6e 73 74   hasColumn(const
d580: 20 69 31 36 20 2a 61 69 43 6f 6c 2c 20 69 6e 74   i16 *aiCol, int
d590: 20 6e 43 6f 6c 2c 20 69 6e 74 20 78 29 7b 0a 20   nCol, int x){. 
d5a0: 20 77 68 69 6c 65 28 20 6e 43 6f 6c 2d 2d 20 3e   while( nCol-- >
d5b0: 20 30 20 29 20 69 66 28 20 78 3d 3d 2a 28 61 69   0 ) if( x==*(ai
d5c0: 43 6f 6c 2b 2b 29 20 29 20 72 65 74 75 72 6e 20  Col++) ) return 
d5d0: 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
d5e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
d5f0: 74 69 6e 65 20 72 75 6e 73 20 61 74 20 74 68 65  tine runs at the
d600: 20 65 6e 64 20 6f 66 20 70 61 72 73 69 6e 67 20   end of parsing 
d610: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
d620: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 0a 2a 2a  tatement that.**
d630: 20 68 61 73 20 61 20 57 49 54 48 4f 55 54 20 52   has a WITHOUT R
d640: 4f 57 49 44 20 63 6c 61 75 73 65 2e 20 20 54 68  OWID clause.  Th
d650: 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f  e job of this ro
d660: 75 74 69 6e 65 20 69 73 20 74 6f 20 63 6f 6e 76  utine is to conv
d670: 65 72 74 20 62 6f 74 68 0a 2a 2a 20 69 6e 74 65  ert both.** inte
d680: 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 61 74 61  rnal schema data
d690: 20 73 74 72 75 63 74 75 72 65 73 20 61 6e 64 20   structures and 
d6a0: 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 56 44  the generated VD
d6b0: 42 45 20 63 6f 64 65 20 73 6f 20 74 68 61 74 20  BE code so that 
d6c0: 74 68 65 79 0a 2a 2a 20 61 72 65 20 61 70 70 72  they.** are appr
d6d0: 6f 70 72 69 61 74 65 20 66 6f 72 20 61 20 57 49  opriate for a WI
d6e0: 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
d6f0: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 72  e instead of a r
d700: 6f 77 69 64 20 74 61 62 6c 65 2e 0a 2a 2a 20 43  owid table..** C
d710: 68 61 6e 67 65 73 20 69 6e 63 6c 75 64 65 3a 0a  hanges include:.
d720: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 53  **.**     (1)  S
d730: 65 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f  et all columns o
d740: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
d750: 59 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20  Y schema object 
d760: 74 6f 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a  to be NOT NULL..
d770: 2a 2a 20 20 20 20 20 28 32 29 20 20 43 6f 6e 76  **     (2)  Conv
d780: 65 72 74 20 50 33 20 70 61 72 61 6d 65 74 65 72  ert P3 parameter
d790: 20 6f 66 20 74 68 65 20 4f 50 5f 43 72 65 61 74   of the OP_Creat
d7a0: 65 42 74 72 65 65 20 66 72 6f 6d 20 42 54 52 45  eBtree from BTRE
d7b0: 45 5f 49 4e 54 4b 45 59 20 0a 2a 2a 20 20 20 20  E_INTKEY .**    
d7c0: 20 20 20 20 20 20 69 6e 74 6f 20 42 54 52 45 45        into BTREE
d7d0: 5f 42 4c 4f 42 4b 45 59 2e 0a 2a 2a 20 20 20 20  _BLOBKEY..**    
d7e0: 20 28 33 29 20 20 42 79 70 61 73 73 20 74 68 65   (3)  Bypass the
d7f0: 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65   creation of the
d800: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
d810: 61 62 6c 65 20 65 6e 74 72 79 0a 2a 2a 20 20 20  able entry.**   
d820: 20 20 20 20 20 20 20 66 6f 72 20 74 68 65 20 50         for the P
d830: 52 49 4d 41 52 59 20 4b 45 59 20 61 73 20 74 68  RIMARY KEY as th
d840: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e  e primary key in
d850: 64 65 78 20 69 73 20 6e 6f 77 0a 2a 2a 20 20 20  dex is now.**   
d860: 20 20 20 20 20 20 20 69 64 65 6e 74 69 66 69 65         identifie
d870: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 5f  d by the sqlite_
d880: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74  master table ent
d890: 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ry of the table 
d8a0: 69 74 73 65 6c 66 2e 0a 2a 2a 20 20 20 20 20 28  itself..**     (
d8b0: 34 29 20 20 53 65 74 20 74 68 65 20 49 6e 64 65  4)  Set the Inde
d8c0: 78 2e 74 6e 75 6d 20 6f 66 20 74 68 65 20 50 52  x.tnum of the PR
d8d0: 49 4d 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20  IMARY KEY Index 
d8e0: 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a  object in the.**
d8f0: 20 20 20 20 20 20 20 20 20 20 73 63 68 65 6d 61            schema
d900: 20 74 6f 20 74 68 65 20 72 6f 6f 74 70 61 67 65   to the rootpage
d910: 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74   from the main t
d920: 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 35 29  able..**     (5)
d930: 20 20 41 64 64 20 61 6c 6c 20 74 61 62 6c 65 20    Add all table 
d940: 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 50  columns to the P
d950: 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64 65 78  RIMARY KEY Index
d960: 20 6f 62 6a 65 63 74 0a 2a 2a 20 20 20 20 20 20   object.**      
d970: 20 20 20 20 73 6f 20 74 68 61 74 20 74 68 65 20      so that the 
d980: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 61  PRIMARY KEY is a
d990: 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e   covering index.
d9a0: 20 20 54 68 65 20 73 75 72 70 6c 75 73 0a 2a 2a    The surplus.**
d9b0: 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e            column
d9c0: 73 20 61 72 65 20 70 61 72 74 20 6f 66 20 4b 65  s are part of Ke
d9d0: 79 49 6e 66 6f 2e 6e 41 6c 6c 46 69 65 6c 64 20  yInfo.nAllField 
d9e0: 61 6e 64 20 61 72 65 20 6e 6f 74 20 75 73 65 64  and are not used
d9f0: 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20   for.**         
da00: 20 73 6f 72 74 69 6e 67 20 6f 72 20 6c 6f 6f 6b   sorting or look
da10: 75 70 20 6f 72 20 75 6e 69 71 75 65 6e 65 73 73  up or uniqueness
da20: 20 63 68 65 63 6b 73 2e 0a 2a 2a 20 20 20 20 20   checks..**     
da30: 28 36 29 20 20 52 65 70 6c 61 63 65 20 74 68 65  (6)  Replace the
da40: 20 72 6f 77 69 64 20 74 61 69 6c 20 6f 6e 20 61   rowid tail on a
da50: 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
da60: 20 67 65 6e 65 72 61 74 65 64 20 55 4e 49 51 55   generated UNIQU
da70: 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e  E.**          in
da80: 64 69 63 65 73 20 77 69 74 68 20 74 68 65 20 50  dices with the P
da90: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
daa0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 76 69  ns..**.** For vi
dab0: 72 74 75 61 6c 20 74 61 62 6c 65 73 2c 20 6f 6e  rtual tables, on
dac0: 6c 79 20 28 31 29 20 69 73 20 70 65 72 66 6f 72  ly (1) is perfor
dad0: 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  med..*/.static v
dae0: 6f 69 64 20 63 6f 6e 76 65 72 74 54 6f 57 69 74  oid convertToWit
daf0: 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28 50  houtRowidTable(P
db00: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
db10: 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e  ble *pTab){.  In
db20: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 49 6e 64  dex *pIdx;.  Ind
db30: 65 78 20 2a 70 50 6b 3b 0a 20 20 69 6e 74 20 6e  ex *pPk;.  int n
db40: 50 6b 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  Pk;.  int i, j;.
db50: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
db60: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64  pParse->db;.  Vd
db70: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
db80: 70 56 64 62 65 3b 0a 0a 20 20 2f 2a 20 4d 61 72  pVdbe;..  /* Mar
db90: 6b 20 65 76 65 72 79 20 50 52 49 4d 41 52 59 20  k every PRIMARY 
dba0: 4b 45 59 20 63 6f 6c 75 6d 6e 20 61 73 20 4e 4f  KEY column as NO
dbb0: 54 20 4e 55 4c 4c 20 28 65 78 63 65 70 74 20 66  T NULL (except f
dbc0: 6f 72 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  or imposter tabl
dbd0: 65 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  es).  */.  if( !
dbe0: 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65  db->init.imposte
dbf0: 72 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 66 6f  rTable ){.    fo
dc00: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e  r(i=0; i<pTab->n
dc10: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
dc20: 20 69 66 28 20 28 70 54 61 62 2d 3e 61 43 6f 6c   if( (pTab->aCol
dc30: 5b 69 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43  [i].colFlags & C
dc40: 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21  OLFLAG_PRIMKEY)!
dc50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  =0 ){.        pT
dc60: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e  ab->aCol[i].notN
dc70: 75 6c 6c 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ull = OE_Abort;.
dc80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
dc90: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 6d 61  }..  /* The rema
dca0: 69 6e 69 6e 67 20 74 72 61 6e 73 66 6f 72 6d 61  ining transforma
dcb0: 74 69 6f 6e 73 20 6f 6e 6c 79 20 61 70 70 6c 79  tions only apply
dcc0: 20 74 6f 20 62 2d 74 72 65 65 20 74 61 62 6c 65   to b-tree table
dcd0: 73 2c 20 6e 6f 74 20 74 6f 0a 20 20 2a 2a 20 76  s, not to.  ** v
dce0: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f  irtual tables */
dcf0: 0a 20 20 69 66 28 20 49 4e 5f 44 45 43 4c 41 52  .  if( IN_DECLAR
dd00: 45 5f 56 54 41 42 20 29 20 72 65 74 75 72 6e 3b  E_VTAB ) return;
dd10: 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74  ..  /* Convert t
dd20: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 6f 66  he P3 operand of
dd30: 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65 42 74   the OP_CreateBt
dd40: 72 65 65 20 6f 70 63 6f 64 65 20 66 72 6f 6d 20  ree opcode from 
dd50: 42 54 52 45 45 5f 49 4e 54 4b 45 59 0a 20 20 2a  BTREE_INTKEY.  *
dd60: 2a 20 69 6e 74 6f 20 42 54 52 45 45 5f 42 4c 4f  * into BTREE_BLO
dd70: 42 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  BKEY..  */.  if(
dd80: 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54   pParse->addrCrT
dd90: 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ab ){.    assert
dda0: 28 20 76 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ( v );.    sqlit
ddb0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
ddc0: 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72  , pParse->addrCr
ddd0: 54 61 62 2c 20 42 54 52 45 45 5f 42 4c 4f 42 4b  Tab, BTREE_BLOBK
dde0: 45 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  EY);.  }..  /* L
ddf0: 6f 63 61 74 65 20 74 68 65 20 50 52 49 4d 41 52  ocate the PRIMAR
de00: 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 20 4f 72  Y KEY index.  Or
de10: 2c 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20  , if this table 
de20: 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  was originally. 
de30: 20 2a 2a 20 61 6e 20 49 4e 54 45 47 45 52 20 50   ** an INTEGER P
de40: 52 49 4d 41 52 59 20 4b 45 59 20 74 61 62 6c 65  RIMARY KEY table
de50: 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 50  , create a new P
de60: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
de70: 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  . .  */.  if( pT
de80: 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a  ab->iPKey>=0 ){.
de90: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
dea0: 69 73 74 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 69  ist;.    Token i
deb0: 70 6b 54 6f 6b 65 6e 3b 0a 20 20 20 20 73 71 6c  pkToken;.    sql
dec0: 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 69  ite3TokenInit(&i
ded0: 70 6b 54 6f 6b 65 6e 2c 20 70 54 61 62 2d 3e 61  pkToken, pTab->a
dee0: 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d  Col[pTab->iPKey]
def0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69  .zName);.    pLi
df00: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
df10: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
df20: 65 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  e, 0, .         
df30: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
df40: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
df50: 5f 49 44 2c 20 26 69 70 6b 54 6f 6b 65 6e 2c 20  _ID, &ipkToken, 
df60: 30 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  0));.    if( pLi
df70: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
df80: 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e      pList->a[0].
df90: 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 50 61 72  sortOrder = pPar
dfa0: 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72  se->iPkSortOrder
dfb0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
dfc0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d  arse->pNewTable=
dfd0: 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 73 71 6c  =pTab );.    sql
dfe0: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
dff0: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c  pParse, 0, 0, 0,
e000: 20 70 4c 69 73 74 2c 20 70 54 61 62 2d 3e 6b 65   pList, pTab->ke
e010: 79 43 6f 6e 66 2c 20 30 2c 20 30 2c 20 30 2c 20  yConf, 0, 0, 0, 
e020: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
e030: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
e040: 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59  _IDXTYPE_PRIMARY
e050: 4b 45 59 29 3b 0a 20 20 20 20 69 66 28 20 64 62  KEY);.    if( db
e060: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
e070: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 50 6b   return;.    pPk
e080: 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
e090: 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
e0a0: 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  .    pTab->iPKey
e0b0: 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = -1;.  }else{.
e0c0: 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65      pPk = sqlite
e0d0: 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
e0e0: 28 70 54 61 62 29 3b 0a 0a 20 20 20 20 2f 2a 0a  (pTab);..    /*.
e0f0: 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 61 6c      ** Remove al
e100: 6c 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75  l redundant colu
e110: 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 50 52 49  mns from the PRI
e120: 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f 72 20 65  MARY KEY.  For e
e130: 78 61 6d 70 6c 65 2c 20 63 68 61 6e 67 65 0a 20  xample, change. 
e140: 20 20 20 2a 2a 20 22 50 52 49 4d 41 52 59 20 4b     ** "PRIMARY K
e150: 45 59 28 61 2c 62 2c 61 2c 62 2c 63 2c 62 2c 63  EY(a,b,a,b,c,b,c
e160: 2c 64 29 22 20 69 6e 74 6f 20 6a 75 73 74 20 22  ,d)" into just "
e170: 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c  PRIMARY KEY(a,b,
e180: 63 2c 64 29 22 2e 20 20 4c 61 74 65 72 0a 20 20  c,d)".  Later.  
e190: 20 20 2a 2a 20 63 6f 64 65 20 61 73 73 75 6d 65    ** code assume
e1a0: 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  s the PRIMARY KE
e1b0: 59 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 65  Y contains no re
e1c0: 70 65 61 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a  peated columns..
e1d0: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
e1e0: 3d 6a 3d 31 3b 20 69 3c 70 50 6b 2d 3e 6e 4b 65  =j=1; i<pPk->nKe
e1f0: 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  yCol; i++){.    
e200: 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28    if( hasColumn(
e210: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a  pPk->aiColumn, j
e220: 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  , pPk->aiColumn[
e230: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  i]) ){.        p
e240: 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 0a 20  Pk->nColumn--;. 
e250: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e260: 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d      pPk->aiColum
e270: 6e 5b 6a 2b 2b 5d 20 3d 20 70 50 6b 2d 3e 61 69  n[j++] = pPk->ai
e280: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
e290: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 6b   }.    }.    pPk
e2a0: 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6a 3b 0a 20  ->nKeyCol = j;. 
e2b0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 6b   }.  assert( pPk
e2c0: 21 3d 30 20 29 3b 0a 20 20 70 50 6b 2d 3e 69 73  !=0 );.  pPk->is
e2d0: 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b 0a 20 20  Covering = 1;.  
e2e0: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 69 6d  if( !db->init.im
e2f0: 70 6f 73 74 65 72 54 61 62 6c 65 20 29 20 70 50  posterTable ) pP
e300: 6b 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d  k->uniqNotNull =
e310: 20 31 3b 0a 20 20 6e 50 6b 20 3d 20 70 50 6b 2d   1;.  nPk = pPk-
e320: 3e 6e 4b 65 79 43 6f 6c 3b 0a 0a 20 20 2f 2a 20  >nKeyCol;..  /* 
e330: 42 79 70 61 73 73 20 74 68 65 20 63 72 65 61 74  Bypass the creat
e340: 69 6f 6e 20 6f 66 20 74 68 65 20 50 52 49 4d 41  ion of the PRIMA
e350: 52 59 20 4b 45 59 20 62 74 72 65 65 20 61 6e 64  RY KEY btree and
e360: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
e370: 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20 65 6e  er.  ** table en
e380: 74 72 79 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c  try. This is onl
e390: 79 20 72 65 71 75 69 72 65 64 20 69 66 20 63 75  y required if cu
e3a0: 72 72 65 6e 74 6c 79 20 67 65 6e 65 72 61 74 69  rrently generati
e3b0: 6e 67 20 56 44 42 45 0a 20 20 2a 2a 20 63 6f 64  ng VDBE.  ** cod
e3c0: 65 20 66 6f 72 20 61 20 43 52 45 41 54 45 20 54  e for a CREATE T
e3d0: 41 42 4c 45 20 28 6e 6f 74 20 77 68 65 6e 20 70  ABLE (not when p
e3e0: 61 72 73 69 6e 67 20 6f 6e 65 20 61 73 20 70 61  arsing one as pa
e3f0: 72 74 20 6f 66 20 72 65 61 64 69 6e 67 0a 20 20  rt of reading.  
e400: 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 73 63  ** a database sc
e410: 68 65 6d 61 29 2e 20 20 2a 2f 0a 20 20 69 66 28  hema).  */.  if(
e420: 20 76 20 26 26 20 70 50 6b 2d 3e 74 6e 75 6d 3e   v && pPk->tnum>
e430: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
e440: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
e450: 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
e460: 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65  VdbeChangeOpcode
e470: 28 76 2c 20 70 50 6b 2d 3e 74 6e 75 6d 2c 20 4f  (v, pPk->tnum, O
e480: 50 5f 47 6f 74 6f 29 3b 0a 20 20 7d 0a 0a 20 20  P_Goto);.  }..  
e490: 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  /* The root page
e4a0: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
e4b0: 4b 45 59 20 69 73 20 74 68 65 20 74 61 62 6c 65  KEY is the table
e4c0: 20 72 6f 6f 74 20 70 61 67 65 20 2a 2f 0a 20 20   root page */.  
e4d0: 70 50 6b 2d 3e 74 6e 75 6d 20 3d 20 70 54 61 62  pPk->tnum = pTab
e4e0: 2d 3e 74 6e 75 6d 3b 0a 0a 20 20 2f 2a 20 55 70  ->tnum;..  /* Up
e4f0: 64 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  date the in-memo
e500: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
e510: 6e 20 6f 66 20 61 6c 6c 20 55 4e 49 51 55 45 20  n of all UNIQUE 
e520: 69 6e 64 69 63 65 73 20 62 79 20 63 6f 6e 76 65  indices by conve
e530: 72 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66  rting.  ** the f
e540: 69 6e 61 6c 20 72 6f 77 69 64 20 63 6f 6c 75 6d  inal rowid colum
e550: 6e 20 69 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f  n into one or mo
e560: 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  re columns of th
e570: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 20  e PRIMARY KEY.. 
e580: 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d 70   */.  for(pIdx=p
e590: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
e5a0: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
e5b0: 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  ext){.    int n;
e5c0: 0a 20 20 20 20 69 66 28 20 49 73 50 72 69 6d 61  .    if( IsPrima
e5d0: 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29  ryKeyIndex(pIdx)
e5e0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
e5f0: 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c 6e 50   for(i=n=0; i<nP
e600: 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  k; i++){.      i
e610: 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49  f( !hasColumn(pI
e620: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49  dx->aiColumn, pI
e630: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b  dx->nKeyCol, pPk
e640: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29  ->aiColumn[i]) )
e650: 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20   n++;.    }.    
e660: 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
e670: 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20    /* This index 
e680: 69 73 20 61 20 73 75 70 65 72 73 65 74 20 6f 66  is a superset of
e690: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
e6a0: 20 2a 2f 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   */.      pIdx->
e6b0: 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e  nColumn = pIdx->
e6c0: 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 63  nKeyCol;.      c
e6d0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
e6e0: 20 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64     if( resizeInd
e6f0: 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 49 64  exObject(db, pId
e700: 78 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  x, pIdx->nKeyCol
e710: 2b 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  +n) ) return;.  
e720: 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 49 64    for(i=0, j=pId
e730: 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 3c 6e 50  x->nKeyCol; i<nP
e740: 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  k; i++){.      i
e750: 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49  f( !hasColumn(pI
e760: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49  dx->aiColumn, pI
e770: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b  dx->nKeyCol, pPk
e780: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29  ->aiColumn[i]) )
e790: 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  {.        pIdx->
e7a0: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 50  aiColumn[j] = pP
e7b0: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  k->aiColumn[i];.
e7c0: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
e7d0: 43 6f 6c 6c 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61  Coll[j] = pPk->a
e7e0: 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  zColl[i];.      
e7f0: 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    j++;.      }. 
e800: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
e810: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
e820: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 20  pIdx->nKeyCol+n 
e830: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
e840: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20  Idx->nColumn>=j 
e850: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64  );.  }..  /* Add
e860: 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d   all table colum
e870: 6e 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52  ns to the PRIMAR
e880: 59 20 4b 45 59 20 69 6e 64 65 78 0a 20 20 2a 2f  Y KEY index.  */
e890: 0a 20 20 69 66 28 20 6e 50 6b 3c 70 54 61 62 2d  .  if( nPk<pTab-
e8a0: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28  >nCol ){.    if(
e8b0: 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65   resizeIndexObje
e8c0: 63 74 28 64 62 2c 20 70 50 6b 2c 20 70 54 61 62  ct(db, pPk, pTab
e8d0: 2d 3e 6e 43 6f 6c 29 20 29 20 72 65 74 75 72 6e  ->nCol) ) return
e8e0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a  ;.    for(i=0, j
e8f0: 3d 6e 50 6b 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  =nPk; i<pTab->nC
e900: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
e910: 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70  if( !hasColumn(p
e920: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c  Pk->aiColumn, j,
e930: 20 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61   i) ){.        a
e940: 73 73 65 72 74 28 20 6a 3c 70 50 6b 2d 3e 6e 43  ssert( j<pPk->nC
e950: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20  olumn );.       
e960: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a   pPk->aiColumn[j
e970: 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70  ] = i;.        p
e980: 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20  Pk->azColl[j] = 
e990: 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
e9a0: 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  ;.        j++;. 
e9b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
e9c0: 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e 6e 43   assert( pPk->nC
e9d0: 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a 20 20 20 20  olumn==j );.    
e9e0: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
e9f0: 6f 6c 3d 3d 6a 20 29 3b 0a 20 20 7d 65 6c 73 65  ol==j );.  }else
ea00: 7b 0a 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75  {.    pPk->nColu
ea10: 6d 6e 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b  mn = pTab->nCol;
ea20: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
ea30: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
ea40: 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74  lled to report t
ea50: 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61  he final ")" tha
ea60: 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20  t terminates.** 
ea70: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
ea80: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
ea90: 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74  The table struct
eaa0: 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61  ure that other a
eab0: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68  ction routines h
eac0: 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e  ave been buildin
ead0: 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f  g.** is added to
eae0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61   the internal ha
eaf0: 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d  sh tables, assum
eb00: 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61  ing no errors ha
eb10: 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a  ve.** occurred..
eb20: 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66  **.** An entry f
eb30: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  or the table is 
eb40: 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74  made in the mast
eb50: 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b  er table on disk
eb60: 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73  , unless.** this
eb70: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
eb80: 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69  table or db->ini
eb90: 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e  t.busy==1.  When
eba0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
ebb0: 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65  1.** it means we
ebc0: 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
ebd0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
ebe0: 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20  able because we 
ebf0: 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65  just.** connecte
ec00: 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  d to the databas
ec10: 65 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  e or because the
ec20: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
ec30: 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65  able has.** rece
ec40: 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f  ntly changed, so
ec50: 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
ec60: 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64  his table alread
ec70: 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74  y exists in.** t
ec80: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
ec90: 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e   table.  We do n
eca0: 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74  ot want to creat
ecb0: 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  e it again..**.*
ecc0: 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74  * If the pSelect
ecd0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
ece0: 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20   NULL, it means 
ecf0: 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e  that this routin
ed00: 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20  e.** was called 
ed10: 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c  to create a tabl
ed20: 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d  e generated from
ed30: 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54   a .** "CREATE T
ed40: 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45  ABLE ... AS SELE
ed50: 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e  CT ..." statemen
ed60: 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e  t.  The column n
ed70: 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ames of.** the n
ed80: 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61  ew table will ma
ed90: 74 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73  tch the result s
eda0: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
edb0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
edc0: 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72  3EndTable(.  Par
edd0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
ede0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
edf0: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
ee00: 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20   *pCons,        
ee10: 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f     /* The ',' to
ee20: 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61  ken after the la
ee30: 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20  st column defn. 
ee40: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64  */.  Token *pEnd
ee50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
ee60: 54 68 65 20 27 29 27 20 62 65 66 6f 72 65 20 6f  The ')' before o
ee70: 70 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 43 52  ptions in the CR
ee80: 45 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20  EATE TABLE */.  
ee90: 75 38 20 74 61 62 4f 70 74 73 2c 20 20 20 20 20  u8 tabOpts,     
eea0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
eeb0: 20 74 61 62 6c 65 20 6f 70 74 69 6f 6e 73 2e 20   table options. 
eec0: 55 73 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a 20 20  Usually 0. */.  
eed0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
eee0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63          /* Selec
eef0: 74 20 66 72 6f 6d 20 61 20 22 43 52 45 41 54 45  t from a "CREATE
ef00: 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 22 20   ... AS SELECT" 
ef10: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
ef20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ef30: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 74 61 62    /* The new tab
ef40: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  le */.  sqlite3 
ef50: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
ef60: 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73  ; /* The databas
ef70: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
ef80: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
ef90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
efa0: 61 74 61 62 61 73 65 20 69 6e 20 77 68 69 63 68  atabase in which
efb0: 20 74 68 65 20 74 61 62 6c 65 20 6c 69 76 65 73   the table lives
efc0: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
efd0: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
efe0: 2f 2a 20 41 6e 20 69 6d 70 6c 69 65 64 20 69 6e  /* An implied in
eff0: 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65  dex of the table
f000: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 6e 64 3d   */..  if( pEnd=
f010: 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30  =0 && pSelect==0
f020: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
f030: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 64    }.  assert( !d
f040: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f050: 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  );.  p = pParse-
f060: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
f070: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
f080: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ..  assert( !db-
f090: 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70  >init.busy || !p
f0a0: 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 2f 2a 20  Select );..  /* 
f0b0: 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  If the db->init.
f0c0: 62 75 73 79 20 69 73 20 31 20 69 74 20 6d 65 61  busy is 1 it mea
f0d0: 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ns we are readin
f0e0: 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68  g the SQL off th
f0f0: 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d  e.  ** "sqlite_m
f100: 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74  aster" or "sqlit
f110: 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74  e_temp_master" t
f120: 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b  able on the disk
f130: 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74  ..  ** So do not
f140: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69   write to the di
f150: 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61  sk again.  Extra
f160: 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ct the root page
f170: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72   number.  ** for
f180: 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
f190: 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  the db->init.new
f1a0: 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68  Tnum field.  (Th
f1b0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  e page number.  
f1c0: 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  ** should have b
f1d0: 65 65 6e 20 70 75 74 20 74 68 65 72 65 20 62 79  een put there by
f1e0: 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43   the sqliteOpenC
f1f0: 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2a  b routine.).  **
f200: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f  .  ** If the roo
f210: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  t page number is
f220: 20 31 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74   1, that means t
f230: 68 69 73 20 69 73 20 74 68 65 20 73 71 6c 69 74  his is the sqlit
f240: 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61  e_master.  ** ta
f250: 62 6c 65 20 69 74 73 65 6c 66 2e 20 20 53 6f 20  ble itself.  So 
f260: 6d 61 72 6b 20 69 74 20 72 65 61 64 2d 6f 6e 6c  mark it read-onl
f270: 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  y..  */.  if( db
f280: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
f290: 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d     p->tnum = db-
f2a0: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20  >init.newTnum;. 
f2b0: 20 20 20 69 66 28 20 70 2d 3e 74 6e 75 6d 3d 3d     if( p->tnum==
f2c0: 31 20 29 20 70 2d 3e 74 61 62 46 6c 61 67 73 20  1 ) p->tabFlags 
f2d0: 7c 3d 20 54 46 5f 52 65 61 64 6f 6e 6c 79 3b 0a  |= TF_Readonly;.
f2e0: 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61    }..  /* Specia
f2f0: 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  l processing for
f300: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 54   WITHOUT ROWID T
f310: 61 62 6c 65 73 20 2a 2f 0a 20 20 69 66 28 20 74  ables */.  if( t
f320: 61 62 4f 70 74 73 20 26 20 54 46 5f 57 69 74 68  abOpts & TF_With
f330: 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  outRowid ){.    
f340: 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73  if( (p->tabFlags
f350: 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
f360: 65 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ent) ){.      sq
f370: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
f380: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
f390: 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6e  "AUTOINCREMENT n
f3a0: 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 57 49  ot allowed on WI
f3b0: 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
f3c0: 65 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  es");.      retu
f3d0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rn;.    }.    if
f3e0: 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26  ( (p->tabFlags &
f3f0: 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
f400: 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  y)==0 ){.      s
f410: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
f420: 50 61 72 73 65 2c 20 22 50 52 49 4d 41 52 59 20  Parse, "PRIMARY 
f430: 4b 45 59 20 6d 69 73 73 69 6e 67 20 6f 6e 20 74  KEY missing on t
f440: 61 62 6c 65 20 25 73 22 2c 20 70 2d 3e 7a 4e 61  able %s", p->zNa
f450: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
f460: 20 20 20 20 20 20 70 2d 3e 74 61 62 46 6c 61 67        p->tabFlag
f470: 73 20 7c 3d 20 54 46 5f 57 69 74 68 6f 75 74 52  s |= TF_WithoutR
f480: 6f 77 69 64 20 7c 20 54 46 5f 4e 6f 56 69 73 69  owid | TF_NoVisi
f490: 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  bleRowid;.      
f4a0: 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74  convertToWithout
f4b0: 52 6f 77 69 64 54 61 62 6c 65 28 70 50 61 72 73  RowidTable(pPars
f4c0: 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, p);.    }.  }
f4d0: 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  ..  iDb = sqlite
f4e0: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
f4f0: 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  b, p->pSchema);.
f500: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f510: 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20  OMIT_CHECK.  /* 
f520: 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e  Resolve names in
f530: 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74   all CHECK const
f540: 72 61 69 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  raint expression
f550: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
f560: 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 73  >pCheck ){.    s
f570: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
f580: 66 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73  fReference(pPars
f590: 65 2c 20 70 2c 20 4e 43 5f 49 73 43 68 65 63 6b  e, p, NC_IsCheck
f5a0: 2c 20 30 2c 20 70 2d 3e 70 43 68 65 63 6b 29 3b  , 0, p->pCheck);
f5b0: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  .  }.#endif /* !
f5c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
f5d0: 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20  MIT_CHECK) */.. 
f5e0: 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65   /* Estimate the
f5f0: 20 61 76 65 72 61 67 65 20 72 6f 77 20 73 69 7a   average row siz
f600: 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  e for the table 
f610: 61 6e 64 20 66 6f 72 20 61 6c 6c 20 69 6d 70 6c  and for all impl
f620: 69 65 64 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20  ied indices */. 
f630: 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69   estimateTableWi
f640: 64 74 68 28 70 29 3b 0a 20 20 66 6f 72 28 70 49  dth(p);.  for(pI
f650: 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49  dx=p->pIndex; pI
f660: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
f670: 4e 65 78 74 29 7b 0a 20 20 20 20 65 73 74 69 6d  Next){.    estim
f680: 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 70 49  ateIndexWidth(pI
f690: 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  dx);.  }..  /* I
f6a0: 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69  f not initializi
f6b0: 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  ng, then create 
f6c0: 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65  a record for the
f6d0: 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20   new table.  ** 
f6e0: 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  in the SQLITE_MA
f6f0: 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68  STER table of th
f700: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a  e database..  **
f710: 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73  .  ** If this is
f720: 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62   a TEMPORARY tab
f730: 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e  le, write the en
f740: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78  try into the aux
f750: 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65  iliary.  ** file
f760: 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f   instead of into
f770: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
f780: 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  se file..  */.  
f790: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
f7a0: 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  sy ){.    int n;
f7b0: 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
f7c0: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20    char *zType;  
f7d0: 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72 20 22    /* "view" or "
f7e0: 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68  table" */.    ch
f7f0: 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a  ar *zType2;   /*
f800: 20 22 56 49 45 57 22 20 6f 72 20 22 54 41 42 4c   "VIEW" or "TABL
f810: 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  E" */.    char *
f820: 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78  zStmt;    /* Tex
f830: 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
f840: 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20  TABLE or CREATE 
f850: 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2a  VIEW statement *
f860: 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  /..    v = sqlit
f870: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
f880: 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  );.    if( NEVER
f890: 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  (v==0) ) return;
f8a0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ..    sqlite3Vdb
f8b0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
f8c0: 6f 73 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  ose, 0);..    /*
f8d0: 20 0a 20 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c   .    ** Initial
f8e0: 69 7a 65 20 7a 54 79 70 65 20 66 6f 72 20 74 68  ize zType for th
f8f0: 65 20 6e 65 77 20 76 69 65 77 20 6f 72 20 74 61  e new view or ta
f900: 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
f910: 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d  if( p->pSelect==
f920: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  0 ){.      /* A 
f930: 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f  regular table */
f940: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
f950: 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54  table";.      zT
f960: 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a  ype2 = "TABLE";.
f970: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f980: 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c  MIT_VIEW.    }el
f990: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76  se{.      /* A v
f9a0: 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79  iew */.      zTy
f9b0: 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20 20  pe = "view";.   
f9c0: 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49 45     zType2 = "VIE
f9d0: 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  W";.#endif.    }
f9e0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
f9f0: 20 69 73 20 61 20 43 52 45 41 54 45 20 54 41 42   is a CREATE TAB
fa00: 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43 54 20  LE xx AS SELECT 
fa10: 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65  ..., execute the
fa20: 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73   SELECT.    ** s
fa30: 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75  tatement to popu
fa40: 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74 61 62  late the new tab
fa50: 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67  le. The root-pag
fa60: 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  e number for the
fa70: 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c  .    ** new tabl
fa80: 65 20 69 73 20 69 6e 20 72 65 67 69 73 74 65 72  e is in register
fa90: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
faa0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
fab0: 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54 20  Once the SELECT 
fac0: 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62  has been coded b
fad0: 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  y sqlite3Select(
fae0: 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20  ), it is in a.  
faf0: 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74    ** suitable st
fb00: 61 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72  ate to query for
fb10: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
fb20: 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62  s and types to b
fb30: 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79  e used.    ** by
fb40: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a   the new table..
fb50: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20      **.    ** A 
fb60: 73 68 61 72 65 64 2d 63 61 63 68 65 20 77 72 69  shared-cache wri
fb70: 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  te-lock is not r
fb80: 65 71 75 69 72 65 64 20 74 6f 20 77 72 69 74 65  equired to write
fb90: 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c   to the new tabl
fba0: 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 73  e,.    ** as a s
fbb0: 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20  chema-lock must 
fbc0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
fbd0: 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20 63 72  n obtained to cr
fbe0: 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65 0a 20  eate it. Since. 
fbf0: 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c     ** a schema-l
fc00: 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61 6c 6c  ock excludes all
fc10: 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
fc20: 75 73 65 72 73 2c 20 74 68 65 20 77 72 69 74 65  users, the write
fc30: 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20  -lock would.    
fc40: 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e 74 2e  ** be redundant.
fc50: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
fc60: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
fc70: 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
fc80: 3b 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 68  ;    /* Where th
fc90: 65 20 53 45 4c 45 43 54 20 73 68 6f 75 6c 64 20  e SELECT should 
fca0: 73 74 6f 72 65 20 72 65 73 75 6c 74 73 20 2a 2f  store results */
fcb0: 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 59 69  .      int regYi
fcc0: 65 6c 64 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  eld;       /* Re
fcd0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63  gister holding c
fce0: 6f 2d 72 6f 75 74 69 6e 65 20 65 6e 74 72 79 2d  o-routine entry-
fcf0: 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69  point */.      i
fd00: 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20  nt addrTop;     
fd10: 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
fd20: 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   co-routine */. 
fd30: 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 3b       int regRec;
fd40: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65           /* A re
fd50: 63 6f 72 64 20 74 6f 20 62 65 20 69 6e 73 65 72  cord to be inser
fd60: 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 74  t into the new t
fd70: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  able */.      in
fd80: 74 20 72 65 67 52 6f 77 69 64 3b 20 20 20 20 20  t regRowid;     
fd90: 20 20 2f 2a 20 52 6f 77 69 64 20 6f 66 20 74 68    /* Rowid of th
fda0: 65 20 6e 65 78 74 20 72 6f 77 20 74 6f 20 69 6e  e next row to in
fdb0: 73 65 72 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  sert */.      in
fdc0: 74 20 61 64 64 72 49 6e 73 4c 6f 6f 70 3b 20 20  t addrInsLoop;  
fdd0: 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
fde0: 6c 6f 6f 70 20 66 6f 72 20 69 6e 73 65 72 74 69  loop for inserti
fdf0: 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20  ng rows */.     
fe00: 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b   Table *pSelTab;
fe10: 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
fe20: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
fe30: 68 65 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74  he SELECT result
fe40: 73 20 2a 2f 0a 0a 20 20 20 20 20 20 72 65 67 59  s */..      regY
fe50: 69 65 6c 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ield = ++pParse-
fe60: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67  >nMem;.      reg
fe70: 52 65 63 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Rec = ++pParse->
fe80: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52  nMem;.      regR
fe90: 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  owid = ++pParse-
fea0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73 73  >nMem;.      ass
feb0: 65 72 74 28 70 50 61 72 73 65 2d 3e 6e 54 61 62  ert(pParse->nTab
fec0: 3d 3d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ==1);.      sqli
fed0: 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
fee0: 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
fef0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
ff00: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c  OP_OpenWrite, 1,
ff10: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
ff20: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
ff30: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
ff40: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 32 49 53  5(v, OPFLAG_P2IS
ff50: 52 45 47 29 3b 0a 20 20 20 20 20 20 70 50 61 72  REG);.      pPar
ff60: 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20  se->nTab = 2;.  
ff70: 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71      addrTop = sq
ff80: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
ff90: 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 20  Addr(v) + 1;.   
ffa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ffb0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
ffc0: 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65  oroutine, regYie
ffd0: 6c 64 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b  ld, 0, addrTop);
ffe0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
fff0: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
10000 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 20  ;.      pSelTab 
10010 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  = sqlite3ResultS
10020 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
10030 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  e, pSelect);.   
10040 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d     if( pSelTab==
10050 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
10060 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f    assert( p->aCo
10070 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d  l==0 );.      p-
10080 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >nCol = pSelTab-
10090 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e  >nCol;.      p->
100a0 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  aCol = pSelTab->
100b0 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c  aCol;.      pSel
100c0 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->nCol = 0;. 
100d0 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43       pSelTab->aC
100e0 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  ol = 0;.      sq
100f0 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
10100 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20  (db, pSelTab);. 
10110 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
10120 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
10130 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
10140 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20   regYield);.    
10150 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
10160 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
10170 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69   &dest);.      i
10180 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
10190 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
101a0 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f  sqlite3VdbeEndCo
101b0 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 59 69  routine(v, regYi
101c0 65 6c 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eld);.      sqli
101d0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
101e0 76 2c 20 61 64 64 72 54 6f 70 20 2d 20 31 29 3b  v, addrTop - 1);
101f0 0a 20 20 20 20 20 20 61 64 64 72 49 6e 73 4c 6f  .      addrInsLo
10200 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
10210 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
10220 6c 64 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d  ld, dest.iSDParm
10230 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
10240 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
10250 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10260 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
10270 72 64 2c 20 64 65 73 74 2e 69 53 64 73 74 2c 20  rd, dest.iSdst, 
10280 64 65 73 74 2e 6e 53 64 73 74 2c 20 72 65 67 52  dest.nSdst, regR
10290 65 63 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ec);.      sqlit
102a0 65 33 54 61 62 6c 65 41 66 66 69 6e 69 74 79 28  e3TableAffinity(
102b0 76 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20  v, p, 0);.      
102c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
102d0 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
102e0 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  , 1, regRowid);.
102f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10300 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
10310 73 65 72 74 2c 20 31 2c 20 72 65 67 52 65 63 2c  sert, 1, regRec,
10320 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
10330 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
10340 6f 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70  o(v, addrInsLoop
10350 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10360 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
10370 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20  addrInsLoop);.  
10380 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10390 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
103a0 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  e, 1);.    }..  
103b0 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
103c0 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   complete text o
103d0 66 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61  f the CREATE sta
103e0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66  tement */.    if
103f0 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
10400 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61 74     zStmt = creat
10410 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c 20 70  eTableStmt(db, p
10420 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
10430 20 20 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 32      Token *pEnd2
10440 20 3d 20 74 61 62 4f 70 74 73 20 3f 20 26 70 50   = tabOpts ? &pP
10450 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
10460 20 3a 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 6e   : pEnd;.      n
10470 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 32 2d 3e   = (int)(pEnd2->
10480 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d  z - pParse->sNam
10490 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20  eToken.z);.     
104a0 20 69 66 28 20 70 45 6e 64 32 2d 3e 7a 5b 30 5d   if( pEnd2->z[0]
104b0 21 3d 27 3b 27 20 29 20 6e 20 2b 3d 20 70 45 6e  !=';' ) n += pEn
104c0 64 32 2d 3e 6e 3b 0a 20 20 20 20 20 20 7a 53 74  d2->n;.      zSt
104d0 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
104e0 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20 20  ntf(db, .       
104f0 20 20 20 22 43 52 45 41 54 45 20 25 73 20 25 2e     "CREATE %s %.
10500 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20  *s", zType2, n, 
10510 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
10520 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20  en.z.      );.  
10530 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c    }..    /* A sl
10540 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72  ot for the recor
10550 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  d has already be
10560 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20  en allocated in 
10570 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49  the .    ** SQLI
10580 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e  TE_MASTER table.
10590 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74    We just need t
105a0 6f 20 75 70 64 61 74 65 20 74 68 61 74 20 73 6c  o update that sl
105b0 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20  ot with all.    
105c0 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  ** the informati
105d0 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74  on we've collect
105e0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
105f0 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
10600 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
10610 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 22 0a  "UPDATE %Q.%s ".
10620 20 20 20 20 20 20 20 20 20 22 53 45 54 20 74 79           "SET ty
10630 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51  pe='%s', name=%Q
10640 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72  , tbl_name=%Q, r
10650 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20 73 71 6c  ootpage=#%d, sql
10660 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22 57 48  =%Q ".       "WH
10670 45 52 45 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a  ERE rowid=#%d",.
10680 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
10690 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53  b].zDbSName, MAS
106a0 54 45 52 5f 4e 41 4d 45 2c 0a 20 20 20 20 20 20  TER_NAME,.      
106b0 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e  zType,.      p->
106c0 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e  zName,.      p->
106d0 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 50 61  zName,.      pPa
106e0 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20  rse->regRoot,.  
106f0 20 20 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20      zStmt,.     
10700 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69   pParse->regRowi
10710 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  d.    );.    sql
10720 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
10730 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Stmt);.    sqlit
10740 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
10750 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69  Parse, iDb);..#i
10760 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10770 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
10780 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
10790 73 65 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  see if we need t
107a0 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69  o create an sqli
107b0 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
107c0 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65  e for.    ** kee
107d0 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75  ping track of au
107e0 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73  toincrement keys
107f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
10800 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20   (p->tabFlags & 
10810 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  TF_Autoincrement
10820 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 44 62  )!=0 ){.      Db
10830 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
10840 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20 61 73 73  [iDb];.      ass
10850 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
10860 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
10870 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 20  iDb, 0) );.     
10880 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
10890 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b  a->pSeqTab==0 ){
108a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
108b0 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
108c0 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43  se,.          "C
108d0 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73  REATE TABLE %Q.s
108e0 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e  qlite_sequence(n
108f0 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20  ame,seq)",.     
10900 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61       pDb->zDbSNa
10910 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  me.        );.  
10920 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
10930 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61 72  if..    /* Repar
10940 73 65 20 65 76 65 72 79 74 68 69 6e 67 20 74 6f  se everything to
10950 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65   update our inte
10960 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63 74  rnal data struct
10970 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ures */.    sqli
10980 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53  te3VdbeAddParseS
10990 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a  chemaOp(v, iDb,.
109a0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
109b0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 74  e3MPrintf(db, "t
109c0 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44  bl_name='%q' AND
109d0 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27   type!='trigger'
109e0 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  ", p->zName));. 
109f0 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68   }...  /* Add th
10a00 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69  e table to the i
10a10 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
10a20 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ntation of the d
10a30 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
10a40 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
10a50 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  y ){.    Table *
10a60 70 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65 6d 61  pOld;.    Schema
10a70 20 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70   *pSchema = p->p
10a80 53 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65  Schema;.    asse
10a90 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
10aa0 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
10ab0 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 4f  Db, 0) );.    pO
10ac0 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ld = sqlite3Hash
10ad0 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61 2d  Insert(&pSchema-
10ae0 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61  >tblHash, p->zNa
10af0 6d 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20  me, p);.    if( 
10b00 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73  pOld ){.      as
10b10 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b  sert( p==pOld );
10b20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74    /* Malloc must
10b30 20 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73   have failed ins
10b40 69 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29  ide HashInsert()
10b50 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
10b60 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
10b70 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
10b80 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70   }.    pParse->p
10b90 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  NewTable = 0;.  
10ba0 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c    db->mDbFlags |
10bb0 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43  = DBFLAG_SchemaC
10bc0 68 61 6e 67 65 3b 0a 0a 23 69 66 6e 64 65 66 20  hange;..#ifndef 
10bd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45  SQLITE_OMIT_ALTE
10be0 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 21  RTABLE.    if( !
10bf0 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  p->pSelect ){.  
10c00 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10c10 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  zName = (const c
10c20 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e  har *)pParse->sN
10c30 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20  ameToken.z;.    
10c40 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20    int nName;.   
10c50 20 20 20 61 73 73 65 72 74 28 20 21 70 53 65 6c     assert( !pSel
10c60 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26 26 20  ect && pCons && 
10c70 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 69 66  pEnd );.      if
10c80 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b  ( pCons->z==0 ){
10c90 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 73 20 3d  .        pCons =
10ca0 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20   pEnd;.      }. 
10cb0 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e       nName = (in
10cc0 74 29 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  t)((const char *
10cd0 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d  )pCons->z - zNam
10ce0 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64  e);.      p->add
10cf0 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33 20 2b  ColOffset = 13 +
10d00 20 73 71 6c 69 74 65 33 55 74 66 38 43 68 61 72   sqlite3Utf8Char
10d10 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  Len(zName, nName
10d20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
10d30 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
10d40 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
10d50 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  /*.** The parser
10d60 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
10d70 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ine in order to 
10d80 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49 45  create a new VIE
10d90 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  W.*/.void sqlite
10da0 33 43 72 65 61 74 65 56 69 65 77 28 0a 20 20 50  3CreateView(.  P
10db0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
10dc0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
10dd0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
10de0 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20  ken *pBegin,    
10df0 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
10e00 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
10e10 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
10e20 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
10e30 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f  1,     /* The to
10e40 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ken that holds t
10e50 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
10e60 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  iew */.  Token *
10e70 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54  pName2,     /* T
10e80 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f  he token that ho
10e90 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  lds the name of 
10ea0 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 45 78  the view */.  Ex
10eb0 70 72 4c 69 73 74 20 2a 70 43 4e 61 6d 65 73 2c  prList *pCNames,
10ec0 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 6c 69 73   /* Optional lis
10ed0 74 20 6f 66 20 76 69 65 77 20 63 6f 6c 75 6d 6e  t of view column
10ee0 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 53 65 6c 65   names */.  Sele
10ef0 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f  ct *pSelect,   /
10f00 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65  * A SELECT state
10f10 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62  ment that will b
10f20 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69  ecome the new vi
10f30 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  ew */.  int isTe
10f40 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 52  mp,        /* TR
10f50 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41  UE for a TEMPORA
10f60 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  RY view */.  int
10f70 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 20 20   noErr          
10f80 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72 72 6f  /* Suppress erro
10f90 72 20 6d 65 73 73 61 67 65 73 20 69 66 20 56 49  r messages if VI
10fa0 45 57 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  EW already exist
10fb0 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  s */.){.  Table 
10fc0 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63  *p;.  int n;.  c
10fd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
10fe0 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62  Token sEnd;.  Db
10ff0 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f  Fixer sFix;.  To
11000 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a  ken *pName = 0;.
11010 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c    int iDb;.  sql
11020 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
11030 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50  e->db;..  if( pP
11040 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a  arse->nVar>0 ){.
11050 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
11060 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70 61 72  Msg(pParse, "par
11070 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f 74 20  ameters are not 
11080 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65 77 73  allowed in views
11090 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65  ");.    goto cre
110a0 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 20  ate_view_fail;. 
110b0 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 61 72   }.  sqlite3Star
110c0 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  tTable(pParse, p
110d0 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69  Name1, pName2, i
110e0 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f 45  sTemp, 1, 0, noE
110f0 72 72 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  rr);.  p = pPars
11100 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
11110 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72  if( p==0 || pPar
11120 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20  se->nErr ) goto 
11130 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c  create_view_fail
11140 3b 0a 20 20 73 71 6c 69 74 65 33 54 77 6f 50 61  ;.  sqlite3TwoPa
11150 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
11160 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
11170 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62 20 3d 20  pName);.  iDb = 
11180 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
11190 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68  ndex(db, p->pSch
111a0 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 46  ema);.  sqlite3F
111b0 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50  ixInit(&sFix, pP
111c0 61 72 73 65 2c 20 69 44 62 2c 20 22 76 69 65 77  arse, iDb, "view
111d0 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  ", pName);.  if(
111e0 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63   sqlite3FixSelec
111f0 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63 74  t(&sFix, pSelect
11200 29 20 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f  ) ) goto create_
11210 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a  view_fail;..  /*
11220 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   Make a copy of 
11230 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45 43  the entire SELEC
11240 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
11250 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65   defines the vie
11260 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69 6c  w..  ** This wil
11270 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65 20  l force all the 
11280 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c  Expr.token.z val
11290 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d 69  ues to be dynami
112a0 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63  cally.  ** alloc
112b0 61 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e  ated rather than
112c0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e   point to the in
112d0 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68 69  put string - whi
112e0 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20  ch means that.  
112f0 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65 72  ** they will per
11300 73 69 73 74 20 61 66 74 65 72 20 74 68 65 20 63  sist after the c
11310 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65  urrent sqlite3_e
11320 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72  xec() call retur
11330 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53  ns..  */.  p->pS
11340 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
11350 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 53 65  electDup(db, pSe
11360 6c 65 63 74 2c 20 45 58 50 52 44 55 50 5f 52 45  lect, EXPRDUP_RE
11370 44 55 43 45 29 3b 0a 20 20 70 2d 3e 70 43 68 65  DUCE);.  p->pChe
11380 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ck = sqlite3Expr
11390 4c 69 73 74 44 75 70 28 64 62 2c 20 70 43 4e 61  ListDup(db, pCNa
113a0 6d 65 73 2c 20 45 58 50 52 44 55 50 5f 52 45 44  mes, EXPRDUP_RED
113b0 55 43 45 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  UCE);.  if( db->
113c0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
113d0 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f  oto create_view_
113e0 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61  fail;..  /* Loca
113f0 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  te the end of th
11400 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  e CREATE VIEW st
11410 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73  atement.  Make s
11420 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a  End point to.  *
11430 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a  * the end..  */.
11440 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d    sEnd = pParse-
11450 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 61  >sLastToken;.  a
11460 73 73 65 72 74 28 20 73 45 6e 64 2e 7a 5b 30 5d  ssert( sEnd.z[0]
11470 21 3d 30 20 7c 7c 20 73 45 6e 64 2e 6e 3d 3d 30  !=0 || sEnd.n==0
11480 20 29 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a   );.  if( sEnd.z
11490 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20  [0]!=';' ){.    
114a0 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e  sEnd.z += sEnd.n
114b0 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d  ;.  }.  sEnd.n =
114c0 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28   0;.  n = (int)(
114d0 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d  sEnd.z - pBegin-
114e0 3e 7a 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  >z);.  assert( n
114f0 3e 30 20 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67  >0 );.  z = pBeg
11500 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20  in->z;.  while( 
11510 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
11520 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d  [n-1]) ){ n--; }
11530 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e  .  sEnd.z = &z[n
11540 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  -1];.  sEnd.n = 
11550 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c  1;..  /* Use sql
11560 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74  ite3EndTable() t
11570 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74  o add the view t
11580 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  o the SQLITE_MAS
11590 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  TER table */.  s
115a0 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70  qlite3EndTable(p
115b0 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c  Parse, 0, &sEnd,
115c0 20 30 2c 20 30 29 3b 0a 0a 63 72 65 61 74 65 5f   0, 0);..create_
115d0 76 69 65 77 5f 66 61 69 6c 3a 0a 20 20 73 71 6c  view_fail:.  sql
115e0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
115f0 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  (db, pSelect);. 
11600 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
11610 44 65 6c 65 74 65 28 64 62 2c 20 70 43 4e 61 6d  Delete(db, pCNam
11620 65 73 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  es);.  return;.}
11630 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
11640 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
11650 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
11660 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
11670 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
11680 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
11690 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54  BLE)./*.** The T
116a0 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70  able structure p
116b0 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20  Table is really 
116c0 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e  a VIEW.  Fill in
116d0 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a   the names of.**
116e0 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
116f0 74 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20  the view in the 
11700 70 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65  pTable structure
11710 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
11720 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72  mber.** of error
11730 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  s.  If an error 
11740 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e  is seen leave an
11750 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
11760 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
11770 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
11780 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
11790 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  mes(Parse *pPars
117a0 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  e, Table *pTable
117b0 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c  ){.  Table *pSel
117c0 54 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65  Tab;   /* A fake
117d0 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63   table from whic
117e0 68 20 77 65 20 67 65 74 20 74 68 65 20 72 65 73  h we get the res
117f0 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c  ult set */.  Sel
11800 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f  ect *pSel;     /
11810 2a 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45  * Copy of the SE
11820 4c 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d  LECT that implem
11830 65 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f  ents the view */
11840 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
11850 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
11860 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74  f errors encount
11870 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  ered */.  int n;
11880 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11890 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73  emporarily holds
118a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
118b0 75 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20  ursors assigned 
118c0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
118d0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
118e0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
118f0 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f  ection for mallo
11900 63 20 65 72 72 6f 72 73 20 2a 2f 0a 23 69 66 6e  c errors */.#ifn
11910 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11920 56 49 52 54 55 41 4c 54 41 42 4c 45 09 0a 20 20  VIRTUALTABLE..  
11930 69 6e 74 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23  int rc;.#endif.#
11940 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11950 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
11960 0a 20 20 73 71 6c 69 74 65 33 5f 78 61 75 74 68  .  sqlite3_xauth
11970 20 78 41 75 74 68 3b 20 20 20 20 20 20 20 2f 2a   xAuth;       /*
11980 20 53 61 76 65 64 20 78 41 75 74 68 20 70 6f 69   Saved xAuth poi
11990 6e 74 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  nter */.#endif..
119a0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
119b0 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
119c0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
119d0 54 41 42 4c 45 0a 20 20 64 62 2d 3e 6e 53 63 68  TABLE.  db->nSch
119e0 65 6d 61 4c 6f 63 6b 2b 2b 3b 0a 20 20 72 63 20  emaLock++;.  rc 
119f0 3d 20 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c  = sqlite3VtabCal
11a00 6c 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c  lConnect(pParse,
11a10 20 70 54 61 62 6c 65 29 3b 0a 20 20 64 62 2d 3e   pTable);.  db->
11a20 6e 53 63 68 65 6d 61 4c 6f 63 6b 2d 2d 3b 0a 20  nSchemaLock--;. 
11a30 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
11a40 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
11a50 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
11a60 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ble) ) return 0;
11a70 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
11a80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
11a90 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76  W.  /* A positiv
11aa0 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65  e nCol means the
11ab0 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66   columns names f
11ac0 6f 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65  or this view are
11ad0 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e  .  ** already kn
11ae0 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  own..  */.  if( 
11af0 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29  pTable->nCol>0 )
11b00 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
11b10 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c   A negative nCol
11b20 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61   is a special ma
11b30 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61  rker meaning tha
11b40 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74  t we are current
11b50 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74  ly.  ** trying t
11b60 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  o compute the co
11b70 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20  lumn names.  If 
11b80 77 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f  we enter this ro
11b90 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20  utine with.  ** 
11ba0 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c  a negative nCol,
11bb0 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72   it means two or
11bc0 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d   more views form
11bd0 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68   a loop, like th
11be0 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
11bf0 20 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e    CREATE VIEW on
11c00 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  e AS SELECT * FR
11c10 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20  OM two;.  **    
11c20 20 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f   CREATE VIEW two
11c30 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
11c40 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  M one;.  **.  **
11c50 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 65   Actually, the e
11c60 72 72 6f 72 20 61 62 6f 76 65 20 69 73 20 6e 6f  rror above is no
11c70 77 20 63 61 75 67 68 74 20 70 72 69 6f 72 20 74  w caught prior t
11c80 6f 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20  o reaching this 
11c90 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74 20  point..  ** But 
11ca0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65  the following te
11cb0 73 74 20 69 73 20 73 74 69 6c 6c 20 69 6d 70 6f  st is still impo
11cc0 72 74 61 6e 74 20 61 73 20 69 74 20 64 6f 65 73  rtant as it does
11cd0 20 63 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69 6e   come up.  ** in
11ce0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
11cf0 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 43    ** .  **     C
11d00 52 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e  REATE TABLE main
11d10 2e 65 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20 20  .ex1(a);.  **   
11d20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20 56 49    CREATE TEMP VI
11d30 45 57 20 65 78 31 20 41 53 20 53 45 4c 45 43 54  EW ex1 AS SELECT
11d40 20 61 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20 2a   a FROM ex1;.  *
11d50 2a 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  *     SELECT * F
11d60 52 4f 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20 20  ROM temp.ex1;.  
11d70 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
11d80 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73  >nCol<0 ){.    s
11d90 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
11da0 50 61 72 73 65 2c 20 22 76 69 65 77 20 25 73 20  Parse, "view %s 
11db0 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65  is circularly de
11dc0 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e  fined", pTable->
11dd0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
11de0 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 1;.  }.  asse
11df0 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  rt( pTable->nCol
11e00 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  >=0 );..  /* If 
11e10 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c  we get this far,
11e20 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65   it means we nee
11e30 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  d to compute the
11e40 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20   table names..  
11e50 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
11e60 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
11e70 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
11e80 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20  t() will expand 
11e90 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65  any.  ** "*" ele
11ea0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73  ments in the res
11eb0 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65 20  ults set of the 
11ec0 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73  view and will as
11ed0 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a  sign cursors.  *
11ee0 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74  * to the element
11ef0 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  s of the FROM cl
11f00 61 75 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f  ause.  But we do
11f10 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20   not want these 
11f20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20  changes.  ** to 
11f30 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53  be permanent.  S
11f40 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f  o the computatio
11f50 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63  n is done on a c
11f60 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
11f70 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  T.  ** statement
11f80 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
11f90 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61  e view..  */.  a
11fa0 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70  ssert( pTable->p
11fb0 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65 6c  Select );.  pSel
11fc0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
11fd0 44 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e  Dup(db, pTable->
11fe0 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69  pSelect, 0);.  i
11ff0 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 6e  f( pSel ){.    n
12000 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b   = pParse->nTab;
12010 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  .    sqlite3SrcL
12020 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
12030 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70  (pParse, pSel->p
12040 53 72 63 29 3b 0a 20 20 20 20 70 54 61 62 6c 65  Src);.    pTable
12050 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20  ->nCol = -1;.   
12060 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
12070 44 69 73 61 62 6c 65 2b 2b 3b 0a 23 69 66 6e 64  Disable++;.#ifnd
12080 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
12090 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20  UTHORIZATION.   
120a0 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78 41 75   xAuth = db->xAu
120b0 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74  th;.    db->xAut
120c0 68 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54  h = 0;.    pSelT
120d0 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
120e0 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
120f0 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20  arse, pSel);.   
12100 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 78 41 75   db->xAuth = xAu
12110 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 53  th;.#else.    pS
12120 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
12130 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
12140 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a  (pParse, pSel);.
12150 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 72 73  #endif.    pPars
12160 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 20  e->nTab = n;.   
12170 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 70 43 68   if( pTable->pCh
12180 65 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  eck ){.      /* 
12190 43 52 45 41 54 45 20 56 49 45 57 20 6e 61 6d 65  CREATE VIEW name
121a0 28 61 72 67 6c 69 73 74 29 20 41 53 20 2e 2e 2e  (arglist) AS ...
121b0 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6e 61  .      ** The na
121c0 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  mes of the colum
121d0 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
121e0 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 0a 20  are taken from. 
121f0 20 20 20 20 20 2a 2a 20 61 72 67 6c 69 73 74 20       ** arglist 
12200 77 68 69 63 68 20 69 73 20 73 74 6f 72 65 64 20  which is stored 
12210 69 6e 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63  in pTable->pChec
12220 6b 2e 20 20 54 68 65 20 70 43 68 65 63 6b 20 66  k.  The pCheck f
12230 69 65 6c 64 0a 20 20 20 20 20 20 2a 2a 20 6e 6f  ield.      ** no
12240 72 6d 61 6c 6c 79 20 68 6f 6c 64 73 20 43 48 45  rmally holds CHE
12250 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  CK constraints o
12260 6e 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 74 61  n an ordinary ta
12270 62 6c 65 2c 20 62 75 74 20 66 6f 72 0a 20 20 20  ble, but for.   
12280 20 20 20 2a 2a 20 61 20 56 49 45 57 20 69 74 20     ** a VIEW it 
12290 68 6f 6c 64 73 20 74 68 65 20 6c 69 73 74 20 6f  holds the list o
122a0 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 0a  f column names..
122b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
122c0 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f  qlite3ColumnsFro
122d0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
122e0 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b  , pTable->pCheck
122f0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
12300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12310 20 20 20 20 26 70 54 61 62 6c 65 2d 3e 6e 43 6f      &pTable->nCo
12320 6c 2c 20 26 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  l, &pTable->aCol
12330 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
12340 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
12350 20 0a 20 20 20 20 20 20 20 26 26 20 70 50 61 72   .       && pPar
12360 73 65 2d 3e 6e 45 72 72 3d 3d 30 0a 20 20 20 20  se->nErr==0.    
12370 20 20 20 26 26 20 70 54 61 62 6c 65 2d 3e 6e 43     && pTable->nC
12380 6f 6c 3d 3d 70 53 65 6c 2d 3e 70 45 4c 69 73 74  ol==pSel->pEList
12390 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 29 7b  ->nExpr.      ){
123a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
123b0 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  SelectAddColumnT
123c0 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
123d0 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 2c 20  pParse, pTable, 
123e0 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pSel);.      }. 
123f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53 65     }else if( pSe
12400 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a  lTab ){.      /*
12410 20 43 52 45 41 54 45 20 56 49 45 57 20 6e 61 6d   CREATE VIEW nam
12420 65 20 41 53 2e 2e 2e 20 20 77 69 74 68 6f 75 74  e AS...  without
12430 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 6c 69 73   an argument lis
12440 74 2e 20 20 43 6f 6e 73 74 72 75 63 74 0a 20 20  t.  Construct.  
12450 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6c 75 6d      ** the colum
12460 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74 68 65  n names from the
12470 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
12480 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
12490 68 65 20 76 69 65 77 2e 0a 20 20 20 20 20 20 2a  he view..      *
124a0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
124b0 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20  pTable->aCol==0 
124c0 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d  );.      pTable-
124d0 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >nCol = pSelTab-
124e0 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61  >nCol;.      pTa
124f0 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c  ble->aCol = pSel
12500 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  Tab->aCol;.     
12510 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
12520 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61   0;.      pSelTa
12530 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
12540 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
12550 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
12560 64 28 64 62 2c 20 30 2c 20 70 54 61 62 6c 65 2d  d(db, 0, pTable-
12570 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20  >pSchema) );.   
12580 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
12590 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  able->nCol = 0;.
125a0 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
125b0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
125c0 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
125d0 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 73 71 6c  SelTab);.    sql
125e0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
125f0 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  (db, pSel);.    
12600 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44  db->lookaside.bD
12610 69 73 61 62 6c 65 2d 2d 3b 0a 20 20 7d 20 65 6c  isable--;.  } el
12620 73 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b  se {.    nErr++;
12630 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 70  .  }.  pTable->p
12640 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 46 6c  Schema->schemaFl
12650 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73 65  ags |= DB_Unrese
12660 74 56 69 65 77 73 3b 0a 23 65 6e 64 69 66 20 2f  tViews;.#endif /
12670 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
12680 45 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e  EW */.  return n
12690 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20  Err;  .}.#endif 
126a0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
126b0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
126c0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
126d0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
126e0 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  LE) */..#ifndef 
126f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
12700 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
12710 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72   column names fr
12720 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20 69 6e  om every VIEW in
12730 20 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a   database idx..*
12740 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
12750 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
12760 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
12770 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c  t idx){.  HashEl
12780 65 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72 74 28  em *i;.  assert(
12790 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
127a0 74 65 78 48 65 6c 64 28 64 62 2c 20 69 64 78 2c  texHeld(db, idx,
127b0 20 30 29 20 29 3b 0a 20 20 69 66 28 20 21 44 62   0) );.  if( !Db
127c0 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20  HasProperty(db, 
127d0 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56  idx, DB_UnresetV
127e0 69 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a  iews) ) return;.
127f0 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
12800 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62  shFirst(&db->aDb
12810 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74  [idx].pSchema->t
12820 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c  blHash); i;i=sql
12830 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
12840 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
12850 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
12860 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54  a(i);.    if( pT
12870 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
12880 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65       sqlite3Dele
12890 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62  teColumnNames(db
128a0 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 70  , pTab);.      p
128b0 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
128c0 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20       pTab->nCol 
128d0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
128e0 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79   DbClearProperty
128f0 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72  (db, idx, DB_Unr
12900 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65  esetViews);.}.#e
12910 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c  lse.# define sql
12920 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
12930 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  A,B).#endif /* S
12940 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20  QLITE_OMIT_VIEW 
12950 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  */../*.** This f
12960 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
12970 64 20 62 79 20 74 68 65 20 56 44 42 45 20 74 6f  d by the VDBE to
12980 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65   adjust the inte
12990 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75  rnal schema.** u
129a0 73 65 64 20 62 79 20 53 51 4c 69 74 65 20 77 68  sed by SQLite wh
129b0 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  en the btree lay
129c0 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65  er moves a table
129d0 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a   root page. The.
129e0 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20  ** root-page of 
129f0 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  a table or index
12a00 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   in database iDb
12a10 20 68 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f   has changed fro
12a20 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54  m iFrom.** to iT
12a30 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20  o..**.** Ticket 
12a40 23 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d 62  #1728:  The symb
12a50 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 73  ol table might s
12a60 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66  till contain inf
12a70 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74  ormation.** on t
12a80 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64  ables and/or ind
12a90 69 63 65 73 20 74 68 61 74 20 61 72 65 20 74 68  ices that are th
12aa0 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69  e process of bei
12ab0 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49  ng deleted..** I
12ac0 66 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b  f you are unluck
12ad0 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  y, one of those 
12ae0 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 20  deleted indices 
12af0 6f 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74 0a  or tables might.
12b00 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ** have the same
12b10 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72   rootpage number
12b20 20 61 73 20 74 68 65 20 72 65 61 6c 20 74 61 62   as the real tab
12b30 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61 74  le or index that
12b40 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76   is.** being mov
12b50 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f  ed.  So we canno
12b60 74 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e 67  t stop searching
12b70 20 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74   after the first
12b80 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61 75   match .** becau
12b90 73 65 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  se the first mat
12ba0 63 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72 20  ch might be for 
12bb0 6f 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65 74  one of the delet
12bc0 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72  ed indices.** or
12bd0 20 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20   tables and not 
12be0 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20  the table/index 
12bf0 74 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c 79  that is actually
12c00 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a   being moved..**
12c10 20 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75   We must continu
12c20 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20  e looping until 
12c30 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69  all tables and i
12c40 6e 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20 72  ndices with.** r
12c50 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68  ootpage==iFrom h
12c60 61 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72 74  ave been convert
12c70 65 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f 6f  ed to have a roo
12c80 74 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20  tpage of iTo.** 
12c90 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63  in order to be c
12ca0 65 72 74 61 69 6e 20 74 68 61 74 20 77 65 20 67  ertain that we g
12cb0 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e 65  ot the right one
12cc0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
12cd0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
12ce0 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  UUM.void sqlite3
12cf0 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 73 71  RootPageMoved(sq
12d00 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
12d10 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  Db, int iFrom, i
12d20 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45  nt iTo){.  HashE
12d30 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61  lem *pElem;.  Ha
12d40 73 68 20 2a 70 48 61 73 68 3b 0a 20 20 44 62 20  sh *pHash;.  Db 
12d50 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pDb;..  assert(
12d60 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
12d70 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
12d80 20 30 29 20 29 3b 0a 20 20 70 44 62 20 3d 20 26   0) );.  pDb = &
12d90 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
12da0 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53  pHash = &pDb->pS
12db0 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a  chema->tblHash;.
12dc0 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69    for(pElem=sqli
12dd0 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73  teHashFirst(pHas
12de0 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  h); pElem; pElem
12df0 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
12e00 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62  pElem)){.    Tab
12e10 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
12e20 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
12e30 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
12e40 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  tnum==iFrom ){. 
12e50 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20       pTab->tnum 
12e60 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  = iTo;.    }.  }
12e70 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d  .  pHash = &pDb-
12e80 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  >pSchema->idxHas
12e90 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  h;.  for(pElem=s
12ea0 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70  qliteHashFirst(p
12eb0 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
12ec0 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
12ed0 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
12ee0 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71  Index *pIdx = sq
12ef0 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
12f00 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  em);.    if( pId
12f10 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29  x->tnum==iFrom )
12f20 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e  {.      pIdx->tn
12f30 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a  um = iTo;.    }.
12f40 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
12f50 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74  .** Write code t
12f60 6f 20 65 72 61 73 65 20 74 68 65 20 74 61 62 6c  o erase the tabl
12f70 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
12f80 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74   iTable from dat
12f90 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c  abase iDb..** Al
12fa0 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f  so write code to
12fb0 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69   modify the sqli
12fc0 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
12fd0 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  and internal sch
12fe0 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74  ema.** if a root
12ff0 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72  -page of another
13000 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20   table is moved 
13010 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79  by the btree-lay
13020 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61  er whilst.** era
13030 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69  sing iTable (thi
13040 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74  s can happen wit
13050 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  h an auto-vacuum
13060 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a   database)..*/ .
13070 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74  static void dest
13080 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73  royRootPage(Pars
13090 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
130a0 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b  Table, int iDb){
130b0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
130c0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
130d0 73 65 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20  se);.  int r1 = 
130e0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
130f0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  g(pParse);.  ass
13100 65 72 74 28 20 69 54 61 62 6c 65 3e 31 20 29 3b  ert( iTable>1 );
13110 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
13120 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65 73 74 72  dOp3(v, OP_Destr
13130 6f 79 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20  oy, iTable, r1, 
13140 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d  iDb);.  sqlite3M
13150 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
13160 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13170 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
13180 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    /* OP_Destroy 
13190 73 74 6f 72 65 73 20 61 6e 20 69 6e 20 69 6e 74  stores an in int
131a0 65 67 65 72 20 72 31 2e 20 49 66 20 74 68 69 73  eger r1. If this
131b0 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73   integer.  ** is
131c0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
131d0 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  it is the root p
131e0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
131f0 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20  table moved to. 
13200 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61   ** location iTa
13210 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ble. The followi
13220 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73  ng code modifies
13230 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
13240 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a  er table to.  **
13250 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20   reflect this.. 
13260 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 4e   **.  ** The "#N
13270 4e 4e 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69  NN" in the SQL i
13280 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73  s a special cons
13290 74 61 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20  tant that means 
132a0 77 68 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20  whatever value. 
132b0 20 2a 2a 20 69 73 20 69 6e 20 72 65 67 69 73 74   ** is in regist
132c0 65 72 20 4e 4e 4e 2e 20 20 53 65 65 20 67 72 61  er NNN.  See gra
132d0 6d 6d 61 72 20 72 75 6c 65 73 20 61 73 73 6f 63  mmar rules assoc
132e0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 54  iated with the T
132f0 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 2a 2a 20  K_REGISTER.  ** 
13300 74 6f 6b 65 6e 20 66 6f 72 20 61 64 64 69 74 69  token for additi
13310 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
13320 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
13330 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
13340 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54  se, .     "UPDAT
13350 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74  E %Q.%s SET root
13360 70 61 67 65 3d 25 64 20 57 48 45 52 45 20 23 25  page=%d WHERE #%
13370 64 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23  d AND rootpage=#
13380 25 64 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65  %d",.     pParse
13390 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
133a0 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f  DbSName, MASTER_
133b0 4e 41 4d 45 2c 20 69 54 61 62 6c 65 2c 20 72 31  NAME, iTable, r1
133c0 2c 20 72 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20  , r1);.#endif.  
133d0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
133e0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
133f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  );.}../*.** Writ
13400 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 65  e VDBE code to e
13410 72 61 73 65 20 74 61 62 6c 65 20 70 54 61 62 20  rase table pTab 
13420 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74  and all associat
13430 65 64 20 69 6e 64 69 63 65 73 20 6f 6e 20 64 69  ed indices on di
13440 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75  sk..** Code to u
13450 70 64 61 74 65 20 74 68 65 20 73 71 6c 69 74 65  pdate the sqlite
13460 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20 61  _master tables a
13470 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  nd internal sche
13480 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a  ma definitions.*
13490 2a 20 69 6e 20 63 61 73 65 20 61 20 72 6f 6f 74  * in case a root
134a0 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20  -page belonging 
134b0 74 6f 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65  to another table
134c0 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65   is moved by the
134d0 20 62 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20   btree layer.** 
134e0 69 73 20 61 6c 73 6f 20 61 64 64 65 64 20 28 74  is also added (t
134f0 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77  his can happen w
13500 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ith an auto-vacu
13510 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f  um database)..*/
13520 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73  .static void des
13530 74 72 6f 79 54 61 62 6c 65 28 50 61 72 73 65 20  troyTable(Parse 
13540 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
13550 70 54 61 62 29 7b 0a 20 20 2f 2a 20 49 66 20 74  pTab){.  /* If t
13560 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
13570 62 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  be auto-vacuum c
13580 61 70 61 62 6c 65 20 28 69 66 20 53 51 4c 49 54  apable (if SQLIT
13590 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
135a0 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65  M.  ** is not de
135b0 66 69 6e 65 64 29 2c 20 74 68 65 6e 20 69 74 20  fined), then it 
135c0 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
135d0 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20  call OP_Destroy 
135e0 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c  on the.  ** tabl
135f0 65 20 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74  e and index root
13600 2d 70 61 67 65 73 20 69 6e 20 6f 72 64 65 72 2c  -pages in order,
13610 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 74   starting with t
13620 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a  he numerically .
13630 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f    ** largest roo
13640 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54  t-page number. T
13650 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 20 74  his guarantees t
13660 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hat none of the 
13670 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20  root-pages.  ** 
13680 74 6f 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  to be destroyed 
13690 69 73 20 72 65 6c 6f 63 61 74 65 64 20 62 79 20  is relocated by 
136a0 61 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65  an earlier OP_De
136b0 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74  stroy. i.e. if t
136c0 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  he.  ** followin
136d0 67 20 77 65 72 65 20 63 6f 64 65 64 3a 0a 20 20  g were coded:.  
136e0 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72  **.  ** OP_Destr
136f0 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a  oy 4 0.  ** ....
13700 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    ** OP_Destroy 
13710 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e  5 0.  **.  ** an
13720 64 20 72 6f 6f 74 20 70 61 67 65 20 35 20 68 61  d root page 5 ha
13730 70 70 65 6e 65 64 20 74 6f 20 62 65 20 74 68 65  ppened to be the
13740 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
13750 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  ge number in the
13760 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20  .  ** database, 
13770 74 68 65 6e 20 72 6f 6f 74 20 70 61 67 65 20 35  then root page 5
13780 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20   would be moved 
13790 74 6f 20 70 61 67 65 20 34 20 62 79 20 74 68 65  to page 4 by the
137a0 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72   .  ** "OP_Destr
137b0 6f 79 20 34 20 30 22 20 6f 70 63 6f 64 65 2e 20  oy 4 0" opcode. 
137c0 54 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 22  The subsequent "
137d0 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 22 20  OP_Destroy 5 0" 
137e0 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61  would hit.  ** a
137f0 20 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65 2e   free-list page.
13800 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  .  */.  int iTab
13810 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20   = pTab->tnum;. 
13820 20 69 6e 74 20 69 44 65 73 74 72 6f 79 65 64 20   int iDestroyed 
13830 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31  = 0;..  while( 1
13840 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
13850 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61  Idx;.    int iLa
13860 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20  rgest = 0;..    
13870 69 66 28 20 69 44 65 73 74 72 6f 79 65 64 3d 3d  if( iDestroyed==
13880 30 20 7c 7c 20 69 54 61 62 3c 69 44 65 73 74 72  0 || iTab<iDestr
13890 6f 79 65 64 20 29 7b 0a 20 20 20 20 20 20 69 4c  oyed ){.      iL
138a0 61 72 67 65 73 74 20 3d 20 69 54 61 62 3b 0a 20  argest = iTab;. 
138b0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64     }.    for(pId
138c0 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
138d0 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
138e0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
138f0 6e 74 20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e  nt iIdx = pIdx->
13900 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73 73 65  tnum;.      asse
13910 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d  rt( pIdx->pSchem
13920 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
13930 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   );.      if( (i
13940 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20  Destroyed==0 || 
13950 28 69 49 64 78 3c 69 44 65 73 74 72 6f 79 65 64  (iIdx<iDestroyed
13960 29 29 20 26 26 20 69 49 64 78 3e 69 4c 61 72 67  )) && iIdx>iLarg
13970 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  est ){.        i
13980 4c 61 72 67 65 73 74 20 3d 20 69 49 64 78 3b 0a  Largest = iIdx;.
13990 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
139a0 20 20 69 66 28 20 69 4c 61 72 67 65 73 74 3d 3d    if( iLargest==
139b0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
139c0 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  n;.    }else{.  
139d0 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
139e0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
139f0 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
13a00 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
13a10 20 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62       assert( iDb
13a20 3e 3d 30 20 26 26 20 69 44 62 3c 70 50 61 72 73  >=0 && iDb<pPars
13a30 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  e->db->nDb );.  
13a40 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
13a50 61 67 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72  age(pParse, iLar
13a60 67 65 73 74 2c 20 69 44 62 29 3b 0a 20 20 20 20  gest, iDb);.    
13a70 20 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69    iDestroyed = i
13a80 4c 61 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20  Largest;.    }. 
13a90 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f   }.}../*.** Remo
13aa0 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20  ve entries from 
13ab0 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e  the sqlite_statN
13ac0 20 74 61 62 6c 65 73 20 28 66 6f 72 20 4e 20 69   tables (for N i
13ad0 6e 20 28 31 2c 32 2c 33 29 29 0a 2a 2a 20 61 66  n (1,2,3)).** af
13ae0 74 65 72 20 61 20 44 52 4f 50 20 49 4e 44 45 58  ter a DROP INDEX
13af0 20 6f 72 20 44 52 4f 50 20 54 41 42 4c 45 20 63   or DROP TABLE c
13b00 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  ommand..*/.stati
13b10 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c  c void sqlite3Cl
13b20 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 0a 20  earStatTables(. 
13b30 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
13b40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
13b50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
13b60 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20  /.  int iDb,    
13b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
13b80 65 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65  e database numbe
13b90 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  r */.  const cha
13ba0 72 20 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a  r *zType,     /*
13bb0 20 22 69 64 78 22 20 6f 72 20 22 74 62 6c 22 20   "idx" or "tbl" 
13bc0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
13bd0 2a 7a 4e 61 6d 65 20 20 20 20 20 20 2f 2a 20 4e  *zName      /* N
13be0 61 6d 65 20 6f 66 20 69 6e 64 65 78 20 6f 72 20  ame of index or 
13bf0 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  table */.){.  in
13c00 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t i;.  const cha
13c10 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 70 50 61  r *zDbName = pPa
13c20 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
13c30 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 66 6f  ].zDbSName;.  fo
13c40 72 28 69 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b 2b  r(i=1; i<=4; i++
13c50 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 54 61 62  ){.    char zTab
13c60 5b 32 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  [24];.    sqlite
13c70 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
13c80 66 28 7a 54 61 62 29 2c 7a 54 61 62 2c 22 73 71  f(zTab),zTab,"sq
13c90 6c 69 74 65 5f 73 74 61 74 25 64 22 2c 69 29 3b  lite_stat%d",i);
13ca0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
13cb0 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
13cc0 2d 3e 64 62 2c 20 7a 54 61 62 2c 20 7a 44 62 4e  ->db, zTab, zDbN
13cd0 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ame) ){.      sq
13ce0 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
13cf0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
13d00 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
13d10 2e 25 73 20 57 48 45 52 45 20 25 73 3d 25 51 22  .%s WHERE %s=%Q"
13d20 2c 0a 20 20 20 20 20 20 20 20 7a 44 62 4e 61 6d  ,.        zDbNam
13d30 65 2c 20 7a 54 61 62 2c 20 7a 54 79 70 65 2c 20  e, zTab, zType, 
13d40 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  zName.      );. 
13d50 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
13d60 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
13d70 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65 2e  to drop a table.
13d80 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
13d90 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 50 61  CodeDropTable(Pa
13da0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
13db0 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 44  le *pTab, int iD
13dc0 62 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a  b, int isView){.
13dd0 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
13de0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
13df0 65 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67 65 72  e->db;.  Trigger
13e00 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 44 62   *pTrigger;.  Db
13e10 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
13e20 5b 69 44 62 5d 3b 0a 0a 20 20 76 20 3d 20 73 71  [iDb];..  v = sq
13e30 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
13e40 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
13e50 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  v!=0 );.  sqlite
13e60 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
13e70 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
13e80 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  iDb);..#ifndef S
13e90 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
13ea0 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73  ALTABLE.  if( Is
13eb0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
13ec0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13ed0 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65  AddOp0(v, OP_VBe
13ee0 67 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  gin);.  }.#endif
13ef0 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20  ..  /* Drop all 
13f00 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61  triggers associa
13f10 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  ted with the tab
13f20 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
13f30 2e 20 43 6f 64 65 0a 20 20 2a 2a 20 69 73 20 67  . Code.  ** is g
13f40 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f  enerated to remo
13f50 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20  ve entries from 
13f60 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e  sqlite_master an
13f70 64 2f 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74 65  d/or.  ** sqlite
13f80 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20  _temp_master if 
13f90 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20  required..  */. 
13fa0 20 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69   pTrigger = sqli
13fb0 74 65 33 54 72 69 67 67 65 72 4c 69 73 74 28 70  te3TriggerList(p
13fc0 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20  Parse, pTab);.  
13fd0 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20  while( pTrigger 
13fe0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
13ff0 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61  Trigger->pSchema
14000 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ==pTab->pSchema 
14010 7c 7c 20 0a 20 20 20 20 20 20 20 20 70 54 72 69  || .        pTri
14020 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64  gger->pSchema==d
14030 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
14040 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  a );.    sqlite3
14050 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 70  DropTriggerPtr(p
14060 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 29  Parse, pTrigger)
14070 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d  ;.    pTrigger =
14080 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74   pTrigger->pNext
14090 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
140a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
140b0 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65  NCREMENT.  /* Re
140c0 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73  move any entries
140d0 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73   of the sqlite_s
140e0 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73  equence table as
140f0 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20 20  sociated with.  
14100 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ** the table bei
14110 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73  ng dropped. This
14120 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   is done before 
14130 74 68 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f  the table is dro
14140 70 70 65 64 0a 20 20 2a 2a 20 61 74 20 74 68 65  pped.  ** at the
14150 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e   btree level, in
14160 20 63 61 73 65 20 74 68 65 20 73 71 6c 69 74 65   case the sqlite
14170 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
14180 6e 65 65 64 73 20 74 6f 0a 20 20 2a 2a 20 6d 6f  needs to.  ** mo
14190 76 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ve as a result o
141a0 66 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e 20  f the drop (can 
141b0 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76  happen in auto-v
141c0 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 2a  acuum mode)..  *
141d0 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61  /.  if( pTab->ta
141e0 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
141f0 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20  increment ){.   
14200 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
14210 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
14220 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
14230 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  Q.sqlite_sequenc
14240 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22  e WHERE name=%Q"
14250 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62  ,.      pDb->zDb
14260 53 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  SName, pTab->zNa
14270 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65  me.    );.  }.#e
14280 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20  ndif..  /* Drop 
14290 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  all SQLITE_MASTE
142a0 52 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65  R table and inde
142b0 78 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 72  x entries that r
142c0 65 66 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a  efer to the.  **
142d0 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67   table. The prog
142e0 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74  ram name loops t
142f0 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65  hrough the maste
14300 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65  r table and dele
14310 74 65 73 0a 20 20 2a 2a 20 65 76 65 72 79 20 72  tes.  ** every r
14320 6f 77 20 74 68 61 74 20 72 65 66 65 72 73 20 74  ow that refers t
14330 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65  o a table of the
14340 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
14350 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a  e one being.  **
14360 20 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65   dropped. Trigge
14370 72 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73  rs are handled s
14380 65 70 61 72 61 74 65 6c 79 20 62 65 63 61 75 73  eparately becaus
14390 65 20 61 20 74 72 69 67 67 65 72 20 63 61 6e 20  e a trigger can 
143a0 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20  be.  ** created 
143b0 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  in the temp data
143c0 62 61 73 65 20 74 68 61 74 20 72 65 66 65 72 73  base that refers
143d0 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61   to a table in a
143e0 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 64 61 74 61  nother.  ** data
143f0 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  base..  */.  sql
14400 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
14410 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22  pParse, .      "
14420 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
14430 73 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65  s WHERE tbl_name
14440 3d 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74  =%Q and type!='t
14450 72 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20  rigger'",.      
14460 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 4d  pDb->zDbSName, M
14470 41 53 54 45 52 5f 4e 41 4d 45 2c 20 70 54 61 62  ASTER_NAME, pTab
14480 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
14490 21 69 73 56 69 65 77 20 26 26 20 21 49 73 56 69  !isView && !IsVi
144a0 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
144b0 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28     destroyTable(
144c0 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20  pParse, pTab);. 
144d0 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20   }..  /* Remove 
144e0 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
144f0 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e  from SQLite's in
14500 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e  ternal schema an
14510 64 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68  d modify.  ** th
14520 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
14530 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69  .  */.  if( IsVi
14540 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
14550 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14560 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65 73 74  dOp4(v, OP_VDest
14570 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  roy, iDb, 0, 0, 
14580 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pTab->zName, 0);
14590 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
145a0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44  beAddOp4(v, OP_D
145b0 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20 30  ropTable, iDb, 0
145c0 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
145d0 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  , 0);.  sqlite3C
145e0 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
145f0 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69  se, iDb);.  sqli
14600 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64  teViewResetAll(d
14610 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  b, iDb);.}../*.*
14620 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
14630 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74  s called to do t
14640 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f  he work of a DRO
14650 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  P TABLE statemen
14660 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74  t..** pName is t
14670 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
14680 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70  able to be dropp
14690 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
146a0 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72  te3DropTable(Par
146b0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
146c0 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20  ist *pName, int 
146d0 69 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72  isView, int noEr
146e0 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  r){.  Table *pTa
146f0 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
14700 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
14710 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
14720 69 44 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e  iDb;..  if( db->
14730 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
14740 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
14750 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  op_table;.  }.  
14760 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
14770 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73  nErr==0 );.  ass
14780 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
14790 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  ==1 );.  if( sql
147a0 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
147b0 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78  Parse) ) goto ex
147c0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
147d0 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d   if( noErr ) db-
147e0 3e 73 75 70 70 72 65 73 73 45 72 72 2b 2b 3b 0a  >suppressErr++;.
147f0 20 20 61 73 73 65 72 74 28 20 69 73 56 69 65 77    assert( isView
14800 3d 3d 30 20 7c 7c 20 69 73 56 69 65 77 3d 3d 4c  ==0 || isView==L
14810 4f 43 41 54 45 5f 56 49 45 57 20 29 3b 0a 20 20  OCATE_VIEW );.  
14820 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
14830 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50  cateTableItem(pP
14840 61 72 73 65 2c 20 69 73 56 69 65 77 2c 20 26 70  arse, isView, &p
14850 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 69  Name->a[0]);.  i
14860 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73  f( noErr ) db->s
14870 75 70 70 72 65 73 73 45 72 72 2d 2d 3b 0a 0a 20  uppressErr--;.. 
14880 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
14890 20 20 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20      if( noErr ) 
148a0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
148b0 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61  yNamedSchema(pPa
148c0 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  rse, pName->a[0]
148d0 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  .zDatabase);.   
148e0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
148f0 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62  table;.  }.  iDb
14900 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
14910 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
14920 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73  ->pSchema);.  as
14930 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
14940 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a  iDb<db->nDb );..
14950 20 20 2f 2a 20 49 66 20 70 54 61 62 20 69 73 20    /* If pTab is 
14960 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c  a virtual table,
14970 20 63 61 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c   call ViewGetCol
14980 75 6d 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e  umnNames() to en
14990 73 75 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20  sure.  ** it is 
149a0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
149b0 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
149c0 6c 28 70 54 61 62 29 20 26 26 20 73 71 6c 69 74  l(pTab) && sqlit
149d0 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
149e0 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
149f0 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  b) ){.    goto e
14a00 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
14a10 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
14a20 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
14a30 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
14a40 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73  t code;.    cons
14a50 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53  t char *zTab = S
14a60 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
14a70 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
14a80 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
14a90 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20  iDb].zDbSName;. 
14aa0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
14ab0 41 72 67 32 20 3d 20 30 3b 0a 20 20 20 20 69 66  Arg2 = 0;.    if
14ac0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
14ad0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
14ae0 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20  E_DELETE, zTab, 
14af0 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20  0, zDb)){.      
14b00 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
14b10 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  able;.    }.    
14b20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20  if( isView ){.  
14b30 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
14b40 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
14b50 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
14b60 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
14b70 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65  P_VIEW;.      }e
14b80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
14b90 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
14ba0 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 23 69  VIEW;.      }.#i
14bb0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14bc0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
14bd0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56     }else if( IsV
14be0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
14bf0 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
14c00 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45 3b  ITE_DROP_VTABLE;
14c10 0a 20 20 20 20 20 20 7a 41 72 67 32 20 3d 20 73  .      zArg2 = s
14c20 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28  qlite3GetVTable(
14c30 64 62 2c 20 70 54 61 62 29 2d 3e 70 4d 6f 64 2d  db, pTab)->pMod-
14c40 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20  >zName;.#endif. 
14c50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14c60 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
14c70 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20   && iDb==1 ){.  
14c80 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
14c90 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41  ITE_DROP_TEMP_TA
14ca0 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  BLE;.      }else
14cb0 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
14cc0 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42   SQLITE_DROP_TAB
14cd0 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LE;.      }.    
14ce0 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
14cf0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
14d00 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a  e, code, pTab->z
14d10 4e 61 6d 65 2c 20 7a 41 72 67 32 2c 20 7a 44 62  Name, zArg2, zDb
14d20 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
14d30 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
14d40 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
14d50 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
14d60 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
14d70 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61  ELETE, pTab->zNa
14d80 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
14d90 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
14da0 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
14db0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
14dc0 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
14dd0 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22  p(pTab->zName, "
14de0 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20  sqlite_", 7)==0 
14df0 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53  .    && sqlite3S
14e00 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e  trNICmp(pTab->zN
14e10 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 74 61  ame, "sqlite_sta
14e20 74 22 2c 20 31 31 29 21 3d 30 20 29 7b 0a 20 20  t", 11)!=0 ){.  
14e30 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
14e40 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
14e50 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64   %s may not be d
14e60 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a  ropped", pTab->z
14e70 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
14e80 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
14e90 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
14ea0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
14eb0 20 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f 50 20   /* Ensure DROP 
14ec0 54 41 42 4c 45 20 69 73 20 6e 6f 74 20 75 73 65  TABLE is not use
14ed0 64 20 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e 64  d on a view, and
14ee0 20 44 52 4f 50 20 56 49 45 57 20 69 73 20 6e 6f   DROP VIEW is no
14ef0 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61  t used.  ** on a
14f00 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
14f10 66 28 20 69 73 56 69 65 77 20 26 26 20 70 54 61  f( isView && pTa
14f20 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  b->pSelect==0 ){
14f30 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
14f40 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73  rMsg(pParse, "us
14f50 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20  e DROP TABLE to 
14f60 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22  delete table %s"
14f70 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
14f80 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
14f90 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  op_table;.  }.  
14fa0 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20 70  if( !isView && p
14fb0 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
14fc0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14fd0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65  Msg(pParse, "use
14fe0 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65   DROP VIEW to de
14ff0 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c 20 70  lete view %s", p
15000 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
15010 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
15020 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69  table;.  }.#endi
15030 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
15040 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20   code to remove 
15050 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  the table from t
15060 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a  he master table.
15070 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20    ** on disk..  
15080 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
15090 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
150a0 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
150b0 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
150c0 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
150d0 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 1, iDb);.    
150e0 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74  sqlite3ClearStat
150f0 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69  Tables(pParse, i
15100 44 62 2c 20 22 74 62 6c 22 2c 20 70 54 61 62 2d  Db, "tbl", pTab-
15110 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
15120 69 74 65 33 46 6b 44 72 6f 70 54 61 62 6c 65 28  ite3FkDropTable(
15130 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2c 20 70  pParse, pName, p
15140 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Tab);.    sqlite
15150 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 70  3CodeDropTable(p
15160 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 44 62  Parse, pTab, iDb
15170 2c 20 69 73 56 69 65 77 29 3b 0a 20 20 7d 0a 0a  , isView);.  }..
15180 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a  exit_drop_table:
15190 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
151a0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d  tDelete(db, pNam
151b0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  e);.}../*.** Thi
151c0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
151d0 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  led to create a 
151e0 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  new foreign key 
151f0 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  on the table.** 
15200 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
15210 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70  construction.  p
15220 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e  FromCol determin
15230 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73  es which columns
15240 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65  .** in the curre
15250 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74  nt table point t
15260 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  o the foreign ke
15270 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d  y.  If pFromCol=
15280 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65  =0 then.** conne
15290 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68  ct the key to th
152a0 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e  e last column in
152b0 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20  serted.  pTo is 
152c0 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74  the name of.** t
152d0 68 65 20 74 61 62 6c 65 20 72 65 66 65 72 72 65  he table referre
152e0 64 20 74 6f 20 28 61 2e 6b 2e 61 20 74 68 65 20  d to (a.k.a the 
152f0 22 70 61 72 65 6e 74 22 20 74 61 62 6c 65 29 2e  "parent" table).
15300 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69    pToCol is a li
15310 73 74 0a 2a 2a 20 6f 66 20 74 61 62 6c 65 73 20  st.** of tables 
15320 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 54  in the parent pT
15330 6f 20 74 61 62 6c 65 2e 20 20 66 6c 61 67 73 20  o table.  flags 
15340 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20  contains all.** 
15350 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
15360 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72  t the conflict r
15370 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
15380 74 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a  thms specified.*
15390 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45  * in the ON DELE
153a0 54 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e  TE, ON UPDATE an
153b0 64 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75  d ON INSERT clau
153c0 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b  ses..**.** An FK
153d0 65 79 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ey structure is 
153e0 63 72 65 61 74 65 64 20 61 6e 64 20 61 64 64 65  created and adde
153f0 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  d to the table c
15400 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65  urrently.** unde
15410 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69  r construction i
15420 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e  n the pParse->pN
15430 65 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 0a 2a  ewTable field..*
15440 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e  *.** The foreign
15450 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72 20   key is set for 
15460 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73  IMMEDIATE proces
15470 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75  sing.  A subsequ
15480 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73  ent call.** to s
15490 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69  qlite3DeferForei
154a0 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68  gnKey() might ch
154b0 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45 46  ange this to DEF
154c0 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ERRED..*/.void s
154d0 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72 65  qlite3CreateFore
154e0 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20  ignKey(.  Parse 
154f0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
15500 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
15510 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
15520 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43  *pFromCol,  /* C
15530 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74  olumns in this t
15540 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20  able that point 
15550 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  to other table *
15560 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20  /.  Token *pTo, 
15570 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
15580 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74 61   of the other ta
15590 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ble */.  ExprLis
155a0 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a  t *pToCol,    /*
155b0 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   Columns in the 
155c0 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
155d0 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
155e0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63        /* Conflic
155f0 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
15600 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20  orithms. */.){. 
15610 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
15620 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64  Parse->db;.#ifnd
15630 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
15640 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65  OREIGN_KEY.  FKe
15650 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20  y *pFKey = 0;.  
15660 46 4b 65 79 20 2a 70 4e 65 78 74 54 6f 3b 0a 20  FKey *pNextTo;. 
15670 20 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72   Table *p = pPar
15680 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
15690 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e   int nByte;.  in
156a0 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  t i;.  int nCol;
156b0 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61  .  char *z;..  a
156c0 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b  ssert( pTo!=0 );
156d0 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 49  .  if( p==0 || I
156e0 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
156f0 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
15700 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20  if( pFromCol==0 
15710 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  ){.    int iCol 
15720 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20  = p->nCol-1;.   
15730 20 69 66 28 20 4e 45 56 45 52 28 69 43 6f 6c 3c   if( NEVER(iCol<
15740 30 29 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  0) ) goto fk_end
15750 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c  ;.    if( pToCol
15760 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70   && pToCol->nExp
15770 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  r!=1 ){.      sq
15780 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
15790 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b  arse, "foreign k
157a0 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20  ey on %s".      
157b0 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65     " should refe
157c0 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63  rence only one c
157d0 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25  olumn of table %
157e0 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e  T",.         p->
157f0 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
15800 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f  , pTo);.      go
15810 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d  to fk_end;.    }
15820 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20  .    nCol = 1;. 
15830 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f   }else if( pToCo
15840 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78  l && pToCol->nEx
15850 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45  pr!=pFromCol->nE
15860 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xpr ){.    sqlit
15870 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
15880 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62  e,.        "numb
15890 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
158a0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65   foreign key doe
158b0 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
158c0 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20  number of ".    
158d0 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20      "columns in 
158e0 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
158f0 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f  able");.    goto
15900 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65   fk_end;.  }else
15910 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72  {.    nCol = pFr
15920 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20  omCol->nExpr;.  
15930 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  }.  nByte = size
15940 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 28 6e 43  of(*pFKey) + (nC
15950 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 70 46 4b  ol-1)*sizeof(pFK
15960 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70  ey->aCol[0]) + p
15970 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28  To->n + 1;.  if(
15980 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66   pToCol ){.    f
15990 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c  or(i=0; i<pToCol
159a0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
159b0 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71       nByte += sq
159c0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54  lite3Strlen30(pT
159d0 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
159e0 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  ) + 1;.    }.  }
159f0 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74  .  pFKey = sqlit
15a00 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
15a10 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  b, nByte );.  if
15a20 28 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a 20 20  ( pFKey==0 ){.  
15a30 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
15a40 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f   }.  pFKey->pFro
15a50 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e  m = p;.  pFKey->
15a60 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70  pNextFrom = p->p
15a70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61  FKey;.  z = (cha
15a80 72 2a 29 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b  r*)&pFKey->aCol[
15a90 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e  nCol];.  pFKey->
15aa0 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70  zTo = z;.  memcp
15ab0 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f  y(z, pTo->z, pTo
15ac0 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e  ->n);.  z[pTo->n
15ad0 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
15ae0 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 7a 20  Dequote(z);.  z 
15af0 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70  += pTo->n+1;.  p
15b00 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f  FKey->nCol = nCo
15b10 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f  l;.  if( pFromCo
15b20 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65  l==0 ){.    pFKe
15b30 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d  y->aCol[0].iFrom
15b40 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
15b50 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69  }else{.    for(i
15b60 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
15b70 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  {.      int j;. 
15b80 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
15b90 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  p->nCol; j++){. 
15ba0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
15bb0 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f  e3StrICmp(p->aCo
15bc0 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f  l[j].zName, pFro
15bd0 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  mCol->a[i].zName
15be0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
15bf0 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d    pFKey->aCol[i]
15c00 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20  .iFrom = j;.    
15c10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15c20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
15c30 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e       if( j>=p->n
15c40 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Col ){.        s
15c50 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
15c60 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
15c70 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d    "unknown colum
15c80 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65  n \"%s\" in fore
15c90 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
15ca0 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  on", .          
15cb0 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
15cc0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
15cd0 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
15ce0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
15cf0 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
15d00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
15d10 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
15d20 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
15d30 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61  rlen30(pToCol->a
15d40 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
15d50 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d    pFKey->aCol[i]
15d60 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20  .zCol = z;.     
15d70 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f   memcpy(z, pToCo
15d80 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e  l->a[i].zName, n
15d90 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20  );.      z[n] = 
15da0 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b  0;.      z += n+
15db0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
15dc0 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
15dd0 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61   = 0;.  pFKey->a
15de0 41 63 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29  Action[0] = (u8)
15df0 28 66 6c 61 67 73 20 26 20 30 78 66 66 29 3b 20  (flags & 0xff); 
15e00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e             /* ON
15e10 20 44 45 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a   DELETE action *
15e20 2f 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69  /.  pFKey->aActi
15e30 6f 6e 5b 31 5d 20 3d 20 28 75 38 29 28 28 66 6c  on[1] = (u8)((fl
15e40 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66  ags >> 8 ) & 0xf
15e50 66 29 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44  f);    /* ON UPD
15e60 41 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20  ATE action */.. 
15e70 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
15e80 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
15e90 64 62 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d  db, 0, p->pSchem
15ea0 61 29 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20  a) );.  pNextTo 
15eb0 3d 20 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65  = (FKey *)sqlite
15ec0 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e  3HashInsert(&p->
15ed0 70 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73  pSchema->fkeyHas
15ee0 68 2c 20 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  h, .      pFKey-
15ef0 3e 7a 54 6f 2c 20 28 76 6f 69 64 20 2a 29 70 46  >zTo, (void *)pF
15f00 4b 65 79 0a 20 20 29 3b 0a 20 20 69 66 28 20 70  Key.  );.  if( p
15f10 4e 65 78 74 54 6f 3d 3d 70 46 4b 65 79 20 29 7b  NextTo==pFKey ){
15f20 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46  .    sqlite3OomF
15f30 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 67 6f  ault(db);.    go
15f40 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20  to fk_end;.  }. 
15f50 20 69 66 28 20 70 4e 65 78 74 54 6f 20 29 7b 0a   if( pNextTo ){.
15f60 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 78      assert( pNex
15f70 74 54 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30 20  tTo->pPrevTo==0 
15f80 29 3b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e  );.    pFKey->pN
15f90 65 78 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f 3b  extTo = pNextTo;
15fa0 0a 20 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70 50  .    pNextTo->pP
15fb0 72 65 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a 20  revTo = pFKey;. 
15fc0 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68   }..  /* Link th
15fd0 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f  e foreign key to
15fe0 20 74 68 65 20 74 61 62 6c 65 20 61 73 20 74 68   the table as th
15ff0 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a  e last step..  *
16000 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70  /.  p->pFKey = p
16010 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20  FKey;.  pFKey = 
16020 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71  0;..fk_end:.  sq
16030 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
16040 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f  pFKey);.#endif /
16050 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
16060 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
16070 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  EY) */.  sqlite3
16080 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
16090 62 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20  b, pFromCol);.  
160a0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
160b0 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c  elete(db, pToCol
160c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
160d0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
160e0 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49  ed when an INITI
160f0 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f  ALLY IMMEDIATE o
16100 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  r INITIALLY DEFE
16110 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69  RRED.** clause i
16120 73 20 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f  s seen as part o
16130 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  f a foreign key 
16140 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65  definition.  The
16150 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70   isDeferred.** p
16160 61 72 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f  arameter is 1 fo
16170 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  r INITIALLY DEFE
16180 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49  RRED and 0 for I
16190 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
161a0 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76  TE..** The behav
161b0 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ior of the most 
161c0 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64  recently created
161d0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
161e0 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f  adjusted.** acco
161f0 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  rdingly..*/.void
16200 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72   sqlite3DeferFor
16210 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70  eignKey(Parse *p
16220 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66  Parse, int isDef
16230 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20  erred){.#ifndef 
16240 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
16250 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20  IGN_KEY.  Table 
16260 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70  *pTab;.  FKey *p
16270 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61  FKey;.  if( (pTa
16280 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
16290 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46  Table)==0 || (pF
162a0 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65  Key = pTab->pFKe
162b0 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  y)==0 ) return;.
162c0 20 20 61 73 73 65 72 74 28 20 69 73 44 65 66 65    assert( isDefe
162d0 72 72 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66  rred==0 || isDef
162e0 65 72 72 65 64 3d 3d 31 20 29 3b 20 2f 2a 20 45  erred==1 ); /* E
162f0 56 3a 20 52 2d 33 30 33 32 33 2d 32 31 39 31 37  V: R-30323-21917
16300 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44   */.  pFKey->isD
16310 65 66 65 72 72 65 64 20 3d 20 28 75 38 29 69 73  eferred = (u8)is
16320 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66  Deferred;.#endif
16330 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
16340 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
16350 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65 66 69  l erase and refi
16360 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20  ll index *pIdx. 
16370 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64   This is.** used
16380 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61   to initialize a
16390 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 69   newly created i
163a0 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d  ndex or to recom
163b0 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  pute the.** cont
163c0 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  ent of an index 
163d0 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61  in response to a
163e0 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64   REINDEX command
163f0 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f  ..**.** if memRo
16400 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65  otPage is not ne
16410 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73  gative, it means
16420 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20   that the index 
16430 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61  is newly.** crea
16440 74 65 64 2e 20 20 54 68 65 20 72 65 67 69 73 74  ted.  The regist
16450 65 72 20 73 70 65 63 69 66 69 65 64 20 62 79 20  er specified by 
16460 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74  memRootPage cont
16470 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  ains 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 2e 20 20 49 66 20 6d  the index.  If m
164a0 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65  emRootPage is ne
164b0 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20  gative, then.** 
164c0 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64  the index alread
164d0 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73  y exists and mus
164e0 74 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66  t be cleared bef
164f0 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c  ore being refill
16500 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f  ed and.** the ro
16510 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
16520 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74  f the index is t
16530 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78  aken from pIndex
16540 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69  ->tnum..*/.stati
16550 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  c void sqlite3Re
16560 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20  fillIndex(Parse 
16570 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a  *pParse, Index *
16580 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52  pIndex, int memR
16590 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c  ootPage){.  Tabl
165a0 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78  e *pTab = pIndex
165b0 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68  ->pTable;  /* Th
165c0 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
165d0 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
165e0 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
165f0 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42  nTab++;     /* B
16600 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64  tree cursor used
16610 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69   for pTab */.  i
16620 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72 73 65  nt iIdx = pParse
16630 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a  ->nTab++;     /*
16640 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73   Btree cursor us
16650 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f  ed for pIndex */
16660 0a 20 20 69 6e 74 20 69 53 6f 72 74 65 72 3b 20  .  int iSorter; 
16670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16680 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e    /* Cursor open
16690 65 64 20 62 79 20 4f 70 65 6e 53 6f 72 74 65 72  ed by OpenSorter
166a0 20 28 69 66 20 69 6e 20 75 73 65 29 20 2a 2f 0a   (if in use) */.
166b0 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20    int addr1;    
166c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166d0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
166e0 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20  op of loop */.  
166f0 69 6e 74 20 61 64 64 72 32 3b 20 20 20 20 20 20  int addr2;      
16700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16710 2a 20 41 64 64 72 65 73 73 20 74 6f 20 6a 75 6d  * Address to jum
16720 70 20 74 6f 20 66 6f 72 20 6e 65 78 74 20 69 74  p to for next it
16730 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
16740 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20   tnum;          
16750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
16760 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65  oot page of inde
16770 78 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 74  x */.  int iPart
16780 49 64 78 4c 61 62 65 6c 3b 20 20 20 20 20 20 20  IdxLabel;       
16790 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f        /* Jump to
167a0 20 74 68 69 73 20 6c 61 62 65 6c 20 74 6f 20 73   this label to s
167b0 6b 69 70 20 61 20 72 6f 77 20 2a 2f 0a 20 20 56  kip a row */.  V
167c0 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
167d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
167e0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
167f0 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c  nto this virtual
16800 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65   machine */.  Ke
16810 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20  yInfo *pKey;    
16820 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16830 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65  KeyInfo for inde
16840 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  x */.  int regRe
16850 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20  cord;           
16860 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
16870 72 20 68 6f 6c 64 69 6e 67 20 61 73 73 65 6d 62  r holding assemb
16880 6c 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  led index record
16890 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
168a0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
168b0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
168c0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
168d0 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73  */.  int iDb = s
168e0 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
168f0 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e  dex(db, pIndex->
16900 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64  pSchema);..#ifnd
16910 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
16920 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69  UTHORIZATION.  i
16930 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
16940 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
16950 54 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64  TE_REINDEX, pInd
16960 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20  ex->zName, 0,.  
16970 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
16980 2e 7a 44 62 53 4e 61 6d 65 20 29 20 29 7b 0a 20  .zDbSName ) ){. 
16990 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
169a0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75  endif..  /* Requ
169b0 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ire a write-lock
169c0 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f   on the table to
169d0 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70   perform this op
169e0 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  eration */.  sql
169f0 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
16a00 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
16a10 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e  >tnum, 1, pTab->
16a20 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73  zName);..  v = s
16a30 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
16a40 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
16a50 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
16a60 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30  ( memRootPage>=0
16a70 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d   ){.    tnum = m
16a80 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65  emRootPage;.  }e
16a90 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20  lse{.    tnum = 
16aa0 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20  pIndex->tnum;.  
16ab0 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74  }.  pKey = sqlit
16ac0 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78  e3KeyInfoOfIndex
16ad0 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29  (pParse, pIndex)
16ae0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
16af0 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !=0 || db->mallo
16b00 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
16b10 65 2d 3e 6e 45 72 72 20 29 3b 0a 0a 20 20 2f 2a  e->nErr );..  /*
16b20 20 4f 70 65 6e 20 74 68 65 20 73 6f 72 74 65 72   Open the sorter
16b30 20 63 75 72 73 6f 72 20 69 66 20 77 65 20 61 72   cursor if we ar
16b40 65 20 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f  e to use one. */
16b50 0a 20 20 69 53 6f 72 74 65 72 20 3d 20 70 50 61  .  iSorter = pPa
16b60 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73  rse->nTab++;.  s
16b70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
16b80 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  (v, OP_SorterOpe
16b90 6e 2c 20 69 53 6f 72 74 65 72 2c 20 30 2c 20 70  n, iSorter, 0, p
16ba0 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20  Index->nKeyCol, 
16bb0 28 63 68 61 72 2a 29 0a 20 20 20 20 20 20 20 20  (char*).        
16bc0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
16bd0 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b  te3KeyInfoRef(pK
16be0 65 79 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  ey), P4_KEYINFO)
16bf0 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
16c00 20 74 61 62 6c 65 2e 20 4c 6f 6f 70 20 74 68 72   table. Loop thr
16c10 6f 75 67 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66  ough all rows of
16c20 20 74 68 65 20 74 61 62 6c 65 2c 20 69 6e 73 65   the table, inse
16c30 72 74 69 6e 67 20 69 6e 64 65 78 0a 20 20 2a 2a  rting index.  **
16c40 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 74 68   records into th
16c50 65 20 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 73  e sorter. */.  s
16c60 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
16c70 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44  pParse, iTab, iD
16c80 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
16c90 52 65 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d  Read);.  addr1 =
16ca0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16cb0 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
16cc0 20 69 54 61 62 2c 20 30 29 3b 20 56 64 62 65 43   iTab, 0); VdbeC
16cd0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 72 65  overage(v);.  re
16ce0 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
16cf0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
16d00 73 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47  se);..  sqlite3G
16d10 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
16d20 70 50 61 72 73 65 2c 70 49 6e 64 65 78 2c 69 54  pParse,pIndex,iT
16d30 61 62 2c 72 65 67 52 65 63 6f 72 64 2c 30 2c 26  ab,regRecord,0,&
16d40 69 50 61 72 74 49 64 78 4c 61 62 65 6c 2c 30 2c  iPartIdxLabel,0,
16d50 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
16d60 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
16d70 72 74 65 72 49 6e 73 65 72 74 2c 20 69 53 6f 72  rterInsert, iSor
16d80 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  ter, regRecord);
16d90 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  .  sqlite3Resolv
16da0 65 50 61 72 74 49 64 78 4c 61 62 65 6c 28 70 50  ePartIdxLabel(pP
16db0 61 72 73 65 2c 20 69 50 61 72 74 49 64 78 4c 61  arse, iPartIdxLa
16dc0 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  bel);.  sqlite3V
16dd0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16de0 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
16df0 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  1+1); VdbeCovera
16e00 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
16e10 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
16e20 61 64 64 72 31 29 3b 0a 20 20 69 66 28 20 6d 65  addr1);.  if( me
16e30 6d 52 6f 6f 74 50 61 67 65 3c 30 20 29 20 73 71  mRootPage<0 ) sq
16e40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16e50 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75  v, OP_Clear, tnu
16e60 6d 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74  m, iDb);.  sqlit
16e70 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
16e80 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49  OP_OpenWrite, iI
16e90 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a  dx, tnum, iDb, .
16ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16eb0 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b 65 79      (char *)pKey
16ec0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
16ed0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
16ee0 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42  geP5(v, OPFLAG_B
16ef0 55 4c 4b 43 53 52 7c 28 28 6d 65 6d 52 6f 6f 74  ULKCSR|((memRoot
16f00 50 61 67 65 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f  Page>=0)?OPFLAG_
16f10 50 32 49 53 52 45 47 3a 30 29 29 3b 0a 0a 20 20  P2ISREG:0));..  
16f20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
16f30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16f40 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 53 6f 72  SorterSort, iSor
16f50 74 65 72 2c 20 30 29 3b 20 56 64 62 65 43 6f 76  ter, 0); VdbeCov
16f60 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20  erage(v);.  if( 
16f70 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
16f80 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69 6e 74  ndex) ){.    int
16f90 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j2 = sqlite3Vdb
16fa0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
16fb0 2b 20 33 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  + 3;.    sqlite3
16fc0 56 64 62 65 47 6f 74 6f 28 76 2c 20 6a 32 29 3b  VdbeGoto(v, j2);
16fd0 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c  .    addr2 = sql
16fe0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
16ff0 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ddr(v);.    sqli
17000 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
17010 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 43 6f 6d  (v, OP_SorterCom
17020 70 61 72 65 2c 20 69 53 6f 72 74 65 72 2c 20 6a  pare, iSorter, j
17030 32 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a 20 20  2, regRecord,.  
17040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17050 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e         pIndex->n
17060 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76  KeyCol); VdbeCov
17070 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
17080 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74  lite3UniqueConst
17090 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 4f 45  raint(pParse, OE
170a0 5f 41 62 6f 72 74 2c 20 70 49 6e 64 65 78 29 3b  _Abort, pIndex);
170b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64  .  }else{.    ad
170c0 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
170d0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
170e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
170f0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
17100 6f 72 74 65 72 44 61 74 61 2c 20 69 53 6f 72 74  orterData, iSort
17110 65 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 69  er, regRecord, i
17120 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Idx);.  sqlite3V
17130 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
17140 53 65 65 6b 45 6e 64 2c 20 69 49 64 78 29 3b 0a  SeekEnd, iIdx);.
17150 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17160 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
17170 65 72 74 2c 20 69 49 64 78 2c 20 72 65 67 52 65  ert, iIdx, regRe
17180 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
17190 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
171a0 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
171b0 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  SULT);.  sqlite3
171c0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
171d0 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64  Parse, regRecord
171e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
171f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
17200 74 65 72 4e 65 78 74 2c 20 69 53 6f 72 74 65 72  terNext, iSorter
17210 2c 20 61 64 64 72 32 29 3b 20 56 64 62 65 43 6f  , addr2); VdbeCo
17220 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
17230 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
17240 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 73  (v, addr1);..  s
17250 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
17260 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54  (v, OP_Close, iT
17270 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ab);.  sqlite3Vd
17280 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
17290 6c 6f 73 65 2c 20 69 49 64 78 29 3b 0a 20 20 73  lose, iIdx);.  s
172a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
172b0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 53  (v, OP_Close, iS
172c0 6f 72 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  orter);.}../*.**
172d0 20 41 6c 6c 6f 63 61 74 65 20 68 65 61 70 20 73   Allocate heap s
172e0 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 61 6e 20  pace to hold an 
172f0 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 77 69 74  Index object wit
17300 68 20 6e 43 6f 6c 20 63 6f 6c 75 6d 6e 73 2e 0a  h nCol columns..
17310 2a 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74  **.** Increase t
17320 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69  he allocation si
17330 7a 65 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e  ze to provide an
17340 20 65 78 74 72 61 20 6e 45 78 74 72 61 20 62 79   extra nExtra by
17350 74 65 73 0a 2a 2a 20 6f 66 20 38 2d 62 79 74 65  tes.** of 8-byte
17360 20 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61   aligned space a
17370 66 74 65 72 20 74 68 65 20 49 6e 64 65 78 20 6f  fter the Index o
17380 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e  bject and return
17390 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f   a.** pointer to
173a0 20 74 68 69 73 20 65 78 74 72 61 20 73 70 61 63   this extra spac
173b0 65 20 69 6e 20 2a 70 70 45 78 74 72 61 2e 0a 2a  e in *ppExtra..*
173c0 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33  /.Index *sqlite3
173d0 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a  AllocateIndexObj
173e0 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ect(.  sqlite3 *
173f0 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 44  db,         /* D
17400 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
17410 6f 6e 20 2a 2f 0a 20 20 69 31 36 20 6e 43 6f 6c  on */.  i16 nCol
17420 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
17430 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
17440 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69  columns in the i
17450 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ndex */.  int nE
17460 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 2f  xtra,          /
17470 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
17480 73 20 6f 66 20 65 78 74 72 61 20 73 70 61 63 65  s of extra space
17490 20 74 6f 20 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63   to alloc */.  c
174a0 68 61 72 20 2a 2a 70 70 45 78 74 72 61 20 20 20  har **ppExtra   
174b0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
174c0 6f 20 74 68 65 20 22 65 78 74 72 61 22 20 73 70  o the "extra" sp
174d0 61 63 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ace */.){.  Inde
174e0 78 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  x *p;           
174f0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 69 6e   /* Allocated in
17500 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  dex object */.  
17510 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
17520 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
17530 20 73 70 61 63 65 20 66 6f 72 20 49 6e 64 65 78   space for Index
17540 20 6f 62 6a 65 63 74 20 2b 20 61 72 72 61 79 73   object + arrays
17550 20 2a 2f 0a 0a 20 20 6e 42 79 74 65 20 3d 20 52   */..  nByte = R
17560 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64  OUND8(sizeof(Ind
17570 65 78 29 29 20 2b 20 20 20 20 20 20 20 20 20 20  ex)) +          
17580 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72      /* Index str
17590 75 63 74 75 72 65 20 20 2a 2f 0a 20 20 20 20 20  ucture  */.     
175a0 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65       ROUND8(size
175b0 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 20  of(char*)*nCol) 
175c0 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  +         /* Ind
175d0 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f  ex.azColl     */
175e0 0a 20 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44  .          ROUND
175f0 38 28 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29  8(sizeof(LogEst)
17600 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20  *(nCol+1) +     
17610 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77 4c 6f  /* Index.aiRowLo
17620 67 45 73 74 20 20 20 2a 2f 0a 20 20 20 20 20 20  gEst   */.      
17630 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
17640 66 28 69 31 36 29 2a 6e 43 6f 6c 20 2b 20 20 20  f(i16)*nCol +   
17650 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
17660 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a  x.aiColumn   */.
17670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17680 20 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c   sizeof(u8)*nCol
17690 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
176a0 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64  * Index.aSortOrd
176b0 65 72 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69  er */.  p = sqli
176c0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
176d0 64 62 2c 20 6e 42 79 74 65 20 2b 20 6e 45 78 74  db, nByte + nExt
176e0 72 61 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ra);.  if( p ){.
176f0 20 20 20 20 63 68 61 72 20 2a 70 45 78 74 72 61      char *pExtra
17700 20 3d 20 28 28 63 68 61 72 2a 29 70 29 2b 52 4f   = ((char*)p)+RO
17710 55 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65  UND8(sizeof(Inde
17720 78 29 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 43 6f  x));.    p->azCo
17730 6c 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ll = (const char
17740 2a 2a 29 70 45 78 74 72 61 3b 20 70 45 78 74 72  **)pExtra; pExtr
17750 61 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  a += ROUND8(size
17760 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 3b  of(char*)*nCol);
17770 0a 20 20 20 20 70 2d 3e 61 69 52 6f 77 4c 6f 67  .    p->aiRowLog
17780 45 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70  Est = (LogEst*)p
17790 45 78 74 72 61 3b 20 70 45 78 74 72 61 20 2b 3d  Extra; pExtra +=
177a0 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a   sizeof(LogEst)*
177b0 28 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 70 2d  (nCol+1);.    p-
177c0 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36  >aiColumn = (i16
177d0 2a 29 70 45 78 74 72 61 3b 20 20 20 20 20 20 20  *)pExtra;       
177e0 70 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66  pExtra += sizeof
177f0 28 69 31 36 29 2a 6e 43 6f 6c 3b 0a 20 20 20 20  (i16)*nCol;.    
17800 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  p->aSortOrder = 
17810 28 75 38 2a 29 70 45 78 74 72 61 3b 0a 20 20 20  (u8*)pExtra;.   
17820 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43   p->nColumn = nC
17830 6f 6c 3b 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 43  ol;.    p->nKeyC
17840 6f 6c 20 3d 20 6e 43 6f 6c 20 2d 20 31 3b 0a 20  ol = nCol - 1;. 
17850 20 20 20 2a 70 70 45 78 74 72 61 20 3d 20 28 28     *ppExtra = ((
17860 63 68 61 72 2a 29 70 29 20 2b 20 6e 42 79 74 65  char*)p) + nByte
17870 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
17880 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
17890 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f  e a new index fo
178a0 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20  r an SQL table. 
178b0 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69   pName1.pName2 i
178c0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
178d0 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20  e index .** and 
178e0 70 54 62 6c 4c 69 73 74 20 69 73 20 74 68 65 20  pTblList is the 
178f0 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
17900 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
17910 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77  indexed.  Both w
17920 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20  ill .** be NULL 
17930 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65  for a primary ke
17940 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68  y or an index th
17950 61 74 20 69 73 20 63 72 65 61 74 65 64 20 74 6f  at is created to
17960 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e   satisfy a.** UN
17970 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
17980 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20    If pTable and 
17990 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c  pIndex are NULL,
179a0 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   use pParse->pNe
179b0 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65  wTable.** as the
179c0 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   table to be ind
179d0 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70  exed.  pParse->p
179e0 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20 74 61  NewTable is a ta
179f0 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63  ble that is.** c
17a00 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
17a10 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 61 20  onstructed by a 
17a20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
17a30 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c  tement..**.** pL
17a40 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
17a50 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
17a60 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77  ndexed.  pList w
17a70 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74  ill be NULL if t
17a80 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d  his.** is a prim
17a90 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75  ary key or uniqu
17aa0 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  e-constraint on 
17ab0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
17ac0 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20  column added.** 
17ad0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
17ae0 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
17af0 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a  struction.  .*/.
17b00 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61  void sqlite3Crea
17b10 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  teIndex(.  Parse
17b20 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
17b30 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   All information
17b40 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72 73   about this pars
17b50 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  e */.  Token *pN
17b60 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69 72  ame1,     /* Fir
17b70 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78  st part of index
17b80 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55   name. May be NU
17b90 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
17ba0 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53 65  Name2,     /* Se
17bb0 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64  cond part of ind
17bc0 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20  ex name. May be 
17bd0 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73  NULL */.  SrcLis
17be0 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20  t *pTblName, /* 
17bf0 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20  Table to index. 
17c00 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  Use pParse->pNew
17c10 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20  Table if 0 */.  
17c20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
17c30 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20     /* A list of 
17c40 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
17c50 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  dexed */.  int o
17c60 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a  nError,       /*
17c70 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67   OE_Abort, OE_Ig
17c80 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65  nore, OE_Replace
17c90 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a  , or OE_None */.
17ca0 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c    Token *pStart,
17cb0 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41       /* The CREA
17cc0 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65  TE token that be
17cd0 67 69 6e 73 20 74 68 69 73 20 73 74 61 74 65 6d  gins this statem
17ce0 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ent */.  Expr *p
17cf0 50 49 57 68 65 72 65 2c 20 20 20 20 2f 2a 20 57  PIWhere,    /* W
17d00 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20  HERE clause for 
17d10 70 61 72 74 69 61 6c 20 69 6e 64 69 63 65 73 20  partial indices 
17d20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
17d30 65 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74 20  er,     /* Sort 
17d40 6f 72 64 65 72 20 6f 66 20 70 72 69 6d 61 72 79  order of primary
17d50 20 6b 65 79 20 77 68 65 6e 20 70 4c 69 73 74 3d   key when pList=
17d60 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69  =NULL */.  int i
17d70 66 4e 6f 74 45 78 69 73 74 2c 20 20 20 20 2f 2a  fNotExist,    /*
17d80 20 4f 6d 69 74 20 65 72 72 6f 72 20 69 66 20 69   Omit error if i
17d90 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
17da0 73 74 73 20 2a 2f 0a 20 20 75 38 20 69 64 78 54  sts */.  u8 idxT
17db0 79 70 65 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ype         /* T
17dc0 68 65 20 69 6e 64 65 78 20 74 79 70 65 20 2a 2f  he index type */
17dd0 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
17de0 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61  b = 0;     /* Ta
17df0 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
17e00 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  d */.  Index *pI
17e10 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54  ndex = 0;   /* T
17e20 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63  he index to be c
17e30 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72  reated */.  char
17e40 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20   *zName = 0;    
17e50 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
17e60 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e  index */.  int n
17e70 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
17e80 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61  /* Number of cha
17e90 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65  racters in zName
17ea0 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   */.  int i, j;.
17eb0 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20    DbFixer sFix; 
17ec0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73         /* For as
17ed0 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65  signing database
17ee0 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65   names to pTable
17ef0 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72   */.  int sortOr
17f00 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20  derMask;   /* 1 
17f10 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e  to honor DESC in
17f20 20 69 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67   index.  0 to ig
17f30 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  nore. */.  sqlit
17f40 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
17f50 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20  >db;.  Db *pDb; 
17f60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17f70 68 65 20 73 70 65 63 69 66 69 63 20 74 61 62 6c  he specific tabl
17f80 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
17f90 20 69 6e 64 65 78 65 64 20 64 61 74 61 62 61 73   indexed databas
17fa0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  e */.  int iDb; 
17fb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
17fc0 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61  ndex of the data
17fd0 62 61 73 65 20 74 68 61 74 20 69 73 20 62 65 69  base that is bei
17fe0 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  ng written */.  
17ff0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30  Token *pName = 0
18000 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66  ;    /* Unqualif
18010 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ied name of the 
18020 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20  index to create 
18030 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  */.  struct Expr
18040 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74  List_item *pList
18050 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f  Item; /* For loo
18060 70 69 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20  ping over pList 
18070 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  */.  int nExtra 
18080 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
18090 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61        /* Space a
180a0 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 45 78  llocated for zEx
180b0 74 72 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  tra[] */.  int n
180c0 45 78 74 72 61 43 6f 6c 3b 20 20 20 20 20 20 20  ExtraCol;       
180d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
180e0 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 63  umber of extra c
180f0 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 2a 2f  olumns needed */
18100 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61 20  .  char *zExtra 
18110 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
18120 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61      /* Extra spa
18130 63 65 20 61 66 74 65 72 20 74 68 65 20 49 6e 64  ce after the Ind
18140 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 49  ex object */.  I
18150 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30 3b 20 20  ndex *pPk = 0;  
18160 20 20 20 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b      /* PRIMARY K
18170 45 59 20 69 6e 64 65 78 20 66 6f 72 20 57 49 54  EY index for WIT
18180 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
18190 73 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e  s */..  if( db->
181a0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
181b0 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
181c0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
181d0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
181e0 7d 0a 20 20 69 66 28 20 49 4e 5f 44 45 43 4c 41  }.  if( IN_DECLA
181f0 52 45 5f 56 54 41 42 20 26 26 20 69 64 78 54 79  RE_VTAB && idxTy
18200 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59  pe!=SQLITE_IDXTY
18210 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 20 29 7b  PE_PRIMARYKEY ){
18220 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
18230 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
18240 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
18250 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
18260 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
18270 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
18280 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a  ate_index;.  }..
18290 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
182a0 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
182b0 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
182c0 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66   Return early if
182d0 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f   not found..  */
182e0 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21  .  if( pTblName!
182f0 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73  =0 ){..    /* Us
18300 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69  e the two-part i
18310 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74  ndex name to det
18320 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62  ermine the datab
18330 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73  ase .    ** to s
18340 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 74 61  earch for the ta
18350 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20 74  ble. 'Fix' the t
18360 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69  able name to thi
18370 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f  s db.    ** befo
18380 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68  re looking up th
18390 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e table..    */.
183a0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
183b0 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a  e1 && pName2 );.
183c0 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
183d0 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
183e0 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
183f0 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
18400 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f    if( iDb<0 ) go
18410 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18420 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
18430 28 20 70 4e 61 6d 65 20 26 26 20 70 4e 61 6d 65  ( pName && pName
18440 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  ->z );..#ifndef 
18450 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50  SQLITE_OMIT_TEMP
18460 44 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  DB.    /* If the
18470 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20   index name was 
18480 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65  unqualified, che
18490 63 6b 20 69 66 20 74 68 65 20 74 61 62 6c 65 0a  ck if the table.
184a0 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70      ** is a temp
184b0 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73   table. If so, s
184c0 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
184d0 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20  to 1. Do not do 
184e0 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 66 20 69  this.    ** if i
184f0 6e 69 74 69 61 6c 69 73 69 6e 67 20 61 20 64 61  nitialising a da
18500 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20  tabase schema.. 
18510 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 64     */.    if( !d
18520 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
18530 20 20 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c        pTab = sql
18540 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75  ite3SrcListLooku
18550 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61  p(pParse, pTblNa
18560 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  me);.      if( p
18570 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70  Name2->n==0 && p
18580 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63  Tab && pTab->pSc
18590 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d  hema==db->aDb[1]
185a0 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  .pSchema ){.    
185b0 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20      iDb = 1;.   
185c0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
185d0 66 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69  f..    sqlite3Fi
185e0 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61  xInit(&sFix, pPa
185f0 72 73 65 2c 20 69 44 62 2c 20 22 69 6e 64 65 78  rse, iDb, "index
18600 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  ", pName);.    i
18610 66 28 20 73 71 6c 69 74 65 33 46 69 78 53 72 63  f( sqlite3FixSrc
18620 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c  List(&sFix, pTbl
18630 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  Name) ){.      /
18640 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 70 61  * Because the pa
18650 72 73 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20  rser constructs 
18660 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20  pTblName from a 
18670 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65  single identifie
18680 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  r,.      ** sqli
18690 74 65 33 46 69 78 53 72 63 4c 69 73 74 20 63 61  te3FixSrcList ca
186a0 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f  n never fail. */
186b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29  .      assert(0)
186c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
186d0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
186e0 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65  TableItem(pParse
186f0 2c 20 30 2c 20 26 70 54 62 6c 4e 61 6d 65 2d 3e  , 0, &pTblName->
18700 61 5b 30 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  a[0]);.    asser
18710 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
18720 6c 65 64 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d  led==0 || pTab==
18730 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  0 );.    if( pTa
18740 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  b==0 ) goto exit
18750 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
18760 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 26 26     if( iDb==1 &&
18770 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
18780 63 68 65 6d 61 21 3d 70 54 61 62 2d 3e 70 53 63  chema!=pTab->pSc
18790 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71  hema ){.      sq
187a0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
187b0 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
187c0 20 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65    "cannot create
187d0 20 61 20 54 45 4d 50 20 69 6e 64 65 78 20 6f 6e   a TEMP index on
187e0 20 6e 6f 6e 2d 54 45 4d 50 20 74 61 62 6c 65 20   non-TEMP table 
187f0 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20  \"%s\"",.       
18800 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29      pTab->zName)
18810 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
18820 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
18830 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 48      }.    if( !H
18840 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20  asRowid(pTab) ) 
18850 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
18860 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
18870 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  b);.  }else{.   
18880 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d   assert( pName==
18890 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
188a0 20 70 53 74 61 72 74 3d 3d 30 20 29 3b 0a 20 20   pStart==0 );.  
188b0 20 20 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d    pTab = pParse-
188c0 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20  >pNewTable;.    
188d0 69 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f  if( !pTab ) goto
188e0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
188f0 65 78 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  ex;.    iDb = sq
18900 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
18910 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
18920 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62  hema);.  }.  pDb
18930 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
18940 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  ;..  assert( pTa
18950 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
18960 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
18970 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0 );.  if( sqlit
18980 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d  e3StrNICmp(pTab-
18990 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  >zName, "sqlite_
189a0 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 20 20  ", 7)==0 .      
189b0 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   && db->init.bus
189c0 79 3d 3d 30 0a 23 69 66 20 53 51 4c 49 54 45 5f  y==0.#if SQLITE_
189d0 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
189e0 49 4f 4e 0a 20 20 20 20 20 20 20 26 26 20 73 71  ION.       && sq
189f0 6c 69 74 65 33 55 73 65 72 41 75 74 68 54 61 62  lite3UserAuthTab
18a00 6c 65 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3d  le(pTab->zName)=
18a10 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  =0.#endif.      
18a20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
18a30 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65  Cmp(&pTab->zName
18a40 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c  [7],"altertab_",
18a50 39 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  9)!=0 ){.    sql
18a60 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
18a70 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d  rse, "table %s m
18a80 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
18a90 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
18aa0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
18ab0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
18ac0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
18ad0 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28  _OMIT_VIEW.  if(
18ae0 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
18af0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
18b00 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
18b10 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  iews may not be 
18b20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67  indexed");.    g
18b30 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
18b40 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69  index;.  }.#endi
18b50 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
18b60 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
18b70 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  LE.  if( IsVirtu
18b80 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
18b90 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
18ba0 70 50 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c  pParse, "virtual
18bb0 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20   tables may not 
18bc0 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20  be indexed");.  
18bd0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
18be0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65  te_index;.  }.#e
18bf0 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ndif..  /*.  ** 
18c00 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66  Find the name of
18c10 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b   the index.  Mak
18c20 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
18c30 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74  not already anot
18c40 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  her.  ** index o
18c50 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  r table with the
18c60 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20   same name.  .  
18c70 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f  **.  ** Exceptio
18c80 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65  n:  If we are re
18c90 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20  ading the names 
18ca0 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64  of permanent ind
18cb0 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20  ices from the.  
18cc0 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ** sqlite_master
18cd0 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20   table (because 
18ce0 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
18cf0 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73  ss changed the s
18d00 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20  chema) and.  ** 
18d10 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  one of the index
18d20 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20   names collides 
18d30 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66  with the name of
18d40 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
18d50 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78  le or.  ** index
18d60 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63  , then we will c
18d70 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65  ontinue to proce
18d80 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  ss this index.. 
18d90 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d   **.  ** If pNam
18da0 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
18db0 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64  at we are.  ** d
18dc0 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72  ealing with a pr
18dd0 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49  imary key or UNI
18de0 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
18df0 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65   We have to inve
18e00 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20  nt our.  ** own 
18e10 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  name..  */.  if(
18e20 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e   pName ){.    zN
18e30 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
18e40 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
18e50 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  Name);.    if( z
18e60 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65  Name==0 ) goto e
18e70 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18e80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
18e90 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  ame->z!=0 );.   
18ea0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
18eb0 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
18ec0 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a  ctName(pParse, z
18ed0 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67  Name) ){.      g
18ee0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
18ef0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
18f00 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
18f10 75 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28  usy ){.      if(
18f20 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
18f30 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21  e(db, zName, 0)!
18f40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
18f50 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
18f60 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20  arse, "there is 
18f70 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 20  already a table 
18f80 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65  named %s", zName
18f90 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
18fa0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
18fb0 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
18fc0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
18fd0 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
18fe0 61 6d 65 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61  ame, pDb->zDbSNa
18ff0 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
19000 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74 20  if( !ifNotExist 
19010 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
19020 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
19030 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72  e, "index %s alr
19040 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e  eady exists", zN
19050 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
19060 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
19070 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
19080 79 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  y );.        sql
19090 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
190a0 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
190b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
190c0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
190d0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
190e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
190f0 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c  n;.    Index *pL
19100 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f  oop;.    for(pLo
19110 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c  op=pTab->pIndex,
19120 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f   n=1; pLoop; pLo
19130 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c  op=pLoop->pNext,
19140 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d   n++){}.    zNam
19150 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
19160 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 61  tf(db, "sqlite_a
19170 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22 2c  utoindex_%s_%d",
19180 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29   pTab->zName, n)
19190 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ;.    if( zName=
191a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
191b0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
191c0 65 78 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ex;.    }..    /
191d0 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  * Automatic inde
191e0 78 20 6e 61 6d 65 73 20 67 65 6e 65 72 61 74 65  x names generate
191f0 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 73 71  d from within sq
19200 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74  lite3_declare_vt
19210 61 62 28 29 0a 20 20 20 20 2a 2a 20 6d 75 73 74  ab().    ** must
19220 20 68 61 76 65 20 6e 61 6d 65 73 20 74 68 61 74   have names that
19230 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 66 72   are distinct fr
19240 6f 6d 20 6e 6f 72 6d 61 6c 20 61 75 74 6f 6d 61  om normal automa
19250 74 69 63 20 69 6e 64 65 78 20 6e 61 6d 65 73 2e  tic index names.
19260 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
19270 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 20  owing statement 
19280 63 6f 6e 76 65 72 74 73 20 22 73 71 6c 69 74 65  converts "sqlite
19290 33 5f 61 75 74 6f 69 6e 64 65 78 2e 2e 2e 22 20  3_autoindex..." 
192a0 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 22 73 71 6c  into.    ** "sql
192b0 69 74 65 33 5f 62 75 74 6f 69 6e 64 65 78 2e 2e  ite3_butoindex..
192c0 2e 22 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d  ." in order to m
192d0 61 6b 65 20 74 68 65 20 6e 61 6d 65 73 20 64 69  ake the names di
192e0 73 74 69 6e 63 74 2e 0a 20 20 20 20 2a 2a 20 54  stinct..    ** T
192f0 68 65 20 22 76 74 61 62 5f 65 72 72 2e 74 65 73  he "vtab_err.tes
19300 74 22 20 74 65 73 74 20 64 65 6d 6f 6e 73 74 72  t" test demonstr
19310 61 74 65 73 20 74 68 65 20 6e 65 65 64 20 6f 66  ates the need of
19320 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 2e   this statement.
19330 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 4e 5f 44   */.    if( IN_D
19340 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 7a 4e  ECLARE_VTAB ) zN
19350 61 6d 65 5b 37 5d 2b 2b 3b 0a 20 20 7d 0a 0a 20  ame[7]++;.  }.. 
19360 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75   /* Check for au
19370 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63  thorization to c
19380 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a  reate an index..
19390 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
193a0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
193b0 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63  ZATION.  {.    c
193c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
193d0 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 3b 0a   pDb->zDbSName;.
193e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
193f0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
19400 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
19410 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
19420 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  ), 0, zDb) ){.  
19430 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
19440 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
19450 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45  }.    i = SQLITE
19460 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20  _CREATE_INDEX;. 
19470 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
19480 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 20  PDB && iDb==1 ) 
19490 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  i = SQLITE_CREAT
194a0 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  E_TEMP_INDEX;.  
194b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
194c0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69  hCheck(pParse, i
194d0 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  , zName, pTab->z
194e0 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Name, zDb) ){.  
194f0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
19500 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
19510 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
19520 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20  /* If pList==0, 
19530 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f  it means this ro
19540 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
19550 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61   to make a prima
19560 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20  ry.  ** key out 
19570 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  of the last colu
19580 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  mn added to the 
19590 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
195a0 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53  truction..  ** S
195b0 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20  o create a fake 
195c0 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65  list to simulate
195d0 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   this..  */.  if
195e0 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
195f0 20 20 54 6f 6b 65 6e 20 70 72 65 76 43 6f 6c 3b    Token prevCol;
19600 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  .    Column *pCo
19610 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  l = &pTab->aCol[
19620 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20  pTab->nCol-1];. 
19630 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67     pCol->colFlag
19640 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 55 4e 49  s |= COLFLAG_UNI
19650 51 55 45 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  QUE;.    sqlite3
19660 54 6f 6b 65 6e 49 6e 69 74 28 26 70 72 65 76 43  TokenInit(&prevC
19670 6f 6c 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  ol, pCol->zName)
19680 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  ;.    pList = sq
19690 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
196a0 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 0a 20  end(pParse, 0,. 
196b0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
196c0 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
196d0 2c 20 54 4b 5f 49 44 2c 20 26 70 72 65 76 43 6f  , TK_ID, &prevCo
196e0 6c 2c 20 30 29 29 3b 0a 20 20 20 20 69 66 28 20  l, 0));.    if( 
196f0 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  pList==0 ) goto 
19700 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
19710 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  x;.    assert( p
19720 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  List->nExpr==1 )
19730 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
19740 72 4c 69 73 74 53 65 74 53 6f 72 74 4f 72 64 65  rListSetSortOrde
19750 72 28 70 4c 69 73 74 2c 20 73 6f 72 74 4f 72 64  r(pList, sortOrd
19760 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
19770 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
19780 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 70 50 61  tCheckLength(pPa
19790 72 73 65 2c 20 70 4c 69 73 74 2c 20 22 69 6e 64  rse, pList, "ind
197a0 65 78 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ex");.  }..  /* 
197b0 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
197c0 61 6e 79 20 62 79 74 65 73 20 6f 66 20 73 70 61  any bytes of spa
197d0 63 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20  ce are required 
197e0 74 6f 20 73 74 6f 72 65 20 65 78 70 6c 69 63 69  to store explici
197f0 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69 66 69  tly.  ** specifi
19800 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
19810 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a  uence names..  *
19820 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
19830 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
19840 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
19850 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  pr = pList->a[i]
19860 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  .pExpr;.    asse
19870 72 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a  rt( pExpr!=0 );.
19880 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
19890 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b  p==TK_COLLATE ){
198a0 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b 3d  .      nExtra +=
198b0 20 28 31 20 2b 20 73 71 6c 69 74 65 33 53 74 72   (1 + sqlite3Str
198c0 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a  len30(pExpr->u.z
198d0 54 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 20  Token));.    }. 
198e0 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41   }..  /* .  ** A
198f0 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65  llocate the inde
19900 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20  x structure. .  
19910 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c  */.  nName = sql
19920 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
19930 6d 65 29 3b 0a 20 20 6e 45 78 74 72 61 43 6f 6c  me);.  nExtraCol
19940 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 6e 4b   = pPk ? pPk->nK
19950 65 79 43 6f 6c 20 3a 20 31 3b 0a 20 20 70 49 6e  eyCol : 1;.  pIn
19960 64 65 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c  dex = sqlite3All
19970 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74  ocateIndexObject
19980 28 64 62 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70  (db, pList->nExp
19990 72 20 2b 20 6e 45 78 74 72 61 43 6f 6c 2c 0a 20  r + nExtraCol,. 
199a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199c0 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20 6e 45 78       nName + nEx
199d0 74 72 61 20 2b 20 31 2c 20 26 7a 45 78 74 72 61  tra + 1, &zExtra
199e0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
199f0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
19a00 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
19a10 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61  e_index;.  }.  a
19a20 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
19a30 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64  E_ALIGNMENT(pInd
19a40 65 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 29  ex->aiRowLogEst)
19a50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   );.  assert( EI
19a60 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
19a70 4e 54 28 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c  NT(pIndex->azCol
19a80 6c 29 20 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  l) );.  pIndex->
19a90 7a 4e 61 6d 65 20 3d 20 7a 45 78 74 72 61 3b 0a  zName = zExtra;.
19aa0 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 4e 61 6d    zExtra += nNam
19ab0 65 20 2b 20 31 3b 0a 20 20 6d 65 6d 63 70 79 28  e + 1;.  memcpy(
19ac0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a  pIndex->zName, z
19ad0 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a  Name, nName+1);.
19ae0 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
19af0 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65   = pTab;.  pInde
19b00 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38  x->onError = (u8
19b10 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64  )onError;.  pInd
19b20 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20  ex->uniqNotNull 
19b30 3d 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  = onError!=OE_No
19b40 6e 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 64  ne;.  pIndex->id
19b50 78 54 79 70 65 20 3d 20 69 64 78 54 79 70 65 3b  xType = idxType;
19b60 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  .  pIndex->pSche
19b70 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ma = db->aDb[iDb
19b80 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 49 6e  ].pSchema;.  pIn
19b90 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 70  dex->nKeyCol = p
19ba0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69  List->nExpr;.  i
19bb0 66 28 20 70 50 49 57 68 65 72 65 20 29 7b 0a 20  f( pPIWhere ){. 
19bc0 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
19bd0 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70  eSelfReference(p
19be0 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f  Parse, pTab, NC_
19bf0 50 61 72 74 49 64 78 2c 20 70 50 49 57 68 65 72  PartIdx, pPIWher
19c00 65 2c 20 30 29 3b 0a 20 20 20 20 70 49 6e 64 65  e, 0);.    pInde
19c10 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  x->pPartIdxWhere
19c20 20 3d 20 70 50 49 57 68 65 72 65 3b 0a 20 20 20   = pPIWhere;.   
19c30 20 70 50 49 57 68 65 72 65 20 3d 20 30 3b 0a 20   pPIWhere = 0;. 
19c40 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c   }.  assert( sql
19c50 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
19c60 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
19c70 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
19c80 6f 20 73 65 65 20 69 66 20 77 65 20 73 68 6f 75  o see if we shou
19c90 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65  ld honor DESC re
19ca0 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20  quests on index 
19cb0 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69  columns.  */.  i
19cc0 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  f( pDb->pSchema-
19cd0 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20  >file_format>=4 
19ce0 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72  ){.    sortOrder
19cf0 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20  Mask = -1;   /* 
19d00 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20  Honor DESC */.  
19d10 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f  }else{.    sortO
19d20 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20  rderMask = 0;   
19d30 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20   /* Ignore DESC 
19d40 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 61  */.  }..  /* Ana
19d50 6c 79 7a 65 20 74 68 65 20 6c 69 73 74 20 6f 66  lyze the list of
19d60 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
19d70 74 20 66 6f 72 6d 20 74 68 65 20 74 65 72 6d 73  t form the terms
19d80 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e   of the index an
19d90 64 0a 20 20 2a 2a 20 72 65 70 6f 72 74 20 61 6e  d.  ** report an
19da0 79 20 65 72 72 6f 72 73 2e 20 20 49 6e 20 74 68  y errors.  In th
19db0 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
19dc0 65 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ere the expressi
19dd0 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 0a 20 20  on is exactly.  
19de0 2a 2a 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d  ** a table colum
19df0 6e 2c 20 73 74 6f 72 65 20 74 68 61 74 20 63 6f  n, store that co
19e00 6c 75 6d 6e 20 69 6e 20 61 69 43 6f 6c 75 6d 6e  lumn in aiColumn
19e10 5b 5d 2e 20 20 46 6f 72 20 67 65 6e 65 72 61 6c  [].  For general
19e20 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 20 20   expressions,.  
19e30 2a 2a 20 70 6f 70 75 6c 61 74 65 20 70 49 6e 64  ** populate pInd
19e40 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20 61 6e 64  ex->aColExpr and
19e50 20 73 74 6f 72 65 20 58 4e 5f 45 58 50 52 20 28   store XN_EXPR (
19e60 2d 32 29 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b  -2) in aiColumn[
19e70 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44  ]..  **.  ** TOD
19e80 4f 3a 20 49 73 73 75 65 20 61 20 77 61 72 6e 69  O: Issue a warni
19e90 6e 67 20 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ng if two or mor
19ea0 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
19eb0 20 69 6e 64 65 78 20 61 72 65 20 69 64 65 6e 74   index are ident
19ec0 69 63 61 6c 2e 0a 20 20 2a 2a 20 54 4f 44 4f 3a  ical..  ** TODO:
19ed0 20 49 73 73 75 65 20 61 20 77 61 72 6e 69 6e 67   Issue a warning
19ee0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 70 72   if the table pr
19ef0 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75 73 65  imary key is use
19f00 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
19f10 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6b 65 79 2e  .  ** index key.
19f20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  .  */.  for(i=0,
19f30 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c 69 73 74   pListItem=pList
19f40 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  ->a; i<pList->nE
19f50 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49  xpr; i++, pListI
19f60 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  tem++){.    Expr
19f70 20 2a 70 43 45 78 70 72 3b 20 20 20 20 20 20 20   *pCExpr;       
19f80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
19f90 65 20 69 2d 74 68 20 69 6e 64 65 78 20 65 78 70  e i-th index exp
19fa0 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  ression */.    i
19fb0 6e 74 20 72 65 71 75 65 73 74 65 64 53 6f 72 74  nt requestedSort
19fc0 4f 72 64 65 72 3b 20 20 20 20 20 20 20 20 2f 2a  Order;        /*
19fd0 20 41 53 43 20 6f 72 20 44 45 53 43 20 6f 6e 20   ASC or DESC on 
19fe0 74 68 65 20 69 2d 74 68 20 65 78 70 72 65 73 73  the i-th express
19ff0 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  ion */.    const
1a000 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20   char *zColl;   
1a010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
1a020 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1a030 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 73 71 6c  name */..    sql
1a040 69 74 65 33 53 74 72 69 6e 67 54 6f 49 64 28 70  ite3StringToId(p
1a050 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 29  ListItem->pExpr)
1a060 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  ;.    sqlite3Res
1a070 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63  olveSelfReferenc
1a080 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
1a090 4e 43 5f 49 64 78 45 78 70 72 2c 20 70 4c 69 73  NC_IdxExpr, pLis
1a0a0 74 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 30 29  tItem->pExpr, 0)
1a0b0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
1a0c0 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78  ->nErr ) goto ex
1a0d0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1a0e0 0a 20 20 20 20 70 43 45 78 70 72 20 3d 20 73 71  .    pCExpr = sq
1a0f0 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
1a100 6c 61 74 65 28 70 4c 69 73 74 49 74 65 6d 2d 3e  late(pListItem->
1a110 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
1a120 70 43 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43  pCExpr->op!=TK_C
1a130 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 69  OLUMN ){.      i
1a140 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d  f( pTab==pParse-
1a150 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20  >pNewTable ){.  
1a160 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1a170 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 65  orMsg(pParse, "e
1a180 78 70 72 65 73 73 69 6f 6e 73 20 70 72 6f 68 69  xpressions prohi
1a190 62 69 74 65 64 20 69 6e 20 50 52 49 4d 41 52 59  bited in PRIMARY
1a1a0 20 4b 45 59 20 61 6e 64 20 22 0a 20 20 20 20 20   KEY and ".     
1a1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1c0 20 20 20 20 20 20 20 20 20 20 20 22 55 4e 49 51             "UNIQ
1a1d0 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 29  UE constraints")
1a1e0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
1a1f0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1a200 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a210 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c  if( pIndex->aCol
1a220 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Expr==0 ){.     
1a230 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43 6f     ExprList *pCo
1a240 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  py = sqlite3Expr
1a250 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4c 69 73  ListDup(db, pLis
1a260 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  t, 0);.        p
1a270 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20  Index->aColExpr 
1a280 3d 20 70 43 6f 70 79 3b 0a 20 20 20 20 20 20 20  = pCopy;.       
1a290 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
1a2a0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
1a2b0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 70      assert( pCop
1a2c0 79 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  y!=0 );.        
1a2d0 20 20 70 4c 69 73 74 49 74 65 6d 20 3d 20 26 70    pListItem = &p
1a2e0 43 6f 70 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  Copy->a[i];.    
1a2f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1a300 20 20 20 20 6a 20 3d 20 58 4e 5f 45 58 50 52 3b      j = XN_EXPR;
1a310 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  .      pIndex->a
1a320 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f  iColumn[i] = XN_
1a330 45 58 50 52 3b 0a 20 20 20 20 20 20 70 49 6e 64  EXPR;.      pInd
1a340 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20  ex->uniqNotNull 
1a350 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1a360 20 20 20 20 20 20 6a 20 3d 20 70 43 45 78 70 72        j = pCExpr
1a370 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
1a380 20 61 73 73 65 72 74 28 20 6a 3c 3d 30 78 37 66   assert( j<=0x7f
1a390 66 66 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ff );.      if( 
1a3a0 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a  j<0 ){.        j
1a3b0 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
1a3c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1a3d0 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f  pTab->aCol[j].no
1a3e0 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  tNull==0 ){.    
1a3f0 20 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71      pIndex->uniq
1a400 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  NotNull = 0;.   
1a410 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65     }.      pInde
1a420 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d  x->aiColumn[i] =
1a430 20 28 69 31 36 29 6a 3b 0a 20 20 20 20 7d 0a 20   (i16)j;.    }. 
1a440 20 20 20 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20     zColl = 0;.  
1a450 20 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d    if( pListItem-
1a460 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43  >pExpr->op==TK_C
1a470 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20  OLLATE ){.      
1a480 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20  int nColl;.     
1a490 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49 74   zColl = pListIt
1a4a0 65 6d 2d 3e 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  em->pExpr->u.zTo
1a4b0 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 6c  ken;.      nColl
1a4c0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
1a4d0 33 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20  30(zColl) + 1;. 
1a4e0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 78       assert( nEx
1a4f0 74 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20  tra>=nColl );.  
1a500 20 20 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72      memcpy(zExtr
1a510 61 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29  a, zColl, nColl)
1a520 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  ;.      zColl = 
1a530 7a 45 78 74 72 61 3b 0a 20 20 20 20 20 20 7a 45  zExtra;.      zE
1a540 78 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20  xtra += nColl;. 
1a550 20 20 20 20 20 6e 45 78 74 72 61 20 2d 3d 20 6e       nExtra -= n
1a560 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Coll;.    }else 
1a570 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20  if( j>=0 ){.    
1a580 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e    zColl = pTab->
1a590 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20  aCol[j].zColl;. 
1a5a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 7a 43     }.    if( !zC
1a5b0 6f 6c 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20 73 71  oll ) zColl = sq
1a5c0 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a  lite3StrBINARY;.
1a5d0 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
1a5e0 74 2e 62 75 73 79 20 26 26 20 21 73 71 6c 69 74  t.busy && !sqlit
1a5f0 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
1a600 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29  pParse, zColl) )
1a610 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
1a620 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1a630 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78      }.    pIndex
1a640 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43  ->azColl[i] = zC
1a650 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65 73 74  oll;.    request
1a660 65 64 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c  edSortOrder = pL
1a670 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  istItem->sortOrd
1a680 65 72 20 26 20 73 6f 72 74 4f 72 64 65 72 4d 61  er & sortOrderMa
1a690 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  sk;.    pIndex->
1a6a0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
1a6b0 28 75 38 29 72 65 71 75 65 73 74 65 64 53 6f 72  (u8)requestedSor
1a6c0 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f  tOrder;.  }..  /
1a6d0 2a 20 41 70 70 65 6e 64 20 74 68 65 20 74 61 62  * Append the tab
1a6e0 6c 65 20 6b 65 79 20 74 6f 20 74 68 65 20 65 6e  le key to the en
1a6f0 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  d of the index. 
1a700 20 46 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57   For WITHOUT ROW
1a710 49 44 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20 28  ID.  ** tables (
1a720 77 68 65 6e 20 70 50 6b 21 3d 30 29 20 74 68 69  when pPk!=0) thi
1a730 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 64 65  s will be the de
1a740 63 6c 61 72 65 64 20 50 52 49 4d 41 52 59 20 4b  clared PRIMARY K
1a750 45 59 2e 20 20 46 6f 72 0a 20 20 2a 2a 20 6e 6f  EY.  For.  ** no
1a760 72 6d 61 6c 20 74 61 62 6c 65 73 20 28 77 68 65  rmal tables (whe
1a770 6e 20 70 50 6b 3d 3d 30 29 20 74 68 69 73 20 77  n pPk==0) this w
1a780 69 6c 6c 20 62 65 20 74 68 65 20 72 6f 77 69 64  ill be the rowid
1a790 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 6b  ..  */.  if( pPk
1a7a0 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   ){.    for(j=0;
1a7b0 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   j<pPk->nKeyCol;
1a7c0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   j++){.      int
1a7d0 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75   x = pPk->aiColu
1a7e0 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73  mn[j];.      ass
1a7f0 65 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20  ert( x>=0 );.   
1a800 20 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e     if( hasColumn
1a810 28 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  (pIndex->aiColum
1a820 6e 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43  n, pIndex->nKeyC
1a830 6f 6c 2c 20 78 29 20 29 7b 0a 20 20 20 20 20 20  ol, x) ){.      
1a840 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d    pIndex->nColum
1a850 6e 2d 2d 3b 20 0a 20 20 20 20 20 20 7d 65 6c 73  n--; .      }els
1a860 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  e{.        pInde
1a870 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d  x->aiColumn[i] =
1a880 20 78 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64   x;.        pInd
1a890 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20  ex->azColl[i] = 
1a8a0 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a  pPk->azColl[j];.
1a8b0 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
1a8c0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
1a8d0 70 50 6b 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  pPk->aSortOrder[
1a8e0 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b  j];.        i++;
1a8f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a900 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49     assert( i==pI
1a910 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  ndex->nColumn );
1a920 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
1a930 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
1a940 5d 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20  ] = XN_ROWID;.  
1a950 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c    pIndex->azColl
1a960 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72  [i] = sqlite3Str
1a970 42 49 4e 41 52 59 3b 0a 20 20 7d 0a 20 20 73 71  BINARY;.  }.  sq
1a980 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45  lite3DefaultRowE
1a990 73 74 28 70 49 6e 64 65 78 29 3b 0a 20 20 69 66  st(pIndex);.  if
1a9a0 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ( pParse->pNewTa
1a9b0 62 6c 65 3d 3d 30 20 29 20 65 73 74 69 6d 61 74  ble==0 ) estimat
1a9c0 65 49 6e 64 65 78 57 69 64 74 68 28 70 49 6e 64  eIndexWidth(pInd
1a9d0 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ex);..  /* If th
1a9e0 69 73 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e  is index contain
1a9f0 73 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f  s every column o
1aa00 66 20 69 74 73 20 74 61 62 6c 65 2c 20 74 68 65  f its table, the
1aa10 6e 20 6d 61 72 6b 0a 20 20 2a 2a 20 69 74 20 61  n mark.  ** it a
1aa20 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  s a covering ind
1aa30 65 78 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ex */.  assert( 
1aa40 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 0a  HasRowid(pTab) .
1aa50 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 69        || pTab->i
1aa60 50 4b 65 79 3c 30 20 7c 7c 20 73 71 6c 69 74 65  PKey<0 || sqlite
1aa70 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70  3ColumnOfIndex(p
1aa80 49 6e 64 65 78 2c 20 70 54 61 62 2d 3e 69 50 4b  Index, pTab->iPK
1aa90 65 79 29 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  ey)>=0 );.  if( 
1aaa0 70 54 62 6c 4e 61 6d 65 21 3d 30 20 26 26 20 70  pTblName!=0 && p
1aab0 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d  Index->nColumn>=
1aac0 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
1aad0 20 20 70 49 6e 64 65 78 2d 3e 69 73 43 6f 76 65    pIndex->isCove
1aae0 72 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 66 6f  ring = 1;.    fo
1aaf0 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
1ab00 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
1ab10 20 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50   if( j==pTab->iP
1ab20 4b 65 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Key ) continue;.
1ab30 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1ab40 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70  3ColumnOfIndex(p
1ab50 49 6e 64 65 78 2c 6a 29 3e 3d 30 20 29 20 63 6f  Index,j)>=0 ) co
1ab60 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 49  ntinue;.      pI
1ab70 6e 64 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67  ndex->isCovering
1ab80 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
1ab90 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
1aba0 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65  if( pTab==pParse
1abb0 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20  ->pNewTable ){. 
1abc0 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69     /* This routi
1abd0 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  ne has been call
1abe0 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ed to create an 
1abf0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
1ac00 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75  as a.    ** resu
1ac10 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20  lt of a PRIMARY 
1ac20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c  KEY or UNIQUE cl
1ac30 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  ause on a column
1ac40 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a   definition, or.
1ac50 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59      ** a PRIMARY
1ac60 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63   KEY or UNIQUE c
1ac70 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  lause following 
1ac80 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e  the column defin
1ac90 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69  itions..    ** i
1aca0 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20  .e. one of:.    
1acb0 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45  **.    ** CREATE
1acc0 20 54 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41   TABLE t(x PRIMA
1acd0 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20  RY KEY, y);.    
1ace0 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
1acf0 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78  t(x, y, UNIQUE(x
1ad00 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  , y));.    **.  
1ad10 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c    ** Either way,
1ad20 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
1ad30 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61   the table alrea
1ad40 64 79 20 68 61 73 20 73 75 63 68 20 61 6e 20 69  dy has such an i
1ad50 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20  ndex. If.    ** 
1ad60 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72  so, don't bother
1ad70 20 63 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f   creating this o
1ad80 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70  ne. This only ap
1ad90 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20  plies to.    ** 
1ada0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72  automatically cr
1adb0 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55  eated indices. U
1adc0 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74  sers can do as t
1add0 68 65 79 20 77 69 73 68 20 77 69 74 68 0a 20 20  hey wish with.  
1ade0 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e    ** explicit in
1adf0 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20  dices..    **.  
1ae00 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55 45 20    ** Two UNIQUE 
1ae10 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
1ae20 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63  onstraints are c
1ae30 6f 6e 73 69 64 65 72 65 64 20 65 71 75 69 76 61  onsidered equiva
1ae40 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61 6e 64  lent.    ** (and
1ae50 20 74 68 75 73 20 73 75 70 70 72 65 73 73 69 6e   thus suppressin
1ae60 67 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 6e 65  g the second one
1ae70 29 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 68  ) even if they h
1ae80 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20  ave different.  
1ae90 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72 73    ** sort orders
1aea0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1aeb0 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66  If there are dif
1aec0 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67  ferent collating
1aed0 20 73 65 71 75 65 6e 63 65 73 20 6f 72 20 69 66   sequences or if
1aee0 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a   the columns of.
1aef0 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 73 74      ** the const
1af00 72 61 69 6e 74 20 6f 63 63 75 72 20 69 6e 20 64  raint occur in d
1af10 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 73 2c  ifferent orders,
1af20 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72   then the constr
1af30 61 69 6e 74 73 20 61 72 65 0a 20 20 20 20 2a 2a  aints are.    **
1af40 20 63 6f 6e 73 69 64 65 72 65 64 20 64 69 73 74   considered dist
1af50 69 6e 63 74 20 61 6e 64 20 62 6f 74 68 20 72 65  inct and both re
1af60 73 75 6c 74 20 69 6e 20 73 65 70 61 72 61 74 65  sult in separate
1af70 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f   indices..    */
1af80 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
1af90 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
1afa0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
1afb0 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
1afc0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
1afd0 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  k;.      assert(
1afe0 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
1aff0 49 64 78 29 20 29 3b 0a 20 20 20 20 20 20 61 73  Idx) );.      as
1b000 73 65 72 74 28 20 70 49 64 78 2d 3e 69 64 78 54  sert( pIdx->idxT
1b010 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54  ype!=SQLITE_IDXT
1b020 59 50 45 5f 41 50 50 44 45 46 20 29 3b 0a 20 20  YPE_APPDEF );.  
1b030 20 20 20 20 61 73 73 65 72 74 28 20 49 73 55 6e      assert( IsUn
1b040 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78  iqueIndex(pIndex
1b050 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  ) );..      if( 
1b060 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 70  pIdx->nKeyCol!=p
1b070 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29  Index->nKeyCol )
1b080 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1b090 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78   for(k=0; k<pIdx
1b0a0 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 2b 2b 29 7b  ->nKeyCol; k++){
1b0b0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
1b0c0 68 61 72 20 2a 7a 31 3b 0a 20 20 20 20 20 20 20  har *z1;.       
1b0d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b   const char *z2;
1b0e0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1b0f0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
1b100 6b 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  k]>=0 );.       
1b110 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c   if( pIdx->aiCol
1b120 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e  umn[k]!=pIndex->
1b130 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72  aiColumn[k] ) br
1b140 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 31 20  eak;.        z1 
1b150 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b  = pIdx->azColl[k
1b160 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20  ];.        z2 = 
1b170 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b  pIndex->azColl[k
1b180 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ];.        if( s
1b190 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31  qlite3StrICmp(z1
1b1a0 2c 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a 20  , z2) ) break;. 
1b1b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1b1c0 20 6b 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f   k==pIdx->nKeyCo
1b1d0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  l ){.        if(
1b1e0 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
1b1f0 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20  pIndex->onError 
1b200 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1b210 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  This constraint 
1b220 63 72 65 61 74 65 73 20 74 68 65 20 73 61 6d 65  creates the same
1b230 20 69 6e 64 65 78 20 61 73 20 61 20 70 72 65 76   index as a prev
1b240 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ious.          *
1b250 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65  * constraint spe
1b260 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65  cified somewhere
1b270 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54   in the CREATE T
1b280 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
1b290 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77            ** How
1b2a0 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46  ever the ON CONF
1b2b0 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61 72 65  LICT clauses are
1b2c0 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62   different. If b
1b2d0 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20 20 20  oth this .      
1b2e0 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
1b2f0 74 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f  t and the previo
1b300 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f  us equivalent co
1b310 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20 65 78  nstraint have ex
1b320 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20 20  plicit.         
1b330 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20   ** ON CONFLICT 
1b340 63 6c 61 75 73 65 73 20 74 68 69 73 20 69 73 20  clauses this is 
1b350 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77  an error. Otherw
1b360 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20  ise, use the.   
1b370 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63         ** explic
1b380 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 62  itly specified b
1b390 65 68 61 76 69 6f 72 20 66 6f 72 20 74 68 65 20  ehavior for the 
1b3a0 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20  index..         
1b3b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
1b3c0 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  ( !(pIdx->onErro
1b3d0 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c  r==OE_Default ||
1b3e0 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
1b3f0 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b  ==OE_Default) ){
1b400 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1b410 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1b420 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
1b430 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69        "conflicti
1b440 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  ng ON CONFLICT c
1b450 6c 61 75 73 65 73 20 73 70 65 63 69 66 69 65 64  lauses specified
1b460 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  ", 0);.         
1b470 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
1b480 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d   pIdx->onError==
1b490 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  OE_Default ){.  
1b4a0 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
1b4b0 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78  onError = pIndex
1b4c0 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20  ->onError;.     
1b4d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1b4e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 64 78  .        if( idx
1b4f0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44 58  Type==SQLITE_IDX
1b500 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 20  TYPE_PRIMARYKEY 
1b510 29 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65 20  ) pIdx->idxType 
1b520 3d 20 69 64 78 54 79 70 65 3b 0a 20 20 20 20 20  = idxType;.     
1b530 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1b540 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
1b550 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1b560 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20  /* Link the new 
1b570 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
1b580 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64  to its table and
1b590 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20   to the other.  
1b5a0 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
1b5b0 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73  abase structures
1b5c0 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  . .  */.  assert
1b5d0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
1b5e0 30 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 69  0 );.  if( db->i
1b5f0 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
1b600 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 61 73  Index *p;.    as
1b610 73 65 72 74 28 20 21 49 4e 5f 44 45 43 4c 41 52  sert( !IN_DECLAR
1b620 45 5f 56 54 41 42 20 29 3b 0a 20 20 20 20 61 73  E_VTAB );.    as
1b630 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
1b640 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
1b650 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68   0, pIndex->pSch
1b660 65 6d 61 29 20 29 3b 0a 20 20 20 20 70 20 3d 20  ema) );.    p = 
1b670 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
1b680 74 28 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  t(&pIndex->pSche
1b690 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20 20  ma->idxHash, .  
1b6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6b0 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
1b6c0 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 29 3b 0a  zName, pIndex);.
1b6d0 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20      if( p ){.   
1b6e0 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49     assert( p==pI
1b6f0 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c  ndex );  /* Mall
1b700 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  oc must have fai
1b710 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  led */.      sql
1b720 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
1b730 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
1b740 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1b750 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6d 44      }.    db->mD
1b760 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47  bFlags |= DBFLAG
1b770 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20  _SchemaChange;. 
1b780 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21     if( pTblName!
1b790 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64  =0 ){.      pInd
1b7a0 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69  ex->tnum = db->i
1b7b0 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20  nit.newTnum;.   
1b7c0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
1b7d0 74 68 69 73 20 69 73 20 74 68 65 20 69 6e 69 74  this is the init
1b7e0 69 61 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58  ial CREATE INDEX
1b7f0 20 73 74 61 74 65 6d 65 6e 74 20 28 6f 72 20 43   statement (or C
1b800 52 45 41 54 45 20 54 41 42 4c 45 20 69 66 20 74  REATE TABLE if t
1b810 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 73  he.  ** index is
1b820 20 61 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65   an implied inde
1b830 78 20 66 6f 72 20 61 20 55 4e 49 51 55 45 20 6f  x for a UNIQUE o
1b840 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  r PRIMARY KEY co
1b850 6e 73 74 72 61 69 6e 74 29 20 74 68 65 6e 0a 20  nstraint) then. 
1b860 20 2a 2a 20 65 6d 69 74 20 63 6f 64 65 20 74 6f   ** emit code to
1b870 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e   allocate the in
1b880 64 65 78 20 72 6f 6f 74 70 61 67 65 20 6f 6e 20  dex rootpage on 
1b890 64 69 73 6b 20 61 6e 64 20 6d 61 6b 65 20 61 6e  disk and make an
1b8a0 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20   entry for.  ** 
1b8b0 74 68 65 20 69 6e 64 65 78 20 69 6e 20 74 68 65  the index in the
1b8c0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
1b8d0 61 62 6c 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  able and populat
1b8e0 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68  e the index with
1b8f0 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20  .  ** content.  
1b900 42 75 74 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74  But, do not do t
1b910 68 69 73 20 69 66 20 77 65 20 61 72 65 20 73 69  his if we are si
1b920 6d 70 6c 79 20 72 65 61 64 69 6e 67 20 74 68 65  mply reading the
1b930 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20   sqlite_master. 
1b940 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 70 61 72   ** table to par
1b950 73 65 20 74 68 65 20 73 63 68 65 6d 61 2c 20 6f  se the schema, o
1b960 72 20 69 66 20 74 68 69 73 20 69 6e 64 65 78 20  r if this index 
1b970 69 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  is the PRIMARY K
1b980 45 59 20 69 6e 64 65 78 0a 20 20 2a 2a 20 6f 66  EY index.  ** of
1b990 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
1b9a0 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a   table..  **.  *
1b9b0 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30  * If pTblName==0
1b9c0 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69   it means this i
1b9d0 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61 74 65  ndex is generate
1b9e0 64 20 61 73 20 61 6e 20 69 6d 70 6c 69 65 64 20  d as an implied 
1b9f0 50 52 49 4d 41 52 59 20 4b 45 59 0a 20 20 2a 2a  PRIMARY KEY.  **
1ba00 20 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78   or UNIQUE index
1ba10 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42   in a CREATE TAB
1ba20 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53  LE statement.  S
1ba30 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20  ince the table. 
1ba40 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65   ** has just bee
1ba50 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f  n created, it co
1ba60 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61  ntains no data a
1ba70 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69  nd the index ini
1ba80 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
1ba90 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69   step can be ski
1baa0 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  pped..  */.  els
1bab0 65 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70  e if( HasRowid(p
1bac0 54 61 62 29 20 7c 7c 20 70 54 62 6c 4e 61 6d 65  Tab) || pTblName
1bad0 21 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20  !=0 ){.    Vdbe 
1bae0 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  *v;.    char *zS
1baf0 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65  tmt;.    int iMe
1bb00 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
1bb10 65 6d 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c  em;..    v = sql
1bb20 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1bb30 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
1bb40 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
1bb50 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20  eate_index;..   
1bb60 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
1bb70 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
1bb80 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 20 20  se, 1, iDb);..  
1bb90 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
1bba0 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65  rootpage for the
1bbb0 20 69 6e 64 65 78 20 75 73 69 6e 67 20 43 72 65   index using Cre
1bbc0 61 74 65 49 6e 64 65 78 2e 20 42 75 74 20 62 65  ateIndex. But be
1bbd0 66 6f 72 65 0a 20 20 20 20 2a 2a 20 64 6f 69 6e  fore.    ** doin
1bbe0 67 20 73 6f 2c 20 63 6f 64 65 20 61 20 4e 6f 6f  g so, code a Noo
1bbf0 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e  p instruction an
1bc00 64 20 73 74 6f 72 65 20 69 74 73 20 61 64 64 72  d store its addr
1bc10 65 73 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 49  ess in .    ** I
1bc20 6e 64 65 78 2e 74 6e 75 6d 2e 20 54 68 69 73 20  ndex.tnum. This 
1bc30 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 63  is required in c
1bc40 61 73 65 20 74 68 69 73 20 69 6e 64 65 78 20 69  ase this index i
1bc50 73 20 61 63 74 75 61 6c 6c 79 20 61 20 0a 20 20  s actually a .  
1bc60 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59    ** PRIMARY KEY
1bc70 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 69   and the table i
1bc80 73 20 61 63 74 75 61 6c 6c 79 20 61 20 57 49 54  s actually a WIT
1bc90 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
1bca0 2e 20 49 6e 20 0a 20 20 20 20 2a 2a 20 74 68 61  . In .    ** tha
1bcb0 74 20 63 61 73 65 20 74 68 65 20 63 6f 6e 76 65  t case the conve
1bcc0 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64  rtToWithoutRowid
1bcd0 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 20  Table() routine 
1bce0 77 69 6c 6c 20 72 65 70 6c 61 63 65 0a 20 20 20  will replace.   
1bcf0 20 2a 2a 20 74 68 65 20 4e 6f 6f 70 20 77 69 74   ** the Noop wit
1bd00 68 20 61 20 47 6f 74 6f 20 74 6f 20 6a 75 6d 70  h a Goto to jump
1bd10 20 6f 76 65 72 20 74 68 65 20 56 44 42 45 20 63   over the VDBE c
1bd20 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 65  ode generated be
1bd30 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 70 49 6e 64  low. */.    pInd
1bd40 65 78 2d 3e 74 6e 75 6d 20 3d 20 73 71 6c 69 74  ex->tnum = sqlit
1bd50 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
1bd60 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 73 71  OP_Noop);.    sq
1bd70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1bd80 76 2c 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65  v, OP_CreateBtre
1bd90 65 2c 20 69 44 62 2c 20 69 4d 65 6d 2c 20 42 54  e, iDb, iMem, BT
1bda0 52 45 45 5f 42 4c 4f 42 4b 45 59 29 3b 0a 0a 20  REE_BLOBKEY);.. 
1bdb0 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65     /* Gather the
1bdc0 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   complete text o
1bdd0 66 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44  f the CREATE IND
1bde0 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74  EX statement int
1bdf0 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74  o.    ** the zSt
1be00 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  mt variable.    
1be10 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74 61 72  */.    if( pStar
1be20 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  t ){.      int n
1be30 20 3d 20 28 69 6e 74 29 28 70 50 61 72 73 65 2d   = (int)(pParse-
1be40 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20  >sLastToken.z - 
1be50 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70 50 61 72  pName->z) + pPar
1be60 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e  se->sLastToken.n
1be70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d  ;.      if( pNam
1be80 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29  e->z[n-1]==';' )
1be90 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 2f 2a 20 41   n--;.      /* A
1bea0 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74   named index wit
1beb0 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52  h an explicit CR
1bec0 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
1bed0 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53  ment */.      zS
1bee0 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
1bef0 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41 54 45  intf(db, "CREATE
1bf00 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a  %s INDEX %.*s",.
1bf10 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d          onError=
1bf20 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20  =OE_None ? "" : 
1bf30 22 20 55 4e 49 51 55 45 22 2c 20 6e 2c 20 70 4e  " UNIQUE", n, pN
1bf40 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c  ame->z);.    }el
1bf50 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
1bf60 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
1bf70 63 72 65 61 74 65 64 20 62 79 20 61 20 50 52 49  created by a PRI
1bf80 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
1bf90 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  UE constraint */
1bfa0 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20  .      /* zStmt 
1bfb0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
1bfc0 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a  (""); */.      z
1bfd0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Stmt = 0;.    }.
1bfe0 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65  .    /* Add an e
1bff0 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d  ntry in sqlite_m
1c000 61 73 74 65 72 20 66 6f 72 20 74 68 69 73 20 69  aster for this i
1c010 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ndex.    */.    
1c020 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
1c030 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
1c040 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
1c050 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69   %Q.%s VALUES('i
1c060 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c  ndex',%Q,%Q,#%d,
1c070 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 64  %Q);",.        d
1c080 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
1c090 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d  Name, MASTER_NAM
1c0a0 45 2c 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  E,.        pInde
1c0b0 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  x->zName,.      
1c0c0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20    pTab->zName,. 
1c0d0 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20 20 20         iMem,.   
1c0e0 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29       zStmt.    )
1c0f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
1c100 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a  ree(db, zStmt);.
1c110 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65  .    /* Fill the
1c120 20 69 6e 64 65 78 20 77 69 74 68 20 64 61 74 61   index with data
1c130 20 61 6e 64 20 72 65 70 61 72 73 65 20 74 68 65   and reparse the
1c140 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e   schema. Code an
1c150 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20 20 2a   OP_Expire.    *
1c160 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
1c170 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64  all pre-compiled
1c180 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20   statements..   
1c190 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 62 6c   */.    if( pTbl
1c1a0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Name ){.      sq
1c1b0 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
1c1c0 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
1c1d0 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71   iMem);.      sq
1c1e0 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
1c1f0 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
1c200 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1c210 65 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f  eAddParseSchemaO
1c220 70 28 76 2c 20 69 44 62 2c 0a 20 20 20 20 20 20  p(v, iDb,.      
1c230 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
1c240 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27  f(db, "name='%q'
1c250 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78   AND type='index
1c260 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  '", pIndex->zNam
1c270 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e));.      sqlit
1c280 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
1c290 4f 50 5f 45 78 70 69 72 65 29 3b 0a 20 20 20 20  OP_Expire);.    
1c2a0 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  }..    sqlite3Vd
1c2b0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49  beJumpHere(v, pI
1c2c0 6e 64 65 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 7d  ndex->tnum);.  }
1c2d0 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69  ..  /* When addi
1c2e0 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74  ng an index to t
1c2f0 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63  he list of indic
1c300 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20  es for a table, 
1c310 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61  make.  ** sure a
1c320 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c  ll indices label
1c330 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f  ed OE_Replace co
1c340 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f  me after all tho
1c350 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20  se labeled.  ** 
1c360 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73  OE_Ignore.  This
1c370 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f   is necessary fo
1c380 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 63 6f  r the correct co
1c390 6e 73 74 72 61 69 6e 74 20 63 68 65 63 6b 0a 20  nstraint check. 
1c3a0 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 28   ** processing (
1c3b0 69 6e 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61  in sqlite3Genera
1c3c0 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63  teConstraintChec
1c3d0 6b 73 28 29 29 20 61 73 20 70 61 72 74 20 6f 66  ks()) as part of
1c3e0 0a 20 20 2a 2a 20 55 50 44 41 54 45 20 61 6e 64  .  ** UPDATE and
1c3f0 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
1c400 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28  ts.  .  */.  if(
1c410 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c   db->init.busy |
1c420 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b  | pTblName==0 ){
1c430 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72  .    if( onError
1c440 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20  !=OE_Replace || 
1c450 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a  pTab->pIndex==0.
1c460 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62           || pTab
1c470 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  ->pIndex->onErro
1c480 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a  r==OE_Replace){.
1c490 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e        pIndex->pN
1c4a0 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  ext = pTab->pInd
1c4b0 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  ex;.      pTab->
1c4c0 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b  pIndex = pIndex;
1c4d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c4e0 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20    Index *pOther 
1c4f0 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
1c500 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74        while( pOt
1c510 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f  her->pNext && pO
1c520 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45  ther->pNext->onE
1c530 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65  rror!=OE_Replace
1c540 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74 68   ){.        pOth
1c550 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  er = pOther->pNe
1c560 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
1c570 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20    pIndex->pNext 
1c580 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b  = pOther->pNext;
1c590 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e 70  .      pOther->p
1c5a0 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20  Next = pIndex;. 
1c5b0 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 20     }.    pIndex 
1c5c0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  = 0;.  }..  /* C
1c5d0 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65  lean up before e
1c5e0 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63  xiting */.exit_c
1c5f0 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69  reate_index:.  i
1c600 66 28 20 70 49 6e 64 65 78 20 29 20 66 72 65 65  f( pIndex ) free
1c610 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
1c620 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1c630 44 65 6c 65 74 65 28 64 62 2c 20 70 50 49 57 68  Delete(db, pPIWh
1c640 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ere);.  sqlite3E
1c650 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
1c660 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  , pList);.  sqli
1c670 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1c680 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a  (db, pTblName);.
1c690 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1c6a0 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  db, zName);.}../
1c6b0 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e  *.** Fill the In
1c6c0 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61  dex.aiRowEst[] a
1c6d0 72 72 61 79 20 77 69 74 68 20 64 65 66 61 75 6c  rray with defaul
1c6e0 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20  t information - 
1c6f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74  information.** t
1c700 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 77  o be used when w
1c710 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74  e have not run t
1c720 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61  he ANALYZE comma
1c730 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45  nd..**.** aiRowE
1c740 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65  st[0] is suppose
1c750 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  d to contain the
1c760 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
1c770 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  nts in the index
1c780 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f  ..** Since we do
1c790 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73   not know, guess
1c7a0 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52   1 million.  aiR
1c7b0 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65  owEst[1] is an e
1c7c0 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a  stimate of the.*
1c7d0 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
1c7e0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68   in the table th
1c7f0 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72  at match any par
1c800 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66  ticular value of
1c810 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f   the.** first co
1c820 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
1c830 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20  x.  aiRowEst[2] 
1c840 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  is an estimate o
1c850 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20  f the number.** 
1c860 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74  of rows that mat
1c870 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61  ch any particula
1c880 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  r combination of
1c890 20 74 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c   the first 2 col
1c8a0 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69  umns.** of the i
1c8b0 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f  ndex.  And so fo
1c8c0 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c  rth.  It must al
1c8d0 77 61 79 73 20 62 65 20 74 68 65 20 63 61 73 65  ways be the case
1c8e0 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20   that.*.**      
1c8f0 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d       aiRowEst[N]
1c900 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a  <=aiRowEst[N-1].
1c910 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52  **           aiR
1c920 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a  owEst[N]>=1.**.*
1c930 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61  * Apart from tha
1c940 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c  t, we have littl
1c950 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64  e to go on besid
1c960 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20  es intuition as 
1c970 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45  to.** how aiRowE
1c980 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69  st[] should be i
1c990 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65  nitialized.  The
1c9a0 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74   numbers generat
1c9b0 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62  ed here.** are b
1c9c0 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20  ased on typical 
1c9d0 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20  values found in 
1c9e0 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a  actual indices..
1c9f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
1ca00 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64  efaultRowEst(Ind
1ca10 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 2f 2a 20  ex *pIdx){.  /* 
1ca20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
1ca30 30 2c 20 20 39 2c 20 20 38 2c 20 20 37 2c 20 20  0,  9,  8,  7,  
1ca40 36 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61 56  6 */.  LogEst aV
1ca50 61 6c 5b 5d 20 3d 20 7b 20 33 33 2c 20 33 32 2c  al[] = { 33, 32,
1ca60 20 33 30 2c 20 32 38 2c 20 32 36 20 7d 3b 0a 20   30, 28, 26 };. 
1ca70 20 4c 6f 67 45 73 74 20 2a 61 20 3d 20 70 49 64   LogEst *a = pId
1ca80 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 3b 0a  x->aiRowLogEst;.
1ca90 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 4d 49    int nCopy = MI
1caa0 4e 28 41 72 72 61 79 53 69 7a 65 28 61 56 61 6c  N(ArraySize(aVal
1cab0 29 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  ), pIdx->nKeyCol
1cac0 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  );.  int i;..  /
1cad0 2a 20 49 6e 64 65 78 65 73 20 77 69 74 68 20 64  * Indexes with d
1cae0 65 66 61 75 6c 74 20 72 6f 77 20 65 73 74 69 6d  efault row estim
1caf0 61 74 65 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20  ates should not 
1cb00 68 61 76 65 20 73 74 61 74 31 20 64 61 74 61 20  have stat1 data 
1cb10 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 49  */.  assert( !pI
1cb20 64 78 2d 3e 68 61 73 53 74 61 74 31 20 29 3b 0a  dx->hasStat1 );.
1cb30 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 66 69  .  /* Set the fi
1cb40 72 73 74 20 65 6e 74 72 79 20 28 6e 75 6d 62 65  rst entry (numbe
1cb50 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
1cb60 20 69 6e 64 65 78 29 20 74 6f 20 74 68 65 20 65   index) to the e
1cb70 73 74 69 6d 61 74 65 64 20 0a 20 20 2a 2a 20 6e  stimated .  ** n
1cb80 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
1cb90 20 74 68 65 20 74 61 62 6c 65 2c 20 6f 72 20 68   the table, or h
1cba0 61 6c 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  alf the number o
1cbb0 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
1cbc0 62 6c 65 0a 20 20 2a 2a 20 66 6f 72 20 61 20 70  ble.  ** for a p
1cbd0 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 20 20 20  artial index.   
1cbe0 42 75 74 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74  But do not let t
1cbf0 68 65 20 65 73 74 69 6d 61 74 65 20 64 72 6f 70  he estimate drop
1cc00 20 62 65 6c 6f 77 20 31 30 2e 20 2a 2f 0a 20 20   below 10. */.  
1cc10 61 5b 30 5d 20 3d 20 70 49 64 78 2d 3e 70 54 61  a[0] = pIdx->pTa
1cc20 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b  ble->nRowLogEst;
1cc30 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 70 50 61  .  if( pIdx->pPa
1cc40 72 74 49 64 78 57 68 65 72 65 21 3d 30 20 29 20  rtIdxWhere!=0 ) 
1cc50 61 5b 30 5d 20 2d 3d 20 31 30 3b 20 20 61 73 73  a[0] -= 10;  ass
1cc60 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33  ert( 10==sqlite3
1cc70 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 69  LogEst(2) );.  i
1cc80 66 28 20 61 5b 30 5d 3c 33 33 20 29 20 61 5b 30  f( a[0]<33 ) a[0
1cc90 5d 20 3d 20 33 33 3b 20 20 20 20 20 20 20 20 20  ] = 33;         
1cca0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1ccb0 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   33==sqlite3LogE
1ccc0 73 74 28 31 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  st(10) );..  /* 
1ccd0 45 73 74 69 6d 61 74 65 20 74 68 61 74 20 61 5b  Estimate that a[
1cce0 31 5d 20 69 73 20 31 30 2c 20 61 5b 32 5d 20 69  1] is 10, a[2] i
1ccf0 73 20 39 2c 20 61 5b 33 5d 20 69 73 20 38 2c 20  s 9, a[3] is 8, 
1cd00 61 5b 34 5d 20 69 73 20 37 2c 20 61 5b 35 5d 20  a[4] is 7, a[5] 
1cd10 69 73 0a 20 20 2a 2a 20 36 20 61 6e 64 20 65 61  is.  ** 6 and ea
1cd20 63 68 20 73 75 62 73 65 71 75 65 6e 74 20 76 61  ch subsequent va
1cd30 6c 75 65 20 28 69 66 20 61 6e 79 29 20 69 73 20  lue (if any) is 
1cd40 35 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28  5.  */.  memcpy(
1cd50 26 61 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f  &a[1], aVal, nCo
1cd60 70 79 2a 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74  py*sizeof(LogEst
1cd70 29 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 70  ));.  for(i=nCop
1cd80 79 2b 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b  y+1; i<=pIdx->nK
1cd90 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  eyCol; i++){.   
1cda0 20 61 5b 69 5d 20 3d 20 32 33 3b 20 20 20 20 20   a[i] = 23;     
1cdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1cdc0 73 73 65 72 74 28 20 32 33 3d 3d 73 71 6c 69 74  ssert( 23==sqlit
1cdd0 65 33 4c 6f 67 45 73 74 28 35 29 20 29 3b 0a 20  e3LogEst(5) );. 
1cde0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 30 3d   }..  assert( 0=
1cdf0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
1ce00 29 20 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69  ) );.  if( IsUni
1ce10 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29  queIndex(pIdx) )
1ce20 20 61 5b 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   a[pIdx->nKeyCol
1ce30 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ] = 0;.}../*.** 
1ce40 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
1ce50 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69  l drop an existi
1ce60 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20  ng named index. 
1ce70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
1ce80 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
1ce90 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65  DROP INDEX state
1cea0 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
1ceb0 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50  lite3DropIndex(P
1cec0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
1ced0 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e  cList *pName, in
1cee0 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49  t ifExists){.  I
1cef0 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
1cf00 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
1cf10 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1cf20 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
1cf30 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1cf40 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20  e->nErr==0 );   
1cf50 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20  /* Never called 
1cf60 77 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72  with prior error
1cf70 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d  s */.  if( db->m
1cf80 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
1cf90 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1cfa0 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61  p_index;.  }.  a
1cfb0 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53  ssert( pName->nS
1cfc0 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53  rc==1 );.  if( S
1cfd0 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
1cfe0 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
1cff0 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  se) ){.    goto 
1d000 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1d010 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20  .  }.  pIndex = 
1d020 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
1d030 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  (db, pName->a[0]
1d040 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61  .zName, pName->a
1d050 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
1d060 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20    if( pIndex==0 
1d070 29 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45 78  ){.    if( !ifEx
1d080 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71  ists ){.      sq
1d090 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1d0a0 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69  arse, "no such i
1d0b0 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65  ndex: %S", pName
1d0c0 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
1d0d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
1d0e0 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68  deVerifyNamedSch
1d0f0 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ema(pParse, pNam
1d100 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
1d110 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  e);.    }.    pP
1d120 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
1d130 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  a = 1;.    goto 
1d140 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1d150 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65  .  }.  if( pInde
1d160 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49  x->idxType!=SQLI
1d170 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45  TE_IDXTYPE_APPDE
1d180 46 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  F ){.    sqlite3
1d190 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1d1a0 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74   "index associat
1d1b0 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22  ed with UNIQUE "
1d1c0 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41  .      "or PRIMA
1d1d0 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
1d1e0 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70  t cannot be drop
1d1f0 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f  ped", 0);.    go
1d200 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1d210 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  ex;.  }.  iDb = 
1d220 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
1d230 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d  ndex(db, pIndex-
1d240 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64  >pSchema);.#ifnd
1d250 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1d260 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
1d270 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20  .    int code = 
1d280 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45  SQLITE_DROP_INDE
1d290 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  X;.    Table *pT
1d2a0 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61  ab = pIndex->pTa
1d2b0 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ble;.    const c
1d2c0 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
1d2d0 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
1d2e0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
1d2f0 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f   *zTab = SCHEMA_
1d300 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20  TABLE(iDb);.    
1d310 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1d320 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
1d330 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62  ITE_DELETE, zTab
1d340 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
1d350 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1d360 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  p_index;.    }. 
1d370 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
1d380 50 44 42 20 26 26 20 69 44 62 20 29 20 63 6f 64  PDB && iDb ) cod
1d390 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
1d3a0 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  TEMP_INDEX;.    
1d3b0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1d3c0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
1d3d0 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  e, pIndex->zName
1d3e0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
1d3f0 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
1d400 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1d410 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  x;.    }.  }.#en
1d420 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  dif..  /* Genera
1d430 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76  te code to remov
1d440 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  e the index and 
1d450 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20  from the master 
1d460 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73  table */.  v = s
1d470 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1d480 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
1d490 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
1d4a0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
1d4b0 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
1d4c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  ;.    sqlite3Nes
1d4d0 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
1d4e0 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20  .       "DELETE 
1d4f0 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45  FROM %Q.%s WHERE
1d500 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20 74 79 70   name=%Q AND typ
1d510 65 3d 27 69 6e 64 65 78 27 22 2c 0a 20 20 20 20  e='index'",.    
1d520 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
1d530 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52  zDbSName, MASTER
1d540 5f 4e 41 4d 45 2c 20 70 49 6e 64 65 78 2d 3e 7a  _NAME, pIndex->z
1d550 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20  Name.    );.    
1d560 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74  sqlite3ClearStat
1d570 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69  Tables(pParse, i
1d580 44 62 2c 20 22 69 64 78 22 2c 20 70 49 6e 64 65  Db, "idx", pInde
1d590 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  x->zName);.    s
1d5a0 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
1d5b0 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
1d5c0 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74  .    destroyRoot
1d5d0 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Page(pParse, pIn
1d5e0 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  dex->tnum, iDb);
1d5f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1d600 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f  AddOp4(v, OP_Dro
1d610 70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20  pIndex, iDb, 0, 
1d620 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  0, pIndex->zName
1d630 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f  , 0);.  }..exit_
1d640 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71  drop_index:.  sq
1d650 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1d660 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d  te(db, pName);.}
1d670 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69  ../*.** pArray i
1d680 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
1d690 6e 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63  n array of objec
1d6a0 74 73 2e 20 45 61 63 68 20 6f 62 6a 65 63 74 20  ts. Each object 
1d6b0 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20  in the.** array 
1d6c0 69 73 20 73 7a 45 6e 74 72 79 20 62 79 74 65 73  is szEntry bytes
1d6d0 20 69 6e 20 73 69 7a 65 2e 20 54 68 69 73 20 72   in size. This r
1d6e0 6f 75 74 69 6e 65 20 75 73 65 73 20 73 71 6c 69  outine uses sqli
1d6f0 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 29 0a 2a  te3DbRealloc().*
1d700 2a 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20  * to extend the 
1d710 61 72 72 61 79 20 73 6f 20 74 68 61 74 20 74 68  array so that th
1d720 65 72 65 20 69 73 20 73 70 61 63 65 20 66 6f 72  ere is space for
1d730 20 61 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 74   a new object at
1d740 20 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20   the end..**.** 
1d750 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
1d760 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70  on is called, *p
1d770 6e 45 6e 74 72 79 20 63 6f 6e 74 61 69 6e 73 20  nEntry contains 
1d780 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
1d790 20 6f 66 0a 2a 2a 20 74 68 65 20 61 72 72 61 79   of.** the array
1d7a0 20 28 69 6e 20 65 6e 74 72 69 65 73 20 2d 20 73   (in entries - s
1d7b0 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  o the allocation
1d7c0 20 69 73 20 28 28 2a 70 6e 45 6e 74 72 79 29 20   is ((*pnEntry) 
1d7d0 2a 20 73 7a 45 6e 74 72 79 29 20 62 79 74 65 73  * szEntry) bytes
1d7e0 0a 2a 2a 20 69 6e 20 74 6f 74 61 6c 29 2e 0a 2a  .** in total)..*
1d7f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 61 6c  *.** If the real
1d800 6c 6f 63 28 29 20 69 73 20 73 75 63 63 65 73 73  loc() is success
1d810 66 75 6c 20 28 69 2e 65 2e 20 69 66 20 6e 6f 20  ful (i.e. if no 
1d820 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 63  OOM condition oc
1d830 63 75 72 73 29 2c 20 74 68 65 0a 2a 2a 20 73 70  curs), the.** sp
1d840 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
1d850 72 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  r the new object
1d860 20 69 73 20 7a 65 72 6f 65 64 2c 20 2a 70 6e 45   is zeroed, *pnE
1d870 6e 74 72 79 20 75 70 64 61 74 65 64 20 74 6f 0a  ntry updated to.
1d880 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 65 20 6e  ** reflect the n
1d890 65 77 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  ew size of the a
1d8a0 72 72 61 79 20 61 6e 64 20 61 20 70 6f 69 6e 74  rray and a point
1d8b0 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 61 6c  er to the new al
1d8c0 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 72 65 74 75  location.** retu
1d8d0 72 6e 65 64 2e 20 2a 70 49 64 78 20 69 73 20 73  rned. *pIdx is s
1d8e0 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  et to the index 
1d8f0 6f 66 20 74 68 65 20 6e 65 77 20 61 72 72 61 79  of the new array
1d900 20 65 6e 74 72 79 20 69 6e 20 74 68 69 73 20 63   entry in this c
1d910 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ase..**.** Other
1d920 77 69 73 65 2c 20 69 66 20 74 68 65 20 72 65 61  wise, if the rea
1d930 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2c 20 2a 70  lloc() fails, *p
1d940 49 64 78 20 69 73 20 73 65 74 20 74 6f 20 2d 31  Idx is set to -1
1d950 2c 20 2a 70 6e 45 6e 74 72 79 20 72 65 6d 61 69  , *pnEntry remai
1d960 6e 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20  ns.** unchanged 
1d970 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 70 41  and a copy of pA
1d980 72 72 61 79 20 72 65 74 75 72 6e 65 64 2e 0a 2a  rray returned..*
1d990 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 41  /.void *sqlite3A
1d9a0 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
1d9b0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
1d9c0 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
1d9d0 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c  to notify of mal
1d9e0 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a  loc failures */.
1d9f0 20 20 76 6f 69 64 20 2a 70 41 72 72 61 79 2c 20    void *pArray, 
1da00 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
1da10 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67 68 74 20  objects.  Might 
1da20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 2a  be reallocated *
1da30 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c  /.  int szEntry,
1da40 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1da50 20 65 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20   each object in 
1da60 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  the array */.  i
1da70 6e 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20  nt *pnEntry,    
1da80 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62   /* Number of ob
1da90 6a 65 63 74 73 20 63 75 72 72 65 6e 74 6c 79 20  jects currently 
1daa0 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  in use */.  int 
1dab0 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a  *pIdx         /*
1dac0 20 57 72 69 74 65 20 74 68 65 20 69 6e 64 65 78   Write the index
1dad0 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20 68   of a new slot h
1dae0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  ere */.){.  char
1daf0 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 2a   *z;.  int n = *
1db00 70 6e 45 6e 74 72 79 3b 0a 20 20 69 66 28 20 28  pnEntry;.  if( (
1db10 6e 20 26 20 28 6e 2d 31 29 29 3d 3d 30 20 29 7b  n & (n-1))==0 ){
1db20 0a 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 28 6e  .    int sz = (n
1db30 3d 3d 30 29 20 3f 20 31 20 3a 20 32 2a 6e 3b 0a  ==0) ? 1 : 2*n;.
1db40 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d      void *pNew =
1db50 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
1db60 63 28 64 62 2c 20 70 41 72 72 61 79 2c 20 73 7a  c(db, pArray, sz
1db70 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20 69  *szEntry);.    i
1db80 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
1db90 20 20 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a      *pIdx = -1;.
1dba0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 41 72        return pAr
1dbb0 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ray;.    }.    p
1dbc0 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20  Array = pNew;.  
1dbd0 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70  }.  z = (char*)p
1dbe0 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28  Array;.  memset(
1dbf0 26 7a 5b 6e 20 2a 20 73 7a 45 6e 74 72 79 5d 2c  &z[n * szEntry],
1dc00 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20   0, szEntry);.  
1dc10 2a 70 49 64 78 20 3d 20 6e 3b 0a 20 20 2b 2b 2a  *pIdx = n;.  ++*
1dc20 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74 75 72  pnEntry;.  retur
1dc30 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a  n pArray;.}../*.
1dc40 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
1dc50 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67  element to the g
1dc60 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72  iven IdList.  Cr
1dc70 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73  eate a new IdLis
1dc80 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e  t if.** need be.
1dc90 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c  .**.** A new IdL
1dca0 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ist is returned,
1dcb0 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c   or NULL if mall
1dcc0 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49  oc() fails..*/.I
1dcd0 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64  dList *sqlite3Id
1dce0 4c 69 73 74 41 70 70 65 6e 64 28 73 71 6c 69 74  ListAppend(sqlit
1dcf0 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a  e3 *db, IdList *
1dd00 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
1dd10 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  oken){.  int i;.
1dd20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1dd30 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
1dd40 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
1dd50 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c  o(db, sizeof(IdL
1dd60 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
1dd70 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1dd80 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
1dd90 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 41 72 72  ->a = sqlite3Arr
1dda0 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
1ddb0 20 20 64 62 2c 0a 20 20 20 20 20 20 70 4c 69 73    db,.      pLis
1ddc0 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a 65  t->a,.      size
1ddd0 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c  of(pList->a[0]),
1dde0 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e  .      &pList->n
1ddf0 49 64 2c 0a 20 20 20 20 20 20 26 69 0a 20 20 29  Id,.      &i.  )
1de00 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20  ;.  if( i<0 ){. 
1de10 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
1de20 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
1de30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
1de40 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b  .  }.  pList->a[
1de50 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
1de60 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1de70 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 72  db, pToken);.  r
1de80 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
1de90 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
1dea0 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  IdList..*/.void 
1deb0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
1dec0 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
1ded0 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b   IdList *pList){
1dee0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1def0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1df00 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
1df10 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
1df20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
1df30 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  ree(db, pList->a
1df40 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  [i].zName);.  }.
1df50 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1df60 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20  db, pList->a);. 
1df70 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
1df80 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a  (db, pList);.}..
1df90 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1dfa0 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20   index in pList 
1dfb0 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65  of the identifie
1dfc0 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65  r named zId.  Re
1dfd0 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f  turn -1.** if no
1dfe0 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  t found..*/.int 
1dff0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64  sqlite3IdListInd
1e000 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  ex(IdList *pList
1e010 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
1e020 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ame){.  int i;. 
1e030 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
1e040 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72  return -1;.  for
1e050 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
1e060 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Id; i++){.    if
1e070 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
1e080 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
1e090 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  me, zName)==0 ) 
1e0a0 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
1e0b0 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
1e0c0 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68 65 20 73  .** Expand the s
1e0d0 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  pace allocated f
1e0e0 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 72 63  or the given Src
1e0f0 4c 69 73 74 20 6f 62 6a 65 63 74 20 62 79 0a 2a  List object by.*
1e100 2a 20 63 72 65 61 74 69 6e 67 20 6e 45 78 74 72  * creating nExtr
1e110 61 20 6e 65 77 20 73 6c 6f 74 73 20 62 65 67 69  a new slots begi
1e120 6e 6e 69 6e 67 20 61 74 20 69 53 74 61 72 74 2e  nning at iStart.
1e130 20 20 69 53 74 61 72 74 20 69 73 20 7a 65 72 6f    iStart is zero
1e140 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77 20 73   based..** New s
1e150 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f 65 64 2e  lots are zeroed.
1e160 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
1e170 6c 65 2c 20 73 75 70 70 6f 73 65 20 61 20 53 72  le, suppose a Sr
1e180 63 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20  cList initially 
1e190 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65 6e 74  contains two ent
1e1a0 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f  ries: A,B..** To
1e1b0 20 61 70 70 65 6e 64 20 33 20 6e 65 77 20 65 6e   append 3 new en
1e1c0 74 72 69 65 73 20 6f 6e 74 6f 20 74 68 65 20 65  tries onto the e
1e1d0 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a  nd, do this:.**.
1e1e0 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63  **    sqlite3Src
1e1f0 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20  ListEnlarge(db, 
1e200 70 53 72 63 6c 69 73 74 2c 20 33 2c 20 32 29 3b  pSrclist, 3, 2);
1e210 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  .**.** After the
1e220 20 63 61 6c 6c 20 61 62 6f 76 65 20 69 74 20 77   call above it w
1e230 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20 20 41  ould contain:  A
1e240 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e  , B, nil, nil, n
1e250 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 53  il..** If the iS
1e260 74 61 72 74 20 61 72 67 75 6d 65 6e 74 20 68 61  tart argument ha
1e270 64 20 62 65 65 6e 20 31 20 69 6e 73 74 65 61 64  d been 1 instead
1e280 20 6f 66 20 32 2c 20 74 68 65 6e 20 74 68 65 20   of 2, then the 
1e290 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20  result.** would 
1e2a0 68 61 76 65 20 62 65 65 6e 3a 20 20 41 2c 20 6e  have been:  A, n
1e2b0 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e  il, nil, nil, B.
1e2c0 20 20 54 6f 20 70 72 65 70 65 6e 64 20 74 68 65    To prepend the
1e2d0 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74   new slots,.** t
1e2e0 68 65 20 69 53 74 61 72 74 20 76 61 6c 75 65 20  he iStart value 
1e2f0 77 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65  would be 0.  The
1e300 20 72 65 73 75 6c 74 20 74 68 65 6e 20 77 6f 75   result then wou
1e310 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e  ld.** be: nil, n
1e320 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a  il, nil, A, B..*
1e330 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
1e340 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
1e350 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 69 73  s the SrcList is
1e360 20 75 6e 63 68 61 6e 67 65 64 2e 20 20 54 68 65   unchanged.  The
1e370 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  .** db->mallocFa
1e380 69 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c 20 62  iled flag will b
1e390 65 20 73 65 74 20 74 6f 20 74 72 75 65 2e 0a 2a  e set to true..*
1e3a0 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
1e3b0 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65  e3SrcListEnlarge
1e3c0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1e3d0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1e3e0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  se connection to
1e3f0 20 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d 20 65   notify of OOM e
1e400 72 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63 4c 69  rrors */.  SrcLi
1e410 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a  st *pSrc,     /*
1e420 20 54 68 65 20 53 72 63 4c 69 73 74 20 74 6f 20   The SrcList to 
1e430 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20  be enlarged */. 
1e440 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20   int nExtra,    
1e450 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1e460 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20 61 64   new slots to ad
1e470 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d 20 2a  d to pSrc->a[] *
1e480 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 20 20  /.  int iStart  
1e490 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1e4a0 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20  in pSrc->a[] of 
1e4b0 66 69 72 73 74 20 6e 65 77 20 73 6c 6f 74 20 2a  first new slot *
1e4c0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  /.){.  int i;.. 
1e4d0 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
1e4e0 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67 20 70  ing on calling p
1e4f0 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61  arameters */.  a
1e500 73 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d 30  ssert( iStart>=0
1e510 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45   );.  assert( nE
1e520 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61 73 73  xtra>=1 );.  ass
1e530 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a  ert( pSrc!=0 );.
1e540 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74    assert( iStart
1e550 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a  <=pSrc->nSrc );.
1e560 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
1e570 64 64 69 74 69 6f 6e 61 6c 20 73 70 61 63 65 20  dditional space 
1e580 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69  if needed */.  i
1e590 66 28 20 28 75 33 32 29 70 53 72 63 2d 3e 6e 53  f( (u32)pSrc->nS
1e5a0 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e  rc+nExtra>pSrc->
1e5b0 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72  nAlloc ){.    Sr
1e5c0 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20  cList *pNew;.   
1e5d0 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53   int nAlloc = pS
1e5e0 72 63 2d 3e 6e 53 72 63 2a 32 2b 6e 45 78 74 72  rc->nSrc*2+nExtr
1e5f0 61 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b  a;.    int nGot;
1e600 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
1e610 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
1e620 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20   pSrc,.         
1e630 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53        sizeof(*pS
1e640 72 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29  rc) + (nAlloc-1)
1e650 2a 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b  *sizeof(pSrc->a[
1e660 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  0]) );.    if( p
1e670 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
1e680 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
1e690 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
1e6a0 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 20    return pSrc;. 
1e6b0 20 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d 20     }.    pSrc = 
1e6c0 70 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d  pNew;.    nGot =
1e6d0 20 28 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f   (sqlite3DbMallo
1e6e0 63 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29 20  cSize(db, pNew) 
1e6f0 2d 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29  - sizeof(*pSrc))
1e700 2f 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b  /sizeof(pSrc->a[
1e710 30 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d  0])+1;.    pSrc-
1e720 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 47 6f 74 3b 0a  >nAlloc = nGot;.
1e730 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 65    }..  /* Move e
1e740 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74 68  xisting slots th
1e750 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74 68  at come after th
1e760 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65 64  e newly inserted
1e770 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74 20   slots.  ** out 
1e780 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20 20  of the way */.  
1e790 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63  for(i=pSrc->nSrc
1e7a0 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20 69  -1; i>=iStart; i
1e7b0 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61  --){.    pSrc->a
1e7c0 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53 72  [i+nExtra] = pSr
1e7d0 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70  c->a[i];.  }.  p
1e7e0 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 6e 45 78  Src->nSrc += nEx
1e7f0 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20  tra;..  /* Zero 
1e800 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61  the newly alloca
1e810 74 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d  ted slots */.  m
1e820 65 6d 73 65 74 28 26 70 53 72 63 2d 3e 61 5b 69  emset(&pSrc->a[i
1e830 53 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 6f  Start], 0, sizeo
1e840 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45  f(pSrc->a[0])*nE
1e850 78 74 72 61 29 3b 0a 20 20 66 6f 72 28 69 3d 69  xtra);.  for(i=i
1e860 53 74 61 72 74 3b 20 69 3c 69 53 74 61 72 74 2b  Start; i<iStart+
1e870 6e 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a 20 20  nExtra; i++){.  
1e880 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75    pSrc->a[i].iCu
1e890 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  rsor = -1;.  }..
1e8a0 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f    /* Return a po
1e8b0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 65 6e 6c  inter to the enl
1e8c0 61 72 67 65 64 20 53 72 63 4c 69 73 74 20 2a 2f  arged SrcList */
1e8d0 0a 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a  .  return pSrc;.
1e8e0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  }.../*.** Append
1e8f0 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d   a new table nam
1e900 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53  e to the given S
1e910 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  rcList.  Create 
1e920 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66  a new SrcList if
1e930 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20  .** need be.  A 
1e940 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65  new entry is cre
1e950 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c  ated in the SrcL
1e960 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 61 62  ist even if pTab
1e970 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  le is NULL..**.*
1e980 2a 20 41 20 53 72 63 4c 69 73 74 20 69 73 20 72  * A SrcList is r
1e990 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
1e9a0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
1e9b0 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 54 68 65 20  OOM error.  The 
1e9c0 72 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72 63 4c  returned.** SrcL
1e9d0 69 73 74 20 6d 69 67 68 74 20 62 65 20 74 68 65  ist might be the
1e9e0 20 73 61 6d 65 20 61 73 20 74 68 65 20 53 72 63   same as the Src
1e9f0 4c 69 73 74 20 74 68 61 74 20 77 61 73 20 69 6e  List that was in
1ea00 70 75 74 20 6f 72 20 69 74 20 6d 69 67 68 74 20  put or it might 
1ea10 62 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 2e  be.** a new one.
1ea20 20 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f    If an OOM erro
1ea30 72 20 64 6f 65 73 20 6f 63 63 75 72 73 2c 20 74  r does occurs, t
1ea40 68 65 6e 20 74 68 65 20 70 72 69 6f 72 20 76 61  hen the prior va
1ea50 6c 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a 2a 20  lue of pList.** 
1ea60 74 68 61 74 20 69 73 20 69 6e 70 75 74 20 74 6f  that is input to
1ea70 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1ea80 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66   automatically f
1ea90 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  reed..**.** If p
1eaa0 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  Database is not 
1eab0 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  null, it means t
1eac0 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61  hat the table ha
1ead0 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a  s an optional.**
1eae0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70   database name p
1eaf0 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69  refix.  Like thi
1eb00 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61  s:  "database.ta
1eb10 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61  ble".  The pData
1eb20 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  base.** points t
1eb30 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  o the table name
1eb40 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20   and the pTable 
1eb50 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61  points to the da
1eb60 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20  tabase name..** 
1eb70 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  The SrcList.a[].
1eb80 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66  zName field is f
1eb90 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74  illed with the t
1eba0 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20  able name which 
1ebb0 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72  might.** come fr
1ebc0 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44  om pTable (if pD
1ebd0 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29  atabase is NULL)
1ebe0 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61   or from pDataba
1ebf0 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74  se.  .** SrcList
1ec00 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69  .a[].zDatabase i
1ec10 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  s filled with th
1ec20 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
1ec30 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20  from pTable,.** 
1ec40 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20  or with NULL if 
1ec50 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73  no database is s
1ec60 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
1ec70 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1ec80 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69  if call like thi
1ec90 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
1eca0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1ecb0 70 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a  ppend(D,A,B,0);.
1ecc0 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20  **.** Then B is 
1ecd0 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  a table name and
1ece0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
1ecf0 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65  me is unspecifie
1ed00 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a  d.  If called.**
1ed10 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
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 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54  ,A,B,C);.**.** T
1ed50 68 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62  hen C is the tab
1ed60 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73  le name and B is
1ed70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
1ed80 6d 65 2e 20 20 49 66 20 43 20 69 73 20 64 65 66  me.  If C is def
1ed90 69 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73 6f 20  ined.** then so 
1eda0 69 73 20 42 2e 20 20 49 6e 20 6f 74 68 65 72 20  is B.  In other 
1edb0 77 6f 72 64 73 2c 20 77 65 20 6e 65 76 65 72 20  words, we never 
1edc0 68 61 76 65 20 61 20 63 61 73 65 20 77 68 65 72  have a case wher
1edd0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
1ede0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1edf0 70 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29 3b 0a  ppend(D,A,0,C);.
1ee00 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61 62 6c  **.** Both pTabl
1ee10 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 20  e and pDatabase 
1ee20 61 72 65 20 61 73 73 75 6d 65 64 20 74 6f 20 62  are assumed to b
1ee30 65 20 71 75 6f 74 65 64 2e 20 20 54 68 65 79 20  e quoted.  They 
1ee40 61 72 65 20 64 65 71 75 6f 74 65 64 0a 2a 2a 20  are dequoted.** 
1ee50 62 65 66 6f 72 65 20 62 65 69 6e 67 20 61 64 64  before being add
1ee60 65 64 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73  ed to the SrcLis
1ee70 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  t..*/.SrcList *s
1ee80 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
1ee90 65 6e 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  end(.  sqlite3 *
1eea0 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  db,        /* Co
1eeb0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69  nnection to noti
1eec0 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69  fy of malloc fai
1eed0 6c 75 72 65 73 20 2a 2f 0a 20 20 53 72 63 4c 69  lures */.  SrcLi
1eee0 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
1eef0 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73  * Append to this
1ef00 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63   SrcList. NULL c
1ef10 72 65 61 74 65 73 20 61 20 6e 65 77 20 53 72 63  reates a new Src
1ef20 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  List */.  Token 
1ef30 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a  *pTable,      /*
1ef40 20 54 61 62 6c 65 20 74 6f 20 61 70 70 65 6e 64   Table to append
1ef50 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61   */.  Token *pDa
1ef60 74 61 62 61 73 65 20 20 20 20 2f 2a 20 44 61 74  tabase    /* Dat
1ef70 61 62 61 73 65 20 6f 66 20 74 68 65 20 74 61 62  abase of the tab
1ef80 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  le */.){.  struc
1ef90 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1efa0 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28  pItem;.  assert(
1efb0 20 70 44 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c   pDatabase==0 ||
1efc0 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 20 20 2f   pTable!=0 );  /
1efd0 2a 20 43 61 6e 6e 6f 74 20 68 61 76 65 20 43 20  * Cannot have C 
1efe0 77 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20 20 61  without B */.  a
1eff0 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
1f000 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1f010 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
1f020 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
1f030 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 53 72  NN(db, sizeof(Sr
1f040 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  cList) );.    if
1f050 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
1f060 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  urn 0;.    pList
1f070 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20  ->nAlloc = 1;.  
1f080 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20 3d 20    pList->nSrc = 
1f090 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70  1;.    memset(&p
1f0a0 4c 69 73 74 2d 3e 61 5b 30 5d 2c 20 30 2c 20 73  List->a[0], 0, s
1f0b0 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
1f0c0 5d 29 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  ]));.    pList->
1f0d0 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d  a[0].iCursor = -
1f0e0 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
1f0f0 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 53  pList = sqlite3S
1f100 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62  rcListEnlarge(db
1f110 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c 69 73  , pList, 1, pLis
1f120 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 7d 0a 20 20  t->nSrc);.  }.  
1f130 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1f140 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
1f150 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1f160 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  (db, pList);.   
1f170 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1f180 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
1f190 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31  >a[pList->nSrc-1
1f1a0 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62 61  ];.  if( pDataba
1f1b0 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65 2d  se && pDatabase-
1f1c0 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61  >z==0 ){.    pDa
1f1d0 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a  tabase = 0;.  }.
1f1e0 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
1f1f0 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  ){.    pItem->zN
1f200 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
1f210 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
1f220 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70  Database);.    p
1f230 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  Item->zDatabase 
1f240 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1f250 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c  mToken(db, pTabl
1f260 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
1f270 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
1f280 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1f290 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 29  oken(db, pTable)
1f2a0 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 44 61  ;.    pItem->zDa
1f2b0 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a  tabase = 0;.  }.
1f2c0 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
1f2d0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
1f2e0 56 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78  VdbeCursor index
1f2f0 20 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20   numbers to all 
1f300 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c  tables in a SrcL
1f310 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ist.*/.void sqli
1f320 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
1f330 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70  Cursors(Parse *p
1f340 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
1f350 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
1f360 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1f370 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1f380 20 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c   assert(pList ||
1f390 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
1f3a0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
1f3b0 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
1f3c0 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
1f3d0 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74  List->a; i<pList
1f3e0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
1f3f0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  em++){.      if(
1f400 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e   pItem->iCursor>
1f410 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
1f420 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72    pItem->iCursor
1f430 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
1f440 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  +;.      if( pIt
1f450 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
1f460 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
1f470 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
1f480 72 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  rs(pParse, pItem
1f490 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29  ->pSelect->pSrc)
1f4a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f4b0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
1f4c0 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72  ete an entire Sr
1f4d0 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20  cList including 
1f4e0 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63  all its substruc
1f4f0 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
1f500 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1f510 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
1f520 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
1f530 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1f540 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1f550 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c  *pItem;.  if( pL
1f560 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
1f570 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
1f580 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
1f590 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
1f5a0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
1f5b0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1f5c0 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
1f5d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
1f5e0 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
1f5f0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
1f600 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
1f610 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
1f620 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
1f630 69 73 49 6e 64 65 78 65 64 42 79 20 29 20 73 71  isIndexedBy ) sq
1f640 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1f650 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  pItem->u1.zIndex
1f660 65 64 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70  edBy);.    if( p
1f670 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
1f680 6e 63 20 29 20 73 71 6c 69 74 65 33 45 78 70 72  nc ) sqlite3Expr
1f690 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1f6a0 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
1f6b0 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  g);.    sqlite3D
1f6c0 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
1f6d0 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20  Item->pTab);.   
1f6e0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1f6f0 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
1f700 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71  pSelect);.    sq
1f710 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1f720 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b  db, pItem->pOn);
1f730 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69  .    sqlite3IdLi
1f740 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  stDelete(db, pIt
1f750 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d  em->pUsing);.  }
1f760 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1f770 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  NN(db, pList);.}
1f780 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1f790 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
1f7a0 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20  y the parser to 
1f7b0 61 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74  add a new term t
1f7c0 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  o the.** end of 
1f7d0 61 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63  a growing FROM c
1f7e0 6c 61 75 73 65 2e 20 20 54 68 65 20 22 70 22 20  lause.  The "p" 
1f7f0 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
1f800 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20   part of.** the 
1f810 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74  FROM clause that
1f820 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1f830 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20  n constructed.  
1f840 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69  "p" is NULL.** i
1f850 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
1f860 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20  rst term of the 
1f870 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54  FROM clause.  pT
1f880 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61  able and pDataba
1f890 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61  se.** are the na
1f8a0 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
1f8b0 61 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d  and database nam
1f8c0 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ed in the FROM c
1f8d0 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70  lause term..** p
1f8e0 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c  Database is NULL
1f8f0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
1f900 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20   name qualifier 
1f910 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65  is missing - the
1f920 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20  .** usual case. 
1f930 20 49 66 20 74 68 65 20 74 65 72 6d 20 68 61 73   If the term has
1f940 20 61 6e 20 61 6c 69 61 73 2c 20 74 68 65 6e 20   an alias, then 
1f950 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f  pAlias points to
1f960 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f   the.** alias to
1f970 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72  ken.  If the ter
1f980 6d 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2c  m is a subquery,
1f990 20 74 68 65 6e 20 70 53 75 62 71 75 65 72 79 20   then pSubquery 
1f9a0 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54  is the.** SELECT
1f9b0 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
1f9c0 74 68 65 20 73 75 62 71 75 65 72 79 20 65 6e 63  the subquery enc
1f9d0 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c  odes.  The pTabl
1f9e0 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61  e and.** pDataba
1f9f0 73 65 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  se parameters ar
1fa00 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75  e NULL for subqu
1fa10 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20  eries.  The pOn 
1fa20 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61  and pUsing.** pa
1fa30 72 61 6d 65 74 65 72 73 20 61 72 65 20 74 68 65  rameters are the
1fa40 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
1fa50 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
1fa60 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  uses..**.** Retu
1fa70 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  rn a new SrcList
1fa80 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69   which encodes i
1fa90 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20  s the FROM with 
1faa0 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20  the new.** term 
1fab0 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73  added..*/.SrcLis
1fac0 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
1fad0 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28  tAppendFromTerm(
1fae0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1faf0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
1fb00 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1fb10 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20  .  SrcList *p,  
1fb20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1fb30 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74  e left part of t
1fb40 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61  he FROM clause a
1fb50 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20  lready seen */. 
1fb60 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20   Token *pTable, 
1fb70 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1fb80 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
1fb90 20 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d   add to the FROM
1fba0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b   clause */.  Tok
1fbb0 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20  en *pDatabase,  
1fbc0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1fbd0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
1fbe0 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a  taining pTable *
1fbf0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61  /.  Token *pAlia
1fc00 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  s,          /* T
1fc10 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
1fc20 64 65 20 6f 66 20 74 68 65 20 41 53 20 73 75 62  de of the AS sub
1fc30 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
1fc40 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72  Select *pSubquer
1fc50 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  y,      /* A sub
1fc60 71 75 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c  query used in pl
1fc70 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e  ace of a table n
1fc80 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ame */.  Expr *p
1fc90 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  On,             
1fca0 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75 73   /* The ON claus
1fcb0 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20  e of a join */. 
1fcc0 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 20   IdList *pUsing 
1fcd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1fce0 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
1fcf0 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73  a join */.){.  s
1fd00 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1fd10 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c  em *pItem;.  sql
1fd20 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1fd30 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21 70 20  e->db;.  if( !p 
1fd40 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69 6e  && (pOn || pUsin
1fd50 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  g) ){.    sqlite
1fd60 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1fd70 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65  , "a JOIN clause
1fd80 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66   is required bef
1fd90 6f 72 65 20 25 73 22 2c 20 0a 20 20 20 20 20 20  ore %s", .      
1fda0 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22 55  (pOn ? "ON" : "U
1fdb0 53 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20 20  SING").    );.  
1fdc0 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72    goto append_fr
1fdd0 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  om_error;.  }.  
1fde0 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  p = sqlite3SrcLi
1fdf0 73 74 41 70 70 65 6e 64 28 64 62 2c 20 70 2c 20  stAppend(db, p, 
1fe00 70 54 61 62 6c 65 2c 20 70 44 61 74 61 62 61 73  pTable, pDatabas
1fe10 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  e);.  if( p==0 )
1fe20 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e  {.    goto appen
1fe30 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20  d_from_error;.  
1fe40 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  }.  assert( p->n
1fe50 53 72 63 3e 30 20 29 3b 0a 20 20 70 49 74 65 6d  Src>0 );.  pItem
1fe60 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63   = &p->a[p->nSrc
1fe70 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  -1];.  assert( p
1fe80 41 6c 69 61 73 21 3d 30 20 29 3b 0a 20 20 69 66  Alias!=0 );.  if
1fe90 28 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20  ( pAlias->n ){. 
1fea0 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73     pItem->zAlias
1feb0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1fec0 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69  omToken(db, pAli
1fed0 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  as);.  }.  pItem
1fee0 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62  ->pSelect = pSub
1fef0 71 75 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e  query;.  pItem->
1ff00 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74  pOn = pOn;.  pIt
1ff10 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55 73  em->pUsing = pUs
1ff20 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  ing;.  return p;
1ff30 0a 0a 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65  .. append_from_e
1ff40 72 72 6f 72 3a 0a 20 20 61 73 73 65 72 74 28 20  rror:.  assert( 
1ff50 70 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  p==0 );.  sqlite
1ff60 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
1ff70 70 4f 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 49  pOn);.  sqlite3I
1ff80 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
1ff90 70 55 73 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74  pUsing);.  sqlit
1ffa0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
1ffb0 62 2c 20 70 53 75 62 71 75 65 72 79 29 3b 0a 20  b, pSubquery);. 
1ffc0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1ffd0 0a 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44 45 58  .** Add an INDEX
1ffe0 45 44 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44  ED BY or NOT IND
1fff0 45 58 45 44 20 63 6c 61 75 73 65 20 74 6f 20 74  EXED clause to t
20000 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
20010 20 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65   added .** eleme
20020 6e 74 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65  nt of the source
20030 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20  -list passed as 
20040 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
20050 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
20060 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78  ite3SrcListIndex
20070 65 64 42 79 28 50 61 72 73 65 20 2a 70 50 61 72  edBy(Parse *pPar
20080 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20  se, SrcList *p, 
20090 54 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64 42  Token *pIndexedB
200a0 79 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49  y){.  assert( pI
200b0 6e 64 65 78 65 64 42 79 21 3d 30 20 29 3b 0a 20  ndexedBy!=0 );. 
200c0 20 69 66 28 20 70 20 26 26 20 70 49 6e 64 65 78   if( p && pIndex
200d0 65 64 42 79 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20  edBy->n>0 ){.   
200e0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
200f0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
20100 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 72 63   assert( p->nSrc
20110 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 20  >0 );.    pItem 
20120 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d  = &p->a[p->nSrc-
20130 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
20140 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64  pItem->fg.notInd
20150 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61  exed==0 );.    a
20160 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
20170 2e 69 73 49 6e 64 65 78 65 64 42 79 3d 3d 30 20  .isIndexedBy==0 
20180 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
20190 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
201a0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  nc==0 );.    if(
201b0 20 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d   pIndexedBy->n==
201c0 31 20 26 26 20 21 70 49 6e 64 65 78 65 64 42 79  1 && !pIndexedBy
201d0 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ->z ){.      /* 
201e0 41 20 22 4e 4f 54 20 49 4e 44 45 58 45 44 22 20  A "NOT INDEXED" 
201f0 63 6c 61 75 73 65 20 77 61 73 20 73 75 70 70 6c  clause was suppl
20200 69 65 64 2e 20 53 65 65 20 70 61 72 73 65 2e 79  ied. See parse.y
20210 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74   .      ** const
20220 72 75 63 74 20 22 69 6e 64 65 78 65 64 5f 6f 70  ruct "indexed_op
20230 74 22 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20  t" for details. 
20240 2a 2f 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  */.      pItem->
20250 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20  fg.notIndexed = 
20260 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
20270 20 20 20 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49      pItem->u1.zI
20280 6e 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74  ndexedBy = sqlit
20290 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
202a0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64  pParse->db, pInd
202b0 65 78 65 64 42 79 29 3b 0a 20 20 20 20 20 20 70  exedBy);.      p
202c0 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  Item->fg.isIndex
202d0 65 64 42 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  edBy = 1;.    }.
202e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
202f0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66 75 6e   the list of fun
20300 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
20310 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74 20 65  to the SrcList e
20320 6e 74 72 79 20 66 6f 72 20 61 0a 2a 2a 20 74 61  ntry for a.** ta
20330 62 6c 65 2d 76 61 6c 75 65 64 2d 66 75 6e 63 74  ble-valued-funct
20340 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
20350 69 74 65 33 53 72 63 4c 69 73 74 46 75 6e 63 41  ite3SrcListFuncA
20360 72 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  rgs(Parse *pPars
20370 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 45  e, SrcList *p, E
20380 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
20390 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
203a0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
203b0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
203c0 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20  >a[p->nSrc-1];. 
203d0 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
203e0 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d  ->fg.notIndexed=
203f0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
20400 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e  ( pItem->fg.isIn
20410 64 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20  dexedBy==0 );.  
20420 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
20430 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30  >fg.isTabFunc==0
20440 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75   );.    pItem->u
20450 31 2e 70 46 75 6e 63 41 72 67 20 3d 20 70 4c 69  1.pFuncArg = pLi
20460 73 74 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 66  st;.    pItem->f
20470 67 2e 69 73 54 61 62 46 75 6e 63 20 3d 20 31 3b  g.isTabFunc = 1;
20480 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
20490 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
204a0 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
204b0 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pList);.  }.}../
204c0 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64 69  *.** When buildi
204d0 6e 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c 61  ng up a FROM cla
204e0 75 73 65 20 69 6e 20 74 68 65 20 70 61 72 73 65  use in the parse
204f0 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  r, the join oper
20500 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69  ator.** is initi
20510 61 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74 6f  ally attached to
20520 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e   the left operan
20530 64 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64 65  d.  But the code
20540 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78   generator.** ex
20550 70 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f  pects the join o
20560 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e  perator to be on
20570 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
20580 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
20590 65 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c 20  e.** Shifts all 
205a0 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20 66  join operators f
205b0 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
205c0 74 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20  t for an entire 
205d0 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a  FROM.** clause..
205e0 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53  **.** Example: S
205f0 75 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20  uppose the join 
20600 69 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  is like this:.**
20610 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 20  .**           A 
20620 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f  natural cross jo
20630 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  in B.**.** The o
20640 70 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74 75  perator is "natu
20650 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e  ral cross join".
20660 20 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f 70    The A and B op
20670 65 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72 65  erands are store
20680 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20  d.** in p->a[0] 
20690 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73  and p->a[1], res
206a0 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20  pectively.  The 
206b0 70 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c 79  parser initially
206c0 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f   stores the.** o
206d0 70 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e 20  perator with A. 
206e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
206f0 69 66 74 73 20 74 68 61 74 20 6f 70 65 72 61 74  ifts that operat
20700 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f  or over to B..*/
20710 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
20720 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70  ListShiftJoinTyp
20730 65 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20  e(SrcList *p){. 
20740 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e   if( p ){.    in
20750 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70  t i;.    for(i=p
20760 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69  ->nSrc-1; i>0; i
20770 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b  --){.      p->a[
20780 69 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d  i].fg.jointype =
20790 20 70 2d 3e 61 5b 69 2d 31 5d 2e 66 67 2e 6a 6f   p->a[i-1].fg.jo
207a0 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20  intype;.    }.  
207b0 20 20 70 2d 3e 61 5b 30 5d 2e 66 67 2e 6a 6f 69    p->a[0].fg.joi
207c0 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  ntype = 0;.  }.}
207d0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
207e0 20 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20 61   VDBE code for a
207f0 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74   BEGIN statement
20800 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
20810 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f  3BeginTransactio
20820 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
20830 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71   int type){.  sq
20840 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
20850 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  e *v;.  int i;..
20860 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
20870 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50  !=0 );.  db = pP
20880 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65  arse->db;.  asse
20890 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
208a0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
208b0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
208c0 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
208d0 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29  "BEGIN", 0, 0) )
208e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
208f0 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  }.  v = sqlite3G
20900 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
20910 20 20 69 66 28 20 21 76 20 29 20 72 65 74 75 72    if( !v ) retur
20920 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54  n;.  if( type!=T
20930 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20  K_DEFERRED ){.  
20940 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
20950 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
20960 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20970 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61  Op2(v, OP_Transa
20980 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d  ction, i, (type=
20990 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31  =TK_EXCLUSIVE)+1
209a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
209b0 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
209c0 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   i);.    }.  }. 
209d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
209e0 70 30 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  p0(v, OP_AutoCom
209f0 6d 69 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  mit);.}../*.** G
20a00 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
20a10 65 20 66 6f 72 20 61 20 43 4f 4d 4d 49 54 20 6f  e for a COMMIT o
20a20 72 20 52 4f 4c 4c 42 41 43 4b 20 73 74 61 74 65  r ROLLBACK state
20a30 6d 65 6e 74 2e 0a 2a 2a 20 43 6f 64 65 20 66 6f  ment..** Code fo
20a40 72 20 52 4f 4c 4c 42 41 43 4b 20 69 73 20 67 65  r ROLLBACK is ge
20a50 6e 65 72 61 74 65 64 20 69 66 20 65 54 79 70 65  nerated if eType
20a60 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 2e 20 20  ==TK_ROLLBACK.  
20a70 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 63 6f 64  Otherwise.** cod
20a80 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66  e is generated f
20a90 6f 72 20 61 20 43 4f 4d 4d 49 54 2e 0a 2a 2f 0a  or a COMMIT..*/.
20aa0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54  void sqlite3EndT
20ab0 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
20ac0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65 54   *pParse, int eT
20ad0 79 70 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  ype){.  Vdbe *v;
20ae0 0a 20 20 69 6e 74 20 69 73 52 6f 6c 6c 62 61 63  .  int isRollbac
20af0 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  k;..  assert( pP
20b00 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  arse!=0 );.  ass
20b10 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21  ert( pParse->db!
20b20 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
20b30 65 54 79 70 65 3d 3d 54 4b 5f 43 4f 4d 4d 49 54  eType==TK_COMMIT
20b40 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 45 4e   || eType==TK_EN
20b50 44 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 52  D || eType==TK_R
20b60 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 69 73 52  OLLBACK );.  isR
20b70 6f 6c 6c 62 61 63 6b 20 3d 20 65 54 79 70 65 3d  ollback = eType=
20b80 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  =TK_ROLLBACK;.  
20b90 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
20ba0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
20bb0 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
20bc0 20 0a 20 20 20 20 20 20 20 69 73 52 6f 6c 6c 62   .       isRollb
20bd0 61 63 6b 20 3f 20 22 52 4f 4c 4c 42 41 43 4b 22  ack ? "ROLLBACK"
20be0 20 3a 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20   : "COMMIT", 0, 
20bf0 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
20c00 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69  ;.  }.  v = sqli
20c10 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
20c20 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
20c30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20c40 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43  dOp2(v, OP_AutoC
20c50 6f 6d 6d 69 74 2c 20 31 2c 20 69 73 52 6f 6c 6c  ommit, 1, isRoll
20c60 62 61 63 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  back);.  }.}../*
20c70 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
20c80 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  n is called by t
20c90 68 65 20 70 61 72 73 65 72 20 77 68 65 6e 20 69  he parser when i
20ca0 74 20 70 61 72 73 65 73 20 61 20 63 6f 6d 6d 61  t parses a comma
20cb0 6e 64 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a  nd to create,.**
20cc0 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c   release or roll
20cd0 62 61 63 6b 20 61 6e 20 53 51 4c 20 73 61 76 65  back an SQL save
20ce0 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20  point. .*/.void 
20cf0 73 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74  sqlite3Savepoint
20d00 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
20d10 69 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70  int op, Token *p
20d20 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Name){.  char *z
20d30 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
20d40 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
20d50 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  se->db, pName);.
20d60 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
20d70 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
20d80 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
20d90 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  se);.#ifndef SQL
20da0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
20db0 5a 41 54 49 4f 4e 0a 20 20 20 20 73 74 61 74 69  ZATION.    stati
20dc0 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63  c const char * c
20dd0 6f 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42  onst az[] = { "B
20de0 45 47 49 4e 22 2c 20 22 52 45 4c 45 41 53 45 22  EGIN", "RELEASE"
20df0 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a  , "ROLLBACK" };.
20e00 20 20 20 20 61 73 73 65 72 74 28 20 21 53 41 56      assert( !SAV
20e10 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26 20  EPOINT_BEGIN && 
20e20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
20e30 45 3d 3d 31 20 26 26 20 53 41 56 45 50 4f 49 4e  E==1 && SAVEPOIN
20e40 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b  T_ROLLBACK==2 );
20e50 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
20e60 21 76 20 7c 7c 20 73 71 6c 69 74 65 33 41 75 74  !v || sqlite3Aut
20e70 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
20e80 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c  QLITE_SAVEPOINT,
20e90 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20   az[op], zName, 
20ea0 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
20eb0 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
20ec0 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ->db, zName);.  
20ed0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
20ee0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
20ef0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61  eAddOp4(v, OP_Sa
20f00 76 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20  vepoint, op, 0, 
20f10 30 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e  0, zName, P4_DYN
20f20 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  AMIC);.  }.}../*
20f30 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
20f40 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  e TEMP database 
20f50 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69  is open and avai
20f60 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20  lable for use.  
20f70 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75  Return.** the nu
20f80 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
20f90 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72   Leave any error
20fa0 20 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65   messages in the
20fb0 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
20fc0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
20fd0 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73  3OpenTempDatabas
20fe0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
20ff0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
21000 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
21010 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  if( db->aDb[1].p
21020 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65  Bt==0 && !pParse
21030 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
21040 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72   int rc;.    Btr
21050 65 65 20 2a 70 42 74 3b 0a 20 20 20 20 73 74 61  ee *pBt;.    sta
21060 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c  tic const int fl
21070 61 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20  ags = .         
21080 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
21090 44 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20  DWRITE |.       
210a0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43     SQLITE_OPEN_C
210b0 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20  REATE |.        
210c0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
210d0 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20  CLUSIVE |.      
210e0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
210f0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a  DELETEONCLOSE |.
21100 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
21110 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a  _OPEN_TEMP_DB;..
21120 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21130 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56  BtreeOpen(db->pV
21140 66 73 2c 20 30 2c 20 64 62 2c 20 26 70 42 74 2c  fs, 0, db, &pBt,
21150 20 30 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20   0, flags);.    
21160 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
21170 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
21180 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
21190 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70  e, "unable to op
211a0 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64  en a temporary d
211b0 61 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20  atabase ".      
211c0 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72    "file for stor
211d0 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ing temporary ta
211e0 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50  bles");.      pP
211f0 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
21200 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
21210 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62     }.    db->aDb
21220 5b 31 5d 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20  [1].pBt = pBt;. 
21230 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61     assert( db->a
21240 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b  Db[1].pSchema );
21250 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
21260 4e 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74  NOMEM==sqlite3Bt
21270 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 70  reeSetPageSize(p
21280 42 74 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67 65  Bt, db->nextPage
21290 73 69 7a 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a  size, -1, 0) ){.
212a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d        sqlite3Oom
212b0 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20  Fault(db);.     
212c0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
212d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
212e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64  .}../*.** Record
212f0 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
21300 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
21310 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65   will need to be
21320 20 76 65 72 69 66 69 65 64 0a 2a 2a 20 66 6f 72   verified.** for
21330 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 20 20   database iDb.  
21340 54 68 65 20 63 6f 64 65 20 74 6f 20 61 63 74 75  The code to actu
21350 61 6c 6c 79 20 76 65 72 69 66 79 20 74 68 65 20  ally verify the 
21360 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a  schema cookie.**
21370 20 77 69 6c 6c 20 6f 63 63 75 72 20 61 74 20 74   will occur at t
21380 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74 6f  he end of the to
21390 70 2d 6c 65 76 65 6c 20 56 44 42 45 20 61 6e 64  p-level VDBE and
213a0 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74   will be generat
213b0 65 64 0a 2a 2a 20 6c 61 74 65 72 2c 20 62 79 20  ed.** later, by 
213c0 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64  sqlite3FinishCod
213d0 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ing()..*/.void s
213e0 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
213f0 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50  Schema(Parse *pP
21400 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
21410 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
21420 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
21430 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
21440 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44  );..  assert( iD
21450 62 3e 3d 30 20 26 26 20 69 44 62 3c 70 50 61 72  b>=0 && iDb<pPar
21460 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  se->db->nDb );. 
21470 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
21480 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42  >db->aDb[iDb].pB
21490 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29  t!=0 || iDb==1 )
214a0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3c  ;.  assert( iDb<
214b0 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
214c0 48 45 44 2b 32 20 29 3b 0a 20 20 61 73 73 65 72  HED+2 );.  asser
214d0 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
214e0 4d 75 74 65 78 48 65 6c 64 28 70 50 61 72 73 65  MutexHeld(pParse
214f0 2d 3e 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  ->db, iDb, 0) );
21500 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 54 65 73  .  if( DbMaskTes
21510 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f  t(pToplevel->coo
21520 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30  kieMask, iDb)==0
21530 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65   ){.    DbMaskSe
21540 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f  t(pToplevel->coo
21550 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20  kieMask, iDb);. 
21560 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
21570 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b  PDB && iDb==1 ){
21580 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
21590 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70  enTempDatabase(p
215a0 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d  Toplevel);.    }
215b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
215c0 20 61 72 67 75 6d 65 6e 74 20 7a 44 62 20 69 73   argument zDb is
215d0 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 61 6c 6c   NULL, then call
215e0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
215f0 66 79 53 63 68 65 6d 61 28 29 20 66 6f 72 20 65  fySchema() for e
21600 61 63 68 20 0a 2a 2a 20 61 74 74 61 63 68 65 64  ach .** attached
21610 20 64 61 74 61 62 61 73 65 2e 20 4f 74 68 65 72   database. Other
21620 77 69 73 65 2c 20 69 6e 76 6f 6b 65 20 69 74 20  wise, invoke it 
21630 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
21640 20 6e 61 6d 65 64 20 7a 44 62 20 6f 6e 6c 79 2e   named zDb only.
21650 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21660 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53  CodeVerifyNamedS
21670 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61  chema(Parse *pPa
21680 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
21690 2a 7a 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33  *zDb){.  sqlite3
216a0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
216b0 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  b;.  int i;.  fo
216c0 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
216d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a  ; i++){.    Db *
216e0 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
216f0 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
21700 70 42 74 20 26 26 20 28 21 7a 44 62 20 7c 7c 20  pBt && (!zDb || 
21710 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
21720 70 28 7a 44 62 2c 20 70 44 62 2d 3e 7a 44 62 53  p(zDb, pDb->zDbS
21730 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20 20 20 20  Name)) ){.      
21740 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
21750 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
21760 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  i);.    }.  }.}.
21770 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
21780 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70  VDBE code that p
21790 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e  repares for doin
217a0 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74  g an operation t
217b0 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61  hat.** might cha
217c0 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65  nge the database
217d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
217e0 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65  tine starts a ne
217f0 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  w transaction if
21800 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65   we are not alre
21810 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20  ady within.** a 
21820 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
21830 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20   we are already 
21840 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63  within a transac
21850 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65  tion, then a che
21860 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65  ckpoint.** is se
21870 74 20 69 66 20 74 68 65 20 73 65 74 53 74 61 74  t if the setStat
21880 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20  ement parameter 
21890 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63  is true.  A chec
218a0 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a  kpoint should.**
218b0 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72   be set for oper
218c0 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68  ations that migh
218d0 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61  t fail (due to a
218e0 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72   constraint) par
218f0 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20  t of.** the way 
21900 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63  through and whic
21910 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75  h will need to u
21920 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20  ndo some writes 
21930 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
21940 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68  o.** rollback th
21950 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74  e whole transact
21960 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74  ion.  For operat
21970 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63  ions where all c
21980 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61  onstraints.** ca
21990 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66  n be checked bef
219a0 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20  ore any changes 
219b0 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
219c0 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20  database, it is 
219d0 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61  never.** necessa
219e0 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69  ry to undo a wri
219f0 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b  te and the check
21a00 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74  point should not
21a10 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64   be set..*/.void
21a20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
21a30 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73  teOperation(Pars
21a40 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73  e *pParse, int s
21a50 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74  etStatement, int
21a60 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a   iDb){.  Parse *
21a70 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
21a80 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
21a90 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
21aa0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
21ab0 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
21ac0 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74 28 70 54  ;.  DbMaskSet(pT
21ad0 6f 70 6c 65 76 65 6c 2d 3e 77 72 69 74 65 4d 61  oplevel->writeMa
21ae0 73 6b 2c 20 69 44 62 29 3b 0a 20 20 70 54 6f 70  sk, iDb);.  pTop
21af0 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72  level->isMultiWr
21b00 69 74 65 20 7c 3d 20 73 65 74 53 74 61 74 65 6d  ite |= setStatem
21b10 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ent;.}../*.** In
21b20 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
21b30 73 74 61 74 65 6d 65 6e 74 20 63 75 72 72 65 6e  statement curren
21b40 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
21b50 75 63 74 69 6f 6e 20 6d 69 67 68 74 20 77 72 69  uction might wri
21b60 74 65 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20  te.** more than 
21b70 6f 6e 65 20 65 6e 74 72 79 20 28 65 78 61 6d 70  one entry (examp
21b80 6c 65 3a 20 64 65 6c 65 74 69 6e 67 20 6f 6e 65  le: deleting one
21b90 20 72 6f 77 20 74 68 65 6e 20 69 6e 73 65 72 74   row then insert
21ba0 69 6e 67 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20  ing another,.** 
21bb0 69 6e 73 65 72 74 69 6e 67 20 6d 75 6c 74 69 70  inserting multip
21bc0 6c 65 20 72 6f 77 73 20 69 6e 20 61 20 74 61 62  le rows in a tab
21bd0 6c 65 2c 20 6f 72 20 69 6e 73 65 72 74 69 6e 67  le, or inserting
21be0 20 61 20 72 6f 77 20 61 6e 64 20 69 6e 64 65 78   a row and index
21bf0 20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a 20 49 66   entries.).** If
21c00 20 61 6e 20 61 62 6f 72 74 20 6f 63 63 75 72 73   an abort occurs
21c10 20 61 66 74 65 72 20 73 6f 6d 65 20 6f 66 20 74   after some of t
21c20 68 65 73 65 20 77 72 69 74 65 73 20 68 61 76 65  hese writes have
21c30 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74 68 65 6e   completed, then
21c40 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e   it will.** be n
21c50 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f  ecessary to undo
21c60 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 64 20 77   the completed w
21c70 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rites..*/.void s
21c80 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65  qlite3MultiWrite
21c90 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
21ca0 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65  .  Parse *pTople
21cb0 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72  vel = sqlite3Par
21cc0 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
21cd0 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d  e);.  pToplevel-
21ce0 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 3d 20  >isMultiWrite = 
21cf0 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65  1;.}../* .** The
21d00 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
21d10 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
21d20 6e 65 20 69 66 20 69 73 20 64 69 73 63 6f 76 65  ne if is discove
21d30 72 73 20 74 68 61 74 20 69 74 20 69 73 0a 2a 2a  rs that it is.**
21d40 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 62 6f   possible to abo
21d50 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 70  rt a statement p
21d60 72 69 6f 72 20 74 6f 20 63 6f 6d 70 6c 65 74 69  rior to completi
21d70 6f 6e 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f  on.  In order to
21d80 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68 69   .** perform thi
21d90 73 20 61 62 6f 72 74 20 77 69 74 68 6f 75 74 20  s abort without 
21da0 63 6f 72 72 75 70 74 69 6e 67 20 74 68 65 20 64  corrupting the d
21db0 61 74 61 62 61 73 65 2c 20 77 65 20 6e 65 65 64  atabase, we need
21dc0 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65   to make.** sure
21dd0 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d   that the statem
21de0 65 6e 74 20 69 73 20 70 72 6f 74 65 63 74 65 64  ent is protected
21df0 20 62 79 20 61 20 73 74 61 74 65 6d 65 6e 74 20   by a statement 
21e00 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
21e10 2a 2a 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20  ** Technically, 
21e20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20  we only need to 
21e30 73 65 74 20 74 68 65 20 6d 61 79 41 62 6f 72 74  set the mayAbort
21e40 20 66 6c 61 67 20 69 66 20 74 68 65 0a 2a 2a 20   flag if the.** 
21e50 69 73 4d 75 6c 74 69 57 72 69 74 65 20 66 6c 61  isMultiWrite fla
21e60 67 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  g was previously
21e70 20 73 65 74 2e 20 20 54 68 65 72 65 20 69 73 20   set.  There is 
21e80 61 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63  a time dependenc
21e90 79 0a 2a 2a 20 73 75 63 68 20 74 68 61 74 20 74  y.** such that t
21ea0 68 65 20 61 62 6f 72 74 20 6d 75 73 74 20 6f 63  he abort must oc
21eb0 63 75 72 20 61 66 74 65 72 20 74 68 65 20 6d 75  cur after the mu
21ec0 6c 74 69 77 72 69 74 65 2e 20 20 54 68 69 73 20  ltiwrite.  This 
21ed0 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20 73 74  makes.** some st
21ee0 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6c 76 69  atements involvi
21ef0 6e 67 20 74 68 65 20 52 45 50 4c 41 43 45 20 63  ng the REPLACE c
21f00 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
21f10 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20  on algorithm.** 
21f20 67 6f 20 61 20 6c 69 74 74 6c 65 20 66 61 73 74  go a little fast
21f30 65 72 2e 20 20 42 75 74 20 74 61 6b 69 6e 67 20  er.  But taking 
21f40 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 69  advantage of thi
21f50 73 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63  s time dependenc
21f60 79 0a 2a 2a 20 6d 61 6b 65 73 20 69 74 20 6d 6f  y.** makes it mo
21f70 72 65 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20  re difficult to 
21f80 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 63  prove that the c
21f90 6f 64 65 20 69 73 20 63 6f 72 72 65 63 74 20 28  ode is correct (
21fa0 69 6e 20 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61  in .** particula
21fb0 72 2c 20 69 74 20 70 72 65 76 65 6e 74 73 20 75  r, it prevents u
21fc0 73 20 66 72 6f 6d 20 77 72 69 74 69 6e 67 20 61  s from writing a
21fd0 6e 20 65 66 66 65 63 74 69 76 65 0a 2a 2a 20 69  n effective.** i
21fe0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
21ff0 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61   sqlite3AssertMa
22000 79 41 62 6f 72 74 28 29 29 20 61 6e 64 20 73 6f  yAbort()) and so
22010 20 77 65 20 68 61 76 65 20 63 68 6f 73 65 6e 0a   we have chosen.
22020 2a 2a 20 74 6f 20 74 61 6b 65 20 74 68 65 20 73  ** to take the s
22030 61 66 65 20 72 6f 75 74 65 20 61 6e 64 20 73 6b  afe route and sk
22040 69 70 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  ip the optimizat
22050 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
22060 69 74 65 33 4d 61 79 41 62 6f 72 74 28 50 61 72  ite3MayAbort(Par
22070 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50  se *pParse){.  P
22080 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
22090 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
220a0 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
220b0 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79    pToplevel->may
220c0 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  Abort = 1;.}../*
220d0 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48  .** Code an OP_H
220e0 61 6c 74 20 74 68 61 74 20 63 61 75 73 65 73 20  alt that causes 
220f0 74 68 65 20 76 64 62 65 20 74 6f 20 72 65 74 75  the vdbe to retu
22100 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  rn an SQLITE_CON
22110 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72 72 6f 72  STRAINT.** error
22120 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72 20 70 61  . The onError pa
22130 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e  rameter determin
22140 65 73 20 77 68 69 63 68 20 28 69 66 20 61 6e 79  es which (if any
22150 29 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  ) of the stateme
22160 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63 75 72  nt.** and/or cur
22170 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
22180 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
22190 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
221a0 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 0a  HaltConstraint(.
221b0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
221c0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
221d0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
221e0 65 72 72 43 6f 64 65 2c 20 20 20 20 20 20 2f 2a  errCode,      /*
221f0 20 65 78 74 65 6e 64 65 64 20 65 72 72 6f 72 20   extended error 
22200 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  code */.  int on
22210 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43  Error,      /* C
22220 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a  onstraint type *
22230 2f 0a 20 20 63 68 61 72 20 2a 70 34 2c 20 20 20  /.  char *p4,   
22240 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d        /* Error m
22250 65 73 73 61 67 65 20 2a 2f 0a 20 20 69 38 20 70  essage */.  i8 p
22260 34 74 79 70 65 2c 20 20 20 20 20 20 20 20 2f 2a  4type,        /*
22270 20 50 34 5f 53 54 41 54 49 43 20 6f 72 20 50 34   P4_STATIC or P4
22280 5f 54 52 41 4e 53 49 45 4e 54 20 2a 2f 0a 20 20  _TRANSIENT */.  
22290 75 38 20 70 35 45 72 72 6d 73 67 20 20 20 20 20  u8 p5Errmsg     
222a0 20 20 2f 2a 20 50 35 5f 45 72 72 4d 73 67 20 74    /* P5_ErrMsg t
222b0 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ype */.){.  Vdbe
222c0 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
222d0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
222e0 61 73 73 65 72 74 28 20 28 65 72 72 43 6f 64 65  assert( (errCode
222f0 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43  &0xff)==SQLITE_C
22300 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a 20 20 69  ONSTRAINT );.  i
22310 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41  f( onError==OE_A
22320 62 6f 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  bort ){.    sqli
22330 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
22340 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  se);.  }.  sqlit
22350 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
22360 4f 50 5f 48 61 6c 74 2c 20 65 72 72 43 6f 64 65  OP_Halt, errCode
22370 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 70 34  , onError, 0, p4
22380 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 73 71 6c  , p4type);.  sql
22390 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
223a0 28 76 2c 20 70 35 45 72 72 6d 73 67 29 3b 0a 7d  (v, p5Errmsg);.}
223b0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
223c0 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 55  OP_Halt due to U
223d0 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59  NIQUE or PRIMARY
223e0 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
223f0 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  violation..*/.vo
22400 69 64 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65  id sqlite3Unique
22410 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61  Constraint(.  Pa
22420 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
22430 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
22440 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  xt */.  int onEr
22450 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e  ror,      /* Con
22460 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a  straint type */.
22470 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
22480 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
22490 20 74 68 61 74 20 74 72 69 67 67 65 72 73 20 74   that triggers t
224a0 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  he constraint */
224b0 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  .){.  char *zErr
224c0 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 53 74 72  ;.  int j;.  Str
224d0 41 63 63 75 6d 20 65 72 72 4d 73 67 3b 0a 20 20  Accum errMsg;.  
224e0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
224f0 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 73  dx->pTable;..  s
22500 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e  qlite3StrAccumIn
22510 69 74 28 26 65 72 72 4d 73 67 2c 20 70 50 61 72  it(&errMsg, pPar
22520 73 65 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 32 30  se->db, 0, 0, 20
22530 30 29 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e  0);.  if( pIdx->
22540 61 43 6f 6c 45 78 70 72 20 29 7b 0a 20 20 20 20  aColExpr ){.    
22550 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
22560 65 72 72 4d 73 67 2c 20 22 69 6e 64 65 78 20 27  errMsg, "index '
22570 25 71 27 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d  %q'", pIdx->zNam
22580 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
22590 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78   for(j=0; j<pIdx
225a0 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b  ->nKeyCol; j++){
225b0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  .      char *zCo
225c0 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  l;.      assert(
225d0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
225e0 6a 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 7a  j]>=0 );.      z
225f0 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
22600 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  [pIdx->aiColumn[
22610 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  j]].zName;.     
22620 20 69 66 28 20 6a 20 29 20 73 71 6c 69 74 65 33   if( j ) sqlite3
22630 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
22640 65 72 72 4d 73 67 2c 20 22 2c 20 22 2c 20 32 29  errMsg, ", ", 2)
22650 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
22660 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c  trAccumAppendAll
22670 28 26 65 72 72 4d 73 67 2c 20 70 54 61 62 2d 3e  (&errMsg, pTab->
22680 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  zName);.      sq
22690 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
226a0 65 6e 64 28 26 65 72 72 4d 73 67 2c 20 22 2e 22  end(&errMsg, "."
226b0 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
226c0 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
226d0 64 41 6c 6c 28 26 65 72 72 4d 73 67 2c 20 7a 43  dAll(&errMsg, zC
226e0 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ol);.    }.  }. 
226f0 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 53   zErr = sqlite3S
22700 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 65  trAccumFinish(&e
22710 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
22720 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
22730 70 50 61 72 73 65 2c 20 0a 20 20 20 20 49 73 50  pParse, .    IsP
22740 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
22750 49 64 78 29 20 3f 20 53 51 4c 49 54 45 5f 43 4f  Idx) ? SQLITE_CO
22760 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59  NSTRAINT_PRIMARY
22770 4b 45 59 20 0a 20 20 20 20 20 20 20 20 20 20 20  KEY .           
22780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22790 20 3a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   : SQLITE_CONSTR
227a0 41 49 4e 54 5f 55 4e 49 51 55 45 2c 0a 20 20 20  AINT_UNIQUE,.   
227b0 20 6f 6e 45 72 72 6f 72 2c 20 7a 45 72 72 2c 20   onError, zErr, 
227c0 50 34 5f 44 59 4e 41 4d 49 43 2c 20 50 35 5f 43  P4_DYNAMIC, P5_C
227d0 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71 75 65 29  onstraintUnique)
227e0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  ;.}.../*.** Code
227f0 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65 20   an OP_Halt due 
22800 74 6f 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f  to non-unique ro
22810 77 69 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wid..*/.void sql
22820 69 74 65 33 52 6f 77 69 64 43 6f 6e 73 74 72 61  ite3RowidConstra
22830 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  int(.  Parse *pP
22840 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
22850 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
22860 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
22870 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72     /* Conflict r
22880 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
22890 74 68 6d 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  thm */.  Table *
228a0 70 54 61 62 20 20 20 20 20 20 20 2f 2a 20 54 68  pTab       /* Th
228b0 65 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  e table with the
228c0 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69   non-unique rowi
228d0 64 20 2a 2f 20 0a 29 7b 0a 20 20 63 68 61 72 20  d */ .){.  char 
228e0 2a 7a 4d 73 67 3b 0a 20 20 69 6e 74 20 72 63 3b  *zMsg;.  int rc;
228f0 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b  .  if( pTab->iPK
22900 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 7a 4d 73  ey>=0 ){.    zMs
22910 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
22920 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
22930 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  %s.%s", pTab->zN
22940 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
22950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
22960 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e  Tab->aCol[pTab->
22970 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  iPKey].zName);. 
22980 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
22990 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52  ONSTRAINT_PRIMAR
229a0 59 4b 45 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  YKEY;.  }else{. 
229b0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
229c0 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
229d0 3e 64 62 2c 20 22 25 73 2e 72 6f 77 69 64 22 2c  >db, "%s.rowid",
229e0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
229f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
22a00 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 3b  ONSTRAINT_ROWID;
22a10 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61  .  }.  sqlite3Ha
22a20 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  ltConstraint(pPa
22a30 72 73 65 2c 20 72 63 2c 20 6f 6e 45 72 72 6f 72  rse, rc, onError
22a40 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
22a50 49 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  IC,.            
22a60 20 20 20 20 20 20 20 20 20 20 20 20 50 35 5f 43              P5_C
22a70 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71 75 65 29  onstraintUnique)
22a80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
22a90 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e 64 65   to see if pInde
22aa0 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61  x uses the colla
22ab0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43  ting sequence pC
22ac0 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  oll.  Return.** 
22ad0 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 20  true if it does 
22ae0 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69 74 20  and false if it 
22af0 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66  does not..*/.#if
22b00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
22b10 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20  _REINDEX.static 
22b20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74  int collationMat
22b30 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ch(const char *z
22b40 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e  Coll, Index *pIn
22b50 64 65 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  dex){.  int i;. 
22b60 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d   assert( zColl!=
22b70 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0 );.  for(i=0; 
22b80 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  i<pIndex->nColum
22b90 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  n; i++){.    con
22ba0 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e  st char *z = pIn
22bb0 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  dex->azColl[i];.
22bc0 20 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30      assert( z!=0
22bd0 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f   || pIndex->aiCo
22be0 6c 75 6d 6e 5b 69 5d 3c 30 20 29 3b 0a 20 20 20  lumn[i]<0 );.   
22bf0 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 69 43   if( pIndex->aiC
22c00 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 26 26 20 30  olumn[i]>=0 && 0
22c10 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
22c20 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  (z, zColl) ){.  
22c30 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
22c40 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
22c50 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
22c60 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c  .** Recompute al
22c70 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61  l indices of pTa
22c80 62 20 74 68 61 74 20 75 73 65 20 74 68 65 20 63  b that use the c
22c90 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
22ca0 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70  e pColl..** If p
22cb0 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63  Coll==0 then rec
22cc0 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
22cd0 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23  es of pTab..*/.#
22ce0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22cf0 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69  IT_REINDEX.stati
22d00 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61  c void reindexTa
22d10 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
22d20 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
22d30 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
22d40 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  l){.  Index *pIn
22d50 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
22d60 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73    /* An index as
22d70 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
22d80 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e  ab */..  for(pIn
22d90 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  dex=pTab->pIndex
22da0 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ; pIndex; pIndex
22db0 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b  =pIndex->pNext){
22dc0 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d  .    if( zColl==
22dd0 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61  0 || collationMa
22de0 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65  tch(zColl, pInde
22df0 78 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  x) ){.      int 
22e00 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
22e10 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
22e20 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
22e30 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  hema);.      sql
22e40 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
22e50 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
22e60 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73  0, iDb);.      s
22e70 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
22e80 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
22e90 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , -1);.    }.  }
22ea0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
22eb0 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   Recompute all i
22ec0 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61  ndices of all ta
22ed0 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61  bles in all data
22ee0 62 61 73 65 73 20 77 68 65 72 65 20 74 68 65 0a  bases where the.
22ef0 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20 74  ** indices use t
22f00 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
22f10 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66  uence pColl.  If
22f20 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72   pColl==0 then r
22f30 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20  ecompute.** all 
22f40 69 6e 64 69 63 65 73 20 65 76 65 72 79 77 68 65  indices everywhe
22f50 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  re..*/.#ifndef S
22f60 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
22f70 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  EX.static void r
22f80 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
22f90 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
22fa0 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c  har const *zColl
22fb0 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20  ){.  Db *pDb;   
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fd0 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74   /* A single dat
22fe0 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  abase */.  int i
22ff0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
23000 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
23010 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d  tabase index num
23020 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ber */.  sqlite3
23030 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
23040 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  b;   /* The data
23050 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
23060 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b  */.  HashElem *k
23070 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23080 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
23090 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70  over tables in p
230a0 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  Db */.  Table *p
230b0 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
230c0 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69      /* A table i
230d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
230e0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
230f0 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c  ite3BtreeHoldsAl
23100 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 20  lMutexes(db) ); 
23110 20 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72 20 73   /* Needed for s
23120 63 68 65 6d 61 20 61 63 63 65 73 73 20 2a 2f 0a  chema access */.
23130 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62    for(iDb=0, pDb
23140 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62  =db->aDb; iDb<db
23150 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44  ->nDb; iDb++, pD
23160 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  b++){.    assert
23170 28 20 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20  ( pDb!=0 );.    
23180 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68  for(k=sqliteHash
23190 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68  First(&pDb->pSch
231a0 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20  ema->tblHash);  
231b0 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e  k; k=sqliteHashN
231c0 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70  ext(k)){.      p
231d0 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71  Tab = (Table*)sq
231e0 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b  liteHashData(k);
231f0 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 54 61  .      reindexTa
23200 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
23210 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a  , zColl);.    }.
23220 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
23230 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
23240 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45  e for the REINDE
23250 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  X command..**.**
23260 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
23270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23280 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a             -- 1.
23290 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
232a0 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20  X  <collation>  
232b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
232c0 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  2.**        REIN
232d0 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e  DEX  ?<database>
232e0 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d  .?<tablename>  -
232f0 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 3.**        RE
23300 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73  INDEX  ?<databas
23310 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20  e>.?<indexname> 
23320 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d   -- 4.**.** Form
23330 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e   1 causes all in
23340 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74  dices in all att
23350 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
23360 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a  to be rebuilt..*
23370 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64  * Form 2 rebuild
23380 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e  s all indices in
23390 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74   all databases t
233a0 68 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65  hat use the name
233b0 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66  d.** collating f
233c0 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20  unction.  Forms 
233d0 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20  3 and 4 rebuild 
233e0 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  the named index 
233f0 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65  or all.** indice
23400 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
23410 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  h the named tabl
23420 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
23430 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
23440 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  X.void sqlite3Re
23450 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  index(Parse *pPa
23460 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  rse, Token *pNam
23470 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  e1, Token *pName
23480 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  2){.  CollSeq *p
23490 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
234a0 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
234b0 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65  equence to be re
234c0 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c  indexed, or NULL
234d0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20   */.  char *z;  
234e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234f0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74    /* Name of a t
23500 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f  able or index */
23510 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
23520 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Db;            /
23530 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
23540 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c  tabase */.  Tabl
23550 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
23560 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62          /* A tab
23570 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  le in the databa
23580 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  se */.  Index *p
23590 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  Index;          
235a0 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
235b0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
235c0 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44  pTab */.  int iD
235d0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
235e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
235f0 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62  abase index numb
23600 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
23610 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
23620 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
23630 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
23640 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e  /.  Token *pObjN
23650 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
23660 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
23670 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f  able or index to
23680 20 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f   be reindexed */
23690 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
236a0 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
236b0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
236c0 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  urs, leave an er
236d0 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a  ror message.  **
236e0 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61   and code in pPa
236f0 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  rse and return N
23700 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51  ULL. */.  if( SQ
23710 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
23720 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
23730 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
23740 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61  ;.  }..  if( pNa
23750 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  me1==0 ){.    re
23760 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70  indexDatabases(p
23770 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72  Parse, 0);.    r
23780 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69  eturn;.  }else i
23790 66 28 20 4e 45 56 45 52 28 70 4e 61 6d 65 32 3d  f( NEVER(pName2=
237a0 3d 30 29 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a  =0) || pName2->z
237b0 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
237c0 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65  *zColl;.    asse
237d0 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b  rt( pName1->z );
237e0 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c  .    zColl = sql
237f0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
23800 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e  n(pParse->db, pN
23810 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 21  ame1);.    if( !
23820 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a  zColl ) return;.
23830 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
23840 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
23850 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c  b, ENC(db), zCol
23860 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  l, 0);.    if( p
23870 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65  Coll ){.      re
23880 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70  indexDatabases(p
23890 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  Parse, zColl);. 
238a0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
238b0 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  ee(db, zColl);. 
238c0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
238d0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
238e0 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
238f0 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
23900 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
23910 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
23920 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d  pName2, &pObjNam
23930 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20  e);.  if( iDb<0 
23940 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20  ) return;.  z = 
23950 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
23960 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d  oken(db, pObjNam
23970 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  e);.  if( z==0 )
23980 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d   return;.  zDb =
23990 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44   db->aDb[iDb].zD
239a0 62 53 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d  bSName;.  pTab =
239b0 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
239c0 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20  e(db, z, zDb);. 
239d0 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
239e0 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50   reindexTable(pP
239f0 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a  arse, pTab, 0);.
23a00 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
23a10 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 72 65  e(db, z);.    re
23a20 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64  turn;.  }.  pInd
23a30 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ex = sqlite3Find
23a40 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62  Index(db, z, zDb
23a50 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
23a60 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 69 66 28  ee(db, z);.  if(
23a70 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73   pIndex ){.    s
23a80 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
23a90 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
23aa0 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 0, iDb);.    s
23ab0 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
23ac0 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
23ad0 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72  , -1);.    retur
23ae0 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
23af0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
23b00 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e   "unable to iden
23b10 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20  tify the object 
23b20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 22  to be reindexed"
23b30 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
23b40 2a 2a 20 52 65 74 75 72 6e 20 61 20 4b 65 79 49  ** Return a KeyI
23b50 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
23b60 61 74 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  at is appropriat
23b70 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  e for the given 
23b80 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Index..**.** The
23b90 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 69   caller should i
23ba0 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 4b 65 79  nvoke sqlite3Key
23bb0 49 6e 66 6f 55 6e 72 65 66 28 29 20 6f 6e 20 74  InfoUnref() on t
23bc0 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65  he returned obje
23bd0 63 74 0a 2a 2a 20 77 68 65 6e 20 69 74 20 68 61  ct.** when it ha
23be0 73 20 66 69 6e 69 73 68 65 64 20 75 73 69 6e 67  s finished using
23bf0 20 69 74 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20   it..*/.KeyInfo 
23c00 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f  *sqlite3KeyInfoO
23c10 66 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  fIndex(Parse *pP
23c20 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64  arse, Index *pId
23c30 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  x){.  int i;.  i
23c40 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  nt nCol = pIdx->
23c50 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e  nColumn;.  int n
23c60 4b 65 79 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79  Key = pIdx->nKey
23c70 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  Col;.  KeyInfo *
23c80 70 4b 65 79 3b 0a 20 20 69 66 28 20 70 50 61 72  pKey;.  if( pPar
23c90 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
23ca0 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 64 78 2d  n 0;.  if( pIdx-
23cb0 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 29 7b 0a  >uniqNotNull ){.
23cc0 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74      pKey = sqlit
23cd0 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70  e3KeyInfoAlloc(p
23ce0 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 2c  Parse->db, nKey,
23cf0 20 6e 43 6f 6c 2d 6e 4b 65 79 29 3b 0a 20 20 7d   nCol-nKey);.  }
23d00 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 20 3d  else{.    pKey =
23d10 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
23d20 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
23d30 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20   nCol, 0);.  }. 
23d40 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
23d50 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
23d60 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
23d70 6c 65 28 70 4b 65 79 29 20 29 3b 0a 20 20 20 20  le(pKey) );.    
23d80 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
23d90 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e   i++){.      con
23da0 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d  st char *zColl =
23db0 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d   pIdx->azColl[i]
23dc0 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43  ;.      pKey->aC
23dd0 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3d 3d  oll[i] = zColl==
23de0 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
23df0 20 3f 20 30 20 3a 0a 20 20 20 20 20 20 20 20 20   ? 0 :.         
23e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
23e10 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
23e20 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
23e30 6c 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e  l);.      pKey->
23e40 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
23e50 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
23e60 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  [i];.    }.    i
23e70 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
23e80 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
23e90 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c   pParse->rc==SQL
23ea0 49 54 45 5f 45 52 52 4f 52 5f 4d 49 53 53 49 4e  ITE_ERROR_MISSIN
23eb0 47 5f 43 4f 4c 4c 53 45 51 20 29 3b 0a 20 20 20  G_COLLSEQ );.   
23ec0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 62 4e 6f     if( pIdx->bNo
23ed0 51 75 65 72 79 3d 3d 30 20 29 7b 0a 20 20 20 20  Query==0 ){.    
23ee0 20 20 20 20 2f 2a 20 44 65 61 63 74 69 76 61 74      /* Deactivat
23ef0 65 20 74 68 65 20 69 6e 64 65 78 20 62 65 63 61  e the index beca
23f00 75 73 65 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  use it contains 
23f10 61 6e 20 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 6c 61  an unknown colla
23f20 74 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ting.        ** 
23f30 73 65 71 75 65 6e 63 65 2e 20 20 54 68 65 20 6f  sequence.  The o
23f40 6e 6c 79 20 77 61 79 20 74 6f 20 72 65 61 63 74  nly way to react
23f50 69 76 65 20 74 68 65 20 69 6e 64 65 78 20 69 73  ive the index is
23f60 20 74 6f 20 72 65 6c 6f 61 64 20 74 68 65 0a 20   to reload the. 
23f70 20 20 20 20 20 20 20 2a 2a 20 73 63 68 65 6d 61         ** schema
23f80 2e 20 20 41 64 64 69 6e 67 20 74 68 65 20 6d 69  .  Adding the mi
23f90 73 73 69 6e 67 20 63 6f 6c 6c 61 74 69 6e 67 20  ssing collating 
23fa0 73 65 71 75 65 6e 63 65 20 6c 61 74 65 72 20 64  sequence later d
23fb0 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20  oes not.        
23fc0 2a 2a 20 72 65 61 63 74 69 76 65 20 74 68 65 20  ** reactive the 
23fd0 69 6e 64 65 78 2e 20 20 54 68 65 20 61 70 70 6c  index.  The appl
23fe0 69 63 61 74 69 6f 6e 20 68 61 64 20 74 68 65 20  ication had the 
23ff0 63 68 61 6e 63 65 20 74 6f 20 72 65 67 69 73 74  chance to regist
24000 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  er.        ** th
24010 65 20 6d 69 73 73 69 6e 67 20 69 6e 64 65 78 20  e missing index 
24020 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74  using the collat
24030 69 6f 6e 2d 6e 65 65 64 65 64 20 63 61 6c 6c 62  ion-needed callb
24040 61 63 6b 2e 20 20 46 6f 72 0a 20 20 20 20 20 20  ack.  For.      
24050 20 20 2a 2a 20 73 69 6d 70 6c 69 63 69 74 79 2c    ** simplicity,
24060 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74   SQLite will not
24070 20 67 69 76 65 20 74 68 65 20 61 70 70 6c 69 63   give the applic
24080 61 74 69 6f 6e 20 61 20 73 65 63 6f 6e 64 20 63  ation a second c
24090 68 61 6e 63 65 2e 0a 20 20 20 20 20 20 20 20 2a  hance..        *
240a0 2f 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  /.        pIdx->
240b0 62 4e 6f 51 75 65 72 79 20 3d 20 31 3b 0a 20 20  bNoQuery = 1;.  
240c0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
240d0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 5f   = SQLITE_ERROR_
240e0 52 45 54 52 59 3b 0a 20 20 20 20 20 20 7d 0a 20  RETRY;.      }. 
240f0 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49       sqlite3KeyI
24100 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 29 3b 0a  nfoUnref(pKey);.
24110 20 20 20 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a        pKey = 0;.
24120 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
24130 72 6e 20 70 4b 65 79 3b 0a 7d 0a 0a 23 69 66 6e  rn pKey;.}..#ifn
24140 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
24150 43 54 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  CTE./* .** This 
24160 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b  routine is invok
24170 65 64 20 6f 6e 63 65 20 70 65 72 20 43 54 45 20  ed once per CTE 
24180 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
24190 69 6c 65 20 70 61 72 73 69 6e 67 20 61 20 0a 2a  ile parsing a .*
241a0 2a 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20 0a  * WITH clause. .
241b0 2a 2f 0a 57 69 74 68 20 2a 73 71 6c 69 74 65 33  */.With *sqlite3
241c0 57 69 74 68 41 64 64 28 0a 20 20 50 61 72 73 65  WithAdd(.  Parse
241d0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
241e0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
241f0 6e 74 65 78 74 20 2a 2f 0a 20 20 57 69 74 68 20  ntext */.  With 
24200 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20 20 20  *pWith,         
24210 20 20 20 2f 2a 20 45 78 69 73 74 69 6e 67 20 57     /* Existing W
24220 49 54 48 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e  ITH clause, or N
24230 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
24240 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  pName,          
24250 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
24260 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 20 2a 2f 0a  common-table */.
24270 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41 72 67    ExprList *pArg
24280 6c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4f 70 74  list,     /* Opt
24290 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ional column nam
242a0 65 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20 74  e list for the t
242b0 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  able */.  Select
242c0 20 2a 70 51 75 65 72 79 20 20 20 20 20 20 20 20   *pQuery        
242d0 20 20 2f 2a 20 51 75 65 72 79 20 75 73 65 64 20    /* Query used 
242e0 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  to initialize th
242f0 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  e table */.){.  
24300 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
24310 61 72 73 65 2d 3e 64 62 3b 0a 20 20 57 69 74 68  arse->db;.  With
24320 20 2a 70 4e 65 77 3b 0a 20 20 63 68 61 72 20 2a   *pNew;.  char *
24330 7a 4e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 43 68 65  zName;..  /* Che
24340 63 6b 20 74 68 61 74 20 74 68 65 20 43 54 45 20  ck that the CTE 
24350 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 20 77  name is unique w
24360 69 74 68 69 6e 20 74 68 69 73 20 57 49 54 48 20  ithin this WITH 
24370 63 6c 61 75 73 65 2e 20 49 66 0a 20 20 2a 2a 20  clause. If.  ** 
24380 6e 6f 74 2c 20 73 74 6f 72 65 20 61 6e 20 65 72  not, store an er
24390 72 6f 72 20 69 6e 20 74 68 65 20 50 61 72 73 65  ror in the Parse
243a0 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20   structure. */. 
243b0 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
243c0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  NameFromToken(pP
243d0 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29  arse->db, pName)
243e0 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 26 26  ;.  if( zName &&
243f0 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e   pWith ){.    in
24400 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
24410 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b  ; i<pWith->nCte;
24420 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
24430 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
24440 7a 4e 61 6d 65 2c 20 70 57 69 74 68 2d 3e 61 5b  zName, pWith->a[
24450 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
24460 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
24470 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
24480 22 64 75 70 6c 69 63 61 74 65 20 57 49 54 48 20  "duplicate WITH 
24490 74 61 62 6c 65 20 6e 61 6d 65 3a 20 25 73 22 2c  table name: %s",
244a0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   zName);.      }
244b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
244c0 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69  ( pWith ){.    i
244d0 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  nt nByte = sizeo
244e0 66 28 2a 70 57 69 74 68 29 20 2b 20 28 73 69 7a  f(*pWith) + (siz
244f0 65 6f 66 28 70 57 69 74 68 2d 3e 61 5b 31 5d 29  eof(pWith->a[1])
24500 20 2a 20 70 57 69 74 68 2d 3e 6e 43 74 65 29 3b   * pWith->nCte);
24510 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
24520 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
24530 20 70 57 69 74 68 2c 20 6e 42 79 74 65 29 3b 0a   pWith, nByte);.
24540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65    }else{.    pNe
24550 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
24560 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
24570 6f 66 28 2a 70 57 69 74 68 29 29 3b 0a 20 20 7d  of(*pWith));.  }
24580 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77  .  assert( (pNew
24590 21 3d 30 20 26 26 20 7a 4e 61 6d 65 21 3d 30 29  !=0 && zName!=0)
245a0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
245b0 69 6c 65 64 20 29 3b 0a 0a 20 20 69 66 28 20 64  iled );..  if( d
245c0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
245d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
245e0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
245f0 20 70 41 72 67 6c 69 73 74 29 3b 0a 20 20 20 20   pArglist);.    
24600 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
24610 65 74 65 28 64 62 2c 20 70 51 75 65 72 79 29 3b  ete(db, pQuery);
24620 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
24630 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ee(db, zName);. 
24640 20 20 20 70 4e 65 77 20 3d 20 70 57 69 74 68 3b     pNew = pWith;
24650 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
24660 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65  ew->a[pNew->nCte
24670 5d 2e 70 53 65 6c 65 63 74 20 3d 20 70 51 75 65  ].pSelect = pQue
24680 72 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b  ry;.    pNew->a[
24690 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 43 6f 6c  pNew->nCte].pCol
246a0 73 20 3d 20 70 41 72 67 6c 69 73 74 3b 0a 20 20  s = pArglist;.  
246b0 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
246c0 6e 43 74 65 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e  nCte].zName = zN
246d0 61 6d 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ame;.    pNew->a
246e0 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 43 74  [pNew->nCte].zCt
246f0 65 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 4e  eErr = 0;.    pN
24700 65 77 2d 3e 6e 43 74 65 2b 2b 3b 0a 20 20 7d 0a  ew->nCte++;.  }.
24710 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
24720 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
24730 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
24740 65 20 57 69 74 68 20 6f 62 6a 65 63 74 20 70 61  e With object pa
24750 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
24760 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
24770 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 74 68  void sqlite3With
24780 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
24790 64 62 2c 20 57 69 74 68 20 2a 70 57 69 74 68 29  db, With *pWith)
247a0 7b 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b  {.  if( pWith ){
247b0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
247c0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69 74 68  for(i=0; i<pWith
247d0 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCte; i++){.  
247e0 20 20 20 20 73 74 72 75 63 74 20 43 74 65 20 2a      struct Cte *
247f0 70 43 74 65 20 3d 20 26 70 57 69 74 68 2d 3e 61  pCte = &pWith->a
24800 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  [i];.      sqlit
24810 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
24820 28 64 62 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73  (db, pCte->pCols
24830 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24840 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
24850 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 29 3b   pCte->pSelect);
24860 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
24870 46 72 65 65 28 64 62 2c 20 70 43 74 65 2d 3e 7a  Free(db, pCte->z
24880 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
24890 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
248a0 62 2c 20 70 57 69 74 68 29 3b 0a 20 20 7d 0a 7d  b, pWith);.  }.}
248b0 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
248c0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
248d0 43 54 45 29 20 2a 2f 0a                          CTE) */.